changeset 2:16f2b6c91171 trunk

[svn] Load openjdk/jdk7/b14 into jdk/trunk.
author xiomara
date Fri, 22 Jun 2007 00:46:43 +0000
parents 193df1943809
children 64ed597c0ad3
files README-builds.html hotspot/agent/src/os/linux/LinuxDebuggerLocal.c hotspot/agent/src/os/win32/windbg/sawindbg.cpp hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java hotspot/build/linux/makefiles/top.make hotspot/build/solaris/Makefile hotspot/build/solaris/makefiles/dtrace.make hotspot/build/solaris/makefiles/kernel.make hotspot/build/solaris/makefiles/rules.make hotspot/build/solaris/makefiles/top.make hotspot/build/solaris/makefiles/vm.make hotspot/build/windows/build.bat hotspot/build/windows/build.make hotspot/build/windows/create.bat hotspot/build/windows/makefiles/generated.make hotspot/build/windows/makefiles/makedeps.make hotspot/build/windows/makefiles/vm.make hotspot/build/windows/projectfiles/common/Makefile hotspot/build/windows/projectfiles/kernel/Makefile hotspot/build/windows/projectfiles/kernel/vm.def hotspot/build/windows/projectfiles/kernel/vm.dsw hotspot/src/cpu/amd64/vm/amd64.ad hotspot/src/cpu/amd64/vm/assembler_amd64.cpp hotspot/src/cpu/amd64/vm/assembler_amd64.hpp hotspot/src/cpu/amd64/vm/interp_masm_amd64.cpp hotspot/src/cpu/amd64/vm/interpreterRT_amd64.cpp hotspot/src/cpu/amd64/vm/interpreter_amd64.cpp hotspot/src/cpu/amd64/vm/jniFastGetField_amd64.cpp hotspot/src/cpu/amd64/vm/sharedRuntime_amd64.cpp hotspot/src/cpu/amd64/vm/stubGenerator_amd64.cpp hotspot/src/cpu/amd64/vm/templateTable_amd64.cpp hotspot/src/cpu/amd64/vm/vm_version_amd64.cpp hotspot/src/cpu/i486/vm/assembler_i486.cpp hotspot/src/cpu/i486/vm/assembler_i486.hpp hotspot/src/cpu/i486/vm/c1_LIRAssembler_i486.cpp hotspot/src/cpu/i486/vm/c1_Runtime1_i486.cpp hotspot/src/cpu/i486/vm/i486.ad hotspot/src/cpu/i486/vm/interp_masm_i486.cpp hotspot/src/cpu/i486/vm/interpreter_i486.cpp hotspot/src/cpu/i486/vm/nativeInst_i486.cpp hotspot/src/cpu/i486/vm/nativeInst_i486.hpp hotspot/src/cpu/i486/vm/sharedRuntime_i486.cpp hotspot/src/cpu/i486/vm/stubGenerator_i486.cpp hotspot/src/cpu/i486/vm/vm_version_i486.cpp hotspot/src/cpu/i486/vm/vm_version_i486.hpp hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp hotspot/src/os/linux/vm/mutex_linux.cpp hotspot/src/os/solaris/vm/mutex_solaris.cpp hotspot/src/os/win32/vm/globals_win32.hpp hotspot/src/os/win32/vm/os_win32.cpp hotspot/src/share/tools/MakeDeps/BuildConfig.java hotspot/src/share/tools/MakeDeps/WinGammaPlatform.java hotspot/src/share/vm/c1/c1_Runtime1.cpp hotspot/src/share/vm/ci/ciMethod.hpp hotspot/src/share/vm/classfile/classFileParser.cpp hotspot/src/share/vm/classfile/classFileStream.cpp hotspot/src/share/vm/classfile/classFileStream.hpp hotspot/src/share/vm/classfile/systemDictionary.cpp hotspot/src/share/vm/classfile/verifier.cpp hotspot/src/share/vm/code/nmethod.cpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsPermGen.cpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsPermGen.hpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.hpp hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep hotspot/src/share/vm/gc_implementation/includeDB_gc_parNew hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge hotspot/src/share/vm/gc_implementation/includeDB_gc_serial hotspot/src/share/vm/gc_implementation/includeDB_gc_shared hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.hpp hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp hotspot/src/share/vm/gc_implementation/parNew/vmStructs_parNew.hpp hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp hotspot/src/share/vm/gc_implementation/parallelScavenge/vmPSOperations.cpp hotspot/src/share/vm/gc_implementation/parallelScavenge/vmPSOperations.hpp hotspot/src/share/vm/gc_implementation/parallelScavenge/vmStructs_parallelgc.hpp hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp hotspot/src/share/vm/includeDB_core hotspot/src/share/vm/includeDB_gc_parallel hotspot/src/share/vm/interpreter/bytecodeStream.cpp hotspot/src/share/vm/interpreter/bytecodeStream.hpp hotspot/src/share/vm/interpreter/bytecodeTracer.cpp hotspot/src/share/vm/interpreter/bytecodes.cpp hotspot/src/share/vm/interpreter/bytecodes.hpp hotspot/src/share/vm/interpreter/interpreter.cpp hotspot/src/share/vm/memory/cardTableModRefBS.cpp hotspot/src/share/vm/memory/cardTableModRefBS.hpp hotspot/src/share/vm/memory/cardTableRS.cpp hotspot/src/share/vm/memory/collectorPolicy.cpp hotspot/src/share/vm/memory/collectorPolicy.hpp hotspot/src/share/vm/memory/defNewGeneration.cpp hotspot/src/share/vm/memory/dump.cpp hotspot/src/share/vm/memory/genCollectedHeap.cpp hotspot/src/share/vm/memory/genCollectedHeap.hpp hotspot/src/share/vm/memory/genOopClosures.hpp hotspot/src/share/vm/memory/genOopClosures.inline.hpp hotspot/src/share/vm/memory/generationSpec.cpp hotspot/src/share/vm/memory/heapInspection.cpp hotspot/src/share/vm/memory/permGen.cpp hotspot/src/share/vm/memory/permGen.hpp hotspot/src/share/vm/memory/space.cpp hotspot/src/share/vm/memory/space.hpp hotspot/src/share/vm/memory/specialized_oop_closures.hpp hotspot/src/share/vm/memory/tenuredGeneration.cpp hotspot/src/share/vm/memory/tenuredGeneration.hpp hotspot/src/share/vm/memory/universe.cpp hotspot/src/share/vm/oops/arrayKlassKlass.cpp hotspot/src/share/vm/oops/arrayKlassKlass.hpp hotspot/src/share/vm/oops/compiledICHolderKlass.cpp hotspot/src/share/vm/oops/compiledICHolderKlass.hpp hotspot/src/share/vm/oops/constMethodKlass.cpp hotspot/src/share/vm/oops/constMethodKlass.hpp hotspot/src/share/vm/oops/constantPoolKlass.cpp hotspot/src/share/vm/oops/constantPoolKlass.hpp hotspot/src/share/vm/oops/cpCacheKlass.cpp hotspot/src/share/vm/oops/cpCacheKlass.hpp hotspot/src/share/vm/oops/cpCacheOop.cpp hotspot/src/share/vm/oops/cpCacheOop.hpp hotspot/src/share/vm/oops/instanceKlass.cpp hotspot/src/share/vm/oops/instanceKlass.hpp hotspot/src/share/vm/oops/instanceKlassKlass.cpp hotspot/src/share/vm/oops/instanceKlassKlass.hpp hotspot/src/share/vm/oops/instanceRefKlass.cpp hotspot/src/share/vm/oops/instanceRefKlass.hpp hotspot/src/share/vm/oops/klass.hpp hotspot/src/share/vm/oops/klassKlass.cpp hotspot/src/share/vm/oops/klassKlass.hpp hotspot/src/share/vm/oops/klassPS.hpp hotspot/src/share/vm/oops/klassVtable.cpp hotspot/src/share/vm/oops/klassVtable.hpp hotspot/src/share/vm/oops/methodDataKlass.cpp hotspot/src/share/vm/oops/methodDataKlass.hpp hotspot/src/share/vm/oops/methodDataOop.cpp hotspot/src/share/vm/oops/methodDataOop.hpp hotspot/src/share/vm/oops/methodKlass.cpp hotspot/src/share/vm/oops/methodKlass.hpp hotspot/src/share/vm/oops/methodOop.cpp hotspot/src/share/vm/oops/objArrayKlass.cpp hotspot/src/share/vm/oops/objArrayKlass.hpp hotspot/src/share/vm/oops/objArrayKlassKlass.cpp hotspot/src/share/vm/oops/objArrayKlassKlass.hpp hotspot/src/share/vm/oops/oop.cpp hotspot/src/share/vm/oops/oop.hpp hotspot/src/share/vm/oops/oop.inline.hpp hotspot/src/share/vm/oops/oop.pcgc.inline.hpp hotspot/src/share/vm/oops/symbolKlass.cpp hotspot/src/share/vm/oops/symbolKlass.hpp hotspot/src/share/vm/oops/typeArrayKlass.cpp hotspot/src/share/vm/oops/typeArrayKlass.hpp hotspot/src/share/vm/opto/loopTransform.cpp hotspot/src/share/vm/opto/loopopts.cpp hotspot/src/share/vm/opto/node.cpp hotspot/src/share/vm/opto/parseHelper.cpp hotspot/src/share/vm/prims/jni.cpp hotspot/src/share/vm/prims/jvmtiEnv.cpp hotspot/src/share/vm/prims/jvmtiEnvBase.hpp hotspot/src/share/vm/prims/jvmtiEnvThreadState.cpp hotspot/src/share/vm/prims/jvmtiEventController.cpp hotspot/src/share/vm/prims/jvmtiExport.cpp hotspot/src/share/vm/prims/jvmtiImpl.hpp hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp hotspot/src/share/vm/prims/jvmtiTagMap.cpp hotspot/src/share/vm/runtime/arguments.cpp hotspot/src/share/vm/runtime/biasedLocking.cpp hotspot/src/share/vm/runtime/globals.hpp hotspot/src/share/vm/runtime/init.cpp hotspot/src/share/vm/runtime/java.cpp hotspot/src/share/vm/runtime/os.cpp hotspot/src/share/vm/runtime/os.hpp hotspot/src/share/vm/runtime/reflection.cpp hotspot/src/share/vm/runtime/safepoint.cpp hotspot/src/share/vm/runtime/safepoint.hpp hotspot/src/share/vm/runtime/synchronizer.cpp hotspot/src/share/vm/runtime/synchronizer.hpp hotspot/src/share/vm/runtime/thread.cpp hotspot/src/share/vm/runtime/vframeArray.cpp hotspot/src/share/vm/runtime/vmStructs.cpp hotspot/src/share/vm/runtime/vmThread.cpp hotspot/src/share/vm/runtime/vm_operations.cpp hotspot/src/share/vm/runtime/vm_operations.hpp hotspot/src/share/vm/services/dtraceAttacher.cpp hotspot/src/share/vm/services/heapDumper.cpp hotspot/src/share/vm/services/memoryPool.cpp hotspot/src/share/vm/services/memoryPool.hpp hotspot/src/share/vm/services/memoryService.cpp hotspot/src/share/vm/services/psMemoryPool.cpp hotspot/src/share/vm/services/psMemoryPool.hpp hotspot/src/share/vm/utilities/globalDefinitions.hpp hotspot/src/share/vm/utilities/macros.hpp hotspot/src/share/vm/utilities/ostream.cpp hotspot/src/share/vm/utilities/ostream.hpp hotspot/src/share/vm/utilities/vmError.cpp j2se/make/README-builds.html j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_interceptors.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_legacy.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_naming_pcosnaming.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_oa_poa.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_transport.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_activation.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_extension.jmk j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_ior.jmk j2se/make/com/sun/corba/minclude/org_omg_CORBA.jmk j2se/make/com/sun/corba/minclude/org_omg_CORBAX.jmk j2se/make/com/sun/corba/minclude/org_omg_CosNaming.jmk j2se/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk j2se/make/com/sun/corba/minclude/org_omg_IOP.jmk j2se/make/com/sun/corba/minclude/org_omg_Messaging.jmk j2se/make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk j2se/make/com/sun/corba/minclude/org_omg_PortableServer.jmk j2se/make/com/sun/corba/se/PortableActivationIDL/Makefile j2se/make/com/sun/corba/se/connection/FILES_java.gmk j2se/make/com/sun/corba/se/corespi/Makefile j2se/make/com/sun/corba/se/impl/logging/Makefile j2se/make/com/sun/corba/se/impl/monitoring/Makefile j2se/make/com/sun/corba/se/impl/naming/namingutil/Makefile j2se/make/com/sun/corba/se/interceptor/FILES_java.gmk j2se/make/com/sun/corba/se/pept/Makefile j2se/make/com/sun/corba/se/rmi/rmic/Makefile j2se/make/com/sun/corba/se/rmi/rmic/SUN_RMI_RMIC_IIOP_java.gmk j2se/make/com/sun/corba/se/rmi/rmic/SUN_RMI_RMIC_java.gmk j2se/make/com/sun/corba/se/spi/copyobject/Makefile j2se/make/com/sun/corba/se/spi/logging/Makefile j2se/make/com/sun/corba/se/spi/monitoring/Makefile j2se/make/com/sun/java/pack/prop/Makefile j2se/make/com/sun/java_cup/Makefile j2se/make/com/sun/javah/Makefile j2se/make/com/sun/jndi/cosnaming/Makefile j2se/make/com/sun/jndi/ldap/Makefile j2se/make/com/sun/org/apache/bcel/Makefile j2se/make/com/sun/org/apache/regexp/Makefile j2se/make/com/sun/org/apache/xalan/Makefile j2se/make/com/sun/org/apache/xalan/internal/other/Makefile j2se/make/com/sun/org/apache/xalan/internal/xsltc/Makefile j2se/make/com/sun/org/apache/xerces/Makefile j2se/make/com/sun/org/apache/xerces/internal/dom/Makefile j2se/make/com/sun/org/apache/xerces/internal/impl/Makefile j2se/make/com/sun/org/apache/xerces/internal/jaxp/Makefile j2se/make/com/sun/org/apache/xerces/internal/parsers/Makefile j2se/make/com/sun/org/apache/xerces/internal/util/Makefile j2se/make/com/sun/org/apache/xerces/internal/xinclude/Makefile j2se/make/com/sun/org/apache/xerces/internal/xni/Makefile j2se/make/com/sun/org/apache/xerces/internal/xs/Makefile j2se/make/com/sun/org/apache/xml/Makefile j2se/make/com/sun/org/apache/xpath/Makefile j2se/make/com/sun/rowset/Makefile j2se/make/com/sun/security/auth/Makefile j2se/make/com/sun/sql/FILES_java.gmk j2se/make/com/sun/tools/doclets/Makefile j2se/make/com/sun/xml/Makefile j2se/make/common/CancelImplicits.gmk j2se/make/common/Defs-linux.gmk j2se/make/common/Defs-solaris.gmk j2se/make/common/Defs-windows.gmk j2se/make/common/Defs.gmk j2se/make/common/Library.gmk j2se/make/common/NativeCompileRules.gmk j2se/make/common/Program.gmk j2se/make/common/Release.gmk j2se/make/common/Resources.gmk j2se/make/common/Rules-SCCS.gmk j2se/make/common/Rules.gmk j2se/make/common/Sanity.gmk j2se/make/common/shared/Defs.gmk j2se/make/common/shared/Platform.gmk j2se/make/common/shared/PrivateDefs.gmk-example j2se/make/common/shared/Sanity-Settings.gmk j2se/make/docs/NON_CORE_PKGS.gmk j2se/make/java/awt/Makefile j2se/make/java/fdlibm/FILES_c.gmk j2se/make/java/hpi/hpi_common.gmk j2se/make/java/hpi/windows/Makefile j2se/make/java/instrument/FILES_c.gmk j2se/make/java/instrument/Makefile j2se/make/java/java/Exportedfiles.gmk j2se/make/java/java/localegen.sh j2se/make/java/java/localelist.sh j2se/make/java/java_crw_demo/Makefile j2se/make/java/java_hprof_demo/Makefile j2se/make/java/java_hprof_demo/create_html.ksh j2se/make/java/jexec/Makefile j2se/make/java/jvm/Makefile j2se/make/java/logging/Makefile j2se/make/java/management/Exportedfiles.gmk j2se/make/java/management/FILES_c.gmk j2se/make/java/management/Makefile j2se/make/java/nio/Exportedfiles.gmk j2se/make/java/nio/FILES_c.gmk j2se/make/java/nio/FILES_java.gmk j2se/make/java/nio/genBuffer.sh j2se/make/java/nio/genCharsetProvider.sh j2se/make/java/nio/genCoder.sh j2se/make/java/nio/genExceptions.sh j2se/make/java/nio/mapfile-linux j2se/make/java/nio/mapfile-solaris j2se/make/java/nio/spp.sh j2se/make/java/npt/Makefile j2se/make/java/redist/FILES.gmk j2se/make/java/redist/Makefile j2se/make/java/text/FILES_java.gmk j2se/make/java/zip/FILES_c.gmk j2se/make/java/zip/FILES_java.gmk j2se/make/javax/accessibility/Makefile j2se/make/javax/imageio/Makefile j2se/make/javax/print/Makefile j2se/make/javax/sound/FILES_c.gmk j2se/make/javax/sound/Makefile j2se/make/javax/sql/Makefile j2se/make/javax/swing/FILES.gmk j2se/make/javax/swing/beaninfo/FILES.gmk j2se/make/javax/swing/plaf/FILES.gmk j2se/make/javax/swing/plaf/Makefile j2se/make/javax/xml/Makefile j2se/make/jpda/back/Makefile j2se/make/jpda/front/Makefile j2se/make/jpda/transport/shmem/Makefile j2se/make/jpda/transport/socket/Makefile j2se/make/jpda/tty/Makefile j2se/make/mkdemo/applets/DemoApplets.gmk j2se/make/mkdemo/applets/ImageMap/Makefile j2se/make/mkdemo/applets/Makefile j2se/make/mkdemo/jfc/CodePointIM/FILES.gmk j2se/make/mkdemo/jfc/Font2DTest/FILES.gmk j2se/make/mkdemo/jfc/Font2DTest/Makefile j2se/make/mkdemo/jfc/Java2D/DemoJava2D.gmk j2se/make/mkdemo/jfc/Java2D/FILES.gmk j2se/make/mkdemo/jfc/Java2D/gui/FILES.gmk j2se/make/mkdemo/jvmti/Demo.gmk j2se/make/mkdemo/sound/FILES.gmk j2se/make/netbeans/common/shared.xml j2se/make/netbeans/compiler/build.properties j2se/make/netbeans/compiler/build.xml j2se/make/org/ietf/jgss/FILES_java.gmk j2se/make/org/omg/CORBAX_java.gmk j2se/make/org/omg/idl/FILES_java.gmk j2se/make/org/omg/idl/Makefile j2se/make/org/w3c/dom/Makefile j2se/make/org/xml/sax/Makefile j2se/make/sun/Makefile j2se/make/sun/applet/Makefile j2se/make/sun/awt/Depend.mak j2se/make/sun/awt/FILES_c_unix.gmk j2se/make/sun/awt/FILES_c_windows.gmk j2se/make/sun/awt/FILES_export_unix.gmk j2se/make/sun/awt/FILES_export_windows.gmk j2se/make/sun/awt/Makefile j2se/make/sun/awt/README j2se/make/sun/awt/make.depend j2se/make/sun/awt/mapfile-mawt-vers j2se/make/sun/awt/mapfile-vers j2se/make/sun/awt/mapfile-vers-linux j2se/make/sun/cmm/kcms/FILES_c_unix.gmk j2se/make/sun/cmm/kcms/FILES_c_windows.gmk j2se/make/sun/cmm/lcms/FILES_c_unix.gmk j2se/make/sun/cmm/lcms/FILES_c_windows.gmk j2se/make/sun/corba/core/Makefile j2se/make/sun/corba/org/omg/FILES_java.gmk j2se/make/sun/dcpr/FILES_c.gmk j2se/make/sun/dcpr/Makefile j2se/make/sun/dcpr/mapfile-vers j2se/make/sun/font/FILES_c.gmk j2se/make/sun/font/Makefile j2se/make/sun/font/t2k/FILES_c.gmk j2se/make/sun/font/t2k/Makefile j2se/make/sun/hprof/Makefile j2se/make/sun/image/generic/FILES_c.gmk j2se/make/sun/image/vis/FILES_c.gmk j2se/make/sun/jar/Makefile j2se/make/sun/javac/apt/Makefile j2se/make/sun/javac/bootck/Check.gmk j2se/make/sun/javac/javac/Makefile j2se/make/sun/javac/javadoc/Makefile j2se/make/sun/javazic/tzdata/VERSION j2se/make/sun/javazic/tzdata/africa j2se/make/sun/javazic/tzdata/asia j2se/make/sun/javazic/tzdata/australasia j2se/make/sun/javazic/tzdata/europe j2se/make/sun/javazic/tzdata/leapseconds j2se/make/sun/javazic/tzdata/northamerica j2se/make/sun/javazic/tzdata/southamerica j2se/make/sun/javazic/tzdata/zone.tab j2se/make/sun/jawt/Depend.mak j2se/make/sun/jawt/Makefile j2se/make/sun/jconsole/Makefile j2se/make/sun/jpeg/FILES_c.gmk j2se/make/sun/jpeg/mapfile-vers-closed j2se/make/sun/launcher/Makefile j2se/make/sun/misc/Makefile j2se/make/sun/native2ascii/Makefile j2se/make/sun/net/FILES_java.gmk j2se/make/sun/nio/FILES_java.gmk j2se/make/sun/nio/Makefile j2se/make/sun/rmi/cgi/Makefile j2se/make/sun/rmi/corbalogcompile/Makefile j2se/make/sun/rmi/oldtools/FILES_java.gmk j2se/make/sun/rmi/oldtools/Makefile j2se/make/sun/rmi/registry/Makefile j2se/make/sun/rmi/rmi/Makefile j2se/make/sun/rmi/rmic/Makefile j2se/make/sun/rmi/rmid/Makefile j2se/make/sun/schemagen/Makefile j2se/make/sun/security/jarsigner/Makefile j2se/make/sun/security/keytool/Makefile j2se/make/sun/security/kinit/Makefile j2se/make/sun/security/klist/Makefile j2se/make/sun/security/ktab/Makefile j2se/make/sun/security/policytool/Makefile j2se/make/sun/security/tools/Makefile j2se/make/sun/security/util/Makefile j2se/make/sun/serialver/Makefile j2se/make/sun/splashscreen/FILES_c.gmk j2se/make/sun/wsgen/Makefile j2se/make/sun/wsimport/Makefile j2se/make/sun/xawt/FILES_c_unix.gmk j2se/make/sun/xawt/FILES_export_unix.gmk j2se/make/sun/xawt/Makefile j2se/make/sun/xjc/Makefile j2se/make/tools/AutoMulti/AutoMulti.java j2se/make/tools/AutoMulti/TestALFGenerator.java j2se/make/tools/AutoMulti/TestALFLookAndFeel.java j2se/make/tools/CompileProperties/CompileProperties.class j2se/make/tools/CompileProperties/CompileProperties.java j2se/make/tools/GenerateBreakIteratorData/CharacterCategory.java j2se/make/tools/GenerateCharacter/GenerateCharacter.java j2se/make/tools/GenerateCharacter/SpecialCaseMap.java j2se/make/tools/GenerateCharacter/UnicodeSpec.java j2se/make/tools/GenerateCharacter/Utility.java j2se/make/tools/Hasher/Hasher.java j2se/make/tools/StripProperties/StripProperties.java j2se/make/tools/dtdbuilder/DTDBuilder.java j2se/make/tools/dtdbuilder/DTDInputStream.java j2se/make/tools/dtdbuilder/DTDParser.java j2se/make/tools/dtdbuilder/PublicMapping.java j2se/make/tools/dtdbuilder/README j2se/make/tools/reorder/Makefile j2se/make/tools/signaturetest/APIChangesTest.java j2se/make/tools/signaturetest/Makefile j2se/make/tools/signaturetest/README j2se/make/tools/strip/StripProperties.class j2se/make/tools/strip/StripProperties.java j2se/make/tools/swing-beans/GenDocletBeanInfo.java j2se/make/tools/swing-beans/GenSwingBeanInfo.java j2se/make/tools/swing-beans/SwingBeanInfo.template j2se/make/tools/swing-beans/beaninfo/SwingBeanInfoBase.java j2se/src/share/classes/com/sun/corba/se/impl/activation/CommandHandler.java j2se/src/share/classes/com/sun/imageio/plugins/common/PaletteBuilder.java j2se/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java j2se/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java j2se/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java j2se/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java j2se/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java j2se/src/share/classes/com/sun/jmx/remote/internal/ArrayNotificationBuffer.java j2se/src/share/classes/com/sun/jmx/remote/util/Service.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/client/XSLTProcessorApplet.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Param.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Step.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Variable.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/VariableBase.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/Type.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/dom/AdaptiveResultTreeImpl.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SAX2DOM.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SAX2StAXEventWriter.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/StAXEvent2SAX.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/StAXStream2SAX.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/dom/EntityImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLStreamFilterImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLStreamReaderImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/ASCIIReader.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/UCSReader.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/UTF8Reader.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages.properties j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/DOMValidatorHelper.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java j2se/src/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/IncrementalSAXSource_Filter.java j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java j2se/src/share/classes/com/sun/org/apache/xml/internal/serializer/ToStream.java j2se/src/share/classes/com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java j2se/src/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java j2se/src/share/classes/com/sun/org/apache/xpath/internal/axes/NodeSequence.java j2se/src/share/classes/com/sun/tools/corba/se/idl/first.set j2se/src/share/classes/com/sun/tools/corba/se/idl/follow.set j2se/src/share/classes/com/sun/tools/example/debug/tty/MessageOutput.java j2se/src/share/classes/com/sun/tools/example/debug/tty/TTY.java j2se/src/share/classes/com/sun/tools/example/doc/index.html j2se/src/share/classes/com/sun/tools/example/doc/javadt.html j2se/src/share/classes/com/sun/tools/example/doc/jdb.html j2se/src/share/classes/com/sun/tools/example/doc/trace.html j2se/src/share/classes/com/sun/tools/example/trace/EventThread.java j2se/src/share/classes/com/sun/tools/example/trace/StreamRedirectThread.java j2se/src/share/classes/com/sun/tools/example/trace/Trace.java j2se/src/share/classes/com/sun/tools/javac/resources/version-template.java j2se/src/share/classes/com/sun/tools/javac/resources/version-template.properties j2se/src/share/classes/com/sun/tools/javah/Main.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/Gen.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/JNI.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/JavahEnvironment.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/LLNI.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/Main.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/Mangle.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/OldHeaders.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/OldStubs.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/Util.java j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/Linux_ppc.properties j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/Linux_sparc.properties j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/SunOS_sparc.properties j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/SunOS_sparcv9.properties j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/l10n.properties j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/l10n_ja.properties j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/l10n_zh_CN.properties j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/win32_x86.properties j2se/src/share/classes/com/sun/xml/internal/stream/Entity.java j2se/src/share/classes/com/sun/xml/internal/stream/XMLEventReaderImpl.java j2se/src/share/classes/com/sun/xml/internal/stream/XMLInputFactoryImpl.java j2se/src/share/classes/com/sun/xml/internal/stream/XMLOutputFactoryImpl.java j2se/src/share/classes/com/sun/xml/internal/stream/events/DummyEvent.java j2se/src/share/classes/com/sun/xml/internal/stream/events/StartDocumentEvent.java j2se/src/share/classes/com/sun/xml/internal/stream/events/XMLEventAllocatorImpl.java j2se/src/share/classes/com/sun/xml/internal/stream/util/BufferAllocator.java j2se/src/share/classes/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java j2se/src/share/classes/com/sun/xml/internal/stream/writers/XMLDOMWriterImpl.java j2se/src/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java j2se/src/share/classes/java/awt/BasicStroke.java j2se/src/share/classes/java/awt/Color.java j2se/src/share/classes/java/awt/DefaultKeyboardFocusManager.java j2se/src/share/classes/java/awt/Dialog.java j2se/src/share/classes/java/awt/KeyboardFocusManager.java j2se/src/share/classes/java/awt/List.java j2se/src/share/classes/java/awt/SystemColor.java j2se/src/share/classes/java/awt/Toolkit.java j2se/src/share/classes/java/awt/Window.java j2se/src/share/classes/java/awt/peer/DialogPeer.java j2se/src/share/classes/java/awt/peer/KeyboardFocusManagerPeer.java j2se/src/share/classes/java/net/URL.java j2se/src/share/classes/java/text/Bidi.java j2se/src/share/classes/java/util/CurrencyData.properties j2se/src/share/classes/java/util/LocaleISOData.java j2se/src/share/classes/java/util/ResourceBundle.java j2se/src/share/classes/java/util/concurrent/atomic/package-info.java j2se/src/share/classes/java/util/concurrent/atomic/package.html j2se/src/share/classes/java/util/concurrent/locks/package-info.java j2se/src/share/classes/java/util/concurrent/locks/package.html j2se/src/share/classes/java/util/concurrent/package-info.java j2se/src/share/classes/java/util/concurrent/package.html j2se/src/share/classes/java/util/logging/LogManager.java j2se/src/share/classes/java/util/logging/Logger.java j2se/src/share/classes/javax/imageio/plugins/jpeg/JPEGQTable.java j2se/src/share/classes/javax/management/remote/JMXConnectorFactory.java j2se/src/share/classes/javax/management/remote/JMXConnectorServerFactory.java j2se/src/share/classes/javax/management/remote/rmi/RMIIIOPServerImpl.java j2se/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java j2se/src/share/classes/javax/print/ServiceUI.java j2se/src/share/classes/javax/swing/UIDefaults.java j2se/src/share/classes/javax/xml/validation/SecuritySupport.java j2se/src/share/classes/javax/xml/xpath/SecuritySupport.java j2se/src/share/classes/sun/awt/AppContext.java j2se/src/share/classes/sun/awt/ComponentAccessor.java j2se/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java j2se/src/share/classes/sun/awt/SunToolkit.java j2se/src/share/classes/sun/awt/WindowAccessor.java j2se/src/share/classes/sun/awt/geom/PathConsumer2D.java j2se/src/share/classes/sun/awt/im/InputMethodManager.java j2se/src/share/classes/sun/awt/util/IdentityArrayList.java j2se/src/share/classes/sun/awt/util/IdentityLinkedList.java j2se/src/share/classes/sun/dc/DuctusRenderingEngine.java j2se/src/share/classes/sun/dc/META-INF/services/sun.java2d.pipe.RenderingEngine j2se/src/share/classes/sun/font/FileFontStrike.java j2se/src/share/classes/sun/font/FontManager.java j2se/src/share/classes/sun/font/PhysicalStrike.java j2se/src/share/classes/sun/java2d/SunGraphics2D.java j2se/src/share/classes/sun/java2d/SunGraphicsEnvironment.java j2se/src/share/classes/sun/java2d/SurfaceData.java j2se/src/share/classes/sun/java2d/opengl/OGLBlitLoops.java j2se/src/share/classes/sun/java2d/opengl/OGLBufImgOps.java j2se/src/share/classes/sun/java2d/opengl/OGLContext.java j2se/src/share/classes/sun/java2d/opengl/OGLMaskBlit.java j2se/src/share/classes/sun/java2d/opengl/OGLMaskFill.java j2se/src/share/classes/sun/java2d/opengl/OGLPaints.java j2se/src/share/classes/sun/java2d/opengl/OGLRenderer.java j2se/src/share/classes/sun/java2d/opengl/OGLSurfaceData.java j2se/src/share/classes/sun/java2d/opengl/OGLTextRenderer.java j2se/src/share/classes/sun/java2d/pipe/AAShapePipe.java j2se/src/share/classes/sun/java2d/pipe/AATileGenerator.java j2se/src/share/classes/sun/java2d/pipe/BufferedBufImgOps.java j2se/src/share/classes/sun/java2d/pipe/BufferedContext.java j2se/src/share/classes/sun/java2d/pipe/BufferedMaskFill.java j2se/src/share/classes/sun/java2d/pipe/BufferedOpCodes.java j2se/src/share/classes/sun/java2d/pipe/BufferedPaints.java j2se/src/share/classes/sun/java2d/pipe/BufferedRenderPipe.java j2se/src/share/classes/sun/java2d/pipe/BufferedTextPipe.java j2se/src/share/classes/sun/java2d/pipe/CompositePipe.java j2se/src/share/classes/sun/java2d/pipe/DuctusRenderer.java j2se/src/share/classes/sun/java2d/pipe/DuctusShapeRenderer.java j2se/src/share/classes/sun/java2d/pipe/LoopPipe.java j2se/src/share/classes/sun/java2d/pipe/RenderingEngine.java j2se/src/share/classes/sun/java2d/pipe/ShapeSpanIterator.java j2se/src/share/classes/sun/java2d/pipe/SpanShapeRenderer.java j2se/src/share/classes/sun/management/snmp/jvminstr/README j2se/src/share/classes/sun/misc/Unsafe.java j2se/src/share/classes/sun/net/spi/DefaultProxySelector.java j2se/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java j2se/src/share/classes/sun/net/www/protocol/http/NegotiatorImpl.java j2se/src/share/classes/sun/print/PSPathGraphics.java j2se/src/share/classes/sun/print/PathGraphics.java j2se/src/share/classes/sun/print/RasterPrinterJob.java j2se/src/share/classes/sun/print/ServiceDialog.java j2se/src/share/classes/sun/print/SunAlternateMedia.java j2se/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java j2se/src/share/classes/sun/swing/SwingUtilities2.java j2se/src/share/classes/sun/tools/hprof/Tracker.java j2se/src/share/classes/sun/tools/javap/Main.java j2se/src/share/classes/sun/tools/javap/oldjavap/ConstantPrinter.java j2se/src/share/classes/sun/tools/javap/oldjavap/JavaP.java j2se/src/share/classes/sun/tools/javap/oldjavap/JavaPBinaryCode.java j2se/src/share/classes/sun/tools/javap/oldjavap/JavaPClassPrinter.java j2se/src/share/classes/sun/tools/javap/oldjavap/JavaPEnvironment.java j2se/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java j2se/src/share/classes/sun/util/resources/LocaleNames.properties j2se/src/share/classes/sun/util/resources/TimeZoneNames.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_de.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_en_CA.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_es.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_fr.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_it.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_ja.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_ko.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_sv.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java j2se/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java j2se/src/share/demo/java2d/J2DBench/Makefile j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Destinations.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Group.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/J2DBench.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Option.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Test.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/TestEnvironment.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/report/J2DAnalyzer.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/GraphicsTests.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/ImageTests.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/PixelTests.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/RenderTests.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/iio/IIOTests.java j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/text/TextTests.java j2se/src/share/demo/java2d/SampleRenderPlug/Makefile j2se/src/share/demo/java2d/SampleRenderPlug/README j2se/src/share/demo/java2d/SampleRenderPlug/src/sun/java2d/demo/RegionRenderingEngine.java j2se/src/share/demo/java2d/SampleRenderPlug/src/sun/java2d/demo/RegionTileGenerator.java j2se/src/share/demo/jvmti/hprof/README.txt j2se/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c j2se/src/share/demo/jvmti/java_crw_demo/test_crw.c j2se/src/share/demo/jvmti/java_crw_demo/test_sources/CrwTest1.java j2se/src/share/demo/jvmti/java_crw_demo/test_sources/CrwTest2.java j2se/src/share/native/sun/font/AccelGlyphCache.c j2se/src/share/native/sun/font/AccelGlyphCache.h j2se/src/share/native/sun/font/layout/LayoutEngine.cpp j2se/src/share/native/sun/java2d/opengl/OGLBufImgOps.c j2se/src/share/native/sun/java2d/opengl/OGLContext.c j2se/src/share/native/sun/java2d/opengl/OGLContext.h j2se/src/share/native/sun/java2d/opengl/OGLFuncs.h j2se/src/share/native/sun/java2d/opengl/OGLMaskFill.c j2se/src/share/native/sun/java2d/opengl/OGLMaskFill.h j2se/src/share/native/sun/java2d/opengl/OGLPaints.c j2se/src/share/native/sun/java2d/opengl/OGLPaints.h j2se/src/share/native/sun/java2d/opengl/OGLRenderQueue.c j2se/src/share/native/sun/java2d/opengl/OGLRenderQueue.h j2se/src/share/native/sun/java2d/opengl/OGLTextRenderer.c j2se/src/share/native/sun/java2d/opengl/OGLTextRenderer.h j2se/src/share/native/sun/java2d/opengl/OGLVertexCache.c j2se/src/share/native/sun/java2d/opengl/OGLVertexCache.h j2se/src/share/native/sun/java2d/pipe/PathConsumer2D.h j2se/src/share/native/sun/java2d/pipe/ShapeSpanIterator.c j2se/src/share/opensource/javac/Makefile j2se/src/share/opensource/javac/build.xml j2se/src/solaris/back/exec_md.c j2se/src/solaris/classes/sun/awt/X11/XAWTXSettings.java j2se/src/solaris/classes/sun/awt/X11/XBaseWindow.java j2se/src/solaris/classes/sun/awt/X11/XComponentPeer.java j2se/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java j2se/src/solaris/classes/sun/awt/X11/XDialogPeer.java j2se/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java j2se/src/solaris/classes/sun/awt/X11/XFramePeer.java j2se/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java j2se/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java j2se/src/solaris/classes/sun/awt/X11/XNETProtocol.java j2se/src/solaris/classes/sun/awt/X11/XPopupMenuPeer.java j2se/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java j2se/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java j2se/src/solaris/classes/sun/awt/X11/XToolkit.java j2se/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java j2se/src/solaris/classes/sun/awt/X11/XWindow.java j2se/src/solaris/classes/sun/awt/X11/XWindowPeer.java j2se/src/solaris/classes/sun/awt/X11GraphicsDevice.java j2se/src/solaris/classes/sun/awt/motif/MDialogPeer.java j2se/src/solaris/classes/sun/awt/motif/MToolkit.java j2se/src/solaris/classes/sun/awt/motif/MWindowPeer.java j2se/src/solaris/classes/sun/print/IPPPrintService.java j2se/src/solaris/classes/sun/print/UnixPrintService.java j2se/src/solaris/classes/sun/print/UnixPrintServiceLookup.java j2se/src/solaris/native/java/util/TimeZone_md.c j2se/src/solaris/native/sun/awt/awt_MToolkit.c j2se/src/solaris/native/sun/awt/awt_TopLevel.c j2se/src/solaris/native/sun/awt/awt_Window.h j2se/src/windows/classes/sun/awt/windows/WDesktopProperties.java j2se/src/windows/classes/sun/awt/windows/WDialogPeer.java j2se/src/windows/classes/sun/awt/windows/WFileDialogPeer.java j2se/src/windows/classes/sun/awt/windows/WPathGraphics.java j2se/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java j2se/src/windows/classes/sun/awt/windows/WPrinterJob.java j2se/src/windows/classes/sun/awt/windows/WToolkit.java j2se/src/windows/native/sun/font/fontpath.c j2se/src/windows/native/sun/java2d/d3d/D3DContext.cpp j2se/src/windows/native/sun/java2d/windows/GDIRenderer.cpp j2se/src/windows/native/sun/java2d/windows/Win32SurfaceData.cpp j2se/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c j2se/src/windows/native/sun/windows/WPrinterJob.cpp j2se/src/windows/native/sun/windows/awt_Component.cpp j2se/src/windows/native/sun/windows/awt_Component.h j2se/src/windows/native/sun/windows/awt_Cursor.cpp j2se/src/windows/native/sun/windows/awt_Cursor.h j2se/src/windows/native/sun/windows/awt_Dialog.cpp j2se/src/windows/native/sun/windows/awt_Dialog.h j2se/src/windows/native/sun/windows/awt_DnDDS.cpp j2se/src/windows/native/sun/windows/awt_Frame.cpp j2se/src/windows/native/sun/windows/awt_Frame.h j2se/src/windows/native/sun/windows/awt_List.cpp j2se/src/windows/native/sun/windows/awt_PopupMenu.cpp j2se/src/windows/native/sun/windows/awt_PrintJob.cpp j2se/src/windows/native/sun/windows/awt_Toolkit.cpp j2se/src/windows/native/sun/windows/awt_Toolkit.h j2se/src/windows/native/sun/windows/awt_Window.cpp j2se/src/windows/native/sun/windows/awt_Window.h j2se/test/com/sun/jdi/ShellScaffold.sh j2se/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java j2se/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh j2se/test/com/sun/management/UnixOperatingSystemMXBean/GetMaxFileDescriptorCount.sh j2se/test/com/sun/management/UnixOperatingSystemMXBean/GetOpenFileDescriptorCount.sh j2se/test/java/awt/Choice/ChoiceKeyEventReaction/ChoiceKeyEventReaction.html j2se/test/java/awt/Component/F10TopToplevel/F10TopToplevel.html j2se/test/java/awt/Component/F10TopToplevel/F10TopToplevel.java j2se/test/java/awt/Focus/AutoRequestFocusTest/AutoRequestFocusSetVisibleTest.java j2se/test/java/awt/Focus/AutoRequestFocusTest/AutoRequestFocusToFrontTest.java j2se/test/java/awt/Focus/AutoRequestFocusTest/TestHelper.java j2se/test/java/awt/Focus/DeiconifiedFrameLoosesFocus/DeiconifiedFrameLoosesFocus.java j2se/test/java/awt/Focus/FocusEmbeddedFrameTest/FocusEmbeddedFrameTest.java j2se/test/java/awt/Focus/FrameMinimizeTest/FrameMinimizeTest.java j2se/test/java/awt/FontClass/BigMetrics.java j2se/test/java/awt/Frame/InitialMaximizedTest/InitialMaximizedTest.html j2se/test/java/awt/Frame/InitialMaximizedTest/InitialMaximizedTest.java j2se/test/java/awt/Frame/LayoutOnMaximizeTest/LayoutOnMaximizeTest.java j2se/test/java/awt/Frame/ShownOnPack/ShownOnPack.html j2se/test/java/awt/Frame/ShownOnPack/ShownOnPack.java j2se/test/java/awt/Graphics/DrawImageBG/SystemBgColorTest.java j2se/test/java/awt/List/ActionAfterRemove/ActionAfterRemove.java j2se/test/java/awt/List/SetFontTest/SetFontTest.html j2se/test/java/awt/List/SetFontTest/SetFontTest.java j2se/test/java/awt/List/SingleModeDeselect/SingleModeDeselect.java j2se/test/java/awt/Modal/NpeOnClose/NpeOnCloseTest.java j2se/test/java/awt/PrintJob/SaveDialogTitleTest.java j2se/test/java/awt/PrintJob/Text/StringWidth.java j2se/test/java/awt/PrintJob/Text/stringwidth.sh j2se/test/java/awt/TextArea/TextAreaCursorTest/HoveringAndDraggingTest.html j2se/test/java/awt/TextArea/TextAreaCursorTest/HoveringAndDraggingTest.java j2se/test/java/awt/TextArea/UsingWithMouse/SelectionAutoscrollTest.html j2se/test/java/awt/TextArea/UsingWithMouse/SelectionAutoscrollTest.java j2se/test/java/awt/Toolkit/RealSync/RealSyncOnEDT.java j2se/test/java/awt/event/HierarchyEvent/AncestorResized/AncestorResized.java j2se/test/java/awt/font/TextLayout/TestHebrewMark.java j2se/test/java/awt/font/TextLayout/TextLayoutBounds.java j2se/test/java/awt/image/ImagingOpsNoExceptionsTest/ImagingOpsNoExceptionsTest.java j2se/test/java/awt/print/Dialog/PaperSizeError.java j2se/test/java/awt/print/PrinterJob/ImagePrinting/ClippedImages.java j2se/test/java/awt/print/PrinterJob/Margins.java j2se/test/java/awt/print/PrinterJob/ValidatePage/ValidatePage.java j2se/test/java/awt/regtesthelpers/AbstractTest.java j2se/test/java/awt/regtesthelpers/Sysout.java j2se/test/java/awt/regtesthelpers/Util.java j2se/test/java/awt/regtesthelpers/process/ProcessCommunicator.java j2se/test/java/awt/regtesthelpers/process/ProcessResults.java j2se/test/java/lang/System/Available.java j2se/test/java/lang/ref/SoftReference/Pin.java j2se/test/java/net/ProxySelector/B6563259.java j2se/test/java/net/URL/B6529759.java j2se/test/java/security/Security/signedfirst/Dyn.sh j2se/test/java/security/Security/signedfirst/Static.sh j2se/test/java/util/BitSet/MemoryLeak.java j2se/test/java/util/Currency/Bug4512215.java j2se/test/java/util/Currency/CheckDataVersion.java j2se/test/java/util/Currency/CurrencyTest.java j2se/test/java/util/Currency/ValidateISO4217.java j2se/test/java/util/Currency/tablea1.txt j2se/test/java/util/Locale/Bug4152725.java j2se/test/java/util/Locale/Bug4175998Test.java j2se/test/java/util/Locale/Bug4184873Test.java j2se/test/java/util/Locale/Bug4184873_he j2se/test/java/util/Locale/Bug4184873_id j2se/test/java/util/Locale/Bug4184873_yi j2se/test/java/util/Locale/Bug4210525.java j2se/test/java/util/Locale/Bug4316602.java j2se/test/java/util/Locale/Bug4518797.java j2se/test/java/util/Locale/GenerateKeyList.java j2se/test/java/util/Locale/HashCodeTest.java j2se/test/java/util/Locale/InternationalBAT.java j2se/test/java/util/Locale/LocaleTest.java j2se/test/java/util/Locale/LocaleTestFmwk.java j2se/test/java/util/Locale/PrintDefaultLocale.java j2se/test/java/util/Locale/ThaiGov.java j2se/test/java/util/Locale/bug4122700.java j2se/test/java/util/Locale/bug4123285.html j2se/test/java/util/Locale/bug4123285.java j2se/test/java/util/Locale/bug6277243.java j2se/test/java/util/Locale/bug6312358.java j2se/test/java/util/Locale/data/deflocale.c j2se/test/java/util/Locale/data/deflocale.exe j2se/test/java/util/Locale/data/deflocale.jds3 j2se/test/java/util/Locale/data/deflocale.rhel4 j2se/test/java/util/Locale/data/deflocale.sh j2se/test/java/util/Locale/data/deflocale.sol10 j2se/test/java/util/Locale/data/deflocale.winvista j2se/test/java/util/Locale/data/deflocale.winxp j2se/test/java/util/PluggableLocale/BreakIteratorProviderTest.java j2se/test/java/util/PluggableLocale/BreakIteratorProviderTest.sh j2se/test/java/util/PluggableLocale/ClasspathTest.java j2se/test/java/util/PluggableLocale/ClasspathTest.sh j2se/test/java/util/PluggableLocale/CollatorProviderTest.java j2se/test/java/util/PluggableLocale/CollatorProviderTest.sh j2se/test/java/util/PluggableLocale/CurrencyNameProviderTest.java j2se/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh j2se/test/java/util/PluggableLocale/DateFormatProviderTest.java j2se/test/java/util/PluggableLocale/DateFormatProviderTest.sh j2se/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java j2se/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.sh j2se/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.java j2se/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.sh j2se/test/java/util/PluggableLocale/ExecTest.sh j2se/test/java/util/PluggableLocale/GenericTest.java j2se/test/java/util/PluggableLocale/GenericTest.sh j2se/test/java/util/PluggableLocale/LocaleNameProviderTest.java j2se/test/java/util/PluggableLocale/LocaleNameProviderTest.sh j2se/test/java/util/PluggableLocale/NumberFormatProviderTest.java j2se/test/java/util/PluggableLocale/NumberFormatProviderTest.sh j2se/test/java/util/PluggableLocale/ProviderTest.java j2se/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java j2se/test/java/util/PluggableLocale/TimeZoneNameProviderTest.sh j2se/test/java/util/PluggableLocale/barprovider.jar j2se/test/java/util/PluggableLocale/fooprovider.jar j2se/test/java/util/PluggableLocale/providersrc/BreakIteratorProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/CollatorProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/DateFormatProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/DateFormatSymbolsProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/DecimalFormatSymbolsProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/LocaleNameProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/LocaleNames.properties j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_ja.properties j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_ja_JP_kyoto.properties j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_ja_JP_osaka.properties j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_xx.properties j2se/test/java/util/PluggableLocale/providersrc/Makefile j2se/test/java/util/PluggableLocale/providersrc/NumberFormatProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/TimeZoneNameProviderImpl.java j2se/test/java/util/PluggableLocale/providersrc/Utils.java j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.BreakIteratorProvider j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.CollatorProvider j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.DateFormatProvider j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.DateFormatSymbolsProvider j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.DecimalFormatSymbolsProvider j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.NumberFormatProvider j2se/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider j2se/test/java/util/PluggableLocale/providersrc/java.util.spi.LocaleNameProvider j2se/test/java/util/PluggableLocale/providersrc/java.util.spi.TimeZoneNameProvider j2se/test/java/util/ResourceBundle/Bug4083270Test.java j2se/test/java/util/ResourceBundle/Bug4083270Test.properties j2se/test/java/util/ResourceBundle/Bug4165815Test.java j2se/test/java/util/ResourceBundle/Bug4168625Class.java j2se/test/java/util/ResourceBundle/Bug4168625Getter.java j2se/test/java/util/ResourceBundle/Bug4168625Resource.java j2se/test/java/util/ResourceBundle/Bug4168625Resource2.java j2se/test/java/util/ResourceBundle/Bug4168625Resource2_en_US.java j2se/test/java/util/ResourceBundle/Bug4168625Resource3.java j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en.java j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en_CA.java j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en_IE.java j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en_US.java j2se/test/java/util/ResourceBundle/Bug4168625Test.java j2se/test/java/util/ResourceBundle/Bug4177489Test.java j2se/test/java/util/ResourceBundle/Bug4177489_Resource.java j2se/test/java/util/ResourceBundle/Bug4177489_Resource_jf.java j2se/test/java/util/ResourceBundle/Bug4177489_Resource_jf_JF.properties j2se/test/java/util/ResourceBundle/Bug4179766Class.java j2se/test/java/util/ResourceBundle/Bug4179766Getter.java j2se/test/java/util/ResourceBundle/Bug4179766Resource.java j2se/test/java/util/ResourceBundle/Bug4195978Test.java j2se/test/java/util/ResourceBundle/Bug4257318.java j2se/test/java/util/ResourceBundle/Bug4257318Res.java j2se/test/java/util/ResourceBundle/Bug4257318Res_en.java j2se/test/java/util/ResourceBundle/Bug4353454.java j2se/test/java/util/ResourceBundle/Bug4396021.java j2se/test/java/util/ResourceBundle/Bug4396021GeneralMessages.java j2se/test/java/util/ResourceBundle/Bug4396021SpecialMessages.java j2se/test/java/util/ResourceBundle/Bug6190861.java j2se/test/java/util/ResourceBundle/Bug6190861Data.properties j2se/test/java/util/ResourceBundle/Bug6190861Data_en_US.properties j2se/test/java/util/ResourceBundle/Bug6204853.java j2se/test/java/util/ResourceBundle/Bug6204853.properties j2se/test/java/util/ResourceBundle/Bug6204853_Utf8.properties j2se/test/java/util/ResourceBundle/Bug6287579.java j2se/test/java/util/ResourceBundle/Bug6299235Test.java j2se/test/java/util/ResourceBundle/Bug6299235Test.sh j2se/test/java/util/ResourceBundle/Bug6355009.java j2se/test/java/util/ResourceBundle/Bug6356571.java j2se/test/java/util/ResourceBundle/Bug6356571.properties j2se/test/java/util/ResourceBundle/Bug6359330.java j2se/test/java/util/ResourceBundle/Control/AbstractRB.java j2se/test/java/util/ResourceBundle/Control/BadControlsTest.java j2se/test/java/util/ResourceBundle/Control/BadStaticInitRB.java j2se/test/java/util/ResourceBundle/Control/Bug6530694.java j2se/test/java/util/ResourceBundle/Control/Bug6530694_de_DE.properties j2se/test/java/util/ResourceBundle/Control/Chinese.properties j2se/test/java/util/ResourceBundle/Control/Chinese_zh.properties j2se/test/java/util/ResourceBundle/Control/Chinese_zh_CN.properties j2se/test/java/util/ResourceBundle/Control/Chinese_zh_TW.properties j2se/test/java/util/ResourceBundle/Control/ControlFactoryTest.java j2se/test/java/util/ResourceBundle/Control/DefaultControlTest.java j2se/test/java/util/ResourceBundle/Control/ExpirationTest.java j2se/test/java/util/ResourceBundle/Control/ExpirationTest.sh j2se/test/java/util/ResourceBundle/Control/LoadingStrategiesTest.java j2se/test/java/util/ResourceBundle/Control/MalformedDataRB_en.properties j2se/test/java/util/ResourceBundle/Control/MissingResourceCauseTest.java j2se/test/java/util/ResourceBundle/Control/MissingResourceCauseTest.sh j2se/test/java/util/ResourceBundle/Control/NonResourceBundle.java j2se/test/java/util/ResourceBundle/Control/PackagePrivateRB.java j2se/test/java/util/ResourceBundle/Control/PackagePrivateTest.java j2se/test/java/util/ResourceBundle/Control/PrivateConstructorRB.java j2se/test/java/util/ResourceBundle/Control/StressOut.properties j2se/test/java/util/ResourceBundle/Control/StressOut_en_CA.properties j2se/test/java/util/ResourceBundle/Control/StressOut_ja.properties j2se/test/java/util/ResourceBundle/Control/StressOut_ja_JP.properties j2se/test/java/util/ResourceBundle/Control/StressOut_ko.properties j2se/test/java/util/ResourceBundle/Control/StressOut_zh_CN.properties j2se/test/java/util/ResourceBundle/Control/StressTest.java j2se/test/java/util/ResourceBundle/Control/TestResourceRB.java j2se/test/java/util/ResourceBundle/Control/XMLResourceBundleTest.java j2se/test/java/util/ResourceBundle/Control/XmlRB.xml j2se/test/java/util/ResourceBundle/Control/XmlRB_ja.xml j2se/test/java/util/ResourceBundle/FakeTestResource.java j2se/test/java/util/ResourceBundle/KeySetMessages.java j2se/test/java/util/ResourceBundle/KeySetMessages_zh_CN.java j2se/test/java/util/ResourceBundle/KeySetResources.properties j2se/test/java/util/ResourceBundle/KeySetResources_ja_JP.properties j2se/test/java/util/ResourceBundle/KeySetTest.java j2se/test/java/util/ResourceBundle/RB4353454_en.properties j2se/test/java/util/ResourceBundle/RBTestFmwk.java j2se/test/java/util/ResourceBundle/ReferencesTest.java j2se/test/java/util/ResourceBundle/ReferencesTestBundle.properties j2se/test/java/util/ResourceBundle/ResourceBundleTest.java j2se/test/java/util/ResourceBundle/RestrictedBundleTest.html j2se/test/java/util/ResourceBundle/RestrictedBundleTest.java j2se/test/java/util/ResourceBundle/Test4300693.java j2se/test/java/util/ResourceBundle/Test4300693RB.java j2se/test/java/util/ResourceBundle/Test4314141.java j2se/test/java/util/ResourceBundle/Test4314141A.properties j2se/test/java/util/ResourceBundle/Test4314141A_.properties j2se/test/java/util/ResourceBundle/Test4314141A__DE.properties j2se/test/java/util/ResourceBundle/Test4314141A___EURO.properties j2se/test/java/util/ResourceBundle/Test4314141A_de.properties j2se/test/java/util/ResourceBundle/Test4314141A_de_.properties j2se/test/java/util/ResourceBundle/Test4314141B.java j2se/test/java/util/ResourceBundle/Test4314141B_en.properties j2se/test/java/util/ResourceBundle/Test4314141B_es_ES.java j2se/test/java/util/ResourceBundle/Test4314141B_fr.properties j2se/test/java/util/ResourceBundle/Test4314141B_fr_CH.java j2se/test/java/util/ResourceBundle/Test4314141B_fr_CH.properties j2se/test/java/util/ResourceBundle/Test4318520.java j2se/test/java/util/ResourceBundle/Test4318520RB_de.properties j2se/test/java/util/ResourceBundle/Test4318520RB_en.properties j2se/test/java/util/ResourceBundle/TestBug4179766.java j2se/test/java/util/ResourceBundle/TestResource.java j2se/test/java/util/ResourceBundle/TestResource_de.java j2se/test/java/util/ResourceBundle/TestResource_fr.java j2se/test/java/util/ResourceBundle/TestResource_fr_CH.java j2se/test/java/util/ResourceBundle/TestResource_it.java j2se/test/java/util/ResourceBundle/awtres.jar j2se/test/java/util/ResourceBundle/bug4195978Test.properties j2se/test/java/util/StringTokenizer/FormFeed.java j2se/test/java/util/Vector/IllegalConstructorArgs.java j2se/test/javax/imageio/plugins/gif/GifTransparencyTest.java j2se/test/javax/imageio/plugins/jpeg/ConcurrentReadingTest.java j2se/test/javax/imageio/plugins/jpeg/ConcurrentWritingTest.java j2se/test/javax/imageio/plugins/jpeg/ReadingInterruptionTest.java j2se/test/javax/imageio/plugins/jpeg/WritingInterruptionTest.java j2se/test/javax/imageio/plugins/png/GrayPngTest.java j2se/test/javax/management/ImplementationVersion/ImplVersionCommand.java j2se/test/javax/management/ImplementationVersion/ImplVersionReader.java j2se/test/javax/management/monitor/MBeanServerBuilderImpl.java j2se/test/javax/management/monitor/MBeanServerForwarderInvocationHandler.java j2se/test/javax/management/remote/mandatory/version/ImplVersionCommand.java j2se/test/javax/management/remote/mandatory/version/ImplVersionReader.java j2se/test/sun/java2d/cmm/ColorConvertOp/CIEXYZ.png j2se/test/sun/java2d/cmm/ColorConvertOp/ColConvCCMTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/ColConvDCMTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/ColConvTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/ColCvtAlpha.java j2se/test/sun/java2d/cmm/ColorConvertOp/ColCvtIntARGB.java j2se/test/sun/java2d/cmm/ColorConvertOp/ColorConvertTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/ColorSpaceCvtCrashTest/ColorSpaceCvtCrashTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/ConstructorsNullTest/ConstructorsNullTest.html j2se/test/sun/java2d/cmm/ColorConvertOp/ConstructorsNullTest/ConstructorsNullTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/GRAY.png j2se/test/sun/java2d/cmm/ColorConvertOp/ImageComparator.java j2se/test/sun/java2d/cmm/ColorConvertOp/ImageFactory.java j2se/test/sun/java2d/cmm/ColorConvertOp/LRGB.png j2se/test/sun/java2d/cmm/ColorConvertOp/LRGB555.png j2se/test/sun/java2d/cmm/ColorConvertOp/LRGB565.png j2se/test/sun/java2d/cmm/ColorConvertOp/MTColConvTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/MTSafetyTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/PYCC.png j2se/test/sun/java2d/cmm/ColorConvertOp/RGBColorConvertTest.java j2se/test/sun/java2d/cmm/ColorConvertOp/SRGB.png j2se/test/sun/java2d/cmm/ColorConvertOp/SRGB555.png j2se/test/sun/java2d/cmm/ColorConvertOp/SRGB565.png j2se/test/sun/java2d/cmm/ProfileOp/MTReadProfileTest.java j2se/test/sun/java2d/cmm/ProfileOp/ReadProfileTest.java j2se/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java j2se/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh j2se/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh j2se/test/sun/management/jmxremote/bootstrap/Utils.java j2se/test/sun/management/windows/revokeall.c j2se/test/sun/management/windows/revokeall.exe j2se/test/sun/misc/CopyMemory.java j2se/test/sun/net/www/http/ChunkedInputStream/test.txt j2se/test/sun/net/www/protocol/jar/jarbug/src/test/JarTest.java j2se/test/sun/net/www/protocol/jar/jarbug/src/test/TestBug4361044.java j2se/test/sun/net/www/protocol/jar/jarbug/src/test/TestBug4523159.java j2se/test/sun/security/acl/PermissionImpl/PermissionEqualsHashCode.java j2se/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh j2se/test/sun/security/x509/AVA/AVAEqualsHashCode.java j2se/test/sun/security/x509/AVA/EmptyValue.java j2se/test/sun/security/x509/X500Name/AllAttribs.java j2se/test/sun/security/x509/X500Name/DerValueConstructor.java j2se/test/sun/security/x509/X500Name/NullX500Name.java j2se/test/sun/text/resources/LocaleData j2se/test/sun/text/resources/LocaleDataTest.java j2se/test/sun/util/resources/Locale/Bug4429024.java j2se/test/sun/util/resources/Locale/Bug4965260.java j2se/test/tools/javac/6547131/p/Outer$I.class j2se/test/tools/javac/6547131/p/Outer$I.jasm j2se/test/tools/javac/6547131/p/Outer.class j2se/test/tools/javac/6547131/p/Outer.jasm
diffstat 1084 files changed, 58640 insertions(+), 18895 deletions(-) [+]
line wrap: on
line diff
--- a/README-builds.html	Fri May 25 00:49:14 2007 +0000
+++ b/README-builds.html	Fri Jun 22 00:46:43 2007 +0000
@@ -279,7 +279,7 @@
         </ul>
     </blockquote>
     
-    <h4>Ubuntu 7.4</h4>
+    <h4>Ubuntu 7.04</h4>
     
     <p>
     Using the Synaptic Package Manager, download the following
@@ -1186,7 +1186,7 @@
     <p>
     The provided regression tests can be run with the <tt>jtreg</tt>
     utility from 
-    <a href="https://openjdk.java.net/jtreg/">the jtreg site</a>.
+    <a href="http://openjdk.java.net/jtreg/">the jtreg site</a>.
 </blockquote>
 
 <!-- ------------------------------------------------------ -->
--- a/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)LinuxDebuggerLocal.c	1.23 07/05/05 17:02:03 JVM"
+#pragma ident "@(#)LinuxDebuggerLocal.c	1.24 07/05/23 10:52:11 JVM"
 #endif
 /*
  * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -326,13 +326,13 @@
   regs[REG_INDEX(DS)]  = (uintptr_t) gregs.xds;
   regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
   regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
-  regs[REG_INDEX(EBP)] = (uintptr_t) gregs.ebp;
-  regs[REG_INDEX(ESP)] = (uintptr_t) gregs.esp;
+  regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;
+  regs[REG_INDEX(SP)] = (uintptr_t) gregs.esp;
   regs[REG_INDEX(EBX)] = (uintptr_t) gregs.ebx;
   regs[REG_INDEX(EDX)] = (uintptr_t) gregs.edx;
   regs[REG_INDEX(ECX)] = (uintptr_t) gregs.ecx;
   regs[REG_INDEX(EAX)] = (uintptr_t) gregs.eax;
-  regs[REG_INDEX(EIP)] = (uintptr_t) gregs.eip;
+  regs[REG_INDEX(PC)] = (uintptr_t) gregs.eip;
   regs[REG_INDEX(CS)]  = (uintptr_t) gregs.xcs;
   regs[REG_INDEX(SS)]  = (uintptr_t) gregs.xss;
 
--- a/hotspot/agent/src/os/win32/windbg/sawindbg.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/agent/src/os/win32/windbg/sawindbg.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)sawindbg.cpp	1.18 07/05/05 17:02:04 JVM"
+#pragma ident "@(#)sawindbg.cpp	1.19 07/05/23 10:52:34 JVM"
 #endif
 /*
  * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -597,11 +597,11 @@
      ptrRegs[REG_INDEX(ECX)] = context.Ecx;
      ptrRegs[REG_INDEX(EAX)] = context.Eax;
 
-     ptrRegs[REG_INDEX(EBP)] = context.Ebp;
-     ptrRegs[REG_INDEX(EIP)] = context.Eip;
+     ptrRegs[REG_INDEX(FP)] = context.Ebp;
+     ptrRegs[REG_INDEX(PC)] = context.Eip;
      ptrRegs[REG_INDEX(CS)]  = context.SegCs;
      ptrRegs[REG_INDEX(EFL)] = context.EFlags;
-     ptrRegs[REG_INDEX(ESP)] = context.Esp;
+     ptrRegs[REG_INDEX(SP)] = context.Esp;
      ptrRegs[REG_INDEX(SS)]  = context.SegSs;
 
      ptrRegs[REG_INDEX(DR0)] = context.Dr0;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java	Fri Jun 22 00:46:43 2007 +0000
@@ -66,6 +66,14 @@
   public static final int DR6 = 23;
   public static final int DR7 = 24;
 
+
+  public static final int PC = EIP;
+  public static final int FP = EBP;
+  public static final int SP = UESP;
+  public static final int PS = EFL;
+  public static final int R0 = EAX;
+  public static final int R1 = EDX;
+
   public static final int NPRGREG = 25;
 
   private static final String[] regNames = {
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java	Fri Jun 22 00:46:43 2007 +0000
@@ -63,9 +63,9 @@
 
   /** Returns false if not able to find a frame within a reasonable range. */
   public boolean run(long regionInBytesToSearch) {
-    Address sp  = context.getRegisterAsAddress(X86ThreadContext.ESP);
-    Address pc  = context.getRegisterAsAddress(X86ThreadContext.EIP);
-    Address fp  = context.getRegisterAsAddress(X86ThreadContext.EBP);
+    Address sp  = context.getRegisterAsAddress(X86ThreadContext.SP);
+    Address pc  = context.getRegisterAsAddress(X86ThreadContext.PC);
+    Address fp  = context.getRegisterAsAddress(X86ThreadContext.FP);
     if (sp == null) {
       // Bail out if no last java frame eithe
       if (thread.getLastJavaSP() != null) {
--- a/hotspot/build/linux/makefiles/top.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/linux/makefiles/top.make	Fri Jun 22 00:46:43 2007 +0000
@@ -60,9 +60,11 @@
 MakeDeps    = $(RUN.JAVA) $(PrecompiledOption) -classpath $(GENERATED) MakeDeps
 
 Include_DBs/GC          = $(VM)/includeDB_gc \
+                          $(VM)/includeDB_gc_parallel \
                           $(VM)/gc_implementation/includeDB_gc_parallelScavenge \
                           $(VM)/gc_implementation/includeDB_gc_concurrentMarkSweep \
                           $(VM)/gc_implementation/includeDB_gc_parNew \
+                          $(VM)/gc_implementation/includeDB_gc_serial \
                           $(VM)/gc_implementation/includeDB_gc_shared
 
 Include_DBs/CORE        = $(VM)/includeDB_core   $(Include_DBs/GC)
--- a/hotspot/build/solaris/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/solaris/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -156,11 +156,13 @@
 SUBDIRS_C2        = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler2/,$(TARGETS))
 SUBDIRS_TIERED    = $(addprefix $(OSNAME)_$(BUILDARCH)_tiered/,$(TARGETS))
 SUBDIRS_CORE      = $(addprefix $(OSNAME)_$(BUILDARCH)_core/,$(TARGETS))
+SUBDIRS_KERNEL    = $(addprefix $(OSNAME)_$(BUILDARCH)_kernel/,$(TARGETS))
 
 TARGETS_C2        = $(TARGETS)
 TARGETS_C1        = $(addsuffix 1,$(TARGETS))
 TARGETS_TIERED    = $(addsuffix tiered,$(TARGETS))
 TARGETS_CORE      = $(addsuffix core,$(TARGETS))
+TARGETS_KERNEL    = $(addsuffix kernel,$(TARGETS))
 
 BUILDTREE_MAKE    = $(GAMMADIR)/build/$(OSNAME)/makefiles/buildtree.make
 BUILDTREE_VARS    = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OSNAME) ARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH)
@@ -223,6 +225,10 @@
 	$(QUIETLY) $(MAKE) -f $(GAMMADIR)/build/$(OSNAME)/Makefile checks
 	$(BUILDTREE) VARIANT=core
 
+$(SUBDIRS_KERNEL): $(BUILDTREE_MAKE)
+	$(QUIETLY) $(MAKE) -f $(GAMMADIR)/build/$(OSNAME)/Makefile checks
+	$(BUILDTREE) VARIANT=kernel
+
 # Define INSTALL=y at command line to automatically copy JVM into JAVA_HOME
 
 $(TARGETS_C2):  $(SUBDIRS_C2)
@@ -253,10 +259,18 @@
 	cd $(OSNAME)_$(BUILDARCH)_core/$(patsubst %core,%,$@) && $(MAKE) $(MFLAGS) install
 endif
 
+$(TARGETS_KERNEL):  $(SUBDIRS_KERNEL)
+	cd $(OSNAME)_$(BUILDARCH)_kernel/$(patsubst %kernel,%,$@) && $(MAKE) $(MFLAGS)
+	cd $(OSNAME)_$(BUILDARCH)_kernel/$(patsubst %kernel,%,$@) && ./test_gamma
+ifdef INSTALL
+	cd $(OSNAME)_$(BUILDARCH)_kernel/$(patsubst %kernel,%,$@) && $(MAKE) $(MFLAGS) install
+endif
+
 # Just build the tree, and nothing else:
 tree:      $(SUBDIRS_C2)
 tree1:     $(SUBDIRS_C1)
 treecore:  $(SUBDIRS_CORE)
+treekernel:  $(SUBDIRS_KERNEL)
 
 # Doc target.  This is the same for all build options.
 #     Hence create a docs directory beside ...$(ARCH)_[...]
@@ -274,10 +288,10 @@
 clean_docs:
 	rm -rf $(SUBDIR_DOCS)
 
-clean_compiler1 clean_compiler2 clean_core:
+clean_compiler1 clean_compiler2 clean_core clean_kernel:
 	rm -rf $(OSNAME)_$(BUILDARCH)_$(subst clean_,,$@)
 
-clean:  clean_compiler2 clean_compiler1 clean_core clean_docs
+clean:  clean_compiler2 clean_compiler1 clean_core clean_docs clean_kernel
 
 include $(GAMMADIR)/build/$(OSNAME)/makefiles/cscope.make
 
--- a/hotspot/build/solaris/makefiles/dtrace.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/solaris/makefiles/dtrace.make	Fri Jun 22 00:46:43 2007 +0000
@@ -117,23 +117,23 @@
 
 # $@.tmp is created first. It's to avoid empty $(JVMOFFS).h produced in error case.
 $(JVMOFFS).h: $(GENOFFS)
-	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -header > $@.tmp ; touch $@ ; \
+	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -header > $@.tmp ; \
 	if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
-	then rm -f $@; mv $@.tmp $@; \
+	then rm -f $@; mv $@.tmp $@; echo Updated $@ ; \
 	else rm -f $@.tmp; \
 	fi
 
 $(JVMOFFS)Index.h: $(GENOFFS)
-	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -index > $@.tmp ; touch $@ ; \
+	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -index > $@.tmp ; \
 	if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
-	then rm -f $@; mv $@.tmp $@; \
+	then rm -f $@; mv $@.tmp $@; echo Updated $@ ; \
 	else rm -f $@.tmp; \
 	fi
 
 $(JVMOFFS).cpp: $(GENOFFS) $(JVMOFFS).h $(JVMOFFS)Index.h
-	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -table > $@.tmp ; touch $@ ; \
+	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -table > $@.tmp ; \
 	if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
-	then rm -f $@; mv $@.tmp $@; \
+	then rm -f $@; mv $@.tmp $@; echo Updated $@ ; \
 	else rm -f $@.tmp; \
 	fi
 
@@ -155,7 +155,7 @@
 	$(QUIETLY) cat $^ > $@
 
 # Dtrace is available, so we build $(DTRACE.o)  
-$(DTRACE.o): $(DTRACE).d $(JVMOFFS.o) $(DTraced_Files)
+$(DTRACE.o): $(DTRACE).d $(JVMOFFS).h $(JVMOFFS)Index.h $(DTraced_Files)
 	@echo Compiling $(DTRACE).d
 
 	$(QUIETLY) $(DTRACE_PROG) $(DTRACE_OPTS) -C -I. -G -o $@ -s $(DTRACE).d \
@@ -178,9 +178,12 @@
   # command, and libgenerateJvmOffsets.so depends on LIBJVM.o, 'make' will
   # think it needs to rebuild libgenerateJvmOffsets.so and thus JvmOffsets*
   # files, but it doesn't, so we touch the necessary files to prevent later
-  # recompilation.
+  # recompilation.  But, we can't touch the *.h files:  This rule depends
+  # on them, and that would cause an infinite cycle of rebuilding.
+  # Neither the *.h or *.ccp files need to be touched, since they have
+  # rules which do not update them when the generator file has not
+  # changed their contents.
 	$(QUIETLY) touch lib$(GENOFFS).so $(GENOFFS)
-	$(QUIETLY) touch $(JVMOFFS).h $(JVMOFFS).cpp $(JVMOFFS)Index.h
 	$(QUIETLY) touch $(JVMOFFS.o)
 
 .PHONY: dtraceCheck
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/build/solaris/makefiles/kernel.make	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#   
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#   
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#  
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#   
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#  
+#
+# 
+# Sets make macros for making kernel version of VM.
+# This target on solaris is just tempoarily for debugging the kernel build.
+
+TYPE=KERNEL
+
+VM_SUBDIR = client
+
+CFLAGS += -DKERNEL
--- a/hotspot/build/solaris/makefiles/rules.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/solaris/makefiles/rules.make	Fri Jun 22 00:46:43 2007 +0000
@@ -137,14 +137,14 @@
 # flag. Performance measurements show that compiling GC related code will
 # dramatically reduce the gc pause time. See bug 6454213 for more details.
 
-#include $(GAMMADIR)/make/scm.make
+include $(GAMMADIR)/make/scm.make
 
 NONPIC_DIRS  = memory oops gc_implementation gc_interface 
 NONPIC_DIRS  := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
 # Look for source code under NONPIC_DIRS
 NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\
-                 $(shell find $(dir) -name *.cpp -o \
-		 -name $(SCM_DIRS) -prune -type f))
+                 $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \
+		  -name '*.cpp' -print))
 NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES)))
 
 # Sun compiler for 64 bit Solaris does not support building non-PIC object files.
@@ -158,7 +158,7 @@
 	@echo Compiling $<
 	$(QUIETLY) $(REMOVE_TARGET)
 	$(QUIETLY) $(if $(findstring $@, $(NONPIC_OBJ_FILES)), \
-         $(subst $(PICFLAG), ,$(COMPILE.CC)) -o $@ $< $(COMPILE_DONE), \
+         $(subst $(VM_PICFLAG), ,$(COMPILE.CC)) -o $@ $< $(COMPILE_DONE), \
          $(COMPILE.CC) -o $@ $< $(COMPILE_DONE))
 endif
 
--- a/hotspot/build/solaris/makefiles/top.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/solaris/makefiles/top.make	Fri Jun 22 00:46:43 2007 +0000
@@ -49,16 +49,24 @@
 MakeDepsClass = MakeDeps.class
 MakeDeps    = $(RUN.JAVA) -classpath . MakeDeps
 
-Include_DBs/GC          = $(VM)/includeDB_gc \
-                          $(VM)/gc_implementation/includeDB_gc_parallelScavenge \
-                          $(VM)/gc_implementation/includeDB_gc_concurrentMarkSweep \
-                          $(VM)/gc_implementation/includeDB_gc_parNew \
-                          $(VM)/gc_implementation/includeDB_gc_shared
+Include_DBs/GC     = $(VM)/includeDB_gc \
+                     $(VM)/includeDB_gc_parallel \
+                     $(VM)/gc_implementation/includeDB_gc_parallelScavenge \
+                     $(VM)/gc_implementation/includeDB_gc_concurrentMarkSweep \
+                     $(VM)/gc_implementation/includeDB_gc_parNew \
+                     $(VM)/gc_implementation/includeDB_gc_serial \
+                     $(VM)/gc_implementation/includeDB_gc_shared
 
-Include_DBs/CORE        = $(VM)/includeDB_core   $(Include_DBs/GC)   
+
+Include_DBs/CORE        = $(VM)/includeDB_core   $(Include_DBs/GC)
+Include_DBs/JKERNEL     = $(VM)/includeDB_core $(VM)/includeDB_gc \
+                          $(VM)/gc_implementation/includeDB_gc_serial \
+                          $(VM)/includeDB_compiler1
 Include_DBs/COMPILER1   = $(Include_DBs/CORE) $(VM)/includeDB_compiler1
 Include_DBs/COMPILER2   = $(Include_DBs/CORE) $(VM)/includeDB_compiler2
-Include_DBs/TIERED      = $(Include_DBs/CORE) $(VM)/includeDB_compiler1 $(VM)/includeDB_compiler2
+Include_DBs/TIERED      = $(Include_DBs/CORE) $(VM)/includeDB_compiler1 \
+                          $(VM)/includeDB_compiler2
+
 Include_DBs = $(Include_DBs/$(TYPE))
 
 Cached_plat = platform.current
--- a/hotspot/build/solaris/makefiles/vm.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/solaris/makefiles/vm.make	Fri Jun 22 00:46:43 2007 +0000
@@ -196,7 +196,7 @@
 endif
 # making the library:
 $(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) 
-	\
+	$(QUIETLY) \
 	case "$(CFLAGS_BROWSE)" in \
 	-sbfast|-xsbfast) \
 	    ;; \
--- a/hotspot/build/windows/build.bat	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/windows/build.bat	Fri Jun 22 00:46:43 2007 +0000
@@ -51,6 +51,7 @@
 
 :test1
 if "%2" == "core"      goto test2
+if "%2" == "kernel"   goto test2
 if "%2" == "compiler1" goto test2
 if "%2" == "compiler2" goto test2
 if "%2" == "tiered"    goto test2
@@ -87,7 +88,7 @@
 echo.
 echo where:
 echo flavor is "product", "debug" or "fastdebug",
-echo version is "core", "compiler1", "compiler2", or "tiered",
+echo version is "core", "kernel", "compiler1", "compiler2", or "tiered",
 echo workspace is source directory without trailing slash, 
 echo bootstrap_dir is a full path to echo a JDK in which bin/java 
 echo   and bin/javac are present and working, and echo build_id is an 
--- a/hotspot/build/windows/build.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/windows/build.make	Fri Jun 22 00:46:43 2007 +0000
@@ -94,6 +94,8 @@
 !endif
 !elseif "$(Variant)" == "tiered"
 VARIANT_TEXT=Tiered
+!elseif "$(Variant)" == "kernel"
+VARIANT_TEXT=Client
 !endif
 
 #########################################################################
@@ -250,9 +252,9 @@
 checks: checkVariant checkWorkSpace checkSA
 
 checkVariant:
-	@ if "$(Variant)"=="" echo Need to specify "Variant=[tiered|compiler2|compiler1|core]" && false
-	@ if "$(Variant)" NEQ "tiered" if "$(Variant)" NEQ "compiler2" if "$(Variant)" NEQ "compiler1" if "$(Variant)" NEQ "core" \
-          echo Need to specify "Variant=[tiered|compiler2|compiler1|core]" && false
+	@ if "$(Variant)"=="" echo Need to specify "Variant=[tiered|compiler2|compiler1|kernel|core]" && false
+	@ if "$(Variant)" NEQ "tiered" if "$(Variant)" NEQ "compiler2" if "$(Variant)" NEQ "compiler1" if "$(Variant)" NEQ "kernel" if "$(Variant)" NEQ "core" \
+          echo Need to specify "Variant=[tiered|compiler2|compiler1|kernel|core]" && false
 
 checkWorkSpace:
 	@ if "$(WorkSpace)"=="" echo Need to specify "WorkSpace=..." && false
--- a/hotspot/build/windows/create.bat	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/windows/create.bat	Fri Jun 22 00:46:43 2007 +0000
@@ -115,7 +115,7 @@
 
 REM This is now safe to do.
 :copyfiles
-for /D %%i in (compiler1, compiler2, tiered, core) do (
+for /D %%i in (compiler1, compiler2, tiered, core, kernel) do (
 if NOT EXIST %HotSpotBuildSpace%\%%i mkdir %HotSpotBuildSpace%\%%i
 copy %HotSpotWorkSpace%\build\windows\projectfiles\%%i\* %HotSpotBuildSpace%\%%i\ > NUL
 )
@@ -123,7 +123,7 @@
 REM force regneration of ProjectFile
 if exist %HotSpotBuildSpace%\%ProjectFile% del %HotSpotBuildSpace%\%ProjectFile%
 
-for /D %%i in (compiler1, compiler2, tiered, core) do (
+for /D %%i in (compiler1, compiler2, tiered, core, kernel) do (
 
 echo # Generated file!                                                 >    %HotSpotBuildSpace%\%%i\local.make
 echo # Changing a variable below and then deleting %ProjectFile% will cause  >>    %HotSpotBuildSpace%\%%i\local.make
--- a/hotspot/build/windows/makefiles/generated.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/windows/makefiles/generated.make	Fri Jun 22 00:46:43 2007 +0000
@@ -39,23 +39,40 @@
 default:: includeDB.current Dependencies $(JvmtiGeneratedFiles)
 !endif
 
-IncludeDBs=$(WorkSpace)/src/share/vm/includeDB_core $(WorkSpace)/src/share/vm/includeDB_gc $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_shared $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_parNew $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep
+# core plus serial gc
+IncludeDBs_base=$(WorkSpace)/src/share/vm/includeDB_core \
+           $(WorkSpace)/src/share/vm/includeDB_gc \
+           $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_serial
+
+# parallel gc
+IncludeDBs_gc= $(WorkSpace)/src/share/vm/includeDB_gc_parallel \
+           $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge \
+           $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_shared \
+           $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_parNew \
+           $(WorkSpace)/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep
+
+IncludeDBs_core=$(IncludeDBs_base) $(IncludeDBs_gc)
 
 !if "$(Variant)" == "core"
-IncludeDBs=$(IncludeDBs) 
+IncludeDBs=$(IncludeDBs_core)
+!endif
+
+!if "$(Variant)" == "kernel"
+IncludeDBs=$(IncludeDBs_base) $(WorkSpace)/src/share/vm/includeDB_compiler1
 !endif
 
 !if "$(Variant)" == "compiler1"
-IncludeDBs=$(IncludeDBs) $(WorkSpace)/src/share/vm/includeDB_compiler1
+IncludeDBs=$(IncludeDBs_core) $(WorkSpace)/src/share/vm/includeDB_compiler1
 !endif
 
+
 !if "$(Variant)" == "compiler2"
-IncludeDBs=$(IncludeDBs) $(WorkSpace)/src/share/vm/includeDB_compiler2
+IncludeDBs=$(IncludeDBs_core) $(WorkSpace)/src/share/vm/includeDB_compiler2
 !endif
 
 !if "$(Variant)" == "tiered"
-IncludeDBs=$(IncludeDBs) $(WorkSpace)/src/share/vm/includeDB_compiler1
-IncludeDBs=$(IncludeDBs) $(WorkSpace)/src/share/vm/includeDB_compiler2
+IncludeDBs=$(IncludeDBs_core) $(WorkSpace)/src/share/vm/includeDB_compiler1 \
+           $(WorkSpace)/src/share/vm/includeDB_compiler2
 !endif
 
 # Note we don't generate a Visual C++ project file using MakeDeps for
--- a/hotspot/build/windows/makefiles/makedeps.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/windows/makefiles/makedeps.make	Fri Jun 22 00:46:43 2007 +0000
@@ -91,7 +91,6 @@
         -disablePch        os_win32_$(ARCH).cpp \
         -disablePch        osThread_win32.cpp \
 	-disablePch        getThread_win32_$(ARCH).cpp \
-        -disablePch_compiler1     c1_RInfo_$(ARCH).cpp \
         -disablePch_compiler2     opcodes.cpp    
 
 # Common options for the IDE builds for core, c1, and c2
@@ -109,10 +108,12 @@
         -additionalFile includeDB_compiler2 \
         -additionalFile includeDB_core \
         -additionalFile includeDB_gc \
+        -additionalFile includeDB_gc_parallel \
         -additionalFile includeDB_gc_parallelScavenge \
         -additionalFile includeDB_gc_concurrentMarkSweep \
         -additionalFile includeDB_gc_parNew \
         -additionalFile includeDB_gc_shared \
+        -additionalFile includeDB_gc_serial \
         -additionalGeneratedFile $(HOTSPOTBUILDSPACE)\%f\%b vm.def \
         -prelink  "" "Generating vm.def..." "cd $(HOTSPOTBUILDSPACE)\%f\%b	$(HOTSPOTMKSHOME)\sh $(HOTSPOTWORKSPACE)\build\windows\build_vm_def.sh" \
        $(MakeDepsIncludesPRIVATE)
@@ -122,12 +123,16 @@
 MakeDepsIDEOptions=$(MakeDepsIDEOptions) -define IA32
 !endif
 
+##################################################
+# JKERNEL specific options
+##################################################
+MakeDepsIDEOptions=$(MakeDepsIDEOptions) \
+ -define_kernel KERNEL \
 
 ##################################################
 # Client(C1) compiler specific options
 ##################################################
 MakeDepsIDEOptions=$(MakeDepsIDEOptions) \
- -disablePch_compiler1 c1_RInfo_$(ARCH).cpp \
  -define_compiler1 COMPILER1 \
 
 ##################################################
--- a/hotspot/build/windows/makefiles/vm.make	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/windows/makefiles/vm.make	Fri Jun 22 00:46:43 2007 +0000
@@ -39,6 +39,10 @@
 # No need to define anything, CORE is defined as !COMPILER1 && !COMPILER2
 !endif
 
+!if "$(Variant)" == "kernel"
+CPP_FLAGS=$(CPP_FLAGS) /D "KERNEL"
+!endif
+
 !if "$(Variant)" == "compiler1"
 CPP_FLAGS=$(CPP_FLAGS) /D "COMPILER1"
 !endif
--- a/hotspot/build/windows/projectfiles/common/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/build/windows/projectfiles/common/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -46,22 +46,30 @@
 
 default:: $(AdditionalTargets) $(JvmtiGeneratedFiles)
 
-IncludeDBs_base=$(HOTSPOTWORKSPACE)/src/share/vm/includeDB_core
-IncludeDBs_base=$(IncludeDBs_base) $(HOTSPOTWORKSPACE)/src/share/vm/includeDB_gc
-IncludeDBs_base=$(IncludeDBs_base) $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge
-IncludeDBs_base=$(IncludeDBs_base) $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_shared
-IncludeDBs_base=$(IncludeDBs_base) $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_parNew
-IncludeDBs_base=$(IncludeDBs_base) $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep
+IncludeDBs_base=$(HOTSPOTWORKSPACE)/src/share/vm/includeDB_core \
+                $(HOTSPOTWORKSPACE)/src/share/vm/includeDB_gc   \
+                $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_serial
 
-IncludeDBs_core =$(IncludeDBs_base) 
+# Parallel gc files
+IncludeDBs_gc=$(HOTSPOTWORKSPACE)/src/share/vm/includeDB_gc_parallel       \
+    $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_shared \
+    $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_parNew \
+    $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge \
+    $(HOTSPOTWORKSPACE)/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep
 
-IncludeDBs_compiler1=$(IncludeDBs_base) \
+
+IncludeDBs_kernel =$(IncludeDBs_base) \
+                    $(HOTSPOTWORKSPACE)/src/share/vm/includeDB_compiler1
+
+IncludeDBs_core =$(IncludeDBs_base) $(IncludeDBs_gc) 
+
+IncludeDBs_compiler1=$(IncludeDBs_base) $(IncludeDBs_gc) \
                      $(HOTSPOTWORKSPACE)/src/share/vm/includeDB_compiler1
 
-IncludeDBs_compiler2=$(IncludeDBs_base) \
+IncludeDBs_compiler2=$(IncludeDBs_base) $(IncludeDBs_gc) \
                     $(HOTSPOTWORKSPACE)/src/share/vm/includeDB_compiler2
 
-IncludeDBs_tiered=$(IncludeDBs_base) \
+IncludeDBs_tiered=$(IncludeDBs_base) $(IncludeDBs_gc) \
                     $(HOTSPOTWORKSPACE)/src/share/vm/includeDB_compiler1 \
                     $(HOTSPOTWORKSPACE)/src/share/vm/includeDB_compiler2
 
@@ -86,6 +94,10 @@
 IncludeDBs = $(IncludeDBs_core)
 !endif
 
+!if "$(Variant)" == "kernel"
+IncludeDBs = $(IncludeDBs_kernel)
+!endif
+
 !include $(HOTSPOTWORKSPACE)/make/hotspot_version
 
 HOTSPOT_RELEASE_VERSION = $(HS_MAJOR_VER).$(HS_MINOR_VER).$(HS_MICRO_VER)
@@ -104,6 +116,7 @@
 !endif
 
 MakeDepsIDEOptions =       $(MakeDepsIDEOptions) \
+      -includeDB_kernel    $(HOTSPOTBUILDSPACE)\includeDB_kernel \
       -includeDB_core      $(HOTSPOTBUILDSPACE)\includeDB_core \
       -includeDB_compiler1 $(HOTSPOTBUILDSPACE)\includeDB_compiler1 \
       -includeDB_compiler2 $(HOTSPOTBUILDSPACE)\includeDB_compiler2 \
@@ -118,10 +131,12 @@
 
 includeDB.current $(ProjectFile) Dependencies: local.make $(HOTSPOTBUILDSPACE)/classes/MakeDeps.class \
                                                $(IncludeDBs) incls
-	@rm -f includeDB $(HOTSPOTBUILDSPACE)\includeDB_core \
+	@rm -f includeDB $(HOTSPOTBUILDSPACE)\includeDB_kernel \
+                         $(HOTSPOTBUILDSPACE)\includeDB_core \
                          $(HOTSPOTBUILDSPACE)\includeDB_compiler1 \
                          $(HOTSPOTBUILDSPACE)\includeDB_compiler2 \
                          $(HOTSPOTBUILDSPACE)\includeDB_tiered
+	@cat $(IncludeDBs_kernel) > $(HOTSPOTBUILDSPACE)\includeDB_kernel
 	@cat $(IncludeDBs_core) > $(HOTSPOTBUILDSPACE)\includeDB_core
 	@cat $(IncludeDBs_compiler1)   > $(HOTSPOTBUILDSPACE)\includeDB_compiler1
 	@cat $(IncludeDBs_compiler2)   > $(HOTSPOTBUILDSPACE)\includeDB_compiler2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/build/windows/projectfiles/kernel/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#   
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#   
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#  
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#   
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#  
+#
+
+Variant=compiler1
+!include local.make
+
+!include $(HOTSPOTWORKSPACE)/build/windows/projectfiles/common/Makefile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/build/windows/projectfiles/kernel/vm.def	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+;
+; This .DEF file is a placeholder for one which is automatically
+; generated during the build process. See
+; build\windows\build_vm_def.sh and
+; build\windows\makefiles\makedeps.make (esp. the "-prelink"
+; options).
+;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/build/windows/projectfiles/kernel/vm.dsw	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "vm"=.\vm.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- a/hotspot/src/cpu/amd64/vm/amd64.ad	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/amd64.ad	Fri Jun 22 00:46:43 2007 +0000
@@ -1267,19 +1267,20 @@
         // 64-bit
         int offset = ra_->reg2offset(src_first);
         if (cbuf) {
-          emit_opcode(*cbuf, 0x66);
+          emit_opcode(*cbuf, UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
           if (Matcher::_regEncode[dst_first] >= 8) {
             emit_opcode(*cbuf, Assembler::REX_R);
           }
           emit_opcode(*cbuf, 0x0F);
-          emit_opcode(*cbuf, 0x12);
+          emit_opcode(*cbuf, UseXmmLoadAndClearUpper ? 0x10 : 0x12);
           encode_RegMem(*cbuf, 
                         Matcher::_regEncode[dst_first], 
                         RSP_enc, 0x4, 0, offset,
                         false);
 #ifndef PRODUCT
         } else if (!do_size) {
-          tty->print("movlpd  %s, [rsp + #%d]\t# spill", 
+          tty->print("%s  %s, [rsp + #%d]\t# spill", 
+                     UseXmmLoadAndClearUpper ? "movsd " : "movlpd",
                      Matcher::regName[dst_first],
                      offset);
 #endif
@@ -1637,7 +1638,7 @@
           (dst_first & 1) == 0 && dst_first + 1 == dst_second) {
         // 64-bit
         if (cbuf) {
-          emit_opcode(*cbuf, 0xF2);
+          emit_opcode(*cbuf, UseXmmRegToRegMoveAll ? 0x66 : 0xF2);
           if (Matcher::_regEncode[dst_first] < 8) {
             if (Matcher::_regEncode[src_first] >= 8) {
               emit_opcode(*cbuf, Assembler::REX_B);
@@ -1650,13 +1651,14 @@
             }
           }
           emit_opcode(*cbuf, 0x0F);
-          emit_opcode(*cbuf, 0x10);
+          emit_opcode(*cbuf, UseXmmRegToRegMoveAll ? 0x28 : 0x10);
           emit_rm(*cbuf, 0x3,
                   Matcher::_regEncode[dst_first] & 7,
                   Matcher::_regEncode[src_first] & 7);
 #ifndef PRODUCT
         } else if (!do_size) {
-          tty->print("movsd   %s, %s\t# spill", 
+          tty->print("%s  %s, %s\t# spill", 
+                     UseXmmRegToRegMoveAll ? "movapd" : "movsd ",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
@@ -1670,7 +1672,8 @@
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
         assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform");
         if (cbuf) {
-          emit_opcode(*cbuf, 0xF3);
+          if (!UseXmmRegToRegMoveAll) 
+            emit_opcode(*cbuf, 0xF3);
           if (Matcher::_regEncode[dst_first] < 8) {
             if (Matcher::_regEncode[src_first] >= 8) {
               emit_opcode(*cbuf, Assembler::REX_B);
@@ -1683,21 +1686,22 @@
             }
           }
           emit_opcode(*cbuf, 0x0F);
-          emit_opcode(*cbuf, 0x10);
+          emit_opcode(*cbuf, UseXmmRegToRegMoveAll ? 0x28 : 0x10);
           emit_rm(*cbuf, 0x3,
                   Matcher::_regEncode[dst_first] & 7,
                   Matcher::_regEncode[src_first] & 7);
 #ifndef PRODUCT
         } else if (!do_size) {
-          tty->print("movss   %s, %s\t# spill", 
+          tty->print("%s  %s, %s\t# spill", 
+                     UseXmmRegToRegMoveAll ? "movaps" : "movss ",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
         return 
           (Matcher::_regEncode[src_first] < 8 && Matcher::_regEncode[dst_first] < 8)
-          ? 4
-          : 5; // REX
+          ? (UseXmmRegToRegMoveAll ? 3 : 4)
+          : (UseXmmRegToRegMoveAll ? 4 : 5); // REX
       }
     }
   }    
@@ -2461,9 +2465,11 @@
   %{
     // Invert sense of branch from sense of cmov
     emit_cc(cbuf, 0x70, $cop$$cmpcode ^ 1);
-    emit_d8(cbuf, $dst$$reg < 8 && $src$$reg < 8 ? 4 : 5); // REX
-
-    emit_opcode(cbuf, 0xF3);
+    emit_d8(cbuf, ($dst$$reg < 8 && $src$$reg < 8)
+                  ? (UseXmmRegToRegMoveAll ? 3 : 4)
+                  : (UseXmmRegToRegMoveAll ? 4 : 5) ); // REX
+    // UseXmmRegToRegMoveAll ? movaps(dst, src) : movss(dst, src)
+    if (!UseXmmRegToRegMoveAll) emit_opcode(cbuf, 0xF3);
     if ($dst$$reg < 8) {
       if ($src$$reg >= 8) {
         emit_opcode(cbuf, Assembler::REX_B);
@@ -2476,7 +2482,7 @@
       }
     }
     emit_opcode(cbuf, 0x0F);
-    emit_opcode(cbuf, 0x10);
+    emit_opcode(cbuf, UseXmmRegToRegMoveAll ? 0x28 : 0x10);
     emit_rm(cbuf, 0x3, $dst$$reg & 7, $src$$reg & 7);
   %}
 
@@ -2486,7 +2492,8 @@
     emit_cc(cbuf, 0x70, $cop$$cmpcode ^ 1);
     emit_d8(cbuf, $dst$$reg < 8 && $src$$reg < 8 ? 4 : 5); // REX
 
-    emit_opcode(cbuf, 0xF2);
+    //  UseXmmRegToRegMoveAll ? movapd(dst, src) : movsd(dst, src)
+    emit_opcode(cbuf, UseXmmRegToRegMoveAll ? 0x66 : 0xF2);
     if ($dst$$reg < 8) {
       if ($src$$reg >= 8) {
         emit_opcode(cbuf, Assembler::REX_B);
@@ -2499,7 +2506,7 @@
       }
     }
     emit_opcode(cbuf, 0x0F);
-    emit_opcode(cbuf, 0x10);
+    emit_opcode(cbuf, UseXmmRegToRegMoveAll ? 0x28 : 0x10);
     emit_rm(cbuf, 0x3, $dst$$reg & 7, $src$$reg & 7);
   %}
 
@@ -2736,6 +2743,29 @@
     emit_double_constant(cbuf, $con$$constant);
   %}
 
+  enc_class load_conF (regF dst, immF con) %{    // Load float constant
+    emit_opcode(cbuf, 0xF3);
+    if ($dst$$reg >= 8) {
+      emit_opcode(cbuf, Assembler::REX_R);
+    }
+    emit_opcode(cbuf, 0x0F);
+    emit_opcode(cbuf, 0x10);
+    emit_rm(cbuf, 0x0, $dst$$reg & 7, 0x5); // 00 reg 101
+    emit_float_constant(cbuf, $con$$constant);
+  %}
+
+  enc_class load_conD (regD dst, immD con) %{    // Load double constant
+    // UseXmmLoadAndClearUpper ? movsd(dst, con) : movlpd(dst, con)
+    emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
+    if ($dst$$reg >= 8) {
+      emit_opcode(cbuf, Assembler::REX_R);
+    }
+    emit_opcode(cbuf, 0x0F);
+    emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0x10 : 0x12);
+    emit_rm(cbuf, 0x0, $dst$$reg & 7, 0x5); // 00 reg 101
+    emit_double_constant(cbuf, $con$$constant);
+  %}
+
   // Encode a reg-reg copy.  If it is useless, then empty encoding.
   enc_class enc_copy(rRegI dst, rRegI src)
   %{
@@ -3273,13 +3303,13 @@
 
     store_to_stackslot( cbuf, 0xDD, 0x03, 0 ); //FSTP [RSP]
 
-    // movlpd dst,[rsp]
-    emit_opcode  (cbuf, 0x66);
+    // UseXmmLoadAndClearUpper ? movsd dst,[rsp] : movlpd dst,[rsp]
+    emit_opcode  (cbuf, UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
     if (dstenc >= 8) {
       emit_opcode(cbuf, Assembler::REX_R);
     }
     emit_opcode  (cbuf, 0x0F );
-    emit_opcode  (cbuf, 0x12 );
+    emit_opcode  (cbuf, UseXmmLoadAndClearUpper ? 0x10 : 0x12 );
     encode_RegMem(cbuf, dstenc, RSP_enc, 0x4, 0, 0, false);
 
     // add rsp,8
@@ -5766,8 +5796,9 @@
 %}
 
 // Load Double
-instruct loadD(regD dst, memory mem)
-%{
+instruct loadD_partial(regD dst, memory mem)
+%{
+  predicate(!UseXmmLoadAndClearUpper);
   match(Set dst (LoadD mem));
 
   ins_cost(145); // XXX
@@ -5777,6 +5808,18 @@
   ins_pipe(pipe_slow); // XXX
 %}
 
+instruct loadD(regD dst, memory mem)
+%{
+  predicate(UseXmmLoadAndClearUpper);
+  match(Set dst (LoadD mem));
+
+  ins_cost(145); // XXX
+  format %{ "movsd   $dst, $mem\t# double" %}
+  opcode(0xF2, 0x0F, 0x10);
+  ins_encode(OpcP, REX_reg_mem(dst, mem), OpcS, OpcT, reg_mem(dst, mem));
+  ins_pipe(pipe_slow); // XXX
+%}
+
 // Load Effective Address
 instruct leaP8(rRegP dst, indOffset8 mem) 
 %{
@@ -5934,8 +5977,7 @@
   ins_cost(125);
 
   format %{ "movss   $dst, [$src]" %}
-  opcode(0xF3, 0x0F, 0x10);
-  ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immF(dst, src));
+  ins_encode(load_conF(dst, src));
   ins_pipe(pipe_slow);
 %}
 
@@ -5950,14 +5992,14 @@
   ins_pipe(pipe_slow);
 %}
 
+// Use the same format since predicate() can not be used here.
 instruct loadConD(regD dst, immD src) 
 %{
   match(Set dst src);
   ins_cost(125);
 
-  format %{ "movlpd  $dst, [$src]" %}
-  opcode(0x66, 0x0F, 0x12);
-  ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, load_immD(dst, src));
+  format %{ "movsd   $dst, [$src]" %}
+  ins_encode(load_conD(dst, src));
   ins_pipe(pipe_slow);
 %}
 
@@ -6016,14 +6058,16 @@
   ins_pipe(pipe_slow); // XXX
 %}
 
+// Use the same format since predicate() can not be used here.
 instruct loadSSD(regD dst, stackSlotD src)
 %{
   match(Set dst src);
 
   ins_cost(125);
-  format %{ "movlpd  $dst, $src\t# double stk" %}
-  opcode(0x66, 0x0F, 0x12);
-  ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, reg_mem(dst, src));
+  format %{ "movsd   $dst, $src\t# double stk" %}
+  ins_encode  %{
+    __ movdbl($dst$$FloatRegister, Address(rsp, $src$$disp));
+  %}
   ins_pipe(pipe_slow); // XXX
 %}
 
@@ -9985,7 +10029,8 @@
   ins_pipe(ialu_reg_mem);
 %}
 
-instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{
+instruct MoveL2D_stack_reg_partial(regD dst, stackSlotL src) %{
+  predicate(!UseXmmLoadAndClearUpper);
   match(Set dst (MoveL2D src));
   effect(DEF dst, USE src);
 
@@ -9996,6 +10041,18 @@
   ins_pipe(pipe_slow);
 %}
 
+instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{
+  predicate(UseXmmLoadAndClearUpper);
+  match(Set dst (MoveL2D src));
+  effect(DEF dst, USE src);
+
+  ins_cost(125);
+  format %{ "movsd   $dst, $src\t# MoveL2D_stack_reg" %}
+  opcode(0xF2, 0x0F, 0x10);
+  ins_encode(OpcP, REX_reg_mem(dst, src), OpcS, OpcT, reg_mem(dst, src));
+  ins_pipe(pipe_slow);
+%}
+
 
 instruct MoveF2I_reg_stack(stackSlotI dst, regF src) %{
   match(Set dst (MoveF2I src));
--- a/hotspot/src/cpu/amd64/vm/assembler_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/assembler_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)assembler_amd64.cpp	1.56 07/05/17 15:39:38 JVM"
+#pragma ident "@(#)assembler_amd64.cpp	1.57 07/06/08 18:13:29 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -562,15 +562,15 @@
 
   case 0x0F: // movx..., etc.
     switch (0xFF & *ip++) {
+    case 0x12: // movlps
+    case 0x28: // movaps
     case 0x2E: // ucomiss
     case 0x2F: // comiss
+    case 0x54: // andps
     case 0x57: // xorps
-    case 0x54: // andps
-    case 0x12: // movlpd
     case 0x6E: // movd
     case 0x7E: // movd
     case 0xAE: // ldmxcsr   a
-    case 0xD6: // movq
       debug_only(has_disp32 = true); // has both kinds of operands!
       break;
     case 0xAD: // shrd r, a, %cl
@@ -1853,11 +1853,10 @@
   emit_byte(0xC0 | dstenc << 3 | srcenc);
 }
 
-// Optimization guide recommends using movlpd instead of movsd for this case
-void Assembler::movlpd(FloatRegister dst, Address src)
+void Assembler::movsd(FloatRegister dst, Address src)
 {
   InstructionMark im(this);
-  emit_byte(0x66);
+  emit_byte(0xF2);
   if (dst->encoding() < 8) {
     if (src.base_needs_rex()) {
       if (src.index_needs_rex()) {
@@ -1886,7 +1885,7 @@
     }
   }
   emit_byte(0x0F);
-  emit_byte(0x12);
+  emit_byte(0x10);
   emit_operand(dst, src);
 }
 
@@ -1926,6 +1925,92 @@
   emit_operand(src, dst);
 }
 
+// New cpus require to use movsd and movss to avoid partial register stall
+// when loading from memory. But for old Opteron use movlpd instead of movsd.
+// The selection is done in MacroAssembler::movdbl() and movflt().
+void Assembler::movlpd(FloatRegister dst, Address src)
+{
+  InstructionMark im(this);
+  emit_byte(0x66);
+  if (dst->encoding() < 8) {
+    if (src.base_needs_rex()) {
+      if (src.index_needs_rex()) {
+        prefix(REX_XB);
+      } else {
+        prefix(REX_B);
+      }
+    } else {
+      if (src.index_needs_rex()) {
+        prefix(REX_X);
+      }
+    }
+  } else {
+    if (src.base_needs_rex()) {
+      if (src.index_needs_rex()) {
+        prefix(REX_RXB);
+      } else {
+        prefix(REX_RB);
+      }
+    } else {
+      if (src.index_needs_rex()) {
+        prefix(REX_RX);
+      } else {
+        prefix(REX_R);
+      }
+    }
+  }
+  emit_byte(0x0F);
+  emit_byte(0x12);
+  emit_operand(dst, src);
+}
+
+void Assembler::movapd(FloatRegister dst, FloatRegister src)
+{
+  int dstenc = dst->encoding();
+  int srcenc = src->encoding();
+  emit_byte(0x66);
+  if (dstenc < 8) {
+    if (srcenc >= 8) {
+      prefix(REX_B);
+      srcenc -= 8;
+    }
+  } else {
+    if (srcenc < 8) {
+      prefix(REX_R);
+    } else {
+      prefix(REX_RB);
+      srcenc -= 8;
+    }
+    dstenc -= 8;
+  }
+  emit_byte(0x0F);
+  emit_byte(0x28);
+  emit_byte(0xC0 | dstenc << 3 | srcenc);
+}
+
+void Assembler::movaps(FloatRegister dst, FloatRegister src)
+{
+  int dstenc = dst->encoding();
+  int srcenc = src->encoding();
+  if (dstenc < 8) {
+    if (srcenc >= 8) {
+      prefix(REX_B);
+      srcenc -= 8;
+    }
+  } else {
+    if (srcenc < 8) {
+      prefix(REX_R);
+    } else {
+      prefix(REX_RB);
+      srcenc -= 8;
+    }
+    dstenc -= 8;
+  }
+  emit_byte(0x0F);
+  emit_byte(0x28);
+  emit_byte(0xC0 | dstenc << 3 | srcenc);
+}
+
 void Assembler::movdl(FloatRegister dst, Register src)
 {
   int dstenc = dst->encoding();
--- a/hotspot/src/cpu/amd64/vm/assembler_amd64.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/assembler_amd64.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)assembler_amd64.hpp	1.40 07/05/17 15:39:42 JVM"
+#pragma ident "@(#)assembler_amd64.hpp	1.41 07/06/13 16:23:17 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -455,13 +455,22 @@
   void movzwl(Register dst, Address src);
   void movzwl(Register dst, Register src);
 
+ protected: // Avoid using the next instructions directly.
+  // New cpus require use of movsd and movss to avoid partial register stall
+  // when loading from memory. But for old Opteron use movlpd instead of movsd.
+  // The selection is done in MacroAssembler::movdbl() and movflt().
   void movss(FloatRegister dst, FloatRegister src);
   void movss(FloatRegister dst, Address src);
   void movss(Address dst, FloatRegister src);
   void movsd(FloatRegister dst, FloatRegister src);
-  // Optimization guide recommends using movlpd instead of movsd for this case
+  void movsd(Address dst, FloatRegister src);
+  void movsd(FloatRegister dst, Address src);
   void movlpd(FloatRegister dst, Address src);
-  void movsd(Address dst, FloatRegister src);
+  // New cpus require use of movaps and movapd to avoid partial register stall
+  // when moving between registers.
+  void movapd(FloatRegister dst, FloatRegister src);
+  void movaps(FloatRegister dst, FloatRegister src);
+ public:
 
   void movdl(FloatRegister dst, Register src);
   void movdl(Register dst, FloatRegister src);
@@ -906,6 +915,24 @@
   void incrementq(Address dst, int value = 1);
   void decrementq(Address dst, int value = 1);
 
+  // Support optimal SSE move instructions.
+  void movflt(FloatRegister dst, FloatRegister src) {
+    if (UseXmmRegToRegMoveAll) { movaps(dst, src); return; }
+    else                       { movss (dst, src); return; }
+  }
+  void movflt(FloatRegister dst, Address src) { movss(dst, src); }
+  void movflt(Address dst, FloatRegister src) { movss(dst, src); }
+
+  void movdbl(FloatRegister dst, FloatRegister src) {
+    if (UseXmmRegToRegMoveAll) { movapd(dst, src); return; }
+    else                       { movsd (dst, src); return; }
+  }
+  void movdbl(FloatRegister dst, Address src) {
+    if (UseXmmLoadAndClearUpper) { movsd (dst, src); return; }
+    else                         { movlpd(dst, src); return; }
+  }
+  void movdbl(Address dst, FloatRegister src) { movsd(dst, src); }
+
   // Alignment
   void align(int modulus);
 
@@ -1041,6 +1068,7 @@
                        Assembler::movzwl(dst, Address(rscratch1));
   }
 
+private:
   void movss(FloatRegister dst, Address src)
   { 
     check_reach(src) ? Assembler::movss(dst, src) :
@@ -1056,12 +1084,18 @@
     check_reach(src) ? Assembler::movlpd(dst, src) :
                        Assembler::movlpd(dst, Address(rscratch1));
   }
+  void movsd(FloatRegister dst, Address src)
+  { 
+    check_reach(src) ? Assembler::movsd(dst, src) :
+                       Assembler::movsd(dst, Address(rscratch1));
+  }
   void movsd(Address dst, FloatRegister src)
   { 
     check_reach(dst) ? Assembler::movsd(dst, src) :
                        Assembler::movsd(Address(rscratch1), src);
   }
 
+public:
   void cmovl(Condition cc, Register dst, Address src)
   { 
     check_reach(src) ? Assembler::cmovl(cc, dst, src) :
@@ -1464,8 +1498,11 @@
   void movslq(Register dst, Register src)   { Assembler::movslq(dst, src); }
   void movzbl(Register dst, Register src)   { Assembler::movzbl(dst, src); }
   void movzwl(Register dst, Register src)   { Assembler::movzwl(dst, src); }
+private:
   void movss(FloatRegister dst, FloatRegister src) { Assembler::movss(dst, src); }
   void movsd(FloatRegister dst, FloatRegister src) { Assembler::movsd(dst, src); }
+
+public:
   void movdl(FloatRegister dst, Register src) { Assembler::movdl(dst, src); }
   void movdl(Register dst, FloatRegister src) { Assembler::movdl(dst, src); }
   void movdq(FloatRegister dst, Register src) { Assembler::movdq(dst, src); }
--- a/hotspot/src/cpu/amd64/vm/interp_masm_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/interp_masm_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)interp_masm_amd64.cpp	1.42 07/05/17 15:39:48 JVM"
+#pragma ident "@(#)interp_masm_amd64.cpp	1.44 07/06/08 18:13:30 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -143,8 +143,8 @@
     case ctos:                                   // fall through
     case stos:                                   // fall through
     case itos: movl(rax, val_addr);                 break;
-    case ftos: movss (xmm0, val_addr);              break;
-    case dtos: movlpd(xmm0, val_addr);              break;
+    case ftos: movflt(xmm0, val_addr);              break;
+    case dtos: movdbl(xmm0, val_addr);              break;
     case vtos: /* nothing to do */                  break;
     default  : ShouldNotReachHere();
   }
@@ -339,14 +339,14 @@
 
 void InterpreterMacroAssembler::pop_f(FloatRegister r) {
   debug_only(verify_stack_tag(frame::TagValue));
-  movss(r, Address(rsp));
+  movflt(r, Address(rsp));
   addq(rsp, wordSize);
   if (TaggedStackInterpreter) addq(rsp, 1 * wordSize);
 }
 
 void InterpreterMacroAssembler::pop_d(FloatRegister r) {
   debug_only(verify_stack_tag(frame::TagCategory2));
-  movlpd(r, Address(rsp));
+  movdbl(r, Address(rsp));
   addq(rsp, 2 * Interpreter::stackElementSize());
 }
 
@@ -380,7 +380,7 @@
 void InterpreterMacroAssembler::push_f(FloatRegister r) {
   if (TaggedStackInterpreter) pushq(frame::TagValue);
   subq(rsp, wordSize);
-  movss(Address(rsp), r);
+  movflt(Address(rsp), r);
 }
 
 void InterpreterMacroAssembler::push_d(FloatRegister r) {
@@ -392,7 +392,7 @@
   } else {
     subq(rsp, 2 * wordSize);
   }
-  movsd(Address(rsp), r);
+  movdbl(Address(rsp), r);
 }
 
 void InterpreterMacroAssembler::pop(TosState state) {
@@ -1477,8 +1477,6 @@
     // If no method data exists, go to profile_continue.
     test_method_data_pointer(mdp, profile_continue);
 
-    set_mdp_flag_at(mdp, BitData::null_seen_byte_constant());
-
     // The method data pointer needs to be updated.
     int mdp_delta = in_bytes(BitData::bit_data_size());
     if (TypeProfileCasts) {
--- a/hotspot/src/cpu/amd64/vm/interpreterRT_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/interpreterRT_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)interpreterRT_amd64.cpp	1.22 07/05/05 17:04:07 JVM"
+#pragma ident "@(#)interpreterRT_amd64.cpp	1.23 07/06/08 18:13:30 JVM"
 #endif
 /*
  * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -153,7 +153,7 @@
 
 #ifdef _WIN64
   if (_num_args < Argument::n_float_register_parameters_c-1) {
-    __ movss(as_FloatRegister(++_num_args), src);
+    __ movflt(as_FloatRegister(++_num_args), src);
   } else {
     __ movl(rax, src);
     __ movl(Address(to(), _stack_offset), rax);
@@ -161,7 +161,7 @@
   }
 #else
   if (_num_fp_args < Argument::n_float_register_parameters_c) {
-    __ movss(as_FloatRegister(_num_fp_args++), src);
+    __ movflt(as_FloatRegister(_num_fp_args++), src);
   } else {
     __ movl(rax, src);
     __ movl(Address(to(), _stack_offset), rax);
@@ -176,7 +176,7 @@
 
 #ifdef _WIN64
   if (_num_args < Argument::n_float_register_parameters_c-1) {
-    __ movlpd(as_FloatRegister(++_num_args), src);
+    __ movdbl(as_FloatRegister(++_num_args), src);
   } else {
     __ movq(rax, src);
     __ movq(Address(to(), _stack_offset), rax);
@@ -184,7 +184,7 @@
   }
 #else
   if (_num_fp_args < Argument::n_float_register_parameters_c) {
-    __ movlpd(as_FloatRegister(_num_fp_args++), src);
+    __ movdbl(as_FloatRegister(_num_fp_args++), src);
   } else {
     __ movq(rax, src);
     __ movq(Address(to(), _stack_offset), rax);
--- a/hotspot/src/cpu/amd64/vm/interpreter_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/interpreter_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)interpreter_amd64.cpp	1.62 07/05/17 15:39:52 JVM"
+#pragma ident "@(#)interpreter_amd64.cpp	1.63 07/06/08 18:13:30 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -309,12 +309,12 @@
     __ jcc(Assembler::notZero, isdouble);
 
 // Do Float Here
-    __ movss(floatreg, Address(rsp, i * wordSize));
+    __ movflt(floatreg, Address(rsp, i * wordSize));
     __ jmp(next);
 
 // Do Double here
     __ bind(isdouble);
-    __ movlpd(floatreg, Address(rsp, i * wordSize));
+    __ movdbl(floatreg, Address(rsp, i * wordSize));
 
     __ bind(next);
   }
@@ -366,10 +366,10 @@
     
     __ testl(c_rarg3, 1 << i);
     __ jcc(Assembler::notZero, d);
-    __ movss(r, Address(rsp, (6 + i) * wordSize));
+    __ movflt(r, Address(rsp, (6 + i) * wordSize));
     __ jmp(done);
     __ bind(d);
-    __ movlpd(r, Address(rsp, (6 + i) * wordSize));
+    __ movdbl(r, Address(rsp, (6 + i) * wordSize));
     __ bind(done);
   }
 
@@ -2083,7 +2083,7 @@
   __ pushq(c_rarg3);
   __ movq(c_rarg2, rax);  // Pass itos
 #ifdef _WIN64
-  __ movss(xmm3, xmm0); // Pass ftos 
+  __ movflt(xmm3, xmm0); // Pass ftos 
 #endif
   __ call_VM(noreg,
              CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode),
--- a/hotspot/src/cpu/amd64/vm/jniFastGetField_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/jniFastGetField_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)jniFastGetField_amd64.cpp	1.11 07/05/05 17:04:07 JVM"
+#pragma ident "@(#)jniFastGetField_amd64.cpp	1.12 07/06/08 18:13:31 JVM"
 #endif
 /*
  * Copyright 2004-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -184,8 +184,8 @@
   assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
   speculative_load_pclist[count] = __ pc();
   switch (type) {
-    case T_FLOAT:  __ movss  (xmm0, Address(robj, roffset, Address::times_1)); break;
-    case T_DOUBLE: __ movlpd (xmm0, Address(robj, roffset, Address::times_1)); break;
+    case T_FLOAT:  __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break;
+    case T_DOUBLE: __ movdbl (xmm0, Address(robj, roffset, Address::times_1)); break;
     default:        ShouldNotReachHere();
   }
 
--- a/hotspot/src/cpu/amd64/vm/sharedRuntime_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/sharedRuntime_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)sharedRuntime_amd64.cpp	1.39 07/05/17 15:39:55 JVM"
+#pragma ident "@(#)sharedRuntime_amd64.cpp	1.40 07/06/08 18:13:31 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -286,7 +286,7 @@
   // restoration so only result registers need to be restored here.
 
   // Restore fp result register
-  __ movlpd(xmm0, Address(rsp, xmm0_offset_in_bytes()));
+  __ movdbl(xmm0, Address(rsp, xmm0_offset_in_bytes()));
   // Restore integer result register
   __ movq(rax, Address(rsp, rax_offset_in_bytes()));
   // Pop all of the register save are off the stack except the return address
@@ -593,7 +593,7 @@
       assert(r_1->is_FloatRegister(), "");
       if (!r_2->is_valid()) {
         // only a float use just part of the slot
-        __ movss(Address(rsp, st_off), r_1->as_FloatRegister());
+        __ movflt(Address(rsp, st_off), r_1->as_FloatRegister());
         tag_stack(masm, sig_bt[i], st_off);
       } else {
 #ifdef ASSERT
@@ -601,7 +601,7 @@
         __ movq(rax, CONST64(0xdeadffffdeadaaac));
         __ movq(Address(rsp, st_off), rax);
 #endif /* ASSERT */
-        __ movsd(Address(rsp, next_off), r_1->as_FloatRegister());
+        __ movdbl(Address(rsp, next_off), r_1->as_FloatRegister());
         tag_stack(masm, sig_bt[i], next_off);
       }
     }
@@ -738,9 +738,9 @@
       }
     } else {
       if (!r_2->is_valid()) {
-        __ movss(r_1->as_FloatRegister(), Address(r13, ld_off));
+        __ movflt(r_1->as_FloatRegister(), Address(r13, ld_off));
       } else {
-        __ movlpd(r_1->as_FloatRegister(), Address(r13, next_off));
+        __ movdbl(r_1->as_FloatRegister(), Address(r13, next_off));
       }
     }
   }
@@ -1053,17 +1053,17 @@
     } else {
       // stack to reg
       assert(dst.first()->is_FloatRegister(), "only expect xmm registers as parameters");
-      __ movss(dst.first()->as_FloatRegister(), Address(rbp, reg2offset_in(src.first())));
+      __ movflt(dst.first()->as_FloatRegister(), Address(rbp, reg2offset_in(src.first())));
     }
   } else if (dst.first()->is_stack()) {
     // reg to stack
     assert(src.first()->is_FloatRegister(), "only expect xmm registers as parameters");
-    __ movss(Address(rsp, reg2offset_out(dst.first())), src.first()->as_FloatRegister());
+    __ movflt(Address(rsp, reg2offset_out(dst.first())), src.first()->as_FloatRegister());
   } else {
     // reg to reg
     // In theory these overlap but the ordering is such that this is likely a nop
     if ( src.first() != dst.first()) {
-      __ movsd(dst.first()->as_FloatRegister(),  src.first()->as_FloatRegister());
+      __ movdbl(dst.first()->as_FloatRegister(),  src.first()->as_FloatRegister());
     }
   }
 }
@@ -1105,15 +1105,15 @@
     if (dst.is_single_phys_reg()) {
       // In theory these overlap but the ordering is such that this is likely a nop
       if ( src.first() != dst.first()) {
-        __ movsd(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister());
+        __ movdbl(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister());
       }
     } else {
       assert(dst.is_single_reg(), "not a stack pair");
-      __ movsd(Address(rsp, reg2offset_out(dst.first())), src.first()->as_FloatRegister());
+      __ movdbl(Address(rsp, reg2offset_out(dst.first())), src.first()->as_FloatRegister());
     }
   } else if (dst.is_single_phys_reg()) {
     assert(src.is_single_reg(),  "not a stack pair");
-    __ movlpd(dst.first()->as_FloatRegister(), Address(rbp, reg2offset_out(src.first())));
+    __ movdbl(dst.first()->as_FloatRegister(), Address(rbp, reg2offset_out(src.first())));
   } else {
     assert(src.is_single_reg() && dst.is_single_reg(), "not stack pairs");
     __ movq(rax, Address(rbp, reg2offset_in(src.first())));
@@ -1127,10 +1127,10 @@
   // which by this time is free to use
   switch (ret_type) {
   case T_FLOAT:
-    __ movss(Address(rbp, -wordSize), xmm0);
+    __ movflt(Address(rbp, -wordSize), xmm0);
     break;
   case T_DOUBLE:
-    __ movsd(Address(rbp, -wordSize), xmm0);
+    __ movdbl(Address(rbp, -wordSize), xmm0);
     break;
   case T_VOID:  break;
   default: {
@@ -1144,10 +1144,10 @@
   // which by this time is free to use
   switch (ret_type) {
   case T_FLOAT:
-    __ movss(xmm0, Address(rbp, -wordSize));
+    __ movflt(xmm0, Address(rbp, -wordSize));
     break;
   case T_DOUBLE:
-    __ movlpd(xmm0, Address(rbp, -wordSize));
+    __ movdbl(xmm0, Address(rbp, -wordSize));
     break;
   case T_VOID:  break;
   default: {
@@ -1162,7 +1162,7 @@
         __ pushq(args[i].first()->as_Register());
       } else if (args[i].first()->is_FloatRegister()) {
         __ subq(rsp, 2*wordSize);
-        __ movsd(Address(rsp, 0), args[i].first()->as_FloatRegister());
+        __ movdbl(Address(rsp, 0), args[i].first()->as_FloatRegister());
       }
     }
 }
@@ -1172,7 +1172,7 @@
       if (args[i].first()->is_Register()) {
         __ popq(args[i].first()->as_Register());
       } else if (args[i].first()->is_FloatRegister()) {
-        __ movlpd(args[i].first()->as_FloatRegister(), Address(rsp, 0));
+        __ movdbl(args[i].first()->as_FloatRegister(), Address(rsp, 0));
         __ addq(rsp, 2*wordSize);
       }
     }
@@ -2091,7 +2091,7 @@
   __ subq(rsp, (frame_size_in_words - 2) * wordSize);
 
   // Restore frame locals after moving the frame
-  __ movsd(Address(rsp, RegisterSaver::xmm0_offset_in_bytes()), xmm0);
+  __ movdbl(Address(rsp, RegisterSaver::xmm0_offset_in_bytes()), xmm0);
   __ movq(Address(rsp, RegisterSaver::rax_offset_in_bytes()), rax);
 
   // Call C code.  Need thread but NOT official VM entry
@@ -2115,7 +2115,7 @@
   __ reset_last_Java_frame(true, false);
 
   // Collect return values
-  __ movlpd(xmm0, Address(rsp, RegisterSaver::xmm0_offset_in_bytes()));
+  __ movdbl(xmm0, Address(rsp, RegisterSaver::xmm0_offset_in_bytes()));
   __ movq(rax, Address(rsp, RegisterSaver::rax_offset_in_bytes()));
 
   // Pop self-frame.
--- a/hotspot/src/cpu/amd64/vm/stubGenerator_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/stubGenerator_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)stubGenerator_amd64.cpp	1.41 07/05/17 15:40:00 JVM"
+#pragma ident "@(#)stubGenerator_amd64.cpp	1.42 07/06/08 18:13:31 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -365,11 +365,11 @@
     __ jmp(exit);
 
     __ BIND(is_float);
-    __ movss(Address(c_rarg0), xmm0);
+    __ movflt(Address(c_rarg0), xmm0);
     __ jmp(exit);
 
     __ BIND(is_double);
-    __ movsd(Address(c_rarg0), xmm0);
+    __ movdbl(Address(c_rarg0), xmm0);
     __ jmp(exit);
 
     return start;
--- a/hotspot/src/cpu/amd64/vm/templateTable_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/templateTable_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)templateTable_amd64.cpp	1.54 07/05/17 15:45:52 JVM"
+#pragma ident "@(#)templateTable_amd64.cpp	1.55 07/06/08 18:13:32 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -232,10 +232,10 @@
     __ xorps(xmm0, xmm0);
     break;
   case 1:
-    __ movss(xmm0, Address((address) &one, relocInfo::none));
+    __ movflt(xmm0, Address((address) &one, relocInfo::none));
     break;
   case 2:
-    __ movss(xmm0, Address((address) &two, relocInfo::none));
+    __ movflt(xmm0, Address((address) &two, relocInfo::none));
     break;
   default:
     ShouldNotReachHere();
@@ -252,7 +252,7 @@
     __ xorpd(xmm0, xmm0);
     break;
   case 1:
-    __ movlpd(xmm0, Address((address) &one, relocInfo::none));
+    __ movdbl(xmm0, Address((address) &one, relocInfo::none));
     break;
   default:
     ShouldNotReachHere();
@@ -320,7 +320,7 @@
   __ cmpl(rdx, JVM_CONSTANT_Float);
   __ jccb(Assembler::notEqual, notFloat);
   // ftos
-  __ movss(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
+  __ movflt(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
   __ push_f();
   __ jmp(Done);
 
@@ -370,7 +370,7 @@
           JVM_CONSTANT_Double);
   __ jccb(Assembler::notEqual, Long);
   // dtos
-  __ movlpd(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
+  __ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
   __ push_d();
   __ jmpb(Done);
 
@@ -462,7 +462,7 @@
 {
   transition(vtos, ftos);
   locals_index(rbx);
-  __ movss(xmm0, faddress(rbx));
+  __ movflt(xmm0, faddress(rbx));
   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 }
 
@@ -470,7 +470,7 @@
 {
   transition(vtos, dtos);
   locals_index(rbx);
-  __ movlpd(xmm0, daddress(rbx));
+  __ movdbl(xmm0, daddress(rbx));
   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 }
 
@@ -511,7 +511,7 @@
 {
   transition(vtos, ftos);
   locals_index_wide(rbx);
-  __ movss(xmm0, faddress(rbx));
+  __ movflt(xmm0, faddress(rbx));
   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 }
 
@@ -519,7 +519,7 @@
 {
   transition(vtos, dtos);
   locals_index_wide(rbx);
-  __ movlpd(xmm0, daddress(rbx));
+  __ movdbl(xmm0, daddress(rbx));
   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 }
 
@@ -581,7 +581,7 @@
   // eax: index
   // rdx: array
   index_check(rdx, rax); // kills rbx
-  __ movss(xmm0, Address(rdx, rax, 
+  __ movflt(xmm0, Address(rdx, rax, 
                          Address::times_4,
                          arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
 }
@@ -593,7 +593,7 @@
   // eax: index
   // rdx: array
   index_check(rdx, rax); // kills rbx
-  __ movlpd(xmm0, Address(rdx, rax, 
+  __ movdbl(xmm0, Address(rdx, rax, 
                           Address::times_8,
                           arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
 }
@@ -685,14 +685,14 @@
 void TemplateTable::fload(int n) 
 {
   transition(vtos, ftos);
-  __ movss(xmm0, faddress(n));
+  __ movflt(xmm0, faddress(n));
   debug_only(__ verify_local_tag(frame::TagValue, n));
 }
 
 void TemplateTable::dload(int n)
 {
   transition(vtos, dtos);
-  __ movlpd(xmm0, daddress(n));
+  __ movdbl(xmm0, daddress(n));
   debug_only(__ verify_local_tag(frame::TagCategory2, n));
 }
 
@@ -801,7 +801,7 @@
 {
   transition(ftos, vtos);
   locals_index(rbx);
-  __ movss(faddress(rbx), xmm0);
+  __ movflt(faddress(rbx), xmm0);
   __ tag_local(frame::TagValue, rbx);
 }
 
@@ -809,7 +809,7 @@
 {
   transition(dtos, vtos);
   locals_index(rbx);
-  __ movsd(daddress(rbx), xmm0);
+  __ movdbl(daddress(rbx), xmm0);
   __ tag_local(frame::TagCategory2, rbx);
 }
 
@@ -845,7 +845,7 @@
   transition(vtos, vtos);
   __ pop_f();
   locals_index_wide(rbx);
-  __ movss(faddress(rbx), xmm0);
+  __ movflt(faddress(rbx), xmm0);
   __ tag_local(frame::TagValue, rbx);
 }
 
@@ -854,7 +854,7 @@
   transition(vtos, vtos);
   __ pop_d();
   locals_index_wide(rbx);
-  __ movsd(daddress(rbx), xmm0);
+  __ movdbl(daddress(rbx), xmm0);
   __ tag_local(frame::TagCategory2, rbx);
 }
 
@@ -906,7 +906,7 @@
   // ebx:  index
   // rdx:  array
   index_check(rdx, rbx); // prefer index in ebx
-  __ movss(Address(rdx, rbx, 
+  __ movflt(Address(rdx, rbx, 
                    Address::times_4, 
                    arrayOopDesc::base_offset_in_bytes(T_FLOAT)),
            xmm0);
@@ -921,7 +921,7 @@
   // ebx:  index
   // rdx:  array
   index_check(rdx, rbx); // prefer index in ebx
-  __ movsd(Address(rdx, rbx, 
+  __ movdbl(Address(rdx, rbx, 
                    Address::times_8, 
                    arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
            xmm0);
@@ -1031,14 +1031,14 @@
 void TemplateTable::fstore(int n) 
 {
   transition(ftos, vtos);
-  __ movss(faddress(n), xmm0);
+  __ movflt(faddress(n), xmm0);
   __ tag_local(frame::TagValue, n);
 }
 
 void TemplateTable::dstore(int n) 
 {
   transition(dtos, vtos);
-  __ movsd(daddress(n), xmm0);
+  __ movdbl(daddress(n), xmm0);
   __ tag_local(frame::TagCategory2, n);
 }
 
@@ -1285,7 +1285,7 @@
     __ addq(rsp, Interpreter::stackElementSize());
     break;
   case sub:
-    __ movss(xmm1, xmm0);
+    __ movflt(xmm1, xmm0);
     __ pop_f(xmm0);
     __ subss(xmm0, xmm1);
     break;
@@ -1294,12 +1294,12 @@
     __ addq(rsp, Interpreter::stackElementSize());
     break;
   case div:
-    __ movss(xmm1, xmm0);
+    __ movflt(xmm1, xmm0);
     __ pop_f(xmm0);
     __ divss(xmm0, xmm1);
     break;
   case rem:
-    __ movss(xmm1, xmm0);
+    __ movflt(xmm1, xmm0);
     __ pop_f(xmm0);
     __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), 2);
     break;
@@ -1318,7 +1318,7 @@
     __ addq(rsp, 2 * Interpreter::stackElementSize());
     break;
   case sub:
-    __ movsd(xmm1, xmm0);
+    __ movdbl(xmm1, xmm0);
     __ pop_d(xmm0); 
     __ subsd(xmm0, xmm1);
     break;
@@ -1327,12 +1327,12 @@
     __ addq(rsp, 2 * Interpreter::stackElementSize());
     break;
   case div:
-    __ movsd(xmm1, xmm0);
+    __ movdbl(xmm1, xmm0);
     __ pop_d(xmm0);
     __ divsd(xmm0, xmm1);
     break;
   case rem:
-    __ movsd(xmm1, xmm0);
+    __ movdbl(xmm1, xmm0);
     __ pop_d(xmm0);
     __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), 2);
     break;
@@ -2371,7 +2371,7 @@
   __ cmpl(flags, ftos);
   __ jcc(Assembler::notEqual, notFloat);
   // ftos
-  __ movss(xmm0, field);
+  __ movflt(xmm0, field);
   __ push(ftos);
   // Rewrite bytecode to be faster
   if (!is_static) {
@@ -2385,7 +2385,7 @@
   __ jcc(Assembler::notEqual, notDouble);
 #endif
   // dtos
-  __ movlpd(xmm0, field);
+  __ movdbl(xmm0, field);
   __ push(dtos);
   // Rewrite bytecode to be faster
   if (!is_static) {
@@ -2588,7 +2588,7 @@
   // ftos
   __ pop(ftos);
   if (!is_static) pop_and_check_object(obj);
-  __ movss(field, xmm0);
+  __ movflt(field, xmm0);
   if (!is_static) {
     patch_bytecode(Bytecodes::_fast_fputfield, rcx, rbx);
   }
@@ -2602,7 +2602,7 @@
   // dtos
   __ pop(dtos);
   if (!is_static) pop_and_check_object(obj);
-  __ movsd(field, xmm0);
+  __ movdbl(field, xmm0);
   if (!is_static) {
     patch_bytecode(Bytecodes::_fast_dputfield, rcx, rbx);
   }
@@ -2658,8 +2658,8 @@
     case Bytecodes::_fast_bputfield: __ movb(field, rax); break;
     case Bytecodes::_fast_sputfield: // fall through
     case Bytecodes::_fast_cputfield: __ movw(field, rax); break;
-    case Bytecodes::_fast_fputfield: __ movss(field, xmm0); break;
-    case Bytecodes::_fast_dputfield: __ movsd(field, xmm0); break;
+    case Bytecodes::_fast_fputfield: __ movflt(field, xmm0); break;
+    case Bytecodes::_fast_dputfield: __ movdbl(field, xmm0); break;
     default:
       ShouldNotReachHere();
     }
@@ -2738,10 +2738,10 @@
     __ movw(field, rax);
     break;
   case Bytecodes::_fast_fputfield:
-    __ movss(field, xmm0);
+    __ movflt(field, xmm0);
     break;
   case Bytecodes::_fast_dputfield:
-    __ movsd(field, xmm0); 
+    __ movdbl(field, xmm0); 
     break;
   default:
     ShouldNotReachHere();
@@ -2826,10 +2826,10 @@
     __ load_unsigned_word(rax, field);
     break;
   case Bytecodes::_fast_fgetfield:
-    __ movss(xmm0, field);
+    __ movflt(xmm0, field);
     break;
   case Bytecodes::_fast_dgetfield:
-    __ movlpd(xmm0, field);
+    __ movdbl(xmm0, field);
     break;
   default:
     ShouldNotReachHere();
@@ -2870,7 +2870,7 @@
     __ verify_oop(rax);
     break;
   case ftos:
-    __ movss(xmm0, Address(rax, rbx, Address::times_1));
+    __ movflt(xmm0, Address(rax, rbx, Address::times_1));
     break;
   default:
     ShouldNotReachHere();
--- a/hotspot/src/cpu/amd64/vm/vm_version_amd64.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/amd64/vm/vm_version_amd64.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vm_version_amd64.cpp	1.19 07/05/17 15:46:04 JVM"
+#pragma ident "@(#)vm_version_amd64.cpp	1.21 07/06/13 16:23:17 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -240,14 +240,51 @@
   if( !supports_sse () ) // Drop to 0 if no SSE  support
     UseSSE = 0;
 
+  // On new cpus instructions which update whole XMM register should be used
+  // to prevent partial register stall due to dependencies on high half.
+  //
+  // UseXmmLoadAndClearUpper == true  --> movsd(xmm, mem)
+  // UseXmmLoadAndClearUpper == false --> movlpd(xmm, mem)
+  // UseXmmRegToRegMoveAll == true  --> movaps(xmm, xmm), movapd(xmm, xmm).
+  // UseXmmRegToRegMoveAll == false --> movss(xmm, xmm),  movsd(xmm, xmm).
+
+  if( is_amd() ) { // AMD cpus specific settings
+    if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) {
+      if( supports_sse4a() ) {
+        UseXmmLoadAndClearUpper = true; // use movsd only on '10h' Opteron
+      } else {
+        UseXmmLoadAndClearUpper = false;
+      }
+    }
+    if( FLAG_IS_DEFAULT(UseXmmRegToRegMoveAll) ) {
+      if( supports_sse4a() ) {
+        UseXmmRegToRegMoveAll = true; // use movaps, movapd only on '10h'
+      } else {
+        UseXmmRegToRegMoveAll = false;
+      }
+    }
+  }
+
   if( is_intel() ) { // Intel cpus specific settings
     if( FLAG_IS_DEFAULT(UseStoreImmI16) ) {
       UseStoreImmI16 = false; // don't use it on Intel cpus
     }
+    if( FLAG_IS_DEFAULT(UseAddressNop) ) {
+      // Use it on all Intel cpus starting from PentiumPro
+      // (don't need a cpu check since only new cpus support 64-bits mode).
+      UseAddressNop = true;
+    }
+    if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) {
+      UseXmmLoadAndClearUpper = true; // use movsd on all Intel cpus
+    }
+    if( FLAG_IS_DEFAULT(UseXmmRegToRegMoveAll) ) {
+      if( supports_sse3() ) {
+        UseXmmRegToRegMoveAll = true; // use movaps, movapd on new Intel cpus
+      } else {
+        UseXmmRegToRegMoveAll = false;
+      }
+    }
     if( cpu_family() == 6 && supports_sse3() ) { // New Intel cpus
-      if( FLAG_IS_DEFAULT(UseAddressNop) ) {
-        UseAddressNop = true; // use it on new Intel cpus
-      }
 #ifdef COMPILER2
       if( FLAG_IS_DEFAULT(MaxLoopPad) ) {
         // For new Intel cpus do the next optimization:
--- a/hotspot/src/cpu/i486/vm/assembler_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/assembler_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)assembler_i486.cpp	1.235 07/05/17 15:46:14 JVM"
+#pragma ident "@(#)assembler_i486.cpp	1.236 07/06/12 12:32:42 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -343,9 +343,18 @@
 
   case 0x0F: // movx..., etc.
     switch (0xFF & *ip++) {
+    case 0x12: // movlps
+    case 0x28: // movaps
+    case 0x2E: // ucomiss
     case 0x2F: // comiss
+    case 0x54: // andps
+    case 0x55: // andnps
+    case 0x56: // orps
     case 0x57: // xorps
+    case 0x6E: // movd
+    case 0x7E: // movd
     case 0xAD: // shrd r, a, %cl
+    case 0xAE: // ldmxcsr   a
     case 0xAF: // imul r, a
     case 0xBE: // movsxb r, a
     case 0xBF: // movsxw r, a
@@ -400,9 +409,10 @@
   case REP4(0x18): // sbb...
   case REP4(0x28): // sub...
   case REP4(0x38): // cmp...
+  case 0xF7: // mull a
   case 0x8D: // leal r, a
-  case 0xF7: // mull a
   case 0x87: // xchg r, a
+  case 0x85: // test r, a
     break;
 
   case 0xC1: // sal a, #8; sar a, #8; shl a, #8; shr a, #8
@@ -2501,6 +2511,38 @@
   emit_sse_operand(src,dst);
 }
 
+// New cpus require to use movaps and movapd to avoid partial register stall
+// when moving between registers.
+void Assembler::movaps(XMMRegister dst, XMMRegister src) {
+  assert(VM_Version::supports_sse(), "");
+
+  emit_byte(0x0F);
+  emit_byte(0x28);
+  emit_sse_operand(dst, src);
+}
+void Assembler::movapd(XMMRegister dst, XMMRegister src) {
+  assert(VM_Version::supports_sse2(), "");
+
+  emit_byte(0x66);
+  emit_byte(0x0F);
+  emit_byte(0x28);
+  emit_sse_operand(dst, src);
+}
+
+// New cpus require to use movsd and movss to avoid partial register stall
+// when loading from memory. But for old Opteron use movlpd instead of movsd.
+// The selection is done in MacroAssembler::movdbl() and movflt().
+void Assembler::movlpd(XMMRegister dst, Address src) {
+  assert(VM_Version::supports_sse(), "");
+
+  InstructionMark im(this);
+  emit_byte(0x66);
+  emit_byte(0x0F);
+  emit_byte(0x12);
+  emit_sse_operand(dst, src);
+}
+
+
 emit_sse_instruction(andps,  sse,  0,    0x54, XMMRegister, XMMRegister);
 emit_sse_instruction(andpd,  sse2, 0x66, 0x54, XMMRegister, XMMRegister);
 emit_sse_instruction(andnps, sse,  0,    0x55, XMMRegister, XMMRegister);
--- a/hotspot/src/cpu/i486/vm/assembler_i486.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/assembler_i486.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)assembler_i486.hpp	1.163 07/05/17 15:46:17 JVM"
+#pragma ident "@(#)assembler_i486.hpp	1.164 07/06/13 16:22:12 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -636,12 +636,22 @@
   void cvttsd2si(Register dst, Address src);     // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer
   void cvttsd2si(Register dst, XMMRegister src);
 
+ protected: // Avoid using the next instructions directly.
+  // New cpus require use of movsd and movss to avoid partial register stall
+  // when loading from memory. But for old Opteron use movlpd instead of movsd.
+  // The selection is done in MacroAssembler::movdbl() and movflt().
   void movss(XMMRegister dst, Address src);      // Move Scalar Single-Precision Floating-Point Values
   void movss(XMMRegister dst, XMMRegister src);
   void movss(Address dst, XMMRegister src);
   void movsd(XMMRegister dst, Address src);      // Move Scalar Double-Precision Floating-Point Values
   void movsd(XMMRegister dst, XMMRegister src);
   void movsd(Address dst, XMMRegister src);
+  void movlpd(XMMRegister dst, Address src);
+  // New cpus require use of movaps and movapd to avoid partial register stall
+  // when moving between registers.
+  void movaps(XMMRegister dst, XMMRegister src);
+  void movapd(XMMRegister dst, XMMRegister src);
+ public:
 
   void andps(XMMRegister dst, Address src);      // Bitwise Logical AND of Packed Single-Precision Floating-Point Values
   void andps(XMMRegister dst, XMMRegister src);
@@ -778,6 +788,24 @@
   void increment(Address  dst, int value = 1);
   void decrement(Address  dst, int value = 1);
 
+  // Support optimal SSE move instructions.
+  void movflt(XMMRegister dst, XMMRegister src) {
+    if (UseXmmRegToRegMoveAll) { movaps(dst, src); return; }
+    else                       { movss (dst, src); return; }
+  }
+  void movflt(XMMRegister dst, Address src) { movss(dst, src); }
+  void movflt(Address dst, XMMRegister src) { movss(dst, src); }
+
+  void movdbl(XMMRegister dst, XMMRegister src) {
+    if (UseXmmRegToRegMoveAll) { movapd(dst, src); return; }
+    else                       { movsd (dst, src); return; }
+  }
+  void movdbl(XMMRegister dst, Address src) {
+    if (UseXmmLoadAndClearUpper) { movsd (dst, src); return; }
+    else                         { movlpd(dst, src); return; }
+  }
+  void movdbl(Address dst, XMMRegister src) { movsd(dst, src); }
+
   // Alignment
   void align(int modulus);
 
--- a/hotspot/src/cpu/i486/vm/c1_LIRAssembler_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/c1_LIRAssembler_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)c1_LIRAssembler_i486.cpp	1.163 07/05/17 15:46:23 JVM"
+#pragma ident "@(#)c1_LIRAssembler_i486.cpp	1.164 07/06/08 18:13:17 JVM"
 #endif
 /*
  * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -654,7 +654,7 @@
           __ xorps(dest->as_xmm_float_reg(), dest->as_xmm_float_reg());
         } else {
           address const_addr = float_constant(c->as_jfloat());
-          __ movss(dest->as_xmm_float_reg(), Address((int)const_addr, relocInfo::internal_word_type));
+          __ movflt(dest->as_xmm_float_reg(), Address((int)const_addr, relocInfo::internal_word_type));
         }
       } else {
         assert(dest->is_single_fpu(), "must be");
@@ -677,7 +677,7 @@
           __ xorpd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg());
         } else {
           address const_addr = double_constant(c->as_jdouble());
-          __ movsd(dest->as_xmm_double_reg(), Address((int)const_addr, relocInfo::internal_word_type));
+          __ movdbl(dest->as_xmm_double_reg(), Address((int)const_addr, relocInfo::internal_word_type));
         }
       } else {
         assert(dest->is_double_fpu(), "must be");
@@ -806,25 +806,25 @@
     // special moves from fpu-register to xmm-register
     // necessary for method results
   } else if (src->is_single_xmm() && !dest->is_single_xmm()) {
-    __ movss(Address(esp), src->as_xmm_float_reg());
+    __ movflt(Address(esp), src->as_xmm_float_reg());
     __ fld_s(Address(esp));
   } else if (src->is_double_xmm() && !dest->is_double_xmm()) {
-    __ movsd(Address(esp), src->as_xmm_double_reg());
+    __ movdbl(Address(esp), src->as_xmm_double_reg());
     __ fld_d(Address(esp));
   } else if (dest->is_single_xmm() && !src->is_single_xmm()) {
     __ fstp_s(Address(esp));
-    __ movss(dest->as_xmm_float_reg(), Address(esp));
+    __ movflt(dest->as_xmm_float_reg(), Address(esp));
   } else if (dest->is_double_xmm() && !src->is_double_xmm()) {
     __ fstp_d(Address(esp));
-    __ movsd(dest->as_xmm_double_reg(), Address(esp));
+    __ movdbl(dest->as_xmm_double_reg(), Address(esp));
 
     // move between xmm-registers
   } else if (dest->is_single_xmm()) {
     assert(src->is_single_xmm(), "must match");
-    __ movss(dest->as_xmm_float_reg(), src->as_xmm_float_reg());
+    __ movflt(dest->as_xmm_float_reg(), src->as_xmm_float_reg());
   } else if (dest->is_double_xmm()) {
     assert(src->is_double_xmm(), "must match");
-    __ movsd(dest->as_xmm_double_reg(), src->as_xmm_double_reg());
+    __ movdbl(dest->as_xmm_double_reg(), src->as_xmm_double_reg());
 
     // move between fpu-registers (no instruction necessary because of fpu-stack)
   } else if (dest->is_single_fpu() || dest->is_double_fpu()) {
@@ -854,11 +854,11 @@
 
   } else if (src->is_single_xmm()) {
     Address dst_addr = frame_map()->address_for_slot(dest->single_stack_ix());
-    __ movss(dst_addr, src->as_xmm_float_reg());
+    __ movflt(dst_addr, src->as_xmm_float_reg());
 
   } else if (src->is_double_xmm()) {
     Address dst_addr = frame_map()->address_for_slot(dest->double_stack_ix());
-    __ movsd(dst_addr, src->as_xmm_double_reg());
+    __ movdbl(dst_addr, src->as_xmm_double_reg());
 
   } else if (src->is_single_fpu()) {
     assert(src->fpu_regnr() == 0, "argument must be on TOS");
@@ -895,7 +895,7 @@
   switch (type) {
     case T_FLOAT: {
       if (src->is_single_xmm()) {
-        __ movss(as_Address(to_addr), src->as_xmm_float_reg());
+        __ movflt(as_Address(to_addr), src->as_xmm_float_reg());
       } else {
         assert(src->is_single_fpu(), "must be");
         assert(src->fpu_regnr() == 0, "argument must be on TOS");
@@ -907,7 +907,7 @@
 
     case T_DOUBLE: {
       if (src->is_double_xmm()) {
-        __ movsd(as_Address(to_addr), src->as_xmm_double_reg());
+        __ movdbl(as_Address(to_addr), src->as_xmm_double_reg());
       } else {
         assert(src->is_double_fpu(), "must be");
         assert(src->fpu_regnrLo() == 0, "argument must be on TOS");
@@ -997,11 +997,11 @@
 
   } else if (dest->is_single_xmm()) {
     Address src_addr = frame_map()->address_for_slot(src->single_stack_ix());
-    __ movss(dest->as_xmm_float_reg(), src_addr);
+    __ movflt(dest->as_xmm_float_reg(), src_addr);
 
   } else if (dest->is_double_xmm()) {
     Address src_addr = frame_map()->address_for_slot(src->double_stack_ix());
-    __ movsd(dest->as_xmm_double_reg(), src_addr);
+    __ movdbl(dest->as_xmm_double_reg(), src_addr);
 
   } else if (dest->is_single_fpu()) {
     assert(dest->fpu_regnr() == 0, "dest must be TOS");
@@ -1070,7 +1070,7 @@
   switch (type) {
     case T_FLOAT: {
       if (dest->is_single_xmm()) {
-        __ movss(dest->as_xmm_float_reg(), from_addr);
+        __ movflt(dest->as_xmm_float_reg(), from_addr);
       } else {
         assert(dest->is_single_fpu(), "must be");
         assert(dest->fpu_regnr() == 0, "dest must be TOS");
@@ -1081,7 +1081,7 @@
 
     case T_DOUBLE: {
       if (dest->is_double_xmm()) {
-        __ movsd(dest->as_xmm_double_reg(), from_addr);
+        __ movdbl(dest->as_xmm_double_reg(), from_addr);
       } else {
         assert(dest->is_double_fpu(), "must be");
         assert(dest->fpu_regnrLo() == 0, "dest must be TOS");
@@ -2146,7 +2146,7 @@
     switch(code) {
       case lir_abs :
         if (dest->as_xmm_double_reg() != value->as_xmm_double_reg()) {
-          __ movsd(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
+          __ movdbl(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
         }
         __ andpd(dest->as_xmm_double_reg(), Address((int)double_signmask_pool, relocInfo::none));
         break;
@@ -3004,13 +3004,13 @@
 
   } else if (dest->is_single_xmm()) {
     if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) {
-      __ movss(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
+      __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
     }
     __ xorps(dest->as_xmm_float_reg(), Address((int)float_signflip_pool, relocInfo::none));
 
   } else if (dest->is_double_xmm()) {
     if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) {
-      __ movsd(dest->as_xmm_double_reg(), left->as_xmm_double_reg());
+      __ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg());
     }
     __ xorpd(dest->as_xmm_double_reg(), Address((int)double_signflip_pool, relocInfo::none));
 
@@ -3055,18 +3055,18 @@
       __ psrlq(src->as_xmm_double_reg(), 32);
       __ movd(dest->as_register_hi(), src->as_xmm_double_reg());
     } else if (dest->is_double_stack()) {
-      __ movsd(frame_map()->address_for_slot(dest->double_stack_ix()), src->as_xmm_double_reg());
+      __ movdbl(frame_map()->address_for_slot(dest->double_stack_ix()), src->as_xmm_double_reg());
     } else if (dest->is_address()) {
-      __ movsd(as_Address(dest->as_address_ptr()), src->as_xmm_double_reg());
+      __ movdbl(as_Address(dest->as_address_ptr()), src->as_xmm_double_reg());
     } else {
       ShouldNotReachHere();
     }
 
   } else if (dest->is_double_xmm()) {
     if (src->is_double_stack()) {
-      __ movsd(dest->as_xmm_double_reg(), frame_map()->address_for_slot(src->double_stack_ix()));
+      __ movdbl(dest->as_xmm_double_reg(), frame_map()->address_for_slot(src->double_stack_ix()));
     } else if (src->is_address()) {
-      __ movsd(dest->as_xmm_double_reg(), as_Address(src->as_address_ptr()));
+      __ movdbl(dest->as_xmm_double_reg(), as_Address(src->as_address_ptr()));
     } else {
       ShouldNotReachHere();
     }
--- a/hotspot/src/cpu/i486/vm/c1_Runtime1_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/c1_Runtime1_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)c1_Runtime1_i486.cpp	1.191 07/05/17 15:46:28 JVM"
+#pragma ident "@(#)c1_Runtime1_i486.cpp	1.193 07/06/08 18:13:17 JVM"
 #endif
 /*
  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -231,7 +231,7 @@
 // to simply save their current value.
 
 static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args,
-                                bool save_fpu_registers = true, bool describe_fpu_registers = false) {
+                                bool save_fpu_registers = true) {
   int frame_size = reg_save_frame_size + num_rt_args; // args + thread
   sasm->set_frame_size(frame_size);
 
@@ -245,7 +245,7 @@
   map->set_callee_saved(VMRegImpl::stack2reg(esi_off + num_rt_args), esi->as_VMReg());
   map->set_callee_saved(VMRegImpl::stack2reg(edi_off + num_rt_args), edi->as_VMReg());
 
-  if (save_fpu_registers && describe_fpu_registers) {
+  if (save_fpu_registers) {
     if (UseSSE < 2) {
       int fpu_off = float_regs_as_doubles_off;
       for (int n = 0; n < FrameMap::nof_fpu_regs; n++) {
@@ -288,7 +288,7 @@
 }
 
 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
-                                   bool save_fpu_registers = true, bool describe_fpu_registers = false) {
+                                   bool save_fpu_registers = true) {
   __ block_comment("save_live_registers");
 
   int frame_size = reg_save_frame_size + num_rt_args; // args + thread
@@ -312,24 +312,17 @@
       __ fnsave(Address(esp, fpu_state_off * wordSize));
       __ fwait();
 
-      // only during deopt do we need to store the FPU stack in a deoptable form.
-      if (describe_fpu_registers) {
-        // restore FPUStatusWord that was initialized by fnsave instruction
-        __ fldenv(Address(esp, fpu_state_off * wordSize));
+      // restore FPUStatusWord that was initialized by fnsave instruction
+      __ fldenv(Address(esp, fpu_state_off * wordSize));
 
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord +  0));
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord +  8));
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 16));
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 24));
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 32));
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 40));
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 48));
-        __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 56));
-      } else {
-        // restore FPUControlWord that was initialized by fnsave instruction
-        // (necessary to preserve the correct rounding mode)
-        __ fldcw(Address(esp, fpu_state_off * wordSize));
-      }
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord +  0));
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord +  8));
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 16));
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 24));
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 32));
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 40));
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 48));
+      __ fstp_d(Address(esp, float_regs_as_doubles_off * BytesPerWord + 56));
     }
 
     if (UseSSE >= 2) {
@@ -338,31 +331,31 @@
       // so always save them as doubles.
       // note that float values are _not_ converted automatically, so for float values 
       // the second word contains only garbage data.
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize +  0), xmm0);
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize +  8), xmm1);
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize + 16), xmm2);
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize + 24), xmm3);
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize + 32), xmm4);
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize + 40), xmm5);
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize + 48), xmm6);
-      __ movsd(Address(esp, xmm_regs_as_doubles_off * wordSize + 56), xmm7);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize +  0), xmm0);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize +  8), xmm1);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize + 16), xmm2);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize + 24), xmm3);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize + 32), xmm4);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize + 40), xmm5);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize + 48), xmm6);
+      __ movdbl(Address(esp, xmm_regs_as_doubles_off * wordSize + 56), xmm7);
     } else if (UseSSE == 1) {
       // save XMM registers as float because double not supported without SSE2
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize +  0), xmm0);
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize +  8), xmm1);
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize + 16), xmm2);
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize + 24), xmm3);
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize + 32), xmm4);
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize + 40), xmm5);
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize + 48), xmm6);
-      __ movss(Address(esp, xmm_regs_as_doubles_off * wordSize + 56), xmm7);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize +  0), xmm0);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize +  8), xmm1);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize + 16), xmm2);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize + 24), xmm3);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize + 32), xmm4);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize + 40), xmm5);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize + 48), xmm6);
+      __ movflt(Address(esp, xmm_regs_as_doubles_off * wordSize + 56), xmm7);
     }
   }
 
   // FPU stack must be empty now
   __ verify_FPU(0, "save_live_registers"); 
 
-  return generate_oop_map(sasm, num_rt_args, save_fpu_registers, describe_fpu_registers);
+  return generate_oop_map(sasm, num_rt_args, save_fpu_registers);
 }
 
 
@@ -370,24 +363,24 @@
   if (restore_fpu_registers) {
     if (UseSSE >= 2) {
       // restore XMM registers
-      __ movsd(xmm0, Address(esp, xmm_regs_as_doubles_off * wordSize +  0));
-      __ movsd(xmm1, Address(esp, xmm_regs_as_doubles_off * wordSize +  8));
-      __ movsd(xmm2, Address(esp, xmm_regs_as_doubles_off * wordSize + 16));
-      __ movsd(xmm3, Address(esp, xmm_regs_as_doubles_off * wordSize + 24));
-      __ movsd(xmm4, Address(esp, xmm_regs_as_doubles_off * wordSize + 32));
-      __ movsd(xmm5, Address(esp, xmm_regs_as_doubles_off * wordSize + 40));
-      __ movsd(xmm6, Address(esp, xmm_regs_as_doubles_off * wordSize + 48));
-      __ movsd(xmm7, Address(esp, xmm_regs_as_doubles_off * wordSize + 56));
+      __ movdbl(xmm0, Address(esp, xmm_regs_as_doubles_off * wordSize +  0));
+      __ movdbl(xmm1, Address(esp, xmm_regs_as_doubles_off * wordSize +  8));
+      __ movdbl(xmm2, Address(esp, xmm_regs_as_doubles_off * wordSize + 16));
+      __ movdbl(xmm3, Address(esp, xmm_regs_as_doubles_off * wordSize + 24));
+      __ movdbl(xmm4, Address(esp, xmm_regs_as_doubles_off * wordSize + 32));
+      __ movdbl(xmm5, Address(esp, xmm_regs_as_doubles_off * wordSize + 40));
+      __ movdbl(xmm6, Address(esp, xmm_regs_as_doubles_off * wordSize + 48));
+      __ movdbl(xmm7, Address(esp, xmm_regs_as_doubles_off * wordSize + 56));
     } else if (UseSSE == 1) {
       // restore XMM registers
-      __ movss(xmm0, Address(esp, xmm_regs_as_doubles_off * wordSize +  0));
-      __ movss(xmm1, Address(esp, xmm_regs_as_doubles_off * wordSize +  8));
-      __ movss(xmm2, Address(esp, xmm_regs_as_doubles_off * wordSize + 16));
-      __ movss(xmm3, Address(esp, xmm_regs_as_doubles_off * wordSize + 24));
-      __ movss(xmm4, Address(esp, xmm_regs_as_doubles_off * wordSize + 32));
-      __ movss(xmm5, Address(esp, xmm_regs_as_doubles_off * wordSize + 40));
-      __ movss(xmm6, Address(esp, xmm_regs_as_doubles_off * wordSize + 48));
-      __ movss(xmm7, Address(esp, xmm_regs_as_doubles_off * wordSize + 56));
+      __ movflt(xmm0, Address(esp, xmm_regs_as_doubles_off * wordSize +  0));
+      __ movflt(xmm1, Address(esp, xmm_regs_as_doubles_off * wordSize +  8));
+      __ movflt(xmm2, Address(esp, xmm_regs_as_doubles_off * wordSize + 16));
+      __ movflt(xmm3, Address(esp, xmm_regs_as_doubles_off * wordSize + 24));
+      __ movflt(xmm4, Address(esp, xmm_regs_as_doubles_off * wordSize + 32));
+      __ movflt(xmm5, Address(esp, xmm_regs_as_doubles_off * wordSize + 40));
+      __ movflt(xmm6, Address(esp, xmm_regs_as_doubles_off * wordSize + 48));
+      __ movflt(xmm7, Address(esp, xmm_regs_as_doubles_off * wordSize + 56));
     }
 
     if (UseSSE < 2) {
--- a/hotspot/src/cpu/i486/vm/i486.ad	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/i486.ad	Fri Jun 22 00:46:43 2007 +0000
@@ -751,22 +751,33 @@
                          int offset, int reg_lo, int reg_hi, int size ) {
   if( cbuf ) {
     if( reg_lo+1 == reg_hi ) { // double move?
-      emit_opcode  (*cbuf, 0xF2 );
+      if( is_load && !UseXmmLoadAndClearUpper )
+        emit_opcode(*cbuf, 0x66 ); // use 'movlpd' for load
+      else
+        emit_opcode(*cbuf, 0xF2 ); // use 'movsd' otherwise
     } else {
-      emit_opcode  (*cbuf, 0xF3 );
+      emit_opcode(*cbuf, 0xF3 );
     }
-    emit_opcode  (*cbuf, 0x0F );
-    emit_opcode  (*cbuf, is_load ? 0x10 : 0x11 );
+    emit_opcode(*cbuf, 0x0F );
+    if( reg_lo+1 == reg_hi && is_load && !UseXmmLoadAndClearUpper )
+      emit_opcode(*cbuf, 0x12 );   // use 'movlpd' for load
+    else
+      emit_opcode(*cbuf, is_load ? 0x10 : 0x11 );
     encode_RegMem(*cbuf, Matcher::_regEncode[reg_lo], ESP_enc, 0x4, 0, offset, false);
 #ifndef PRODUCT
   } else if( !do_size ) { 
     if( size != 0 ) tty->print("\n\t"); 
     if( reg_lo+1 == reg_hi ) { // double move?
-      if( is_load ) tty->print("MOVSD  %s:%s,[ESP + #%d]",Matcher::regName[reg_lo],Matcher::regName[reg_hi],offset); 
-      else          tty->print("MOVSD  [ESP + #%d],%s:%s",offset,Matcher::regName[reg_lo],Matcher::regName[reg_hi]); 
+      if( is_load ) tty->print("%s %s,[ESP + #%d]",
+                               UseXmmLoadAndClearUpper ? "MOVSD " : "MOVLPD",
+                               Matcher::regName[reg_lo], offset); 
+      else          tty->print("MOVSD  [ESP + #%d],%s", 
+                               offset, Matcher::regName[reg_lo]); 
     } else {
-      if( is_load ) tty->print("MOVSS  %s,[ESP + #%d]",Matcher::regName[reg_lo],offset); 
-      else          tty->print("MOVSS  [ESP + #%d],%s",offset,Matcher::regName[reg_lo]); 
+      if( is_load ) tty->print("MOVSS  %s,[ESP + #%d]", 
+                               Matcher::regName[reg_lo], offset); 
+      else          tty->print("MOVSS  [ESP + #%d],%s", 
+                               offset, Matcher::regName[reg_lo]); 
     }
 #endif
   }
@@ -777,22 +788,43 @@
 
 static int impl_movx_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo, 
                             int src_hi, int dst_hi, int size ) {
-  if( cbuf ) {
-    emit_opcode(*cbuf, (src_lo+1 == src_hi && dst_lo+1 == dst_hi) ? 0xF2 : 0xF3 );
-    emit_opcode(*cbuf, 0x0F );
-    emit_opcode(*cbuf, 0x10 );
-    emit_rm    (*cbuf, 0x3, Matcher::_regEncode[dst_lo], Matcher::_regEncode[src_lo] );
+  if( UseXmmRegToRegMoveAll ) {//Use movaps,movapd to move between xmm registers
+    if( cbuf ) {
+      if( (src_lo+1 == src_hi && dst_lo+1 == dst_hi) ) {
+        emit_opcode(*cbuf, 0x66 );
+      }
+      emit_opcode(*cbuf, 0x0F );
+      emit_opcode(*cbuf, 0x28 );
+      emit_rm    (*cbuf, 0x3, Matcher::_regEncode[dst_lo], Matcher::_regEncode[src_lo] );
 #ifndef PRODUCT
-  } else if( !do_size ) { 
-    if( size != 0 ) tty->print("\n\t"); 
-    if( src_lo+1 == src_hi && dst_lo+1 == dst_hi ) { // double move?
-      tty->print("MOVSD  %s:%s,%s:%s",Matcher::regName[dst_lo],Matcher::regName[dst_hi],Matcher::regName[src_lo],Matcher::regName[src_hi]); 
-    } else {
-      tty->print("MOVSS  %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]); 
+    } else if( !do_size ) { 
+      if( size != 0 ) tty->print("\n\t"); 
+      if( src_lo+1 == src_hi && dst_lo+1 == dst_hi ) { // double move?
+        tty->print("MOVAPD %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]); 
+      } else {
+        tty->print("MOVAPS %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]); 
+      }
+#endif
     }
+    return size + ((src_lo+1 == src_hi && dst_lo+1 == dst_hi) ? 4 : 3);
+  } else {
+    if( cbuf ) {
+      emit_opcode(*cbuf, (src_lo+1 == src_hi && dst_lo+1 == dst_hi) ? 0xF2 : 0xF3 );
+      emit_opcode(*cbuf, 0x0F );
+      emit_opcode(*cbuf, 0x10 );
+      emit_rm    (*cbuf, 0x3, Matcher::_regEncode[dst_lo], Matcher::_regEncode[src_lo] );
+#ifndef PRODUCT
+    } else if( !do_size ) { 
+      if( size != 0 ) tty->print("\n\t"); 
+      if( src_lo+1 == src_hi && dst_lo+1 == dst_hi ) { // double move?
+        tty->print("MOVSD  %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]); 
+      } else {
+        tty->print("MOVSS  %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]); 
+      }
 #endif
+    }
+    return size+4;
   }
-  return size+4;
 }
 
 static int impl_mov_helper( CodeBuffer *cbuf, bool do_size, int src, int dst, int size ) {
@@ -1708,12 +1740,12 @@
       } else if (rt == T_FLOAT) {
         __ leal(esp, Address(esp, -4));
         __ fstp_s(Address(esp, 0));
-        __ movss(xmm0, Address(esp, 0));
+        __ movflt(xmm0, Address(esp, 0));
         __ leal(esp, Address(esp,  4));
       } else if (rt == T_DOUBLE) {
         __ leal(esp, Address(esp, -8));
         __ fstp_d(Address(esp, 0));
-        __ movsd(xmm0, Address(esp, 0));
+        __ movdbl(xmm0, Address(esp, 0));
         __ leal(esp, Address(esp,  8));
       }
     }
@@ -1912,6 +1944,15 @@
     emit_double_constant(cbuf, $con$$constant);
   %}
 
+  enc_class load_conXD (regXD dst, immXD con) %{ // Load double constant
+    // UseXmmLoadAndClearUpper ? movsd(dst, con) : movlpd(dst, con)
+    emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
+    emit_opcode(cbuf, 0x0F);
+    emit_opcode(cbuf, UseXmmLoadAndClearUpper ? 0x10 : 0x12);
+    emit_rm(cbuf, 0x0, $dst$$reg, 0x5);
+    emit_double_constant(cbuf, $con$$constant);
+  %}
+
   enc_class Opc_MemImm_F(immF src) %{
     cbuf.set_inst_mark();
     $$$emit8$primary;
@@ -1920,20 +1961,6 @@
   %}
 
 
-  enc_class MovX_reg(regX dst, regX src) %{
-    emit_opcode(cbuf, 0xF3 );     // MOVSS dst,src
-    emit_opcode(cbuf, 0x0F );
-    emit_opcode(cbuf, 0x10 );
-    emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
-  %}
-
-  enc_class MovXD_reg(regXD dst, regXD src) %{
-    emit_opcode(cbuf, 0xF2 );     // MOVSD dst,src
-    emit_opcode(cbuf, 0x0F );
-    emit_opcode(cbuf, 0x10 );
-    emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
-  %}
-
   enc_class MovI2X_reg(regX dst, eRegI src) %{
     emit_opcode(cbuf, 0x66 );     // MOVD dst,src
     emit_opcode(cbuf, 0x0F );
@@ -2604,9 +2631,10 @@
   enc_class Push_ResultXD(regXD dst) %{
     store_to_stackslot( cbuf, 0xDD, 0x03, 0 ); //FSTP [ESP]
 
-    emit_opcode  (cbuf, 0xF2 );     // MOVSD dst(xmm), [ESP]
+    // UseXmmLoadAndClearUpper ? movsd dst,[esp] : movlpd dst,[esp]
+    emit_opcode  (cbuf, UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
     emit_opcode  (cbuf, 0x0F );
-    emit_opcode  (cbuf, 0x10 );
+    emit_opcode  (cbuf, UseXmmLoadAndClearUpper ? 0x10 : 0x12);
     encode_RegMem(cbuf, $dst$$reg, ESP_enc, 0x4, 0, 0, false);
 
     emit_opcode(cbuf,0x83);    // ADD ESP,8
@@ -4221,10 +4249,11 @@
   %}
 
   enc_class enc_loadLX_volatile( memory mem, stackSlotL dst, regXD tmp ) %{
-    { // MOVSD $tmp,$mem ! atomic long load
-      emit_opcode(cbuf,0xF2);
+    { // Atomic long load
+      // UseXmmLoadAndClearUpper ? movsd $tmp,$mem : movlpd $tmp,$mem
+      emit_opcode(cbuf,UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
       emit_opcode(cbuf,0x0F);
-      emit_opcode(cbuf,0x10);
+      emit_opcode(cbuf,UseXmmLoadAndClearUpper ? 0x10 : 0x12);
       int base     = $mem$$base;
       int index    = $mem$$index;
       int scale    = $mem$$scale;
@@ -4246,10 +4275,11 @@
   %}
 
   enc_class enc_loadLX_reg_volatile( memory mem, eRegL dst, regXD tmp ) %{
-    { // MOVSD $tmp,$mem ! atomic long load
-      emit_opcode(cbuf,0xF2);
+    { // Atomic long load
+      // UseXmmLoadAndClearUpper ? movsd $tmp,$mem : movlpd $tmp,$mem
+      emit_opcode(cbuf,UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
       emit_opcode(cbuf,0x0F);
-      emit_opcode(cbuf,0x10);
+      emit_opcode(cbuf,UseXmmLoadAndClearUpper ? 0x10 : 0x12);
       int base     = $mem$$base;
       int index    = $mem$$index;
       int scale    = $mem$$scale;
@@ -4296,10 +4326,11 @@
   %}
 
   enc_class enc_storeLX_volatile( memory mem, stackSlotL src, regXD tmp) %{
-    { // MOVSD $tmp,$src ! atomic long load
-      emit_opcode(cbuf,0xF2);
+    { // Atomic long load
+      // UseXmmLoadAndClearUpper ? movsd $tmp,[$src] : movlpd $tmp,[$src]
+      emit_opcode(cbuf,UseXmmLoadAndClearUpper ? 0xF2 : 0x66);
       emit_opcode(cbuf,0x0F);
-      emit_opcode(cbuf,0x10);
+      emit_opcode(cbuf,UseXmmLoadAndClearUpper ? 0x10 : 0x12);
       int base     = $src$$base;
       int index    = $src$$index;
       int scale    = $src$$scale;
@@ -6356,7 +6387,7 @@
 
 // Load Double to XMM
 instruct loadXD(regXD dst, memory mem) %{
-  predicate(UseSSE>=2);
+  predicate(UseSSE>=2 && UseXmmLoadAndClearUpper);
   match(Set dst (LoadD mem));
   ins_cost(145);
   format %{ "MOVSD  $dst,$mem" %}
@@ -6364,6 +6395,15 @@
   ins_pipe( pipe_slow );
 %}
 
+instruct loadXD_partial(regXD dst, memory mem) %{
+  predicate(UseSSE>=2 && !UseXmmLoadAndClearUpper);
+  match(Set dst (LoadD mem));
+  ins_cost(145);
+  format %{ "MOVLPD $dst,$mem" %}
+  ins_encode( Opcode(0x66), Opcode(0x0F), Opcode(0x12), RegMem(dst,mem));
+  ins_pipe( pipe_slow );
+%}
+
 // Load to XMM register (single-precision floating point)
 // MOVSS instruction
 instruct loadX(regX dst, memory mem) %{
@@ -6588,7 +6628,7 @@
   match(Set dst con);
   ins_cost(125);
   format %{ "MOVSD  $dst,[$con]" %}
-  ins_encode(Opcode(0xF2), Opcode(0x0F), Opcode(0x10), LdImmXD(dst, con));
+  ins_encode(load_conXD(dst, con));
   ins_pipe( pipe_slow );
 %}
 
@@ -7358,8 +7398,13 @@
   format %{ "Jn$cop   skip\n\t"
             "MOVSS  $dst,$src\t# float\n"
       "skip:" %}
-  opcode (0xdd, 0x3);     /* DD D8+i or DD /3 */
-  ins_encode( enc_cmov_branch( cop, 0x04 ), MovX_reg(dst,src));
+  ins_encode %{
+    Label skip;
+    // Invert sense of branch from sense of CMOV
+    __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
+    __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+    __ bind(skip);
+  %}
   ins_pipe( pipe_slow );
 %}
 
@@ -7371,8 +7416,13 @@
   format %{ "Jn$cop   skip\n\t"
             "MOVSD  $dst,$src\t# float\n"
       "skip:" %}
-  opcode (0xdd, 0x3);     /* DD D8+i or DD /3 */
-  ins_encode( enc_cmov_branch( cop, 0x4 ), MovXD_reg(dst,src));
+  ins_encode %{
+    Label skip;
+    // Invert sense of branch from sense of CMOV
+    __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
+    __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+    __ bind(skip);
+  %}
   ins_pipe( pipe_slow );
 %}
 
@@ -7384,7 +7434,13 @@
   format %{ "Jn$cop   skip\n\t"
             "MOVSS  $dst,$src\t# float\n"
       "skip:" %}
-  ins_encode( enc_cmov_branch( cop, 0x4 ), MovX_reg(dst,src) );
+  ins_encode %{
+    Label skip;
+    // Invert sense of branch from sense of CMOV
+    __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
+    __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+    __ bind(skip);
+  %}
   ins_pipe( pipe_slow );
 %}
 
@@ -7396,7 +7452,13 @@
   format %{ "Jn$cop   skip\n\t"
             "MOVSD  $dst,$src\t# float\n"
       "skip:" %}
-  ins_encode( enc_cmov_branch( cop, 0x4 ), MovXD_reg(dst,src) );
+  ins_encode %{
+    Label skip;
+    // Invert sense of branch from sense of CMOV
+    __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
+    __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+    __ bind(skip);
+  %}
   ins_pipe( pipe_slow );
 %}
 
@@ -11260,7 +11322,7 @@
 
 
 instruct MoveL2D_stack_reg_sse(regXD dst, stackSlotL src) %{
-  predicate(UseSSE>=2);
+  predicate(UseSSE>=2 && UseXmmLoadAndClearUpper);
   match(Set dst (MoveL2D src));
   effect(DEF dst, USE src);
 
@@ -11270,6 +11332,17 @@
   ins_pipe( pipe_slow );
 %}
 
+instruct MoveL2D_stack_reg_sse_partial(regXD dst, stackSlotL src) %{
+  predicate(UseSSE>=2 && !UseXmmLoadAndClearUpper);
+  match(Set dst (MoveL2D src));
+  effect(DEF dst, USE src);
+
+  ins_cost(95);
+  format %{ "MOVLPD $dst,$src\t# MoveL2D_stack_reg_sse" %}
+  ins_encode( Opcode(0x66), Opcode(0x0F), Opcode(0x12), RegMem(dst,src));
+  ins_pipe( pipe_slow );
+%}
+
 instruct MoveL2D_reg_reg_sse(regXD dst, eRegL src, regXD tmp) %{
   predicate(UseSSE>=2);
   match(Set dst (MoveL2D src));
--- a/hotspot/src/cpu/i486/vm/interp_masm_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/interp_masm_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)interp_masm_i486.cpp	1.165 07/05/17 15:46:48 JVM"
+#pragma ident "@(#)interp_masm_i486.cpp	1.167 07/06/08 18:13:19 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -811,12 +811,12 @@
     if (state == ftos && UseSSE >= 1) {
       subl(esp, wordSize);
       fstp_s(Address(esp, 0));
-      movss(xmm0, Address(esp, 0));
+      movflt(xmm0, Address(esp, 0));
       addl(esp, wordSize);
     } else if (state == dtos && UseSSE >= 2) {
       subl(esp, 2*wordSize);
       fstp_d(Address(esp, 0));
-      movsd(xmm0, Address(esp, 0));
+      movdbl(xmm0, Address(esp, 0));
       addl(esp, 2*wordSize);
     }
   }
@@ -1397,8 +1397,6 @@
     // If no method data exists, go to profile_continue.
     test_method_data_pointer(mdp, profile_continue);
 
-    set_mdp_flag_at(mdp, BitData::null_seen_byte_constant());
-
     // The method data pointer needs to be updated.
     int mdp_delta = in_bytes(BitData::bit_data_size());
     if (TypeProfileCasts) {
--- a/hotspot/src/cpu/i486/vm/interpreter_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/interpreter_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)interpreter_i486.cpp	1.371 07/05/17 15:46:56 JVM"
+#pragma ident "@(#)interpreter_i486.cpp	1.372 07/06/08 18:13:19 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -161,12 +161,12 @@
   // to end up back on the FPU so it can operate on them.
   if (state == ftos && UseSSE >= 1) {
     __ subl(esp, wordSize);
-    __ movss(Address(esp, 0), xmm0);
+    __ movflt(Address(esp, 0), xmm0);
     __ fld_s(Address(esp, 0));
     __ addl(esp, wordSize);
   } else if (state == dtos && UseSSE >= 2) {
     __ subl(esp, 2*wordSize);
-    __ movsd(Address(esp, 0), xmm0);
+    __ movdbl(Address(esp, 0), xmm0);
     __ fld_d(Address(esp, 0));
     __ addl(esp, 2*wordSize);
   }
@@ -197,12 +197,12 @@
   // In SSE mode, FP results are in xmm0
   if (state == ftos && UseSSE > 0) {
     __ subl(esp, wordSize);
-    __ movss(Address(esp, 0), xmm0);
+    __ movflt(Address(esp, 0), xmm0);
     __ fld_s(Address(esp, 0));
     __ addl(esp, wordSize);
   } else if (state == dtos && UseSSE >= 2) {
     __ subl(esp, 2*wordSize);
-    __ movsd(Address(esp, 0), xmm0);
+    __ movdbl(Address(esp, 0), xmm0);
     __ fld_d(Address(esp, 0));
     __ addl(esp, 2*wordSize);
   }
@@ -272,9 +272,9 @@
           // Store as float and empty fpu stack
           __ fstp_s(Address(esp, 0));
           // and reload
-          __ movss(xmm0, Address(esp, 0));
+          __ movflt(xmm0, Address(esp, 0));
         } else if (type == T_DOUBLE && UseSSE >= 2 ) {
-          __ movsd(xmm0, Address(esp, 0));
+          __ movdbl(xmm0, Address(esp, 0));
         } else {
           // restore ST0
           __ fld_d(Address(esp));
@@ -663,7 +663,7 @@
   if (UseSSE >= 2) {
     __ subl(esp, 2*wordSize);
     __ fstp_d(Address(esp, 0));
-    __ movsd(xmm0, Address(esp, 0));
+    __ movdbl(xmm0, Address(esp, 0));
     __ addl(esp, 2*wordSize);
   }
 
--- a/hotspot/src/cpu/i486/vm/nativeInst_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/nativeInst_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)nativeInst_i486.cpp	1.74 07/05/05 17:04:18 JVM"
+#pragma ident "@(#)nativeInst_i486.cpp	1.75 07/06/08 20:56:40 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -200,7 +200,10 @@
   int inst_size = instruction_size;
 
   // See if there's an instruction size prefix override.
-  if ( *(address(this)) == instruction_operandsize_prefix ) inst_size += 1;
+  if ( *(address(this))   == instruction_operandsize_prefix &&
+       *(address(this)+1) != instruction_code_xmm_code ) { // Not SSE instr
+    inst_size += 1;
+  }
   if ( *(address(this)) == instruction_extended_prefix ) inst_size += 1;
 
   for (int i = 0; i < instruction_size; i++) {
@@ -225,10 +228,13 @@
   {
     u_char byte1 = ((u_char*)instruction_address())[1];
     u_char byte2 = ((u_char*)instruction_address())[2];
-    if (((test_byte != instruction_code_xmm_ss_prefix) &&
-         (test_byte != instruction_code_xmm_sd_prefix)) ||
+    if ((test_byte != instruction_code_xmm_ss_prefix &&
+         test_byte != instruction_code_xmm_sd_prefix &&
+         test_byte != instruction_operandsize_prefix) ||
         byte1 != instruction_code_xmm_code ||
-        (byte2 != instruction_code_xmm_load && byte2 != instruction_code_xmm_store)) {
+        (byte2 != instruction_code_xmm_load && 
+         byte2 != instruction_code_xmm_lpd  && 
+         byte2 != instruction_code_xmm_store)) {
 	  fatal ("not a mov [reg+offs], reg instruction");
     }
   }
--- a/hotspot/src/cpu/i486/vm/nativeInst_i486.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/nativeInst_i486.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)nativeInst_i486.hpp	1.79 07/05/05 17:04:19 JVM"
+#pragma ident "@(#)nativeInst_i486.hpp	1.80 07/06/08 20:56:42 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -253,6 +253,7 @@
     instruction_code_xmm_code           = 0x0f,
     instruction_code_xmm_load           = 0x10,
     instruction_code_xmm_store          = 0x11,
+    instruction_code_xmm_lpd            = 0x12,
     
     instruction_size	                = 4,
     instruction_offset	                = 0,
@@ -261,8 +262,11 @@
   };
 
   address instruction_address() const { 
-    if ( (*addr_at(instruction_offset) == instruction_operandsize_prefix) || 
-         (*addr_at(instruction_offset) == instruction_extended_prefix) ) {
+    if (*addr_at(instruction_offset)   == instruction_operandsize_prefix && 
+        *addr_at(instruction_offset+1) != instruction_code_xmm_code) {
+      return addr_at(instruction_offset+1); // Not SSE instructions
+    }
+    else if (*addr_at(instruction_offset) == instruction_extended_prefix) {
       return addr_at(instruction_offset+1);
     }
     else if (*addr_at(instruction_offset) == instruction_code_xor) {
@@ -274,6 +278,8 @@
   address next_instruction_address() const {
     switch (*addr_at(instruction_offset)) {
     case instruction_operandsize_prefix:
+      if (*addr_at(instruction_offset+1) == instruction_code_xmm_code)
+        return instruction_address() + instruction_size; // SSE instructions
     case instruction_extended_prefix:
       return instruction_address() + instruction_size + 1;
     case instruction_code_reg2meml:
@@ -287,26 +293,34 @@
     }
   }
   int   offset() const{ 
-    if ( (*addr_at(instruction_offset) == instruction_operandsize_prefix) || 
-         (*addr_at(instruction_offset) == instruction_extended_prefix) ) {
+    if (*addr_at(instruction_offset)   == instruction_operandsize_prefix && 
+        *addr_at(instruction_offset+1) != instruction_code_xmm_code) {
+      return long_at(data_offset+1); // Not SSE instructions
+    }
+    else if (*addr_at(instruction_offset) == instruction_extended_prefix) {
       return long_at(data_offset+1); 
     }
     else if (*addr_at(instruction_offset) == instruction_code_xor || 
              *addr_at(instruction_offset) == instruction_code_xmm_ss_prefix ||
-             *addr_at(instruction_offset) == instruction_code_xmm_sd_prefix) {
+             *addr_at(instruction_offset) == instruction_code_xmm_sd_prefix ||
+             *addr_at(instruction_offset) == instruction_operandsize_prefix) {
       return long_at(data_offset+2); 
     }
     else return long_at(data_offset); 
   }
 
   void  set_offset(int x) {
-    if ( (*addr_at(instruction_offset) == instruction_operandsize_prefix) || 
-         (*addr_at(instruction_offset) == instruction_extended_prefix) ) {
+    if (*addr_at(instruction_offset)   == instruction_operandsize_prefix && 
+        *addr_at(instruction_offset+1) != instruction_code_xmm_code) {
+      set_long_at(data_offset+1, x); // Not SSE instructions
+    }
+    else if (*addr_at(instruction_offset) == instruction_extended_prefix) {
       set_long_at(data_offset+1, x); 
     }
     else if (*addr_at(instruction_offset) == instruction_code_xor || 
              *addr_at(instruction_offset) == instruction_code_xmm_ss_prefix ||
-             *addr_at(instruction_offset) == instruction_code_xmm_sd_prefix) {
+             *addr_at(instruction_offset) == instruction_code_xmm_sd_prefix ||
+             *addr_at(instruction_offset) == instruction_operandsize_prefix) {
       set_long_at(data_offset+2, x); 
     }
     else set_long_at(data_offset, x); 
--- a/hotspot/src/cpu/i486/vm/sharedRuntime_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/sharedRuntime_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)sharedRuntime_i486.cpp	1.50 07/05/17 15:47:00 JVM"
+#pragma ident "@(#)sharedRuntime_i486.cpp	1.51 07/06/08 18:13:19 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -140,23 +140,23 @@
   __ fstp_d(Address(esp, st7_off*wordSize)); // st(7)
 
   if( UseSSE == 1 ) {           // Save the XMM state
-    __ movss(Address(esp,xmm0_off*wordSize),xmm0);
-    __ movss(Address(esp,xmm1_off*wordSize),xmm1);
-    __ movss(Address(esp,xmm2_off*wordSize),xmm2);
-    __ movss(Address(esp,xmm3_off*wordSize),xmm3);
-    __ movss(Address(esp,xmm4_off*wordSize),xmm4);
-    __ movss(Address(esp,xmm5_off*wordSize),xmm5);
-    __ movss(Address(esp,xmm6_off*wordSize),xmm6);
-    __ movss(Address(esp,xmm7_off*wordSize),xmm7);
+    __ movflt(Address(esp,xmm0_off*wordSize),xmm0);
+    __ movflt(Address(esp,xmm1_off*wordSize),xmm1);
+    __ movflt(Address(esp,xmm2_off*wordSize),xmm2);
+    __ movflt(Address(esp,xmm3_off*wordSize),xmm3);
+    __ movflt(Address(esp,xmm4_off*wordSize),xmm4);
+    __ movflt(Address(esp,xmm5_off*wordSize),xmm5);
+    __ movflt(Address(esp,xmm6_off*wordSize),xmm6);
+    __ movflt(Address(esp,xmm7_off*wordSize),xmm7);
   } else if( UseSSE >= 2 ) {
-    __ movsd(Address(esp,xmm0_off*wordSize),xmm0);
-    __ movsd(Address(esp,xmm1_off*wordSize),xmm1);
-    __ movsd(Address(esp,xmm2_off*wordSize),xmm2);
-    __ movsd(Address(esp,xmm3_off*wordSize),xmm3);
-    __ movsd(Address(esp,xmm4_off*wordSize),xmm4);
-    __ movsd(Address(esp,xmm5_off*wordSize),xmm5);
-    __ movsd(Address(esp,xmm6_off*wordSize),xmm6);
-    __ movsd(Address(esp,xmm7_off*wordSize),xmm7);
+    __ movdbl(Address(esp,xmm0_off*wordSize),xmm0);
+    __ movdbl(Address(esp,xmm1_off*wordSize),xmm1);
+    __ movdbl(Address(esp,xmm2_off*wordSize),xmm2);
+    __ movdbl(Address(esp,xmm3_off*wordSize),xmm3);
+    __ movdbl(Address(esp,xmm4_off*wordSize),xmm4);
+    __ movdbl(Address(esp,xmm5_off*wordSize),xmm5);
+    __ movdbl(Address(esp,xmm6_off*wordSize),xmm6);
+    __ movdbl(Address(esp,xmm7_off*wordSize),xmm7);
   }
 
   // Set an oopmap for the call site.  This oopmap will map all
@@ -223,23 +223,23 @@
 
   // Recover XMM & FPU state
   if( UseSSE == 1 ) {
-    __ movss(xmm0,Address(esp,xmm0_off*wordSize));
-    __ movss(xmm1,Address(esp,xmm1_off*wordSize));
-    __ movss(xmm2,Address(esp,xmm2_off*wordSize));
-    __ movss(xmm3,Address(esp,xmm3_off*wordSize));
-    __ movss(xmm4,Address(esp,xmm4_off*wordSize));
-    __ movss(xmm5,Address(esp,xmm5_off*wordSize));
-    __ movss(xmm6,Address(esp,xmm6_off*wordSize));
-    __ movss(xmm7,Address(esp,xmm7_off*wordSize));
+    __ movflt(xmm0,Address(esp,xmm0_off*wordSize));
+    __ movflt(xmm1,Address(esp,xmm1_off*wordSize));
+    __ movflt(xmm2,Address(esp,xmm2_off*wordSize));
+    __ movflt(xmm3,Address(esp,xmm3_off*wordSize));
+    __ movflt(xmm4,Address(esp,xmm4_off*wordSize));
+    __ movflt(xmm5,Address(esp,xmm5_off*wordSize));
+    __ movflt(xmm6,Address(esp,xmm6_off*wordSize));
+    __ movflt(xmm7,Address(esp,xmm7_off*wordSize));
   } else if( UseSSE >= 2 ) {
-    __ movsd(xmm0,Address(esp,xmm0_off*wordSize));
-    __ movsd(xmm1,Address(esp,xmm1_off*wordSize));
-    __ movsd(xmm2,Address(esp,xmm2_off*wordSize));
-    __ movsd(xmm3,Address(esp,xmm3_off*wordSize));
-    __ movsd(xmm4,Address(esp,xmm4_off*wordSize));
-    __ movsd(xmm5,Address(esp,xmm5_off*wordSize));
-    __ movsd(xmm6,Address(esp,xmm6_off*wordSize));
-    __ movsd(xmm7,Address(esp,xmm7_off*wordSize));
+    __ movdbl(xmm0,Address(esp,xmm0_off*wordSize));
+    __ movdbl(xmm1,Address(esp,xmm1_off*wordSize));
+    __ movdbl(xmm2,Address(esp,xmm2_off*wordSize));
+    __ movdbl(xmm3,Address(esp,xmm3_off*wordSize));
+    __ movdbl(xmm4,Address(esp,xmm4_off*wordSize));
+    __ movdbl(xmm5,Address(esp,xmm5_off*wordSize));
+    __ movdbl(xmm6,Address(esp,xmm6_off*wordSize));
+    __ movdbl(xmm7,Address(esp,xmm7_off*wordSize));
   }
   __ pop_FPU_state();
   __ addl(esp,FPU_regs_live*sizeof(jdouble)); // Pop FPU registers
@@ -264,9 +264,9 @@
 
   // Recover XMM & FPU state
   if( UseSSE == 1 ) {
-    __ movss(xmm0, Address(esp, xmm0_off*wordSize));
+    __ movflt(xmm0, Address(esp, xmm0_off*wordSize));
   } else if( UseSSE >= 2 ) {
-    __ movsd(xmm0, Address(esp, xmm0_off*wordSize));
+    __ movdbl(xmm0, Address(esp, xmm0_off*wordSize));
   }
   __ movl(eax, Address(esp, eax_off*wordSize));
   __ movl(edx, Address(esp, edx_off*wordSize));
@@ -431,13 +431,13 @@
 
   if (UseSSE == 1) {
     __ subl(esp, 2*wordSize);
-    __ movss(Address(esp, 0), xmm0);
-    __ movss(Address(esp, wordSize), xmm1);
+    __ movflt(Address(esp, 0), xmm0);
+    __ movflt(Address(esp, wordSize), xmm1);
   }
   if (UseSSE >= 2) {
     __ subl(esp, 4*wordSize);
-    __ movsd(Address(esp, 0), xmm0);
-    __ movsd(Address(esp, 2*wordSize), xmm1);
+    __ movdbl(Address(esp, 0), xmm0);
+    __ movdbl(Address(esp, 2*wordSize), xmm1);
   }
 #ifdef COMPILER2
   // C2 may leave the stack dirty if not in SSE2+ mode
@@ -457,13 +457,13 @@
   __ addl(esp, 2*wordSize);
 
   if (UseSSE == 1) {
-    __ movss(xmm0, Address(esp, 0));
-    __ movss(xmm1, Address(esp, wordSize));
+    __ movflt(xmm0, Address(esp, 0));
+    __ movflt(xmm1, Address(esp, wordSize));
     __ addl(esp, 2*wordSize);
   }
   if (UseSSE >= 2) {
-    __ movsd(xmm0, Address(esp, 0));
-    __ movsd(xmm1, Address(esp, 2*wordSize));
+    __ movdbl(xmm0, Address(esp, 0));
+    __ movdbl(xmm1, Address(esp, 2*wordSize));
     __ addl(esp, 4*wordSize);
   }
 
@@ -493,13 +493,13 @@
 static void move_c2i_double(MacroAssembler *masm, XMMRegister r, int st_off) {
   int next_off = st_off - Interpreter::stackElementSize();
   if (TaggedStackInterpreter) {
-   __ movsd(Address(esp, next_off), r);
+   __ movdbl(Address(esp, next_off), r);
    // Move top half up and put tag in the middle.
    __ movl(edi, Address(esp, next_off+wordSize));
    __ movl(Address(esp, st_off), edi);
    tag_stack(masm, T_DOUBLE, next_off);
   } else {
-   __ movsd(Address(esp, next_off), r);
+   __ movdbl(Address(esp, next_off), r);
   }
 }
 
@@ -594,7 +594,7 @@
     } else {
       assert(r_1->is_XMMRegister(), "");
       if (!r_2->is_valid()) {
-        __ movss(Address(esp, st_off), r_1->as_XMMRegister());
+        __ movflt(Address(esp, st_off), r_1->as_XMMRegister());
         tag_stack(masm, sig_bt[i], st_off);
       } else {
         assert(sig_bt[i] == T_DOUBLE || sig_bt[i] == T_LONG, "wrong type");
@@ -619,11 +619,11 @@
     // use tag slot temporarily for MSW
     __ movl(esi, Address(saved_sp, ld_off));
     __ movl(Address(saved_sp, next_val_off+wordSize), esi);
-    __ movsd(r, Address(saved_sp, next_val_off));
+    __ movdbl(r, Address(saved_sp, next_val_off));
     // restore tag
     __ movl(Address(saved_sp, next_val_off+wordSize), frame::TagValue);
   } else {
-    __ movsd(r, Address(saved_sp, next_val_off));
+    __ movdbl(r, Address(saved_sp, next_val_off));
   }
 }
 
@@ -794,7 +794,7 @@
     } else {
       assert(r_1->is_XMMRegister(), "");
       if (!r_2->is_valid()) {
-        __ movss(r_1->as_XMMRegister(), Address(saved_sp, ld_off));
+        __ movflt(r_1->as_XMMRegister(), Address(saved_sp, ld_off));
       } else {
         move_i2c_double(masm, r_1->as_XMMRegister(), saved_sp, ld_off);
       }
@@ -1008,7 +1008,7 @@
     __ movl(Address(esp, reg2offset_out(dst.first())), eax);
   } else {
     // reg to stack
-    __ movss(Address(esp, reg2offset_out(dst.first())), src.first()->as_XMMRegister());
+    __ movflt(Address(esp, reg2offset_out(dst.first())), src.first()->as_XMMRegister());
   }
 }
 
@@ -1053,7 +1053,7 @@
   } else {
     // reg to stack
     // No worries about stack alignment
-    __ movsd(Address(esp, reg2offset_out(dst.first())), src.first()->as_XMMRegister());
+    __ movdbl(Address(esp, reg2offset_out(dst.first())), src.first()->as_XMMRegister());
   }
 }
 
@@ -1723,13 +1723,13 @@
     if (UseSSE >= 1) {
       // Pop st0 and store as float and reload into xmm register
       __ fstp_s(Address(ebp, -4));
-      __ movss(xmm0, Address(ebp, -4));
+      __ movflt(xmm0, Address(ebp, -4));
     }
   } else if (ret_type == T_DOUBLE) {
     if (UseSSE >= 2) {
       // Pop st0 and store as double and reload into xmm register
       __ fstp_d(Address(ebp, -8));
-      __ movsd(xmm0, Address(ebp, -8));
+      __ movdbl(xmm0, Address(ebp, -8));
     }
   }
 
@@ -2123,8 +2123,8 @@
   __ movl(Address(esp, RegisterSaver::eaxOffset()*wordSize), eax);
   __ movl(Address(esp, RegisterSaver::edxOffset()*wordSize), edx);
   __ fstp_d(Address(esp, RegisterSaver::fpResultOffset()*wordSize));   // Pop float stack and store in local
-  if( UseSSE>=2 ) __ movsd(Address(esp, RegisterSaver::xmm0Offset()*wordSize), xmm0);
-  if( UseSSE==1 ) __ movss(Address(esp, RegisterSaver::xmm0Offset()*wordSize), xmm0);
+  if( UseSSE>=2 ) __ movdbl(Address(esp, RegisterSaver::xmm0Offset()*wordSize), xmm0);
+  if( UseSSE==1 ) __ movflt(Address(esp, RegisterSaver::xmm0Offset()*wordSize), xmm0);
 
   // Set up the args to unpack_frame
 
@@ -2163,13 +2163,13 @@
   __ jcc (Assembler::notZero, results_done);
 
   // return float value as expected by interpreter
-  if( UseSSE>=1 ) __ movss(xmm0, Address(esp, (RegisterSaver::xmm0Offset() + additional_words + 1)*wordSize));
+  if( UseSSE>=1 ) __ movflt(xmm0, Address(esp, (RegisterSaver::xmm0Offset() + additional_words + 1)*wordSize));
   else            __ fld_d(Address(esp, (RegisterSaver::fpResultOffset() + additional_words + 1)*wordSize));
   __ jmp(results_done);
 
   // return double value as expected by interpreter
   __ bind(yes_double_value);
-  if( UseSSE>=2 ) __ movsd(xmm0, Address(esp, (RegisterSaver::xmm0Offset() + additional_words + 1)*wordSize));
+  if( UseSSE>=2 ) __ movdbl(xmm0, Address(esp, (RegisterSaver::xmm0Offset() + additional_words + 1)*wordSize));
   else            __ fld_d(Address(esp, (RegisterSaver::fpResultOffset() + additional_words + 1)*wordSize));
 
   __ bind(results_done);
--- a/hotspot/src/cpu/i486/vm/stubGenerator_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/stubGenerator_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)stubGenerator_i486.cpp	1.85 07/05/17 15:47:05 JVM"
+#pragma ident "@(#)stubGenerator_i486.cpp	1.87 07/06/08 18:13:20 JVM"
 #endif
 /*
  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -269,7 +269,7 @@
     __ BIND(is_float);
     // interpreter uses xmm0 for return values
     if (UseSSE >= 1) {
-      __ movss(Address(edi), xmm0);
+      __ movflt(Address(edi), xmm0);
     } else {
       __ fstp_s(Address(edi));
     }
@@ -278,7 +278,7 @@
     __ BIND(is_double);
     // interpreter uses xmm0 for return values
     if (UseSSE >= 2) {
-      __ movsd(Address(edi), xmm0);
+      __ movdbl(Address(edi), xmm0);
     } else {
       __ fstp_d(Address(edi));
     }
@@ -1017,8 +1017,7 @@
     __ movl(edx, Address(from, count, sf, -4));
     __ movl(Address(to, count, sf, -4), edx);
 
-    if (!aligned && (t == T_BYTE || t == T_SHORT)) {
-      if (t == T_BYTE || t == T_SHORT) {
+    if (t == T_BYTE || t == T_SHORT) {
         __ subl(count, (1<<shift));
       __ BIND(L_copy_2_bytes);
         // copy prefix dword
@@ -1038,7 +1037,6 @@
         } else {
         __ BIND(L_copy_byte);
         }
-      }
     } else {
     __ BIND(L_copy_2_bytes);
     }
--- a/hotspot/src/cpu/i486/vm/vm_version_i486.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/vm_version_i486.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vm_version_i486.cpp	1.64 07/05/17 15:47:14 JVM"
+#pragma ident "@(#)vm_version_i486.cpp	1.66 07/06/13 16:22:13 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -297,14 +297,52 @@
   if( !supports_sse () ) // Drop to 0 if no SSE  support
     UseSSE = 0;
 
+  // On new cpus instructions which update whole XMM register should be used
+  // to prevent partial register stall due to dependencies on high half.
+  //
+  // UseXmmLoadAndClearUpper == true  --> movsd(xmm, mem)
+  // UseXmmLoadAndClearUpper == false --> movlpd(xmm, mem)
+  // UseXmmRegToRegMoveAll == true  --> movaps(xmm, xmm), movapd(xmm, xmm).
+  // UseXmmRegToRegMoveAll == false --> movss(xmm, xmm),  movsd(xmm, xmm).
+
+  if( is_amd() ) { // AMD cpus specific settings
+    if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) {
+      if( supports_sse4a() ) {
+        UseXmmLoadAndClearUpper = true; // use movsd only on '10h' Opteron
+      } else {
+        UseXmmLoadAndClearUpper = false;
+      }
+    }
+    if( FLAG_IS_DEFAULT(UseXmmRegToRegMoveAll) ) {
+      if( supports_sse4a() ) {
+        UseXmmRegToRegMoveAll = true; // use movaps, movapd only on '10h'
+      } else {
+        UseXmmRegToRegMoveAll = false;
+      }
+    }
+  }
+
   if( is_intel() ) { // Intel cpus specific settings
     if( FLAG_IS_DEFAULT(UseStoreImmI16) ) {
       UseStoreImmI16 = false; // don't use it on Intel cpus
     }
-    if( cpu_family() == 6 && supports_sse3() ) { // New Intel cpus
+    if( cpu_family() == 6 || cpu_family() == 15 ) {
       if( FLAG_IS_DEFAULT(UseAddressNop) ) {
-        UseAddressNop = true; // use it on new Intel cpus
+        // Use it on all Intel cpus starting from PentiumPro
+        UseAddressNop = true;
       }
+    }
+    if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) {
+      UseXmmLoadAndClearUpper = true; // use movsd on all Intel cpus
+    }
+    if( FLAG_IS_DEFAULT(UseXmmRegToRegMoveAll) ) {
+      if( supports_sse3() ) {
+        UseXmmRegToRegMoveAll = true; // use movaps, movapd on new Intel cpus
+      } else {
+        UseXmmRegToRegMoveAll = false;
+      }
+    }
+    if( cpu_family() == 6 && supports_sse3() ) { // New Intel cpus
 #ifdef COMPILER2
       if( FLAG_IS_DEFAULT(MaxLoopPad) ) {
         // For new Intel cpus do the next optimization:
--- a/hotspot/src/cpu/i486/vm/vm_version_i486.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/i486/vm/vm_version_i486.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)vm_version_i486.hpp	1.30 07/05/05 17:04:20 JVM"
+#pragma ident "@(#)vm_version_i486.hpp	1.31 07/06/08 14:41:46 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -181,7 +181,7 @@
      CPU_SSE3 = (1 << 8), // sse3  comes from cpuid 1 (ECX)
      CPU_SSSE3= (1 << 9),
      CPU_SSE4 = (1 <<10),
-     CPU_SSE4A= (1 <<10)
+     CPU_SSE4A= (1 <<11)
    } cpuFeatureFlags;
 
   // cpuid information block.  All info derived from executing cpuid with
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)stubGenerator_sparc.cpp	1.229 07/05/17 15:48:38 JVM"
+#pragma ident "@(#)stubGenerator_sparc.cpp	1.230 07/05/31 18:17:41 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1281,6 +1281,11 @@
     // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
     if (!aligned)  BLOCK_COMMENT("Entry:");
 
+    // for short arrays, just do single element copy
+    __ cmp(count, 23); // 16 + 7
+    __ brx(Assembler::less, false, Assembler::pn, L_copy_byte);
+    __ delayed()->mov(G0, offset);
+
     if (aligned) {
       // 'aligned' == true when it is known statically during compilation
       // of this arraycopy call site that both 'from' and 'to' addresses
@@ -1290,14 +1295,6 @@
       // and 8 bytes - in 64-bits VM. So we do it only for 32-bits VM
       //
 #ifndef _LP64
-      // The next check could be put under 'ifndef' since the code in
-      // generate_disjoint_long_copy_core() has own checks and set 'offset'.
-
-      // For short arrays, just do single element copy
-      __ cmp(count, 12); // 8 + 4
-      __ brx(Assembler::less, false, Assembler::pn, L_copy_byte);
-      __ delayed()->mov(G0, offset);
-
       // copy a 4-bytes word if necessary to align 'to' to 8 bytes
       __ andcc(to, 7, G0);
       __ br(Assembler::zero, false, Assembler::pn, L_skip_alignment);
@@ -1309,12 +1306,6 @@
     __ BIND(L_skip_alignment);
 #endif
     } else {
-
-      // for short arrays, just do single element copy
-      __ cmp(count, 23); // 16 + 7
-      __ brx(Assembler::less, false, Assembler::pn, L_copy_byte);
-      __ delayed()->mov(G0, offset);
-
       // copy bytes to align 'to' on 8 byte boundary
       __ andcc(to, 7, G1); // misaligned bytes
       __ br(Assembler::zero, false, Assembler::pt, L_skip_alignment);
@@ -1412,32 +1403,11 @@
     __ brx(Assembler::less, false, Assembler::pn, L_copy_byte);
     __ delayed()->add(from, count, end_from);
 
-    if (aligned) {
-      // 'aligned' == true when it is known statically during compilation
-      // of this arraycopy call site that both 'from' and 'to' addresses
-      // are HeapWordSize aligned (see LibraryCallKit::basictype2arraycopy()).
-      //
-      // Aligned arrays have 4 bytes alignment in 32-bits VM
-      // and 8 bytes - in 64-bits VM.
-      //
-#ifndef _LP64
-      // copy a 2-elements word if necessary to align to 8 bytes
-      __ andcc(end_to, 7, G0);
-      __ br(Assembler::zero, false, Assembler::pn, L_skip_alignment);
-      __ delayed()->ld(end_from, -4, O4);
-      __ dec(end_from, 4);
-      __ dec(end_to,   4);
-      __ dec(count, 4);
-      __ st(O4, end_to, 0);
-    __ BIND(L_skip_alignment);
-#else
-      // The next code is generated in copy_16_bytes_backward_with_shift()
-      // in other cases.
-      __ dec(count, 16);
-#endif
-    } else {
-
-      // copy bytes to align 'to' on 8 byte boundary
+    {
+      // Align end of arrays since they could be not aligned even
+      // when arrays itself are aligned.
+
+      // copy bytes to align 'end_to' on 8 byte boundary
       __ andcc(end_to, 7, G1); // misaligned bytes
       __ br(Assembler::zero, false, Assembler::pt, L_skip_alignment);
       __ delayed()->nop();
@@ -1452,7 +1422,12 @@
     __ BIND(L_skip_alignment);
     }
 #ifdef _LP64
-    if (!aligned)
+    if (aligned) {
+      // Both arrays are aligned to 8-bytes in 64-bits VM.
+      // The 'count' is decremented in copy_16_bytes_backward_with_shift()
+      // in unaligned case.
+      __ dec(count, 16);
+    } else
 #endif
     {
       // Copy with shift 16 bytes per iteration if arrays do not have
@@ -1527,6 +1502,11 @@
     // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
     if (!aligned)  BLOCK_COMMENT("Entry:");
 
+    // for short arrays, just do single element copy
+    __ cmp(count, 11); // 8 + 3  (22 bytes)
+    __ brx(Assembler::less, false, Assembler::pn, L_copy_2_bytes);
+    __ delayed()->mov(G0, offset);
+
     if (aligned) {
       // 'aligned' == true when it is known statically during compilation
       // of this arraycopy call site that both 'from' and 'to' addresses
@@ -1536,14 +1516,6 @@
       // and 8 bytes - in 64-bits VM.
       //
 #ifndef _LP64
-      // The next check could be put under 'ifndef' since the code in
-      // generate_disjoint_long_copy_core() has own checks and set 'offset'.
-
-      // for short arrays, just do single element copy
-      __ cmp(count, 6); // 4 + 2  (12 bytes)
-      __ brx(Assembler::less, false, Assembler::pn, L_copy_2_bytes);
-      __ delayed()->mov(G0, offset);
-
       // copy a 2-elements word if necessary to align 'to' to 8 bytes
       __ andcc(to, 7, G0);
       __ br(Assembler::zero, false, Assembler::pt, L_skip_alignment);
@@ -1555,11 +1527,6 @@
     __ BIND(L_skip_alignment);
 #endif
     } else {
-      // for short arrays, just do single element copy
-      __ cmp(count, 11); // 8 + 3  (22 bytes)
-      __ brx(Assembler::less, false, Assembler::pn, L_copy_2_bytes);
-      __ delayed()->mov(G0, offset);
-
       // copy 1 element if necessary to align 'to' on an 4 bytes
       __ andcc(to, 3, G0);
       __ br(Assembler::zero, false, Assembler::pt, L_skip_alignment);
@@ -1667,31 +1634,11 @@
     __ brx(Assembler::less, false, Assembler::pn, L_copy_2_bytes);
     __ delayed()->add(from, byte_count, end_from);
 
-    if (aligned) {
-      // 'aligned' == true when it is known statically during compilation
-      // of this arraycopy call site that both 'from' and 'to' addresses
-      // are HeapWordSize aligned (see LibraryCallKit::basictype2arraycopy()).
-      //
-      // Aligned arrays have 4 bytes alignment in 32-bits VM
-      // and 8 bytes - in 64-bits VM.
-      //
-#ifndef _LP64
-      // copy a 2-elements word if necessary to align to 8 bytes
-      __ andcc(end_to, 7, G0);
-      __ br(Assembler::zero, false, Assembler::pn, L_skip_alignment);
-      __ delayed()->ld(end_from, -4, O4);
-      __ dec(end_from, 4);
-      __ dec(end_to,   4);
-      __ dec(count, 2);
-      __ st(O4, end_to, 0);
-    __ BIND(L_skip_alignment);
-#else
-      // The next code is generated in copy_16_bytes_backward_with_shift()
-      // in other cases.
-      __ dec(count, 8);
-#endif
-    } else {
-      // copy 1 element if necessary to align 'to' on an 4 bytes
+    {
+      // Align end of arrays since they could be not aligned even
+      // when arrays itself are aligned.
+
+      // copy 1 element if necessary to align 'end_to' on an 4 bytes
       __ andcc(end_to, 3, G0);
       __ br(Assembler::zero, false, Assembler::pt, L_skip_alignment);
       __ delayed()->lduh(end_from, -2, O3);
@@ -1701,7 +1648,7 @@
       __ sth(O3, end_to, 0);
     __ BIND(L_skip_alignment);
 
-      // copy 2 elements to align 'to' on an 8 byte boundary
+      // copy 2 elements to align 'end_to' on an 8 byte boundary
       __ andcc(end_to, 7, G0);
       __ br(Assembler::zero, false, Assembler::pn, L_skip_alignment2);
       __ delayed()->lduh(end_from, -2, O3);
@@ -1714,7 +1661,12 @@
     __ BIND(L_skip_alignment2);
     }
 #ifdef _LP64
-    if (!aligned)
+    if (aligned) {
+      // Both arrays are aligned to 8-bytes in 64-bits VM.
+      // The 'count' is decremented in copy_16_bytes_backward_with_shift()
+      // in unaligned case.
+      __ dec(count, 8);
+    } else
 #endif
     {
       // Copy with shift 16 bytes per iteration if arrays do not have
--- a/hotspot/src/os/linux/vm/mutex_linux.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/os/linux/vm/mutex_linux.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)mutex_linux.cpp	1.47 07/05/05 17:04:35 JVM"
+#pragma ident "@(#)mutex_linux.cpp	1.48 07/05/29 11:38:16 JVM"
 #endif
 /*
  * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -324,6 +324,7 @@
  */
 
 #define NANOSECS_PER_SEC 1000000000
+#define NANOSECS_PER_MILLISEC 1000000
 #define MAX_SECS 100000000
 /*
  * This code is common to linux and solaris and will be moved to a
@@ -360,7 +361,7 @@
     else {
       absTime->tv_sec = secs;
     }
-    absTime->tv_nsec = 0;  // always zero nanos as time was millis   
+    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;   
   }
   else {
     jlong secs = time / NANOSECS_PER_SEC;
--- a/hotspot/src/os/solaris/vm/mutex_solaris.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/os/solaris/vm/mutex_solaris.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)mutex_solaris.cpp	1.64 07/05/05 17:04:40 JVM"
+#pragma ident "@(#)mutex_solaris.cpp	1.65 07/05/29 11:37:57 JVM"
 #endif
 /*
  * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -327,6 +327,7 @@
  */
 
 #define NANOSECS_PER_SEC 1000000000
+#define NANOSECS_PER_MILLISEC 1000000
 #define MAX_SECS 100000000
 /*
  * This code is common to linux and solaris and will be moved to a
@@ -363,7 +364,7 @@
     else {
       absTime->tv_sec = secs;
     }
-    absTime->tv_nsec = 0;  // always zero nanos as time was millis   
+    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;   
   }
   else {
     jlong secs = time / NANOSECS_PER_SEC;
--- a/hotspot/src/os/win32/vm/globals_win32.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/os/win32/vm/globals_win32.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)globals_win32.hpp	1.10 07/05/05 17:04:43 JVM"
+#pragma ident "@(#)globals_win32.hpp	1.11 07/05/29 13:32:14 JVM"
 #endif
 /*
  * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -28,8 +28,11 @@
 //
 // Defines Windows specific flags. They are not available on other platforms.
 //
-#define RUNTIME_OS_FLAGS(develop, develop_pd, product, product_pd, \
-                         diagnostic, notproduct)                   \
+#define RUNTIME_OS_FLAGS(develop, develop_pd, product, product_pd,       \
+                         diagnostic, notproduct)                         \
+                                                                         \
+  product(bool, UseUTCFileTimestamp, true,                               \
+          "Adjust the timestamp returned from stat() to be UTC")
 
 
 //
--- a/hotspot/src/os/win32/vm/os_win32.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/os/win32/vm/os_win32.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)os_win32.cpp	1.526 07/05/17 15:48:49 JVM"
+#pragma ident "@(#)os_win32.cpp	1.527 07/05/29 13:32:15 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -3095,7 +3095,34 @@
     return -1;
   }
   hpi::native_path(strcpy(pathbuf, path));
-  return ::stat(pathbuf, sbuf);
+  int ret = ::stat(pathbuf, sbuf);
+  if (sbuf != NULL && UseUTCFileTimestamp) {
+    // Fix for 6539723.  st_mtime returned from stat() is dependent on 
+    // the system timezone and so can return different values for the 
+    // same file if/when daylight savings time changes.  This adjustment
+    // makes sure the same timestamp is returned regardless of the TZ.
+    //
+    // See:
+    // http://msdn.microsoft.com/library/
+    //   default.asp?url=/library/en-us/sysinfo/base/
+    //   time_zone_information_str.asp
+    // and
+    // http://msdn.microsoft.com/library/default.asp?url=
+    //   /library/en-us/sysinfo/base/settimezoneinformation.asp
+    // 
+    // NOTE: there is a insidious bug here:  If the timezone is changed
+    // after the call to stat() but before 'GetTimeZoneInformation()', then
+    // the adjustment we do here will be wrong and we'll return the wrong
+    // value (which will likely end up creating an invalid class data 
+    // archive).  Absent a better API for this, or some time zone locking 
+    // mechanism, we'll have to live with this risk.
+    TIME_ZONE_INFORMATION tz;
+    DWORD tzid = GetTimeZoneInformation(&tz);
+    int daylightBias = 
+      (tzid == TIME_ZONE_ID_DAYLIGHT) ?  tz.DaylightBias : tz.StandardBias;
+    sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
+  }
+  return ret;
 }
 
 
--- a/hotspot/src/share/tools/MakeDeps/BuildConfig.java	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/tools/MakeDeps/BuildConfig.java	Fri Jun 22 00:46:43 2007 +0000
@@ -659,6 +659,36 @@
     }
 }
 
+class KernelDebugConfig extends GenericDebugConfig {
+    String getOptFlag() {
+	return getCI().getNoOptFlag();
+    }
+
+    KernelDebugConfig() {
+	initNames("kernel", "debug", "fastdebug\\jre\\bin\\kernel\\jvm.dll");
+	init(getIncludes(), getDefines());
+    }
+}
+
+
+class KernelFastDebugConfig extends GenericDebugConfig {
+    String getOptFlag() {
+	return getCI().getOptFlag();
+    }
+
+    KernelFastDebugConfig() {
+	initNames("kernel", "fastdebug", "fastdebug\\jre\\bin\\kernel\\jvm.dll");
+	init(getIncludes(), getDefines());
+    }
+}
+
+
+class KernelProductConfig extends ProductConfig {
+    KernelProductConfig() {
+	initNames("kernel", "product", "jre\\bin\\kernel\\jvm.dll");
+        init(getIncludes(), getDefines());        
+    }
+}
 abstract class CompilerInterface {
     abstract Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir);
     abstract Vector getBaseLinkerFlags(String outDir, String outDll);
--- a/hotspot/src/share/tools/MakeDeps/WinGammaPlatform.java	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/tools/MakeDeps/WinGammaPlatform.java	Fri Jun 22 00:46:43 2007 +0000
@@ -650,6 +650,10 @@
 	    allConfigs.add(new CoreDebugConfig());
 	    allConfigs.add(new CoreFastDebugConfig());
 	    allConfigs.add(new CoreProductConfig());
+
+	    allConfigs.add(new KernelDebugConfig());
+	    allConfigs.add(new KernelFastDebugConfig());
+	    allConfigs.add(new KernelProductConfig());
 	}
 
 	return allConfigs;
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)c1_Runtime1.cpp	1.243 07/05/17 15:49:45 JVM"
+#pragma ident "@(#)c1_Runtime1.cpp	1.244 07/06/01 13:28:38 JVM"
 #endif
 /*
  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -221,6 +221,9 @@
       ResourceMark rm;
       for (int id = 0; id < number_of_ids; id++) {
         _blobs[id]->print();
+        if (_blobs[id]->oop_maps() != NULL) {
+          _blobs[id]->oop_maps()->print();
+        }
       }
     }
 #endif
@@ -1104,8 +1107,7 @@
     // Revisit in Merlin
     memmove(dst_addr, src_addr, length << l2es);
     return ac_ok;
-  } else {
-    assert(src->is_objArray(), "what array type is it else?");
+  } else if (src->is_objArray() && dst->is_objArray()) {
     oop* src_addr = objArrayOop(src)->obj_at_addr(src_pos);
     oop* dst_addr = objArrayOop(dst)->obj_at_addr(dst_pos);
     // For performance reasons, we assume we are using a card marking write
--- a/hotspot/src/share/vm/ci/ciMethod.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/ci/ciMethod.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)ciMethod.hpp	1.62 07/05/05 17:05:14 JVM"
+#pragma ident "@(#)ciMethod.hpp	1.63 07/06/08 15:21:44 JVM"
 #endif
 /*
  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -130,7 +130,7 @@
 
   Bytecodes::Code java_code_at_bci(int bci) {
     address bcp = code() + bci;
-    return Bytecodes::java_code(Bytecodes::cast(*bcp));
+    return Bytecodes::java_code_at(bcp);
   }
   BCEscapeAnalyzer  *get_bcea();
   ciMethodBlocks    *get_method_blocks();
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)classFileParser.cpp	1.278 07/05/17 15:50:13 JVM"
+#pragma ident "@(#)classFileParser.cpp	1.279 07/05/25 15:14:21 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1243,7 +1243,7 @@
   verify_legal_method_name(name, CHECK_(nullHandle));  
 
   u2 signature_index = cfs->get_u2_fast();
-  check_property(
+  guarantee_property(
     valid_cp_range(signature_index, cp_size) &&
       cp->tag_at(signature_index).is_utf8(), 
     "Illegal constant pool index %u for method signature in class file %s", 
--- a/hotspot/src/share/vm/classfile/classFileStream.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/classfile/classFileStream.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)classFileStream.cpp	1.40 07/05/05 17:06:44 JVM"
+#pragma ident "@(#)classFileStream.cpp	1.41 07/05/31 14:29:24 JVM"
 #endif
 /*
  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -42,18 +42,18 @@
 
 u1 ClassFileStream::get_u1(TRAPS) {
   if (_need_verify) {
-    check_truncated_file(_current + 1 > _buffer_end, CHECK_0);
+    guarantee_more(1, CHECK_0);
   } else {
-    assert(_current + 1 <= _buffer_end, "buffer overflow");
+    assert(1 <= _buffer_end - _current, "buffer overflow");
   }
   return *_current++;
 }
 
 u2 ClassFileStream::get_u2(TRAPS) {
   if (_need_verify) {
-    check_truncated_file(_current + 2 > _buffer_end, CHECK_0);
+    guarantee_more(2, CHECK_0);
   } else {
-    assert(_current + 2 <= _buffer_end, "buffer overflow");
+    assert(2 <= _buffer_end - _current, "buffer overflow");
   }
   u1* tmp = _current;
   _current += 2;
@@ -62,9 +62,9 @@
 
 u4 ClassFileStream::get_u4(TRAPS) {
   if (_need_verify) {
-    check_truncated_file(_current + 4 > _buffer_end, CHECK_0);
+    guarantee_more(4, CHECK_0);
   } else {
-    assert(_current + 4 <= _buffer_end, "buffer overflow");
+    assert(4 <= _buffer_end - _current, "buffer overflow");
   }
   u1* tmp = _current;
   _current += 4;
@@ -73,9 +73,9 @@
 
 u8 ClassFileStream::get_u8(TRAPS) {
   if (_need_verify) {
-    check_truncated_file(_current + 8 > _buffer_end, CHECK_0);
+    guarantee_more(8, CHECK_0);
   } else {
-    assert(_current + 8 <= _buffer_end, "buffer overflow");
+    assert(8 <= _buffer_end - _current, "buffer overflow");
   }
   u1* tmp = _current;
   _current += 8;
@@ -84,14 +84,14 @@
 
 void ClassFileStream::skip_u1(int length, TRAPS) {
   if (_need_verify) {
-    check_truncated_file(_current + length > _buffer_end, CHECK);
+    guarantee_more(length, CHECK);
   } 
   _current += length;
 }
 
 void ClassFileStream::skip_u2(int length, TRAPS) {
   if (_need_verify) {
-    check_truncated_file(_current + length * 2 > _buffer_end, CHECK);
+    guarantee_more(length * 2, CHECK);
   } 
   _current += length * 2;
 }
--- a/hotspot/src/share/vm/classfile/classFileStream.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/classfile/classFileStream.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)classFileStream.hpp	1.32 07/05/05 17:06:44 JVM"
+#pragma ident "@(#)classFileStream.hpp	1.33 07/05/31 14:29:25 JVM"
 #endif
 /*
  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -59,7 +59,9 @@
   }
 
   void guarantee_more(int size, TRAPS) {
-    check_truncated_file(_current + size > _buffer_end, CHECK);
+    size_t remaining = (size_t)(_buffer_end - _current);
+    unsigned int usize = (unsigned int)size;
+    check_truncated_file(usize > remaining, CHECK);
   }
 
   // Read u1 from stream
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)systemDictionary.cpp	1.357 07/05/17 15:50:33 JVM"
+#pragma ident "@(#)systemDictionary.cpp	1.358 07/05/23 10:53:15 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -510,8 +510,6 @@
 // Returns non-null klassOop if other thread has completed load
 // and we are done, 
 // If return null klassOop and no pending exception, the caller must load the class
-// At this point, handle_parallel_super_load should never be called
-// with the bootstrapclass loader
 instanceKlassHandle SystemDictionary::handle_parallel_super_load(
     symbolHandle name, symbolHandle superclassname, Handle class_loader, 
     Handle protection_domain, Handle lockObject, TRAPS) {
@@ -692,23 +690,27 @@
   if (!class_has_been_loaded) {
   
     // add placeholder entry to record loading instance class
-    // to prevent parallel instance class loading if classloader object lock
-    // broken
-    // Also needed to prevent modifying bootclasssearchpath
+    // Five cases:
+    // All cases need to prevent modifying bootclasssearchpath
     // in parallel with a classload of same classname
-    // Classloaders that support parallelism, such as the bootstrap classloader
-    // or all classloaders with UnsyncloadClass flag
-    // allow parallel loading of same class/classloader pair
+    // case 1. traditional classloaders that rely on the classloader object lock
+    //   - no other need for LOAD_INSTANCE
+    // case 2. traditional classloaders that break the classloader object lock 
+    //    as a deadlock workaround. Detection of this case requires that
+    //    this check is done while holding the classloader object lock,
+    //    and that lock is still held when calling classloader's loadClass.
+    //    For these classloaders, we ensure that the first requestor
+    //    completes the load and other requestors wait for completion.
+    // case 3. UnsyncloadClass - don't use objectLocker
+    //    With this flag, we allow parallel classloading of a
+    //    class/classloader pair
+    // case4. Bootstrap classloader - don't own objectLocker
+    //    This classloader supports parallelism at the classloader level,
+    //    but only allows a single load of a class/classloader pair.
+    //    No performance benefit and no deadlock issues.
+    // case 5. Future: parallel user level classloaders - without objectLocker
     symbolHandle nullsymbolHandle;
     bool throw_circularity_error = false;
-    // If not a classloader that supports parallelism and
-    // if NOT UnsyncloadClass, and we find an existing LOAD_INSTANCE for this
-    // class/classloader pair,  we know that the
-    // custom classloader explicitly did a wait to release the lock
-    // since we called out to loadClass with the objectlock already held
-    // In that case we should already own the ObjectLocker
-    // and want to send a notify on it
-    // For parallel bootstrap classloader we won't own the ObjectLocker
     {
       MutexLocker mu(SystemDictionary_lock, THREAD);
       if (!UnsyncloadClass) {
@@ -719,21 +721,16 @@
           if (oldprobe->check_seen_thread(THREAD, PlaceholderTable::LOAD_INSTANCE)) {
             throw_circularity_error = true;
           } else {
+            // case 1: traditional: should never see load_in_progress.
             while (!class_has_been_loaded && oldprobe && oldprobe->instance_load_in_progress()) {
      
-              // For classloaders that allow parallelism, including bootstrap classloader
-              // we want to wait on the first requestor for a specific
-              // class/classloader pair
+              // case 4: bootstrap classloader: prevent futile classloading,
+              // wait on first requestor
               if (class_loader.is_null()) {
                 SystemDictionary_lock->wait();
               } else {
-              // if another thread is already loading this instance, then we
-              // know the user has broken the classloader lock
-              // we need to ensure that the first requestor completes the request
-              // and other requestors wait for that completion
-              // The notify allows applications that did an untimed wait() on
-              // the classloader object lock to not hang.
-              // see test b4699981 
+              // case 2: traditional with broken classloader lock. wait on first
+              // requestor.
                 double_lock_wait(lockObject, THREAD);
               }
               // Check if classloading completed while we were waiting
@@ -749,16 +746,26 @@
           } 
         }
       }
-      // add LOAD_INSTANCE regardless of flag
-      // classloaders that support parallelism, such as bootstrap classloader
-      // or all loaders with  UnsyncloadClass 
-      // allow competing threads to try LOAD_INSTANCE in parallel
+      // All cases: add LOAD_INSTANCE 
+      // case 3: UnsyncloadClass: allow competing threads to try
+      // LOAD_INSTANCE in parallel
       // add placeholder entry even if error - callers will remove on error
       if (!class_has_been_loaded) {
         PlaceholderEntry* newprobe = placeholders()->find_and_add(p_index, p_hash, name, class_loader, PlaceholderTable::LOAD_INSTANCE, nullsymbolHandle, THREAD); 
         if (throw_circularity_error) {
           newprobe->remove_seen_thread(THREAD, PlaceholderTable::LOAD_INSTANCE);
         }
+        // For class loaders that do not acquire the classloader object lock,
+        // if they did not catch another thread holding LOAD_INSTANCE,
+        // need a check analogous to the acquire ObjectLocker/find_class 
+        // i.e. now that we hold the LOAD_INSTANCE token on loading this class/CL
+        // one final check if the load has already completed
+        klassOop check = find_class(d_index, d_hash, name, class_loader);
+        if (check != NULL) {
+        // Klass is already loaded, so just return it
+          k = instanceKlassHandle(THREAD, check);
+          class_has_been_loaded = true;
+        }
       }
     }
     // must throw error outside of owning lock
@@ -1414,7 +1421,7 @@
   {
     MutexLocker mu(SystemDictionary_lock, THREAD);
     PlaceholderEntry* probe = placeholders()->get_entry(p_index, p_hash, class_name, class_loader);
-    assert(probe != NULL, "DEFINE_INSTANCE placeholder lost?");
+    assert(probe != NULL, "DEFINE_CLASS placeholder lost?");
     if (probe != NULL) {
       if (HAS_PENDING_EXCEPTION) {
         linkage_exception = Handle(THREAD,PENDING_EXCEPTION);
--- a/hotspot/src/share/vm/classfile/verifier.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/classfile/verifier.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)verifier.cpp	1.112 07/05/05 17:07:02 JVM"
+#pragma ident "@(#)verifier.cpp	1.113 07/05/23 10:53:19 JVM"
 #endif
 /*
  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1477,9 +1477,13 @@
        ((types == (1 <<  JVM_CONSTANT_InterfaceMethodref)) || 
         (types == (1 <<  JVM_CONSTANT_Methodref)) || 
         (types == (1 <<  JVM_CONSTANT_Fieldref)))) {
-    assert((index >= 0) && (index < cache->length()), 
+    int native_index = index;
+    if (Bytes::is_Java_byte_ordering_different()) {
+      native_index = Bytes::swap_u2(index);
+    }
+    assert((native_index >= 0) && (native_index < cache->length()), 
       "Must be a legal index into the cp cache");
-    index = cache->entry_at(index)->constant_pool_index();
+    index = cache->entry_at(native_index)->constant_pool_index();
   }
 
   verify_cp_index(cp, index, CHECK_VERIFY(this));
--- a/hotspot/src/share/vm/code/nmethod.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/code/nmethod.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)nmethod.cpp	1.365 07/05/17 15:50:44 JVM"
+#pragma ident "@(#)nmethod.cpp	1.366 07/06/08 15:21:44 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -2082,7 +2082,7 @@
         tty->print("method is native");
       } else {
         address bcp  = sd->method()->bcp_from(sd->bci());
-        Bytecodes::Code bc = Bytecodes::java_code(Bytecodes::cast(*bcp));
+        Bytecodes::Code bc = Bytecodes::java_code_at(bcp);
         st->print(";*%s", Bytecodes::name(bc));
         switch (bc) {
         case Bytecodes::_invokevirtual:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,116 @@
+#ifdef USE_PRAGMA_IDENT_SRC
+#pragma ident "@(#)cmsCollectorPolicy.cpp	1.1 07/05/16 10:53:57 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+# include "incls/_precompiled.incl"
+# include "incls/_cmsCollectorPolicy.cpp.incl"
+
+//
+// ConcurrentMarkSweepPolicy methods
+//
+
+ConcurrentMarkSweepPolicy::ConcurrentMarkSweepPolicy() {
+  initialize_all();
+}
+
+void ConcurrentMarkSweepPolicy::initialize_generations() {
+  initialize_perm_generation(PermGen::ConcurrentMarkSweep);
+  _generations = new GenerationSpecPtr[number_of_generations()];
+  if (_generations == NULL)
+    vm_exit_during_initialization("Unable to allocate gen spec");
+  
+  if (UseParNewGC && ParallelGCThreads > 0) {
+    if (UseAdaptiveSizePolicy) {
+      _generations[0] = new GenerationSpec(Generation::ASParNew,
+                                           _initial_gen0_size, _max_gen0_size);
+    } else {
+      _generations[0] = new GenerationSpec(Generation::ParNew,
+                                           _initial_gen0_size, _max_gen0_size);
+    }
+  } else {
+    _generations[0] = new GenerationSpec(Generation::DefNew,
+                                         _initial_gen0_size, _max_gen0_size);
+  }
+  if (UseAdaptiveSizePolicy) {
+    _generations[1] = new GenerationSpec(Generation::ASConcurrentMarkSweep,
+                            _initial_gen1_size, _max_gen1_size);
+  } else {
+    _generations[1] = new GenerationSpec(Generation::ConcurrentMarkSweep,
+                            _initial_gen1_size, _max_gen1_size);
+  }
+
+  if (_generations[0] == NULL || _generations[1] == NULL) {
+    vm_exit_during_initialization("Unable to allocate gen spec");
+  }
+}
+
+void ConcurrentMarkSweepPolicy::initialize_size_policy(size_t init_eden_size,
+					       size_t init_promo_size,
+					       size_t init_survivor_size) {
+  double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;
+  double max_gc_pause_sec = ((double) MaxGCPauseMillis)/1000.0;
+  _size_policy = new CMSAdaptiveSizePolicy(init_eden_size,
+					   init_promo_size,
+                                           init_survivor_size,
+                                           max_gc_minor_pause_sec,
+                                           max_gc_pause_sec,
+                                           GCTimeRatio);
+}
+
+void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
+  // initialize the policy counters - 2 collectors, 3 generations
+  if (UseParNewGC && ParallelGCThreads > 0) {
+    _gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 3);
+  }
+  else {
+    _gc_policy_counters = new GCPolicyCounters("Copy:CMS", 2, 3);
+  }
+}
+
+// Returns true if the incremental mode is enabled.
+bool ConcurrentMarkSweepPolicy::has_soft_ended_eden()
+{
+  return CMSIncrementalMode;
+}
+
+
+//
+// ASConcurrentMarkSweepPolicy methods
+//
+
+void ASConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
+
+  assert(size_policy() != NULL, "A size policy is required");
+  // initialize the policy counters - 2 collectors, 3 generations
+  if (UseParNewGC && ParallelGCThreads > 0) {
+    _gc_policy_counters = new CMSGCAdaptivePolicyCounters("ParNew:CMS", 2, 3,
+      size_policy());
+  }
+  else {
+    _gc_policy_counters = new CMSGCAdaptivePolicyCounters("Copy:CMS", 2, 3,
+      size_policy());
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,61 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)cmsCollectorPolicy.hpp	1.1 07/05/16 10:53:57 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+class ConcurrentMarkSweepPolicy : public TwoGenerationCollectorPolicy {
+ protected:
+  void initialize_generations();
+
+ public:
+  ConcurrentMarkSweepPolicy();
+
+  ConcurrentMarkSweepPolicy* as_concurrent_mark_sweep_policy() { return this; }
+
+  void initialize_gc_policy_counters();
+#if 1
+  virtual void initialize_size_policy(size_t init_eden_size,
+				      size_t init_promo_size,
+				      size_t init_survivor_size);
+#endif
+
+  // Returns true if the incremental mode is enabled.
+  virtual bool has_soft_ended_eden();
+};
+
+class ASConcurrentMarkSweepPolicy : public ConcurrentMarkSweepPolicy {
+ public:
+
+  // Initialize the jstat counters.  This method requires a
+  // size policy.  The size policy is expected to be created
+  // after the generations are fully initialized so the
+  // initialization of the counters need to be done post
+  // the initialization of the generations.
+  void initialize_gc_policy_counters();
+
+  virtual CollectorPolicy::Name kind() { 
+    return CollectorPolicy::ASConcurrentMarkSweepPolicyKind; 
+  }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,335 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)cmsOopClosures.hpp	1.2 07/05/16 16:53:01 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+/////////////////////////////////////////////////////////////////
+// Closures used by ConcurrentMarkSweepGeneration's collector
+/////////////////////////////////////////////////////////////////
+class ConcurrentMarkSweepGeneration;
+class CMSBitMap;
+class CMSMarkStack;
+class CMSCollector;
+class OopTaskQueue;
+class OopTaskQueueSet;
+class MarkFromRootsClosure;
+class Par_MarkFromRootsClosure;
+
+class MarkRefsIntoClosure: public OopsInGenClosure {
+  const MemRegion    _span;
+  CMSBitMap*         _bitMap;
+  const bool         _should_do_nmethods;
+ public:
+  MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap,
+                      bool should_do_nmethods);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop(p); }
+  bool do_header() { return true; }
+  virtual const bool do_nmethods() const {
+    return _should_do_nmethods;
+  }
+  Prefetch::style prefetch_style() {
+    return Prefetch::do_read;
+  }
+};
+
+// A variant of the above used in certain kinds of CMS
+// marking verification.
+class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
+  const MemRegion    _span;
+  CMSBitMap*         _verification_bm;
+  CMSBitMap*         _cms_bm;
+  const bool         _should_do_nmethods;
+ public:
+  MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
+                            CMSBitMap* cms_bm, bool should_do_nmethods);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop(p); }
+  bool do_header() { return true; }
+  virtual const bool do_nmethods() const {
+    return _should_do_nmethods;
+  }
+  Prefetch::style prefetch_style() {
+    return Prefetch::do_read;
+  }
+};
+
+
+// The non-parallel version (the parallel version appears further below).
+class PushAndMarkClosure: public OopClosure {
+  CMSCollector*    _collector;
+  MemRegion        _span;
+  CMSBitMap*       _bit_map;
+  CMSBitMap*       _mod_union_table;
+  CMSMarkStack*    _mark_stack;
+  CMSMarkStack*    _revisit_stack;
+  bool             _concurrent_precleaning;
+  bool     const   _should_remember_klasses;
+ public:
+  PushAndMarkClosure(CMSCollector* collector,
+                     MemRegion span,
+                     ReferenceProcessor* rp,
+                     CMSBitMap* bit_map,
+                     CMSBitMap* mod_union_table,
+                     CMSMarkStack*  mark_stack,
+                     CMSMarkStack*  revisit_stack,
+                     bool           concurrent_precleaning);
+
+  void do_oop(oop* p);    
+  void do_oop_nv(oop* p)  { PushAndMarkClosure::do_oop(p); }
+  bool do_header() { return true; }
+  Prefetch::style prefetch_style() {
+    return Prefetch::do_read;
+  }
+  const bool should_remember_klasses() const {
+    return _should_remember_klasses;
+  }
+  void remember_klass(Klass* k);
+};
+
+// In the parallel case, the revisit stack, the bit map and the
+// reference processor are currently all shared. Access to
+// these shared mutable structures must use appropriate
+// synchronization (for instance, via CAS). The marking stack
+// used in the non-parallel case above is here replaced with
+// an OopTaskQueue structure to allow efficient work stealing.
+class Par_PushAndMarkClosure: public OopClosure {
+  CMSCollector*    _collector;
+  MemRegion        _span;
+  CMSBitMap*       _bit_map;
+  OopTaskQueue*    _work_queue;
+  CMSMarkStack*    _revisit_stack;
+  bool     const   _should_remember_klasses;
+ public:
+  Par_PushAndMarkClosure(CMSCollector* collector,
+                         MemRegion span,
+                         ReferenceProcessor* rp,
+                         CMSBitMap* bit_map,
+                         OopTaskQueue* work_queue,
+                         CMSMarkStack* revisit_stack);
+
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p)  { Par_PushAndMarkClosure::do_oop(p); }
+  bool do_header() { return true; }
+  Prefetch::style prefetch_style() {
+    return Prefetch::do_read;
+  }
+  const bool should_remember_klasses() const {
+    return _should_remember_klasses;
+  }
+  void remember_klass(Klass* k);
+};
+
+
+// The non-parallel version (the parallel version appears further below).
+class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
+  MemRegion                  _span;
+  CMSBitMap*                 _bit_map;
+  CMSMarkStack*              _mark_stack;
+  PushAndMarkClosure         _pushAndMarkClosure;
+  CMSCollector*              _collector;
+  bool                       _yield;
+  // Whether closure is being used for concurrent precleaning
+  bool                       _concurrent_precleaning;
+  Mutex*                     _freelistLock;
+ public:
+  MarkRefsIntoAndScanClosure(MemRegion span,
+                             ReferenceProcessor* rp,
+                             CMSBitMap* bit_map,
+                             CMSBitMap* mod_union_table,
+                             CMSMarkStack*  mark_stack,
+                             CMSMarkStack*  revisit_stack,
+                             CMSCollector* collector,
+                             bool should_yield,
+                             bool concurrent_precleaning);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop(p); }
+  bool do_header() { return true; }
+  virtual const bool do_nmethods() const { return true; }
+  Prefetch::style prefetch_style() {
+    return Prefetch::do_read;
+  }
+  void set_freelistLock(Mutex* m) {
+    _freelistLock = m;
+  }
+
+ private:
+  inline void do_yield_check();
+  void do_yield_work();
+  bool take_from_overflow_list();
+};
+
+// Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
+// stack and the bitMap are shared, so access needs to be suitably
+// sycnhronized. An OopTaskQueue structure, supporting efficient
+// workstealing, replaces a CMSMarkStack for storing grey objects.
+class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
+  MemRegion                      _span;
+  CMSBitMap*                     _bit_map;
+  OopTaskQueue*                  _work_queue;
+  const uint                     _low_water_mark;
+  Par_PushAndMarkClosure         _par_pushAndMarkClosure;
+ public:
+  Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
+                                 MemRegion span,
+                                 ReferenceProcessor* rp,
+                                 CMSBitMap* bit_map,
+                                 OopTaskQueue* work_queue,
+                                 CMSMarkStack*  revisit_stack);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop(p); }
+  bool do_header() { return true; }
+  virtual const bool do_nmethods() const { return true; }
+  Prefetch::style prefetch_style() {
+    return Prefetch::do_read;
+  }
+  void trim_queue(uint size);
+};
+
+// This closure is used during the concurrent marking phase
+// following the first checkpoint. Its use is buried in
+// the closure MarkFromRootsClosure.
+class PushOrMarkClosure: public OopClosure {
+  CMSCollector*    _collector;
+  MemRegion        _span;
+  CMSBitMap*       _bitMap;
+  CMSMarkStack*    _markStack;
+  CMSMarkStack*    _revisitStack;
+  HeapWord* const  _finger;
+  MarkFromRootsClosure* const _parent;
+  bool                  const _should_remember_klasses;
+ public:
+  PushOrMarkClosure(CMSCollector* cms_collector,
+                    MemRegion span,
+                    CMSBitMap* bitMap,
+                    CMSMarkStack*  markStack,
+                    CMSMarkStack*  revisitStack,
+                    HeapWord*      finger,
+                    MarkFromRootsClosure* parent);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p)  { PushOrMarkClosure::do_oop(p); }
+  const bool should_remember_klasses() const {
+    return _should_remember_klasses;
+  }
+  void remember_klass(Klass* k);
+  // Deal with a stack overflow condition
+  void handle_stack_overflow(HeapWord* lost);
+ private:
+  inline void do_yield_check();
+};
+
+// A parallel (MT) version of the above.
+// This closure is used during the concurrent marking phase
+// following the first checkpoint. Its use is buried in
+// the closure Par_MarkFromRootsClosure.
+class Par_PushOrMarkClosure: public OopClosure {
+  CMSCollector*    _collector;
+  MemRegion        _whole_span;
+  MemRegion        _span;        // local chunk
+  CMSBitMap*       _bit_map;
+  OopTaskQueue*    _work_queue;
+  CMSMarkStack*    _overflow_stack;
+  CMSMarkStack*    _revisit_stack;
+  HeapWord*  const _finger;
+  HeapWord** const _global_finger_addr;
+  Par_MarkFromRootsClosure* const _parent;
+  bool       const _should_remember_klasses;
+ public:
+  Par_PushOrMarkClosure(CMSCollector* cms_collector,
+                    MemRegion span,
+                    CMSBitMap* bit_map,
+                    OopTaskQueue* work_queue,
+                    CMSMarkStack*  mark_stack,
+                    CMSMarkStack*  revisit_stack,
+                    HeapWord*      finger,
+                    HeapWord**     global_finger_addr,
+                    Par_MarkFromRootsClosure* parent);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p)  { Par_PushOrMarkClosure::do_oop(p); }
+  const bool should_remember_klasses() const {
+    return _should_remember_klasses;
+  }
+  void remember_klass(Klass* k);
+  // Deal with a stack overflow condition
+  void handle_stack_overflow(HeapWord* lost);
+ private:
+  inline void do_yield_check();
+};
+
+// For objects in CMS generation, this closure marks
+// given objects (transitively) as being reachable/live.
+// This is currently used during the (weak) reference object
+// processing phase of the CMS final checkpoint step.
+class CMSKeepAliveClosure: public OopClosure {
+  CMSCollector* _collector;
+  MemRegion     _span;
+  CMSMarkStack* _mark_stack;
+  CMSBitMap*    _bit_map;
+ public:
+  CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
+                      CMSBitMap* bit_map, CMSMarkStack* mark_stack):
+    _collector(collector),
+    _span(span),
+    _bit_map(bit_map),
+    _mark_stack(mark_stack) { }
+
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop(p); }
+};
+
+class CMSInnerParMarkAndPushClosure: public OopClosure {
+  CMSCollector* _collector;
+  MemRegion     _span;
+  OopTaskQueue* _work_queue;
+  CMSBitMap*    _bit_map;
+ public:
+  CMSInnerParMarkAndPushClosure(CMSCollector* collector,
+                                MemRegion span, CMSBitMap* bit_map,
+                                OopTaskQueue* work_queue):
+    _collector(collector),
+    _span(span),
+    _bit_map(bit_map),
+    _work_queue(work_queue) { }
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop(p); }
+};
+
+// A parallel (MT) version of the above, used when
+// reference processing is parallel; the only difference
+// is in the do_oop method.
+class CMSParKeepAliveClosure: public OopClosure {
+  CMSCollector* _collector;
+  MemRegion     _span;
+  OopTaskQueue* _work_queue;
+  CMSBitMap*    _bit_map;
+  CMSInnerParMarkAndPushClosure _mark_and_push;
+  const uint    _low_water_mark;
+  void trim_queue(uint max);
+ public:
+  CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
+                         CMSBitMap* bit_map, OopTaskQueue* work_queue);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop(p); }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,61 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)cmsOopClosures.inline.hpp	1.1 07/05/16 10:52:51 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+// Trim our work_queue so its length is below max at return
+inline void Par_MarkRefsIntoAndScanClosure::trim_queue(uint max) {
+  while (_work_queue->size() > max) {
+    oop newOop;
+    if (_work_queue->pop_local(newOop)) {
+      assert(newOop->is_oop(), "Expected an oop");
+      assert(_bit_map->isMarked((HeapWord*)newOop),
+             "only grey objects on this stack");
+      // iterate over the oops in this oop, marking and pushing
+      // the ones in CMS heap (i.e. in _span).
+      newOop->oop_iterate(&_par_pushAndMarkClosure);
+    }
+  }
+}
+
+inline void PushOrMarkClosure::remember_klass(Klass* k) {
+  if (!_revisitStack->push(oop(k))) {
+    fatal("Revisit stack overflow in PushOrMarkClosure");
+  }
+}
+
+inline void Par_PushOrMarkClosure::remember_klass(Klass* k) {
+  if (!_revisit_stack->par_push(oop(k))) {
+    fatal("Revisit stack overflow in PushOrMarkClosure");
+  }
+}
+
+inline void PushOrMarkClosure::do_yield_check() {
+  _parent->do_yield_check();
+}
+
+inline void Par_PushOrMarkClosure::do_yield_check() {
+  _parent->do_yield_check();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsPermGen.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,112 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)cmsPermGen.cpp	1.2 07/05/16 16:53:01 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_cmsPermGen.cpp.incl"
+
+CMSPermGen::CMSPermGen(ReservedSpace rs, size_t initial_byte_size,
+             CardTableRS* ct,
+             FreeBlockDictionary::DictionaryChoice dictionaryChoice) {
+  CMSPermGenGen* g =
+    new CMSPermGenGen(rs, initial_byte_size, -1, ct);
+  if (g == NULL) {
+    vm_exit_during_initialization("Could not allocate a CompactingPermGen");
+  }
+
+  g->initialize_performance_counters();
+
+  _gen = g;
+}
+
+HeapWord* CMSPermGen::mem_allocate(size_t size) {
+  Mutex* lock = _gen->freelistLock();
+  bool lock_owned = lock->owned_by_self();
+  if (lock_owned) {
+    MutexUnlocker mul(lock);
+    return mem_allocate_work(size);
+  } else {
+    return mem_allocate_work(size);
+  }
+}
+  
+HeapWord* CMSPermGen::mem_allocate_work(size_t size) {
+  assert(!_gen->freelistLock()->owned_by_self(), "Potetntial deadlock");
+
+  MutexLocker ml(Heap_lock);
+  HeapWord* obj = NULL;
+
+  obj = _gen->allocate(size, false);
+  // Since we want to minimize pause times, we will prefer
+  // expanding the perm gen rather than doing a stop-world
+  // collection to satisfy the allocation request.
+  if (obj == NULL) {
+    // Try to expand the perm gen and allocate space.
+    obj = _gen->expand_and_allocate(size, false, false);
+    if (obj == NULL) {
+      // Let's see if a normal stop-world full collection will
+      // free up enough space.
+      SharedHeap::heap()->collect_locked(GCCause::_permanent_generation_full);
+      obj = _gen->allocate(size, false);
+      if (obj == NULL) {
+        // The collection above may have shrunk the space, so try
+        // to expand again and allocate space.
+        obj = _gen->expand_and_allocate(size, false, false);
+      }
+      if (obj == NULL) {
+        // We have not been able to allocate space despite a
+        // full stop-world collection. We now make a last-ditch collection
+        // attempt (in which soft refs are all aggressively freed)
+        // that will try to reclaim as much space as possible.
+        SharedHeap::heap()->collect_locked(GCCause::_last_ditch_collection);
+        obj = _gen->allocate(size, false);
+        if (obj == NULL) {
+          // Expand generation in case it was shrunk following the collection.
+          obj = _gen->expand_and_allocate(size, false, false);
+        }
+      }
+    }
+  }
+  return obj;
+}
+
+void CMSPermGen::compute_new_size() {
+  _gen->compute_new_size();
+}
+
+void CMSPermGenGen::initialize_performance_counters() {
+
+  const char* gen_name = "perm";
+
+  // Generation Counters - generation 2, 1 subspace
+  _gen_counters = new GenerationCounters(gen_name, 2, 1, &_virtual_space);
+
+  _gc_counters = NULL;
+
+  _space_counters = new GSpaceCounters(gen_name, 0,
+                                       _virtual_space.reserved_size(),
+                                       this, _gen_counters);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsPermGen.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,77 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)cmsPermGen.hpp	1.1 07/05/02 16:12:51 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+class CardTableRS;   // fwd decl
+class ConcurrentMarkSweepGeneration;
+
+// A PermGen implemented with a CMS space, collected by a CMS collector.
+class CMSPermGen:  public PermGen {
+  friend class VMStructs;
+
+  HeapWord* mem_allocate_work(size_t size);
+ protected:
+  // The "generation" view.
+  ConcurrentMarkSweepGeneration* _gen;
+
+ public:
+  CMSPermGen(ReservedSpace rs, size_t initial_byte_size,
+             CardTableRS* ct, FreeBlockDictionary::DictionaryChoice);
+
+  HeapWord* mem_allocate(size_t size);
+
+  void compute_new_size();
+
+  Generation* as_gen() const { return _gen; }
+};
+
+// This is the "generation" view of a CMSPermGen.
+class CMSPermGenGen: public ConcurrentMarkSweepGeneration {
+  // Abstractly, this is a subtype that gets access to protected fields.
+  friend class CMSPermGen;
+public:
+  CMSPermGenGen(ReservedSpace rs, size_t initial_byte_size,
+                       int level, CardTableRS* ct):
+    // See comments in the constructor for CompactibleFreeListSpace
+    // regarding not using adaptive free lists for a perm gen.
+    ConcurrentMarkSweepGeneration(rs, initial_byte_size, // MinPermHeapExapnsion
+      level, ct, false /* use adaptive freelists */,
+      (FreeBlockDictionary::DictionaryChoice)CMSDictionaryChoice)
+  {}
+
+  void initialize_performance_counters();
+
+  const char* name() const {
+    return "concurrent-mark-sweep perm gen";
+  }
+
+  const char* short_name() const {
+    return "CMS Perm";
+  }
+
+  bool must_be_youngest() const { return false; }
+  bool must_be_oldest() const { return false; }
+};
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)concurrentMarkSweepGeneration.cpp	1.286 07/05/17 15:52:02 JVM"
+#pragma ident "@(#)concurrentMarkSweepGeneration.cpp	1.289 07/06/08 23:10:19 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -2200,7 +2200,7 @@
           ReleaseForegroundGC x(this);
 	  stats().record_cms_begin();
 
-          VM_CMS_Initial_Mark_Operation initial_mark_op(this);
+          VM_CMS_Initial_Mark initial_mark_op(this);
 	  VMThread::execute(&initial_mark_op);
         }
 	// The collector state may be any legal state at this point
@@ -2244,7 +2244,7 @@
         {
           ReleaseForegroundGC x(this);
 
-          VM_CMS_Final_Remark_Operation final_remark_op(this);
+          VM_CMS_Final_Remark final_remark_op(this);
           VMThread::execute(&final_remark_op);
 	  }
         assert(_foregroundGCShouldWait, "block post-condition");
@@ -3293,6 +3293,7 @@
     _collector->resetYields();
   }
   if (PrintGCDetails && PrintGCTimeStamps) {
+    gclog_or_tty->date_stamp(PrintGCDateStamps);
     gclog_or_tty->stamp();
     gclog_or_tty->print_cr(": [%s-concurrent-%s-start]", 
       _collector->cmsGen()->short_name(), _phase);
@@ -3307,6 +3308,7 @@
   _collector->stopTimer();
   _wallclock.stop();
   if (PrintGCDetails) {
+    gclog_or_tty->date_stamp(PrintGCDateStamps);
     if (PrintGCTimeStamps) {
       gclog_or_tty->stamp();
       gclog_or_tty->print(": ");
@@ -5169,6 +5171,7 @@
       }
       assert(_cursor[j] < cur_sca->end(), "ctl pt invariant");
       HeapWord* cur_val = cur_sca->nth(_cursor[j]);
+      assert(surv->used_region().contains(cur_val), "Out of bounds value");
       if (cur_val < min_val) {
         min_tid = j;
         min_val = cur_val;
@@ -5980,6 +5983,7 @@
 }
 
 void CMSCollector::do_CMS_operation(CMS_op_type op) {
+  gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
   TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
   TraceTime t("GC", PrintGC, !PrintGCDetails, gclog_or_tty);
   TraceCollectorStats tcs(counters());
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)concurrentMarkSweepGeneration.hpp	1.159 07/05/17 15:52:09 JVM"
+#pragma ident "@(#)concurrentMarkSweepGeneration.hpp	1.160 07/05/23 10:53:26 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -505,8 +505,8 @@
   NOT_PRODUCT(friend class ScanMarkedObjectsAgainClosure;) //  assertion on _overflow_list
   friend class ReleaseForegroundGC;  // to access _foregroundGCShouldWait
   friend class VM_CMS_Operation;
-  friend class VM_CMS_Initial_Mark_Operation;
-  friend class VM_CMS_Final_Remark_Operation;
+  friend class VM_CMS_Initial_Mark;
+  friend class VM_CMS_Final_Remark;
 
  private:
   jlong _time_of_last_gc;
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vmCMSOperations.cpp	1.14 07/05/05 17:05:25 JVM"
+#pragma ident "@(#)vmCMSOperations.cpp	1.16 07/05/29 09:44:13 JVM"
 #endif
 /*
  * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -119,9 +119,9 @@
 }
 
 //////////////////////////////////////////////////////////
-// Methods in class VM_CMS_Initial_Mark_Operation
+// Methods in class VM_CMS_Initial_Mark
 //////////////////////////////////////////////////////////
-void VM_CMS_Initial_Mark_Operation::doit() {
+void VM_CMS_Initial_Mark::doit() {
   if (lost_race()) {
     // Nothing to do.
     return;
@@ -143,7 +143,7 @@
 //////////////////////////////////////////////////////////
 // Methods in class VM_CMS_Final_Remark_Operation
 //////////////////////////////////////////////////////////
-void VM_CMS_Final_Remark_Operation::doit() {
+void VM_CMS_Final_Remark::doit() {
   if (lost_race()) {
     // Nothing to do.
     return;
@@ -161,3 +161,94 @@
   VM_CMS_Operation::verify_after_gc();
   HS_DTRACE_PROBE(hs_private, cms__remark__end);
 }
+
+// VM operation to invoke a concurrent collection of a
+// GenCollectedHeap heap.
+void VM_GenCollectFullConcurrent::doit() {
+  assert(Thread::current()->is_VM_thread(), "Should be VM thread");
+  
+  GenCollectedHeap* gch = GenCollectedHeap::heap();
+  if (_gc_count_before == gch->total_collections()) {
+    // The "full" of do_full_collection call below "forces"
+    // a collection; the second arg, 0, below ensures that
+    // only the young gen is collected. XXX In the future,
+    // we'll probably need to have something in this interface
+    // to say do this only if we are sure we will not bail
+    // out to a full collection in this attempt, but that's
+    // for the future.
+    assert(SafepointSynchronize::is_at_safepoint(),
+      "We can only be executing this arm of if at a safepoint");
+    GCCauseSetter gccs(gch, _gc_cause);
+    gch->do_full_collection(gch->must_clear_all_soft_refs(),
+                            0 /* collect only youngest gen */);
+  } // Else no need for a foreground young gc
+  assert((_gc_count_before < gch->total_collections()) ||
+         (GC_locker::is_active() /* gc may have been skipped */
+          && (_gc_count_before == gch->total_collections())),
+         "total_collections() should be monotonically increasing");
+
+  MutexLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
+  if (gch->total_full_collections() == _full_gc_count_before) {
+    // Disable iCMS until the full collection is done.
+    CMSCollector::disable_icms();
+    // In case CMS thread was in icms_wait(), wake it up.
+    CMSCollector::start_icms();
+    // Nudge the CMS thread to start a concurrent collection    
+    CMSCollector::request_full_gc(_full_gc_count_before);
+  } else {
+    FullGCCount_lock->notify_all();  // Inform the Java thread its work is done
+  }
+}
+
+bool VM_GenCollectFullConcurrent::evaluate_at_safepoint() const {
+  Thread* thr = Thread::current();
+  assert(thr != NULL, "Unexpected tid");
+  if (!thr->is_Java_thread()) {
+    assert(thr->is_VM_thread(), "Expected to be evaluated by VM thread");
+    GenCollectedHeap* gch = GenCollectedHeap::heap();
+    if (_gc_count_before != gch->total_collections()) {
+      // No need to do a young gc, we'll just nudge the CMS thread
+      // in the doit() method above, to be executed soon.
+      assert(_gc_count_before < gch->total_collections(),
+             "total_collections() should be monotnically increasing");
+      return false;  // no need for foreground young gc
+    }
+  }
+  return true;       // may still need foreground young gc
+}
+
+
+void VM_GenCollectFullConcurrent::doit_epilogue() {
+  Thread* thr = Thread::current();
+  assert(thr->is_Java_thread(), "just checking");
+  JavaThread* jt = (JavaThread*)thr;
+  // Release the Heap_lock first.
+  Heap_lock->unlock();
+  release_and_notify_pending_list_lock();
+
+  // It is fine to test whether completed collections has
+  // exceeded our request count without locking because
+  // the completion count is monotonically increasing;
+  // this will break for very long-running apps when the
+  // count overflows and wraps around. XXX fix me !!!
+  // e.g. at the rate of 1 full gc per ms, this could
+  // overflow in about 1000 years.
+  GenCollectedHeap* gch = GenCollectedHeap::heap();
+  if (gch->total_full_collections_completed() <= _full_gc_count_before) {
+    // Now, wait for witnessing concurrent gc cycle to complete,
+    // but do so in native mode, because we want to lock the
+    // FullGCEvent_lock, which may be needed by the VM thread
+    // or by the CMS thread, so we do not want to be suspended
+    // while holding that lock.
+    ThreadToNativeFromVM native(jt);
+    MutexLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
+    // Either a concurrent or a stop-world full gc is sufficient
+    // witness to our request.
+    while (gch->total_full_collections_completed() <= _full_gc_count_before) {
+      FullGCCount_lock->wait(Mutex::_no_safepoint_check_flag);
+    }
+  }
+  // Enable iCMS back.
+  CMSCollector::enable_icms();
+}
+
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)vmCMSOperations.hpp	1.11 07/05/05 17:05:25 JVM"
+#pragma ident "@(#)vmCMSOperations.hpp	1.13 07/05/29 09:44:13 JVM"
 #endif
 /*
  * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -37,8 +37,8 @@
 //    - implements the common portion of work done in support
 //      of CMS' stop-world phases (initial mark and remark).
 //
-//      VM_CMS_Initial_Mark_Operation
-//      VM_CMS_Final_Mark_Operation
+//      VM_CMS_Initial_Mark
+//      VM_CMS_Final_Mark
 //     
 
 // Forward decl.
@@ -85,10 +85,12 @@
 
 
 // VM_CMS_Operation for the initial marking phase of CMS.
-class VM_CMS_Initial_Mark_Operation: public VM_CMS_Operation {
+class VM_CMS_Initial_Mark: public VM_CMS_Operation {
  public:
-  VM_CMS_Initial_Mark_Operation(CMSCollector* _collector) :
+  VM_CMS_Initial_Mark(CMSCollector* _collector) :
     VM_CMS_Operation(_collector) {}
+
+  virtual VMOp_Type type() const { return VMOp_CMS_Initial_Mark; }
   virtual void doit();
 
   virtual const CMSCollector::CollectorState legal_state() const {
@@ -98,17 +100,14 @@
   virtual const bool needs_pll() const {
     return false;
   }
-
-  virtual const char* name() const {
-    return "CMS initial mark operation";
-  }
 };
 
 // VM_CMS_Operation for the final remark phase of CMS.
-class VM_CMS_Final_Remark_Operation: public VM_CMS_Operation {
+class VM_CMS_Final_Remark: public VM_CMS_Operation {
  public:
-  VM_CMS_Final_Remark_Operation(CMSCollector* _collector) :
+  VM_CMS_Final_Remark(CMSCollector* _collector) :
     VM_CMS_Operation(_collector) {}
+  virtual VMOp_Type type() const { return VMOp_CMS_Final_Remark; }
   virtual void doit();
 
   virtual const CMSCollector::CollectorState legal_state() const {
@@ -118,8 +117,26 @@
   virtual const bool needs_pll() const {
     return true;
   }
+};
 
-  virtual const char* name() const {
-    return "CMS final remark operation";
+
+// VM operation to invoke a concurrent collection of the heap as a
+// GenCollectedHeap heap.
+class VM_GenCollectFullConcurrent: public VM_GC_Operation {
+ public:
+  VM_GenCollectFullConcurrent(unsigned int gc_count_before,
+                              unsigned int full_gc_count_before,
+                              GCCause::Cause gc_cause)
+    : VM_GC_Operation(gc_count_before, full_gc_count_before, true /* full */) {
+    _gc_cause = gc_cause;
+    assert(FullGCCount_lock != NULL && UseConcMarkSweepGC &&
+           ExplicitGCInvokesConcurrent, "Otherwise shouldn't be here");
+    assert(UseAsyncConcMarkSweepGC, "Else will hang caller");
   }
+  ~VM_GenCollectFullConcurrent() {}
+  virtual VMOp_Type type() const { return VMOp_GenCollectFullConcurrent; }
+  virtual void doit();
+  virtual void doit_epilogue();
+  virtual bool is_cheap_allocated() const { return false; }
+  virtual bool evaluate_at_safepoint() const;
 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,67 @@
+#ifdef USE_PRAGMA_IDENT_SRC
+#pragma ident "@(#)vmStructs_cms.hpp	1.2 07/05/01 19:01:30 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+#define VM_STRUCTS_CMS(nonstatic_field, \
+                   static_field) \
+  nonstatic_field(CompactibleFreeListSpace,    _collector,                                    CMSCollector*)                         \
+  nonstatic_field(CompactibleFreeListSpace,    _bt,                                           BlockOffsetArrayNonContigSpace)        \
+                                                                                                                                     \
+  nonstatic_field(CMSPermGen,                  _gen,                                          ConcurrentMarkSweepGeneration*)        \
+  nonstatic_field(CMSBitMap,                   _bmStartWord,                                  HeapWord*)                             \
+  nonstatic_field(CMSBitMap,                   _bmWordSize,                                   size_t)                                \
+  nonstatic_field(CMSBitMap,                   _shifter,                                      const int)                            \
+  nonstatic_field(CMSBitMap,                      _bm,                                           BitMap)                            \
+  nonstatic_field(CMSBitMap,                   _virtual_space,                                VirtualSpace)                         \
+  nonstatic_field(CMSCollector,                _markBitMap,                                   CMSBitMap)                             \
+  nonstatic_field(ConcurrentMarkSweepGeneration, _cmsSpace,                                   CompactibleFreeListSpace*)             \
+     static_field(ConcurrentMarkSweepThread,   _collector,                                    CMSCollector*)                         \
+  nonstatic_field(FreeChunk,                   _next,                                         FreeChunk*)                            \
+  nonstatic_field(FreeChunk,                   _prev,                                         FreeChunk*)                            \
+  nonstatic_field(FreeChunk,                   _size,                                         size_t)
+
+#define VM_TYPES_CMS(declare_type,                                        \
+                     declare_toplevel_type)                               \
+                                                                          \
+           declare_type(ConcurrentMarkSweepGeneration,CardGeneration)     \
+           declare_type(CompactibleFreeListSpace,     CompactibleSpace)   \
+           declare_type(CMSPermGenGen,                ConcurrentMarkSweepGeneration) \
+           declare_type(CMSPermGen,                   PermGen)            \
+           declare_type(ConcurrentMarkSweepThread,    NamedThread)        \
+           declare_type(SurrogateLockerThread, JavaThread)                \
+  declare_toplevel_type(CMSCollector)                                     \
+  declare_toplevel_type(CMSBitMap)                                        \
+  declare_toplevel_type(FreeChunk)                                        \
+  declare_toplevel_type(ConcurrentMarkSweepThread*)                       \
+  declare_toplevel_type(ConcurrentMarkSweepGeneration*)                   \
+  declare_toplevel_type(SurrogateLockerThread*)                           \
+  declare_toplevel_type(CompactibleFreeListSpace*)                        \
+  declare_toplevel_type(CMSCollector*)                                    \
+  declare_toplevel_type(FreeChunk*)
+
+#define VM_INT_CONSTANTS_CMS(declare_constant)                            \
+  declare_constant(Generation::ConcurrentMarkSweep)                       \
+  declare_constant(PermGen::ConcurrentMarkSweep)
--- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep	Fri Jun 22 00:46:43 2007 +0000
@@ -34,6 +34,7 @@
 
 cmsAdaptiveSizePolicy.cpp		cmsAdaptiveSizePolicy.hpp
 cmsAdaptiveSizePolicy.cpp		defNewGeneration.hpp
+cmsAdaptiveSizePolicy.cpp		gcStats.hpp
 cmsAdaptiveSizePolicy.cpp		genCollectedHeap.hpp
 cmsAdaptiveSizePolicy.cpp		thread.hpp
 cmsAdaptiveSizePolicy.cpp		os_<os_family>.inline.hpp
@@ -41,6 +42,28 @@
 cmsAdaptiveSizePolicy.hpp		adaptiveSizePolicy.hpp
 cmsAdaptiveSizePolicy.hpp		timer.hpp
 
+cmsCollectorPolicy.cpp                  arguments.hpp
+cmsCollectorPolicy.cpp                  cardTableRS.hpp
+cmsCollectorPolicy.cpp                  cmsAdaptiveSizePolicy.hpp
+cmsCollectorPolicy.cpp                  cmsGCAdaptivePolicyCounters.hpp
+cmsCollectorPolicy.cpp                  cmsCollectorPolicy.hpp
+cmsCollectorPolicy.cpp                  collectorPolicy.hpp
+cmsCollectorPolicy.cpp                  gcLocker.inline.hpp
+cmsCollectorPolicy.cpp                  genCollectedHeap.hpp
+cmsCollectorPolicy.cpp                  gcPolicyCounters.hpp
+cmsCollectorPolicy.cpp                  generationSpec.hpp
+cmsCollectorPolicy.cpp                  globals_extension.hpp
+cmsCollectorPolicy.cpp                  handles.inline.hpp
+cmsCollectorPolicy.cpp                  java.hpp
+cmsCollectorPolicy.cpp                  parNewGeneration.hpp
+cmsCollectorPolicy.cpp                  space.hpp
+cmsCollectorPolicy.cpp                  thread_<os_family>.inline.hpp
+cmsCollectorPolicy.cpp                  universe.hpp
+cmsCollectorPolicy.cpp                  vmGCOperations.hpp
+cmsCollectorPolicy.cpp                  vmThread.hpp
+
+cmsCollectorPolicy.hpp                  collectorPolicy.hpp
+
 cmsGCAdaptivePolicyCounters.cpp		cmsGCAdaptivePolicyCounters.hpp
 cmsGCAdaptivePolicyCounters.cpp		resourceArea.hpp
 
@@ -55,6 +78,27 @@
 
 cmsLockVerifier.hpp                     mutex.hpp
 
+cmsOopClosures.hpp                      genOopClosures.hpp
+
+cmsOopClosures.inline.hpp               cmsOopClosures.hpp
+cmsOopClosures.inline.hpp               concurrentMarkSweepGeneration.hpp
+
+cmsPermGen.cpp                          blockOffsetTable.hpp
+cmsPermGen.cpp                          cSpaceCounters.hpp
+cmsPermGen.cpp                          cmsPermGen.hpp
+cmsPermGen.cpp                          collectedHeap.inline.hpp
+cmsPermGen.cpp                          compactPermGen.hpp
+cmsPermGen.cpp                          concurrentMarkSweepGeneration.inline.hpp
+cmsPermGen.cpp                          genCollectedHeap.hpp
+cmsPermGen.cpp                          generation.inline.hpp
+cmsPermGen.cpp                          java.hpp
+cmsPermGen.cpp                          oop.inline.hpp
+cmsPermGen.cpp                          permGen.hpp
+cmsPermGen.cpp                          universe.hpp
+
+cmsPermGen.hpp                          concurrentMarkSweepGeneration.hpp
+cmsPermGen.hpp                          permGen.hpp
+
 compactibleFreeListSpace.cpp            allocation.inline.hpp
 compactibleFreeListSpace.cpp            blockOffsetTable.inline.hpp
 compactibleFreeListSpace.cpp            cmsLockVerifier.hpp
@@ -92,7 +136,9 @@
 
 concurrentMarkSweepGeneration.cpp       cardTableRS.hpp
 concurrentMarkSweepGeneration.cpp       cmsAdaptiveSizePolicy.hpp
+concurrentMarkSweepGeneration.cpp       cmsCollectorPolicy.hpp
 concurrentMarkSweepGeneration.cpp       cmsGCAdaptivePolicyCounters.hpp
+concurrentMarkSweepGeneration.cpp       cmsOopClosures.inline.hpp
 concurrentMarkSweepGeneration.cpp       codeCache.hpp
 concurrentMarkSweepGeneration.cpp       collectedHeap.inline.hpp
 concurrentMarkSweepGeneration.cpp       collectorCounters.hpp
@@ -110,6 +156,7 @@
 concurrentMarkSweepGeneration.cpp       java.hpp
 concurrentMarkSweepGeneration.cpp       jvmtiExport.hpp
 concurrentMarkSweepGeneration.cpp       oop.inline.hpp
+concurrentMarkSweepGeneration.cpp       parNewGeneration.hpp
 concurrentMarkSweepGeneration.cpp       referencePolicy.hpp
 concurrentMarkSweepGeneration.cpp       resourceArea.hpp
 concurrentMarkSweepGeneration.cpp       runtimeService.hpp
@@ -175,13 +222,17 @@
 
 freeList.hpp                            allocationStats.hpp
 
-vmCMSOperations.cpp			concurrentMarkSweepGeneration.hpp
+vmCMSOperations.cpp			concurrentMarkSweepGeneration.inline.hpp
 vmCMSOperations.cpp			concurrentMarkSweepThread.hpp
 vmCMSOperations.cpp			dtrace.hpp
+vmCMSOperations.cpp			gcLocker.inline.hpp
 vmCMSOperations.cpp			isGCActiveMark.hpp
+vmCMSOperations.cpp			interfaceSupport.hpp
 vmCMSOperations.cpp			vmCMSOperations.hpp
 
+vmCMSOperations.hpp			concurrentMarkSweepGeneration.hpp
 vmCMSOperations.hpp			gcCause.hpp
+vmCMSOperations.hpp			vm_operations.hpp
 vmCMSOperations.hpp			vmGCOperations.hpp
 
 yieldingWorkgroup.cpp                   yieldingWorkgroup.hpp
--- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parNew	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parNew	Fri Jun 22 00:46:43 2007 +0000
@@ -1,11 +1,27 @@
-// @(#)includeDB_gc_parNew	1.2 07/04/24 19:40:42
 //
-// Copyright 1993-2002 Sun Microsystems, Inc.  All rights reserved.
-// SUN PROPRIETARY/CONFIDENTIAL.  Use is subject to license terms.
+// Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+//   
+// This code is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License version 2 only, as
+// published by the Free Software Foundation.
+//   
+// This code 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
+// version 2 for more details (a copy is included in the LICENSE file that
+// accompanied this code).
+//  
+// You should have received a copy of the GNU General Public License version
+// 2 along with this work; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+//   
+// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+// CA 95054 USA or visit www.sun.com if you need additional information or
+// have any questions.
+//  
 //
 
-// NOTE: DO NOT CHANGE THIS COPYRIGHT TO NEW STYLE - IT WILL BREAK makeDeps!
-
 asParNewGeneration.hpp			adaptiveSizePolicy.hpp
 asParNewGeneration.hpp			parNewGeneration.hpp
 
@@ -13,9 +29,20 @@
 asParNewGeneration.cpp			cmsAdaptiveSizePolicy.hpp
 asParNewGeneration.cpp                  cmsGCAdaptivePolicyCounters.hpp
 asParNewGeneration.cpp			defNewGeneration.inline.hpp
+asParNewGeneration.cpp			oop.pcgc.inline.hpp
 asParNewGeneration.cpp			parNewGeneration.hpp
 asParNewGeneration.cpp                  referencePolicy.hpp
 
+parCardTableModRefBS.cpp                allocation.inline.hpp
+parCardTableModRefBS.cpp                cardTableModRefBS.hpp
+parCardTableModRefBS.cpp                cardTableRS.hpp
+parCardTableModRefBS.cpp                java.hpp
+parCardTableModRefBS.cpp                mutexLocker.hpp
+parCardTableModRefBS.cpp                sharedHeap.hpp
+parCardTableModRefBS.cpp                space.hpp
+parCardTableModRefBS.cpp                universe.hpp
+parCardTableModRefBS.cpp                virtualspace.hpp
+
 parGCAllocBuffer.cpp                    arrayOop.hpp
 parGCAllocBuffer.cpp                    oop.inline.hpp
 parGCAllocBuffer.cpp                    parGCAllocBuffer.hpp
@@ -27,6 +54,7 @@
 
 parNewGeneration.cpp                    adaptiveSizePolicy.hpp
 parNewGeneration.cpp                    ageTable.hpp
+parNewGeneration.cpp                    concurrentMarkSweepGeneration.hpp
 parNewGeneration.cpp                    copy.hpp
 parNewGeneration.cpp                    defNewGeneration.inline.hpp
 parNewGeneration.cpp                    genCollectedHeap.hpp
@@ -38,9 +66,11 @@
 parNewGeneration.cpp                    handles.inline.hpp
 parNewGeneration.cpp                    java.hpp
 parNewGeneration.cpp                    objArrayOop.hpp
+parNewGeneration.cpp                    oop.pcgc.inline.hpp
 parNewGeneration.cpp                    oop.inline.hpp
 parNewGeneration.cpp                    parGCAllocBuffer.hpp
 parNewGeneration.cpp                    parNewGeneration.hpp
+parNewGeneration.cpp                    parOopClosures.inline.hpp
 parNewGeneration.cpp                    referencePolicy.hpp
 parNewGeneration.cpp                    resourceArea.hpp
 parNewGeneration.cpp                    sharedHeap.hpp
--- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge	Fri Jun 22 00:46:43 2007 +0000
@@ -132,7 +132,7 @@
 parallelScavengeHeap.cpp                psPromotionManager.hpp
 parallelScavengeHeap.cpp                psScavenge.hpp
 parallelScavengeHeap.cpp                vmThread.hpp
-parallelScavengeHeap.cpp                vmGCOperations.hpp
+parallelScavengeHeap.cpp                vmPSOperations.hpp
 
 parallelScavengeHeap.inline.hpp		parallelScavengeHeap.hpp
 parallelScavengeHeap.inline.hpp		psMarkSweep.hpp
@@ -426,3 +426,14 @@
 psYoungGen.hpp                          spaceCounters.hpp
 psYoungGen.hpp                          psVirtualspace.hpp
 
+vmPSOperations.cpp                      dtrace.hpp
+vmPSOperations.cpp                      parallelScavengeHeap.inline.hpp
+vmPSOperations.cpp                      gcLocker.inline.hpp
+vmPSOperations.cpp                      psMarkSweep.hpp
+vmPSOperations.cpp                      psScavenge.hpp
+vmPSOperations.cpp                      psScavenge.inline.hpp
+vmPSOperations.cpp                      vmPSOperations.hpp
+
+vmPSOperations.hpp                      gcCause.hpp
+vmPSOperations.hpp                      parallelScavengeHeap.hpp
+vmPSOperations.hpp                      vmGCOperations.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_serial	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,123 @@
+//
+// Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+//   
+// This code is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License version 2 only, as
+// published by the Free Software Foundation.
+//   
+// This code 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
+// version 2 for more details (a copy is included in the LICENSE file that
+// accompanied this code).
+//  
+// You should have received a copy of the GNU General Public License version
+// 2 along with this work; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+//   
+// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+// CA 95054 USA or visit www.sun.com if you need additional information or
+// have any questions.
+//  
+//
+
+adaptiveSizePolicy.hpp			collectedHeap.hpp
+adaptiveSizePolicy.hpp			gcCause.hpp
+adaptiveSizePolicy.hpp			gcUtil.hpp
+adaptiveSizePolicy.hpp			allocation.hpp
+adaptiveSizePolicy.hpp			universe.hpp
+
+adaptiveSizePolicy.cpp			adaptiveSizePolicy.hpp
+adaptiveSizePolicy.cpp			gcCause.hpp
+adaptiveSizePolicy.cpp			ostream.hpp
+adaptiveSizePolicy.cpp			timer.hpp
+
+ageTable.cpp                            ageTable.hpp
+ageTable.cpp				collectorPolicy.hpp
+ageTable.cpp                            copy.hpp
+ageTable.cpp                            gcPolicyCounters.hpp
+ageTable.cpp                            resourceArea.hpp
+ageTable.cpp                            sharedHeap.hpp
+
+ageTable.hpp                            markOop.hpp
+ageTable.hpp                            oop.hpp
+ageTable.hpp                            perfData.hpp
+
+collectorCounters.cpp                   collectorCounters.hpp
+collectorCounters.cpp                   resourceArea.hpp
+
+collectorCounters.hpp                   perfData.hpp
+
+cSpaceCounters.cpp                      resourceArea.hpp
+cSpaceCounters.cpp                      cSpaceCounters.hpp
+
+cSpaceCounters.hpp                      space.inline.hpp
+cSpaceCounters.hpp                      perfData.hpp
+cSpaceCounters.hpp                      generationCounters.hpp
+
+gcPolicyCounters.cpp                    resourceArea.hpp
+gcPolicyCounters.cpp                    gcPolicyCounters.hpp
+
+gcPolicyCounters.hpp                    perfData.hpp
+
+gcStats.cpp				gcStats.hpp
+gcStats.cpp				gcUtil.hpp
+
+gcStats.hpp				gcUtil.hpp
+
+gcUtil.cpp                              gcUtil.hpp
+
+gcUtil.hpp                              allocation.hpp
+gcUtil.hpp                              debug.hpp
+gcUtil.hpp                              globalDefinitions.hpp
+gcUtil.hpp				timer.hpp
+
+generationCounters.cpp                  generationCounters.hpp
+generationCounters.cpp                  resourceArea.hpp
+
+generationCounters.hpp                  perfData.hpp
+generationCounters.hpp                  virtualspace.hpp
+
+immutableSpace.hpp                      iterator.hpp
+
+liveRange.hpp                           copy.hpp
+liveRange.hpp                           memRegion.hpp
+
+markSweep.cpp                           collectedHeap.inline.hpp
+markSweep.cpp                           markSweep.inline.hpp
+markSweep.cpp                           oop.inline.hpp
+
+markSweep.hpp                           growableArray.hpp
+markSweep.hpp                           markOop.hpp
+markSweep.hpp                           oop.hpp
+markSweep.hpp                           timer.hpp
+markSweep.hpp                           universe.hpp
+
+markSweep.inline.hpp                    collectedHeap.hpp
+markSweep.inline.hpp                    markSweep.hpp
+
+mutableSpace.hpp                        immutableSpace.hpp
+mutableSpace.hpp                        memRegion.hpp
+mutableSpace.hpp                        copy.hpp
+
+vmGCOperations.cpp                      vmGCOperations.hpp
+vmGCOperations.cpp                      dtrace.hpp
+vmGCOperations.cpp                      classLoader.hpp
+vmGCOperations.cpp                      gcLocker.inline.hpp
+vmGCOperations.cpp                      genCollectedHeap.hpp
+vmGCOperations.cpp                      handles.inline.hpp
+vmGCOperations.cpp                      init.hpp
+vmGCOperations.cpp                      instanceKlass.hpp
+vmGCOperations.cpp                      instanceRefKlass.hpp
+vmGCOperations.cpp                      interfaceSupport.hpp
+vmGCOperations.cpp                      javaClasses.hpp
+vmGCOperations.cpp                      jvmtiExport.hpp
+vmGCOperations.cpp                      oopFactory.hpp
+vmGCOperations.cpp                      preserveException.hpp
+
+vmGCOperations.hpp                      vm_operations.hpp
+vmGCOperations.hpp                      heapInspection.hpp
+vmGCOperations.hpp                      handles.hpp
+vmGCOperations.hpp                      jniHandles.hpp
+vmGCOperations.hpp                      synchronizer.hpp
--- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared	Fri Jun 22 00:46:43 2007 +0000
@@ -24,69 +24,12 @@
 
 // NOTE: DO NOT CHANGE THIS COPYRIGHT TO NEW STYLE - IT WILL BREAK makeDeps!
 
-adaptiveSizePolicy.hpp			collectedHeap.hpp
-adaptiveSizePolicy.hpp			gcCause.hpp
-adaptiveSizePolicy.hpp			gcUtil.hpp
-adaptiveSizePolicy.hpp			allocation.hpp
-adaptiveSizePolicy.hpp			universe.hpp
-
-adaptiveSizePolicy.cpp			adaptiveSizePolicy.hpp
-adaptiveSizePolicy.cpp			gcCause.hpp
-adaptiveSizePolicy.cpp			ostream.hpp
-adaptiveSizePolicy.cpp			timer.hpp
-
-ageTable.cpp                            ageTable.hpp
-ageTable.cpp				collectorPolicy.hpp
-ageTable.cpp                            copy.hpp
-ageTable.cpp                            gcAdaptivePolicyCounters.hpp
-ageTable.cpp                            resourceArea.hpp
-ageTable.cpp                            sharedHeap.hpp
-
-ageTable.hpp                            markOop.hpp
-ageTable.hpp                            oop.hpp
-ageTable.hpp                            perfData.hpp
-
-collectorCounters.cpp                   collectorCounters.hpp
-collectorCounters.cpp                   resourceArea.hpp
-
-collectorCounters.hpp                   perfData.hpp
-
-cSpaceCounters.cpp                      resourceArea.hpp
-cSpaceCounters.cpp                      cSpaceCounters.hpp
-
-cSpaceCounters.hpp                      space.inline.hpp
-cSpaceCounters.hpp                      perfData.hpp
-cSpaceCounters.hpp                      generationCounters.hpp
-
 gcAdaptivePolicyCounters.hpp		adaptiveSizePolicy.hpp
 gcAdaptivePolicyCounters.hpp		gcPolicyCounters.hpp
 
 gcAdaptivePolicyCounters.cpp		resourceArea.hpp
 gcAdaptivePolicyCounters.cpp            gcAdaptivePolicyCounters.hpp
 
-gcPolicyCounters.cpp                    resourceArea.hpp
-gcPolicyCounters.cpp                    gcPolicyCounters.hpp
-
-gcPolicyCounters.hpp                    perfData.hpp
-
-gcStats.cpp				gcStats.hpp
-gcStats.cpp				gcUtil.hpp
-
-gcStats.hpp				gcUtil.hpp
-
-gcUtil.cpp                              gcUtil.hpp
-
-gcUtil.hpp                              allocation.hpp
-gcUtil.hpp                              debug.hpp
-gcUtil.hpp                              globalDefinitions.hpp
-gcUtil.hpp				timer.hpp
-
-generationCounters.cpp                  generationCounters.hpp
-generationCounters.cpp                  resourceArea.hpp
-
-generationCounters.hpp                  perfData.hpp
-generationCounters.hpp                  virtualspace.hpp
-
 gSpaceCounters.cpp                      generation.hpp
 gSpaceCounters.cpp                      resourceArea.hpp
 gSpaceCounters.cpp                      gSpaceCounters.hpp
@@ -99,43 +42,22 @@
 immutableSpace.cpp                      oop.inline.hpp
 immutableSpace.cpp                      universe.hpp
 
-immutableSpace.hpp                      iterator.hpp
-
 isGCActiveMark.hpp                      parallelScavengeHeap.hpp
 
-liveRange.hpp                           copy.hpp
-liveRange.hpp                           memRegion.hpp
-
-markSweep.cpp                           collectedHeap.inline.hpp
-markSweep.cpp                           markSweep.inline.hpp
-markSweep.cpp                           oop.inline.hpp
+markSweep.inline.hpp			psParallelCompact.hpp
 
-markSweep.hpp                           growableArray.hpp
-markSweep.hpp                           markOop.hpp
-markSweep.hpp                           oop.hpp
-markSweep.hpp                           timer.hpp
-markSweep.hpp                           universe.hpp
+mutableNUMASpace.cpp                    mutableNUMASpace.hpp
+mutableNUMASpace.cpp                    sharedHeap.hpp
+mutableNUMASpace.cpp                    thread_<os_family>.inline.hpp
 
-markSweep.inline.hpp                    collectedHeap.hpp
-markSweep.inline.hpp                    markSweep.hpp
-markSweep.inline.hpp			psParallelCompact.hpp
+mutableNUMASpace.hpp                    mutableSpace.hpp
+mutableNUMASpace.hpp                    gcUtil.hpp
 
 mutableSpace.cpp                        mutableSpace.hpp
 mutableSpace.cpp                        oop.inline.hpp
 mutableSpace.cpp                        safepoint.hpp
 mutableSpace.cpp                        thread.hpp
 
-mutableSpace.hpp                        immutableSpace.hpp
-mutableSpace.hpp                        memRegion.hpp
-mutableSpace.hpp                        copy.hpp
-
-mutableNUMASpace.cpp                    mutableNUMASpace.hpp
-mutableNUMASpace.cpp                    sharedHeap.hpp
-mutableNUMASpace.cpp                    thread.hpp
-
-mutableNUMASpace.hpp                    mutableSpace.hpp
-mutableNUMASpace.hpp                    gcUtil.hpp
-
 spaceCounters.cpp                       resourceArea.hpp
 spaceCounters.cpp                       spaceCounters.hpp
 
@@ -143,30 +65,3 @@
 spaceCounters.hpp                       mutableSpace.hpp
 spaceCounters.hpp                       perfData.hpp
 spaceCounters.hpp                       generationCounters.hpp
-
-vmGCOperations.cpp                      vmGCOperations.hpp
-vmGCOperations.cpp                      dtrace.hpp
-vmGCOperations.cpp                      parallelScavengeHeap.inline.hpp
-vmGCOperations.cpp                      psMarkSweep.hpp
-vmGCOperations.cpp                      psScavenge.hpp
-vmGCOperations.cpp                      psScavenge.inline.hpp
-vmGCOperations.cpp                      classLoader.hpp
-vmGCOperations.cpp                      gcLocker.inline.hpp
-vmGCOperations.cpp                      genCollectedHeap.hpp
-vmGCOperations.cpp                      handles.inline.hpp
-vmGCOperations.cpp                      init.hpp
-vmGCOperations.cpp                      instanceKlass.hpp
-vmGCOperations.cpp                      instanceRefKlass.hpp
-vmGCOperations.cpp                      interfaceSupport.hpp
-vmGCOperations.cpp                      javaClasses.hpp
-vmGCOperations.cpp                      jvmtiExport.hpp
-vmGCOperations.cpp                      oopFactory.hpp
-vmGCOperations.cpp                      preserveException.hpp
-vmGCOperations.cpp			concurrentMarkSweepGeneration.inline.hpp
-
-vmGCOperations.hpp                      vm_operations.hpp
-vmGCOperations.hpp                      parallelScavengeHeap.hpp
-vmGCOperations.hpp                      heapInspection.hpp
-vmGCOperations.hpp                      handles.hpp
-vmGCOperations.hpp                      jniHandles.hpp
-vmGCOperations.hpp                      synchronizer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,318 @@
+#ifdef USE_PRAGMA_IDENT_SRC
+#pragma ident "@(#)parCardTableModRefBS.cpp	1.1 07/05/16 19:06:21 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+# include "incls/_precompiled.incl"
+# include "incls/_parCardTableModRefBS.cpp.incl"
+
+void CardTableModRefBS::par_non_clean_card_iterate_work(Space* sp, MemRegion mr,
+                                                        DirtyCardToOopClosure* dcto_cl,
+                                                        MemRegionClosure* cl,
+                                                        bool clear,
+                                                        int n_threads) {
+  if (n_threads > 0) {
+    assert(n_threads == (int)ParallelGCThreads, "# worker threads != # requested!");
+      
+      // Make sure the LNC array is valid for the space.
+    jbyte**   lowest_non_clean;
+    uintptr_t lowest_non_clean_base_chunk_index;
+    size_t    lowest_non_clean_chunk_size;
+    get_LNC_array_for_space(sp, lowest_non_clean,
+                            lowest_non_clean_base_chunk_index,
+                            lowest_non_clean_chunk_size);
+
+    int n_strides = n_threads * StridesPerThread;
+    SequentialSubTasksDone* pst = sp->par_seq_tasks();
+    pst->set_par_threads(n_threads);
+    pst->set_n_tasks(n_strides);
+
+    int stride = 0;
+    while (!pst->is_task_claimed(/* reference */ stride)) {
+      process_stride(sp, mr, stride, n_strides, dcto_cl, cl, clear,
+                     lowest_non_clean, 
+                     lowest_non_clean_base_chunk_index,
+                     lowest_non_clean_chunk_size);
+    }
+    if (pst->all_tasks_completed()) {
+      // Clear lowest_non_clean array for next time.
+      intptr_t first_chunk_index = addr_to_chunk_index(mr.start());
+      uintptr_t last_chunk_index  = addr_to_chunk_index(mr.last());
+      for (uintptr_t ch = first_chunk_index; ch <= last_chunk_index; ch++) {
+        intptr_t ind = ch - lowest_non_clean_base_chunk_index;
+        assert(0 <= ind && ind < (intptr_t)lowest_non_clean_chunk_size,
+               "Bounds error");
+        lowest_non_clean[ind] = NULL;
+      }
+    }
+  }
+}
+
+void
+CardTableModRefBS::
+process_stride(Space* sp,
+	       MemRegion used,
+	       jint stride, int n_strides,
+	       DirtyCardToOopClosure* dcto_cl,
+	       MemRegionClosure* cl,
+	       bool clear,
+	       jbyte** lowest_non_clean,
+	       uintptr_t lowest_non_clean_base_chunk_index,
+	       size_t    lowest_non_clean_chunk_size) {
+  // We don't have to go downwards here; it wouldn't help anyway,
+  // because of parallelism.
+
+  // Find the first card address of the first chunk in the stride that is
+  // at least "bottom" of the used region.
+  jbyte*    start_card  = byte_for(used.start());
+  jbyte*    end_card    = byte_after(used.last());
+  uintptr_t start_chunk = addr_to_chunk_index(used.start());
+  uintptr_t start_chunk_stride_num = start_chunk % n_strides;
+  jbyte* chunk_card_start;
+
+  if ((uintptr_t)stride >= start_chunk_stride_num) {
+    chunk_card_start = (jbyte*)(start_card +
+				(stride - start_chunk_stride_num) *
+				CardsPerStrideChunk);
+  } else {
+    // Go ahead to the next chunk group boundary, then to the requested stride.
+    chunk_card_start = (jbyte*)(start_card +
+				(n_strides - start_chunk_stride_num + stride) *
+				CardsPerStrideChunk);
+  }
+
+  while (chunk_card_start < end_card) {
+    // We don't have to go downwards here; it wouldn't help anyway,
+    // because of parallelism.  (We take care with "min_done"; see below.)
+    // Invariant: chunk_mr should be fully contained within the "used" region.
+    jbyte*    chunk_card_end = chunk_card_start + CardsPerStrideChunk;
+    MemRegion chunk_mr       = MemRegion(addr_for(chunk_card_start),
+                                         chunk_card_end >= end_card ?
+                                           used.end() : addr_for(chunk_card_end));
+    assert(chunk_mr.word_size() > 0, "[chunk_card_start > used_end)");
+    assert(used.contains(chunk_mr), "chunk_mr should be subset of used");
+
+    // Process the chunk.
+    process_chunk_boundaries(sp,
+			     dcto_cl,
+			     chunk_mr,
+			     used,
+			     lowest_non_clean,
+			     lowest_non_clean_base_chunk_index,
+			     lowest_non_clean_chunk_size);
+
+    non_clean_card_iterate_work(chunk_mr, cl, clear);
+
+    // Find the next chunk of the stride.
+    chunk_card_start += CardsPerStrideChunk * n_strides;
+  }
+}
+
+void
+CardTableModRefBS::
+process_chunk_boundaries(Space* sp,
+			 DirtyCardToOopClosure* dcto_cl,
+			 MemRegion chunk_mr,
+			 MemRegion used,
+			 jbyte** lowest_non_clean,
+			 uintptr_t lowest_non_clean_base_chunk_index,
+			 size_t    lowest_non_clean_chunk_size)
+{
+  // We must worry about the chunk boundaries.
+
+  // First, set our max_to_do:
+  HeapWord* max_to_do = NULL;
+  uintptr_t cur_chunk_index = addr_to_chunk_index(chunk_mr.start());
+  cur_chunk_index           = cur_chunk_index - lowest_non_clean_base_chunk_index;
+
+  if (chunk_mr.end() < used.end()) {
+    // This is not the last chunk in the used region.  What is the last
+    // object?
+    HeapWord* last_block = sp->block_start(chunk_mr.end());
+    assert(last_block <= chunk_mr.end(), "In case this property changes.");
+    if (last_block == chunk_mr.end()
+	|| !sp->block_is_obj(last_block)) {
+      max_to_do = chunk_mr.end();
+
+    } else {
+      // It is an object and starts before the end of the current chunk.
+      // last_obj_card is the card corresponding to the start of the last object
+      // in the chunk.  Note that the last object may not start in
+      // the chunk.
+      jbyte* last_obj_card = byte_for(last_block);
+      if (!card_may_have_been_dirty(*last_obj_card)) {
+	// The card containing the head is not dirty.  Any marks in
+	// subsequent cards still in this chunk must have been made
+	// precisely; we can cap processing at the end.
+	max_to_do = chunk_mr.end();
+      } else {
+	// The last object must be considered dirty, and extends onto the
+	// following chunk.  Look for a dirty card in that chunk that will
+	// bound our processing.
+	jbyte* limit_card = NULL;
+	size_t last_block_size = sp->block_size(last_block);
+	jbyte* last_card_of_last_obj =
+	  byte_for(last_block + last_block_size - 1);
+	jbyte* first_card_of_next_chunk = byte_for(chunk_mr.end());
+	// This search potentially goes a long distance looking
+	// for the next card that will be scanned.  For example,
+	// an object that is an array of primitives will not
+	// have any cards covering regions interior to the array
+	// that will need to be scanned. The scan can be terminated
+	// at the last card of the next chunk.  That would leave
+	// limit_card as NULL and would result in "max_to_do"
+	// being set with the LNC value or with the end
+	// of the last block.
+	jbyte* last_card_of_next_chunk = first_card_of_next_chunk + 
+	  CardsPerStrideChunk; 
+	assert(byte_for(chunk_mr.end()) - byte_for(chunk_mr.start())
+	  == CardsPerStrideChunk, "last card of next chunk may be wrong");
+	jbyte* last_card_to_check = (jbyte*) MIN2(last_card_of_last_obj,
+					          last_card_of_next_chunk);
+	for (jbyte* cur = first_card_of_next_chunk;
+	     cur <= last_card_to_check; cur++) {
+	  if (card_will_be_scanned(*cur)) {
+	    limit_card = cur; break;
+	  }
+	}
+        assert(0 <= cur_chunk_index+1 &&
+               cur_chunk_index+1 < lowest_non_clean_chunk_size,
+               "Bounds error.");
+	// LNC for the next chunk
+        jbyte* lnc_card = lowest_non_clean[cur_chunk_index+1];
+	if (limit_card == NULL) {
+	  limit_card = lnc_card;
+	}
+	if (limit_card != NULL) {
+	  if (lnc_card != NULL) {
+   	    limit_card = (jbyte*)MIN2((intptr_t)limit_card,
+				      (intptr_t)lnc_card);
+          }
+	  max_to_do = addr_for(limit_card);
+	} else {
+	  max_to_do = last_block + last_block_size;
+	}
+      }
+    }
+    assert(max_to_do != NULL, "OOPS!");
+  } else {
+    max_to_do = used.end();
+  }
+  // Now we can set the closure we're using so it doesn't to beyond
+  // max_to_do.
+  dcto_cl->set_min_done(max_to_do);
+#ifndef PRODUCT
+  dcto_cl->set_last_bottom(max_to_do);
+#endif
+
+  // Now we set *our" lowest_non_clean entry.
+  // Find the object that spans our boundary, if one exists.
+  // Nothing to do on the first chunk.
+  if (chunk_mr.start() > used.start()) {
+    // first_block is the block possibly spanning the chunk start
+    HeapWord* first_block = sp->block_start(chunk_mr.start());
+    // Does the block span the start of the chunk and is it
+    // an object?  
+    if (first_block < chunk_mr.start() &&
+	sp->block_is_obj(first_block)) {
+      jbyte* first_dirty_card = NULL;
+      jbyte* last_card_of_first_obj =
+	  byte_for(first_block + sp->block_size(first_block) - 1);
+      jbyte* first_card_of_cur_chunk = byte_for(chunk_mr.start());
+      jbyte* last_card_of_cur_chunk = byte_for(chunk_mr.last());
+      jbyte* last_card_to_check = 
+	(jbyte*) MIN2((intptr_t) last_card_of_cur_chunk,
+		      (intptr_t) last_card_of_first_obj);
+      for (jbyte* cur = first_card_of_cur_chunk;
+	   cur <= last_card_to_check; cur++) {
+	if (card_will_be_scanned(*cur)) {
+	  first_dirty_card = cur; break;
+	}
+      }
+      if (first_dirty_card != NULL) {
+	assert(0 <= cur_chunk_index &&
+		 cur_chunk_index < lowest_non_clean_chunk_size,
+	       "Bounds error.");
+	lowest_non_clean[cur_chunk_index] = first_dirty_card;
+      }
+    }
+  }
+}
+
+void
+CardTableModRefBS::
+get_LNC_array_for_space(Space* sp,
+			jbyte**& lowest_non_clean,
+			uintptr_t& lowest_non_clean_base_chunk_index,
+			size_t& lowest_non_clean_chunk_size) {
+
+  int       i        = find_covering_region_containing(sp->bottom());
+  MemRegion covered  = _covered[i];
+  size_t    n_chunks = chunks_to_cover(covered);
+  
+  // Only the first thread to obtain the lock will resize the
+  // LNC array for the covered region.  Any later expansion can't affect
+  // the used_at_save_marks region.
+  // (I observed a bug in which the first thread to execute this would
+  // resize, and then it would cause "expand_and_allocates" that would 
+  // Increase the number of chunks in the covered region.  Then a second
+  // thread would come and execute this, see that the size didn't match,
+  // and free and allocate again.  So the first thread would be using a
+  // freed "_lowest_non_clean" array.)
+
+  // Do a dirty read here. If we pass the conditional then take the rare
+  // event lock and do the read again in case some other thread had already
+  // succeeded and done the resize.
+  int cur_collection = Universe::heap()->total_collections();
+  if (_last_LNC_resizing_collection[i] != cur_collection) {
+    MutexLocker x(ParGCRareEvent_lock);
+    if (_last_LNC_resizing_collection[i] != cur_collection) {
+      if (_lowest_non_clean[i] == NULL ||
+	  n_chunks != _lowest_non_clean_chunk_size[i]) {
+	
+	// Should we delete the old?
+	if (_lowest_non_clean[i] != NULL) {
+	  assert(n_chunks != _lowest_non_clean_chunk_size[i],
+		 "logical consequence");
+	  FREE_C_HEAP_ARRAY(CardPtr, _lowest_non_clean[i]);
+	  _lowest_non_clean[i] = NULL;
+	}
+	// Now allocate a new one if necessary.
+	if (_lowest_non_clean[i] == NULL) {
+	  _lowest_non_clean[i]                  = NEW_C_HEAP_ARRAY(CardPtr, n_chunks);
+	  _lowest_non_clean_chunk_size[i]       = n_chunks;
+	  _lowest_non_clean_base_chunk_index[i] = addr_to_chunk_index(covered.start());
+	  for (int j = 0; j < (int)n_chunks; j++)
+	    _lowest_non_clean[i][j] = NULL;
+	}
+      }
+      _last_LNC_resizing_collection[i] = cur_collection;
+    }
+  }
+  // In any case, now do the initialization.
+  lowest_non_clean                  = _lowest_non_clean[i];
+  lowest_non_clean_base_chunk_index = _lowest_non_clean_base_chunk_index[i];
+  lowest_non_clean_chunk_size       = _lowest_non_clean_chunk_size[i];
+}
--- a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)parGCAllocBuffer.cpp	1.27 07/05/05 17:05:53 JVM"
+#pragma ident "@(#)parGCAllocBuffer.cpp	1.28 07/05/29 09:44:12 JVM"
 #endif
 /*
  * Copyright 2001-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -128,3 +128,218 @@
              "FT"[_retained], _retained_filler.start(), _retained_filler.end());
 }
 #endif // !PRODUCT
+
+const size_t ParGCAllocBufferWithBOT::ChunkSizeInWords =
+MIN2(CardTableModRefBS::par_chunk_heapword_alignment(),
+     ((size_t)Generation::GenGrain)/HeapWordSize);
+const size_t ParGCAllocBufferWithBOT::ChunkSizeInBytes =
+MIN2(CardTableModRefBS::par_chunk_heapword_alignment() * HeapWordSize,
+     (size_t)Generation::GenGrain);
+
+ParGCAllocBufferWithBOT::ParGCAllocBufferWithBOT(size_t word_sz,
+						 BlockOffsetSharedArray* bsa) :
+  ParGCAllocBuffer(word_sz),
+  _bsa(bsa),
+  _bt(bsa, MemRegion(_bottom, _hard_end)),
+  _true_end(_hard_end)
+{}
+
+// The buffer comes with its own BOT, with a shared (obviously) underlying
+// BlockOffsetSharedArray. We manipulate this BOT in the normal way
+// as we would for any contiguous space. However, on accasion we
+// need to do some buffer surgery at the extremities before we
+// start using the body of the buffer for allocations. Such surgery
+// (as explained elsewhere) is to prevent allocation on a card that
+// is in the process of being walked concurrently by another GC thread.
+// When such surgery happens at a point that is far removed (to the
+// right of the current allocation point, top), we use the "contig"
+// parameter below to directly manipulate the shared array without
+// modifying the _next_threshold state in the BOT.
+void ParGCAllocBufferWithBOT::fill_region_with_block(MemRegion mr,
+						     bool contig) {
+  SharedHeap::fill_region_with_object(mr);
+  if (contig) {
+    _bt.alloc_block(mr.start(), mr.end());
+  } else {
+    _bt.BlockOffsetArray::alloc_block(mr.start(), mr.end());
+  }
+}
+
+HeapWord* ParGCAllocBufferWithBOT::allocate_slow(size_t word_sz) {
+  HeapWord* res = NULL;
+  if (_true_end > _hard_end) {
+    assert((HeapWord*)align_size_down(intptr_t(_hard_end),
+				      ChunkSizeInBytes) == _hard_end,
+	   "or else _true_end should be equal to _hard_end");
+    assert(_retained, "or else _true_end should be equal to _hard_end");
+    assert(_retained_filler.end() <= _top, "INVARIANT");
+    SharedHeap::fill_region_with_object(_retained_filler);
+    if (_top < _hard_end) {
+      fill_region_with_block(MemRegion(_top, _hard_end), true);
+    }
+    HeapWord* next_hard_end = MIN2(_true_end, _hard_end + ChunkSizeInWords);
+    _retained_filler = MemRegion(_hard_end, FillerHeaderSize);
+    _bt.alloc_block(_retained_filler.start(), _retained_filler.word_size());
+    _top      = _retained_filler.end();
+    _hard_end = next_hard_end;
+    _end      = _hard_end - AlignmentReserve;
+    res       = ParGCAllocBuffer::allocate(word_sz);
+    if (res != NULL) {
+      _bt.alloc_block(res, word_sz);
+    }
+  }
+  return res;
+}
+
+void
+ParGCAllocBufferWithBOT::undo_allocation(HeapWord* obj, size_t word_sz) {
+  ParGCAllocBuffer::undo_allocation(obj, word_sz);
+  // This may back us up beyond the previous threshold, so reset.
+  _bt.set_region(MemRegion(_top, _hard_end));
+  _bt.initialize_threshold();
+}
+
+void ParGCAllocBufferWithBOT::retire(bool end_of_gc, bool retain) {
+  assert(!retain || end_of_gc, "Can only retain at GC end.");
+  if (_retained) {
+    // We're about to make the retained_filler into a block.
+    _bt.BlockOffsetArray::alloc_block(_retained_filler.start(),
+				      _retained_filler.end());
+  }
+  // Reset _hard_end to _true_end (and update _end)
+  if (retain && _hard_end != NULL) {
+    assert(_hard_end <= _true_end, "Invariant.");
+    _hard_end = _true_end;
+    _end      = MAX2(_top, _hard_end - AlignmentReserve);
+    assert(_end <= _hard_end, "Invariant.");
+  }
+  _true_end = _hard_end;
+  HeapWord* pre_top = _top;
+
+  ParGCAllocBuffer::retire(end_of_gc, retain);
+  // Now any old _retained_filler is cut back to size, the free part is
+  // filled with a filler object, and top is past the header of that
+  // object.
+
+  if (retain && _top < _end) {
+    assert(end_of_gc && retain, "Or else retain should be false.");
+    // If the lab does not start on a card boundary, we don't want to
+    // allocate onto that card, since that might lead to concurrent
+    // allocation and card scanning, which we don't support.  So we fill
+    // the first card with a garbage object.
+    size_t first_card_index = _bsa->index_for(pre_top);
+    HeapWord* first_card_start = _bsa->address_for_index(first_card_index);
+    if (first_card_start < pre_top) {
+      HeapWord* second_card_start =
+	_bsa->address_for_index(first_card_index + 1);
+
+      // Ensure enough room to fill with the smallest block
+      second_card_start = MAX2(second_card_start, pre_top + AlignmentReserve);
+
+      // If the end is already in the first card, don't go beyond it!
+      // Or if the remainder is too small for a filler object, gobble it up.
+      if (_hard_end < second_card_start ||
+          pointer_delta(_hard_end, second_card_start) < AlignmentReserve) {
+        second_card_start = _hard_end;
+      }
+      if (pre_top < second_card_start) {
+	MemRegion first_card_suffix(pre_top, second_card_start);
+	fill_region_with_block(first_card_suffix, true);
+      }
+      pre_top = second_card_start;
+      _top = pre_top;
+      _end = MAX2(_top, _hard_end - AlignmentReserve);
+    }
+
+    // If the lab does not end on a card boundary, we don't want to
+    // allocate onto that card, since that might lead to concurrent
+    // allocation and card scanning, which we don't support.  So we fill
+    // the last card with a garbage object.
+    size_t last_card_index = _bsa->index_for(_hard_end);
+    HeapWord* last_card_start = _bsa->address_for_index(last_card_index);
+    if (last_card_start < _hard_end) {
+
+      // Ensure enough room to fill with the smallest block
+      last_card_start = MIN2(last_card_start, _hard_end - AlignmentReserve);
+
+      // If the top is already in the last card, don't go back beyond it!
+      // Or if the remainder is too small for a filler object, gobble it up.
+      if (_top > last_card_start ||
+          pointer_delta(last_card_start, _top) < AlignmentReserve) {
+        last_card_start = _top;
+      }
+      if (last_card_start < _hard_end) {
+	MemRegion last_card_prefix(last_card_start, _hard_end);
+	fill_region_with_block(last_card_prefix, false);
+      }
+      _hard_end = last_card_start;
+      _end      = MAX2(_top, _hard_end - AlignmentReserve);
+      _true_end = _hard_end;
+      assert(_end <= _hard_end, "Invariant.");
+    }
+
+    // At this point:
+    //   1) we had a filler object from the original top to hard_end.
+    //   2) We've filled in any partial cards at the front and back.
+    if (pre_top < _hard_end) {
+      // Now we can reset the _bt to do allocation in the given area.
+      MemRegion new_filler(pre_top, _hard_end);
+      fill_region_with_block(new_filler, false);
+      _top = pre_top + ParGCAllocBuffer::FillerHeaderSize;
+      // If there's no space left, don't retain.
+      if (_top >= _end) {
+	_retained = false;
+        invalidate();
+	return;
+      } 
+      _retained_filler = MemRegion(pre_top, _top);
+      _bt.set_region(MemRegion(_top, _hard_end));
+      _bt.initialize_threshold();
+      assert(_bt.threshold() > _top, "initialize_threshold failed!");
+
+      // There may be other reasons for queries into the middle of the
+      // filler object.  When such queries are done in parallel with
+      // allocation, bad things can happen, if the query involves object
+      // iteration.  So we ensure that such queries do not involve object
+      // iteration, by putting another filler object on the boundaries of
+      // such queries.  One such is the object spanning a parallel card
+      // chunk boundary.
+
+      // "chunk_boundary" is the address of the first chunk boundary less
+      // than "hard_end".
+      HeapWord* chunk_boundary = 
+        (HeapWord*)align_size_down(intptr_t(_hard_end-1), ChunkSizeInBytes); 
+      assert(chunk_boundary < _hard_end, "Or else above did not work."); 
+      assert(pointer_delta(_true_end, chunk_boundary) >= AlignmentReserve,
+             "Consequence of last card handling above.");
+ 
+      if (_top <= chunk_boundary) { 
+	assert(_true_end == _hard_end, "Invariant.");
+	while (_top <= chunk_boundary) {
+          assert(pointer_delta(_hard_end, chunk_boundary) >= AlignmentReserve,
+                 "Consequence of last card handling above.");
+	  MemRegion chunk_portion(chunk_boundary, _hard_end);
+	  _bt.BlockOffsetArray::alloc_block(chunk_portion.start(),
+                                            chunk_portion.end());
+	  SharedHeap::fill_region_with_object(chunk_portion);
+	  _hard_end = chunk_portion.start();
+	  chunk_boundary -= ChunkSizeInWords;
+	}
+        _end = _hard_end - AlignmentReserve;
+        assert(_top <= _end, "Invariant.");
+	// Now reset the initial filler chunk so it doesn't overlap with
+	// the one(s) inserted above.
+	MemRegion new_filler(pre_top, _hard_end);
+	fill_region_with_block(new_filler, false);
+      }
+    } else {
+      _retained = false;
+      invalidate();
+    }
+  } else {
+    assert(!end_of_gc ||
+	   (!_retained && _true_end == _hard_end), "Checking.");
+  }
+  assert(_end <= _hard_end, "Invariant.");
+  assert(_top < _end || _top == _hard_end, "Invariant");
+}
--- a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)parGCAllocBuffer.hpp	1.29 07/05/05 17:05:53 JVM"
+#pragma ident "@(#)parGCAllocBuffer.hpp	1.30 07/05/29 09:44:13 JVM"
 #endif
 /*
  * Copyright 2001-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -203,3 +203,42 @@
   }
 };
 
+class ParGCAllocBufferWithBOT: public ParGCAllocBuffer {
+  BlockOffsetArrayContigSpace _bt;
+  BlockOffsetSharedArray*     _bsa;
+  HeapWord*                   _true_end;  // end of the whole ParGCAllocBuffer
+
+  static const size_t ChunkSizeInWords;
+  static const size_t ChunkSizeInBytes;
+  HeapWord* allocate_slow(size_t word_sz);
+
+  void fill_region_with_block(MemRegion mr, bool contig);
+
+public:
+  ParGCAllocBufferWithBOT(size_t word_sz, BlockOffsetSharedArray* bsa);
+
+  HeapWord* allocate(size_t word_sz) {
+    HeapWord* res = ParGCAllocBuffer::allocate(word_sz);
+    if (res != NULL) {
+      _bt.alloc_block(res, word_sz);
+    } else {
+      res = allocate_slow(word_sz);
+    }
+    return res;
+  }
+
+  void undo_allocation(HeapWord* obj, size_t word_sz);
+
+  void set_buf(HeapWord* buf_start) {
+    ParGCAllocBuffer::set_buf(buf_start);
+    _true_end = _hard_end;
+    _bt.set_region(MemRegion(buf_start, word_sz()));
+    _bt.initialize_threshold();
+  }
+
+  void retire(bool end_of_gc, bool retain);
+
+  MemRegion range() {
+    return MemRegion(_top, _true_end);
+  }
+};
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)parNewGeneration.cpp	1.99 07/05/17 15:52:40 JVM"
+#pragma ident "@(#)parNewGeneration.cpp	1.101 07/05/22 17:23:45 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -785,6 +785,7 @@
       gclog_or_tty->print(" (promotion failed)");
     }
     // All the spaces are in play for mark-sweep.
+    swap_spaces();  // Make life simpler for CMS || rescan; see 6483690.
     from()->set_next_compaction_space(to());
     gch->set_incremental_collection_will_fail();
   }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,138 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)parOopClosures.hpp	1.1 07/05/16 10:51:44 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+// Closures for ParNewGeneration
+
+class ParScanThreadState;
+class ParNewGeneration;
+typedef class OopTaskQueueSet ObjToScanQueueSet;
+class ParallelTaskTerminator;
+
+class ParScanClosure: public OopsInGenClosure {
+protected:
+  ParScanThreadState* _par_scan_state;
+  ParNewGeneration* _g;
+  HeapWord* _boundary;
+  void do_oop_work(oop* p,
+			  bool gc_barrier,
+			  bool root_scan);
+
+  void par_do_barrier(oop* p);
+
+public:
+  ParScanClosure(ParNewGeneration* g, ParScanThreadState* par_scan_state);
+};
+
+class ParScanWithBarrierClosure: public ParScanClosure {
+public:
+  void do_oop(oop* p)    { do_oop_work(p, true, false); }
+  void do_oop_nv(oop* p) { do_oop_work(p, true, false); }
+  ParScanWithBarrierClosure(ParNewGeneration* g,
+			    ParScanThreadState* par_scan_state) :
+    ParScanClosure(g, par_scan_state) {}
+};
+
+class ParScanWithoutBarrierClosure: public ParScanClosure {
+public:
+  ParScanWithoutBarrierClosure(ParNewGeneration* g,
+			       ParScanThreadState* par_scan_state) :
+    ParScanClosure(g, par_scan_state) {}
+  void do_oop(oop* p)    { do_oop_work(p, false, false); }
+  void do_oop_nv(oop* p) { do_oop_work(p, false, false); }
+};
+
+class ParRootScanWithBarrierTwoGensClosure: public ParScanClosure {
+public:
+  ParRootScanWithBarrierTwoGensClosure(ParNewGeneration* g,
+				       ParScanThreadState* par_scan_state) :
+    ParScanClosure(g, par_scan_state) {}
+  void do_oop(oop* p) { do_oop_work(p, true, true); }
+};
+
+class ParRootScanWithoutBarrierClosure: public ParScanClosure {
+public:
+  ParRootScanWithoutBarrierClosure(ParNewGeneration* g,
+				   ParScanThreadState* par_scan_state) :
+    ParScanClosure(g, par_scan_state) {}
+  void do_oop(oop* p) { do_oop_work(p, false, true); }
+};
+
+class ParScanWeakRefClosure: public ScanWeakRefClosure {
+protected:
+  ParScanThreadState* _par_scan_state;
+public:
+  ParScanWeakRefClosure(ParNewGeneration* g,
+                        ParScanThreadState* par_scan_state);
+  void do_oop(oop* p);
+  void do_oop_nv(oop* p);
+};
+
+class ParEvacuateFollowersClosure: public VoidClosure {
+  ParScanThreadState* _par_scan_state;
+  ParScanThreadState* par_scan_state() { return _par_scan_state; }
+
+  // We want to preserve the specific types here (rather than "OopClosure") 
+  // for later de-virtualization of do_oop calls.
+  ParScanWithoutBarrierClosure* _to_space_closure;
+  ParScanWithoutBarrierClosure* to_space_closure() {
+    return _to_space_closure;
+  }
+  ParRootScanWithoutBarrierClosure* _to_space_root_closure;
+  ParRootScanWithoutBarrierClosure* to_space_root_closure() {
+    return _to_space_root_closure;
+  }
+
+  ParScanWithBarrierClosure* _old_gen_closure;
+  ParScanWithBarrierClosure* old_gen_closure () {
+    return _old_gen_closure;
+  }
+  ParRootScanWithBarrierTwoGensClosure* _old_gen_root_closure;
+  ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure () {
+    return _old_gen_root_closure;
+  }
+
+  ParNewGeneration* _par_gen;
+  ParNewGeneration* par_gen() { return _par_gen; }
+  
+  ObjToScanQueueSet*  _task_queues;
+  ObjToScanQueueSet*  task_queues() { return _task_queues; }
+
+  ParallelTaskTerminator* _terminator;
+  ParallelTaskTerminator* terminator() { return _terminator; }
+
+public:
+  ParEvacuateFollowersClosure(
+    ParScanThreadState* par_scan_state_,
+    ParScanWithoutBarrierClosure* to_space_closure_,
+    ParScanWithBarrierClosure* old_gen_closure_,
+    ParRootScanWithoutBarrierClosure* to_space_root_closure_,
+    ParNewGeneration* par_gen_,
+    ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure_,
+    ObjToScanQueueSet* task_queues_,
+    ParallelTaskTerminator* terminator_);
+  void do_void();
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,103 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)parOopClosures.inline.hpp	1.1 07/05/16 10:51:44 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+inline void ParScanWeakRefClosure::do_oop(oop* p)
+{
+  oop obj = *p;
+  assert (obj != NULL, "null weak reference?");
+  // weak references are sometimes scanned twice; must check
+  // that to-space doesn't already contain this object
+  if ((HeapWord*)obj < _boundary && !_g->to()->is_in_reserved(obj)) {
+    // we need to ensure that it is copied (see comment in 
+    // ParScanClosure::do_oop_work).
+    klassOop objK = obj->klass();
+    markOop m = obj->mark();
+    if (m->is_marked()) { // Contains forwarding pointer.
+      *p = ParNewGeneration::real_forwardee(obj);
+    } else {
+      size_t obj_sz = obj->size_given_klass(objK->klass_part()); 
+      *p = ((ParNewGeneration*)_g)->copy_to_survivor_space(_par_scan_state,
+                                                           obj, obj_sz, m);
+    }
+  }
+}
+
+inline void ParScanWeakRefClosure::do_oop_nv(oop* p)
+{
+  ParScanWeakRefClosure::do_oop(p);
+}
+
+inline void ParScanClosure::par_do_barrier(oop* p) {
+  assert(generation()->is_in_reserved(p), "expected ref in generation");
+  oop obj = *p;
+  assert(obj != NULL, "expected non-null object");
+  // If p points to a younger generation, mark the card.
+  if ((HeapWord*)obj < gen_boundary()) {
+    rs()->write_ref_field_gc_par(p, obj);
+  }
+}
+
+inline void ParScanClosure::do_oop_work(oop* p,
+                                        bool gc_barrier,
+                                        bool root_scan) {
+  oop obj = *p;
+  assert((!Universe::heap()->is_in_reserved(p) ||
+	  generation()->is_in_reserved(p))
+	 && (generation()->level() == 0 || gc_barrier),
+	 "The gen must be right, and we must be doing the barrier "
+	 "in older generations.");
+  if (obj != NULL) {
+    if ((HeapWord*)obj < _boundary) {
+      assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
+      // OK, we need to ensure that it is copied.
+      // We read the klass and mark in this order, so that we can reliably 
+      // get the size of the object: if the mark we read is not a
+      // forwarding pointer, then the klass is valid: the klass is only
+      // overwritten with an overflow next pointer after the object is
+      // forwarded.
+      klassOop objK = obj->klass();
+      markOop m = obj->mark();
+      if (m->is_marked()) { // Contains forwarding pointer.
+	*p = ParNewGeneration::real_forwardee(obj);
+      } else {
+        size_t obj_sz = obj->size_given_klass(objK->klass_part()); 
+        *p = _g->copy_to_survivor_space(_par_scan_state, obj, obj_sz, m);
+	if (root_scan) {
+	  // This may have pushed an object.  If we have a root
+	  // category with a lot of roots, can't let the queue get too
+	  // full:
+	  (void)_par_scan_state->trim_queues(10 * ParallelGCThreads);
+	}
+      }
+      if (gc_barrier) {
+	// Now call parent closure
+	par_do_barrier(p);
+      }
+    }
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parNew/vmStructs_parNew.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,15 @@
+#ifdef USE_PRAGMA_IDENT_SRC
+#pragma ident "@(#)vmStructs_parNew.hpp	1.1 07/05/01 16:48:02 JVM"
+#endif
+/*
+ * @(#)vmStructs_parNew.hpp	1.1 07/05/01
+ * 
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+#define VM_TYPES_PARNEW(declare_type)                                     \
+           declare_type(ParNewGeneration,             DefNewGeneration)
+
+#define VM_INT_CONSTANTS_PARNEW(declare_constant)                         \
+  declare_constant(Generation::ParNew)
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)psMarkSweep.cpp	1.91 07/05/05 17:05:28 JVM"
+#pragma ident "@(#)psMarkSweep.cpp	1.92 07/06/08 23:11:01 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -141,6 +141,7 @@
     if (is_system_gc && PrintGCDetails) {
       gc_cause_str = "Full GC (System)";
     }
+    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
     TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
     TraceTime t1(gc_cause_str, PrintGC, !PrintGCDetails, gclog_or_tty);
     TraceCollectorStats tcs(counters());
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)psParallelCompact.cpp	1.59 07/05/05 17:05:31 JVM"
+#pragma ident "@(#)psParallelCompact.cpp	1.61 07/06/08 23:12:00 JVM"
 #endif
 /*
  * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -91,24 +91,6 @@
 GrowableArray<size_t>   * PSParallelCompact::_last_gc_live_oops_size = NULL;
 #endif
 
-
-// XXX beg - move to globalDefinitions.hpp
-// Format macros that allow the field width to be specified.  The width must be
-// a string literal (e.g., "8") or a macro that evaluates to one.
-#define INT32_FORMAT_W(width)	"%" width "d"
-#define UINT32_FORMAT_W(width)	"%" width "u"
-#define INT64_FORMAT_W(width)	"%" width FORMAT64_MODIFIER "d"
-#define UINT64_FORMAT_W(width)	"%" width FORMAT64_MODIFIER "u"
-
-#ifdef _LP64
-#define SSIZE_FORMAT_W(width)	INT64_FORMAT_W(width)
-#define SIZE_FORMAT_W(width)	UINT64_FORMAT_W(width)
-#else
-#define SSIZE_FORMAT_W(width)	INT32_FORMAT_W(width)
-#define SIZE_FORMAT_W(width)	UINT32_FORMAT_W(width)
-#endif // _LP64
-// XXX end - move to globalDefinitions.hpp
-
 // XXX beg - verification code; only works while we also mark in object headers
 static void
 verify_mark_bitmap(ParMarkBitMap& _mark_bitmap)
@@ -2049,6 +2031,7 @@
     if (is_system_gc && PrintGCDetails) {
       gc_cause_str = "Full GC (System)";
     }
+    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
     TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
     TraceTime t1(gc_cause_str, PrintGC, !PrintGCDetails, gclog_or_tty);
     TraceCollectorStats tcs(counters());
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)psScavenge.cpp	1.97 07/05/05 17:05:31 JVM"
+#pragma ident "@(#)psScavenge.cpp	1.98 07/06/08 23:12:37 JVM"
 #endif
 /*
  * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -290,6 +290,7 @@
     ResourceMark rm;
     HandleMark hm;
 
+    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
     TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
     TraceTime t1("GC", PrintGC, !PrintGCDetails, gclog_or_tty);
     TraceCollectorStats tcs(counters());
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/vmPSOperations.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,105 @@
+#ifdef USE_PRAGMA_IDENT_SRC
+#pragma ident "@(#)vmPSOperations.cpp	1.1 07/05/14 11:57:11 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+# include "incls/_precompiled.incl"
+# include "incls/_vmPSOperations.cpp.incl"
+
+// The following methods are used by the parallel scavenge collector
+VM_ParallelGCFailedAllocation::VM_ParallelGCFailedAllocation(size_t size,
+  bool is_tlab, unsigned int gc_count) :
+  VM_GC_Operation(gc_count),
+  _size(size),
+  _is_tlab(is_tlab),
+  _result(NULL)
+{
+}
+
+void VM_ParallelGCFailedAllocation::doit() {
+  JvmtiGCForAllocationMarker jgcm;
+  notify_gc_begin(false);
+
+  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
+  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "must be a ParallelScavengeHeap");
+
+  GCCauseSetter gccs(heap, _gc_cause);
+  _result = heap->failed_mem_allocate(_size, _is_tlab);
+ 
+  if (_result == NULL && GC_locker::is_active_and_needs_gc()) {
+    set_gc_locked();
+  }
+
+  notify_gc_end();
+}
+
+VM_ParallelGCFailedPermanentAllocation::VM_ParallelGCFailedPermanentAllocation(size_t size,
+  unsigned int gc_count, unsigned int full_gc_count) :
+  VM_GC_Operation(gc_count, full_gc_count, true /* full */),
+  _size(size),
+  _result(NULL)
+{
+}
+
+void VM_ParallelGCFailedPermanentAllocation::doit() {
+  JvmtiGCFullMarker jgcm;
+  notify_gc_begin(true);
+
+  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
+  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "must be a ParallelScavengeHeap");
+
+  GCCauseSetter gccs(heap, _gc_cause);
+  _result = heap->failed_permanent_mem_allocate(_size);
+  notify_gc_end();
+}
+
+// Only used for System.gc() calls
+VM_ParallelGCSystemGC::VM_ParallelGCSystemGC(unsigned int gc_count,
+                                             unsigned int full_gc_count,
+                                             GCCause::Cause gc_cause) :
+  VM_GC_Operation(gc_count, full_gc_count, true /* full */)
+{
+  _gc_cause = gc_cause;
+}
+
+void VM_ParallelGCSystemGC::doit() {
+  JvmtiGCFullMarker jgcm;
+  notify_gc_begin(true);
+
+  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
+  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, 
+    "must be a ParallelScavengeHeap");
+
+  GCCauseSetter gccs(heap, _gc_cause);
+  if (_gc_cause == GCCause::_gc_locker 
+      DEBUG_ONLY(|| _gc_cause == GCCause::_scavenge_alot)) {
+    // If (and only if) the scavenge fails, this will invoke a full gc.
+    heap->invoke_scavenge();
+  } else {
+    heap->invoke_full_gc(false);
+  }
+  notify_gc_end();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/vmPSOperations.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,68 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)vmPSOperations.hpp	1.2 07/05/16 16:53:01 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+class VM_ParallelGCFailedAllocation: public VM_GC_Operation {
+ private:
+  size_t    _size;
+  bool      _is_tlab;
+  HeapWord* _result;
+
+ public:
+  VM_ParallelGCFailedAllocation(size_t size, bool is_tlab,
+                                unsigned int gc_count);
+
+  virtual VMOp_Type type() const {
+    return VMOp_ParallelGCFailedAllocation;
+  }
+  virtual void doit();
+  
+  HeapWord* result() const       { return _result; }
+};
+
+class VM_ParallelGCFailedPermanentAllocation: public VM_GC_Operation {
+private:
+  size_t    _size;
+  HeapWord* _result;
+
+ public:
+  VM_ParallelGCFailedPermanentAllocation(size_t size,
+                                         unsigned int gc_count,
+                                         unsigned int full_gc_count);
+  virtual VMOp_Type type() const { 
+    return VMOp_ParallelGCFailedPermanentAllocation; 
+  }
+  virtual void doit();
+  HeapWord* result() const       { return _result; }
+};
+
+class VM_ParallelGCSystemGC: public VM_GC_Operation {
+ public:
+  VM_ParallelGCSystemGC(unsigned int gc_count, unsigned int full_gc_count,
+                        GCCause::Cause gc_cause);
+  virtual VMOp_Type type() const { return VMOp_ParallelGCSystemGC; }
+  virtual void doit();
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/vmStructs_parallelgc.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,98 @@
+#ifdef USE_PRAGMA_IDENT_SRC
+#pragma ident "@(#)vmStructs_parallelgc.hpp	1.2 07/05/01 19:01:30 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+#define VM_STRUCTS_PARALLELGC(nonstatic_field, \
+                   static_field) \
+                                                                                                                                     \
+  /**********************/                                                                                                           \
+  /* Parallel GC fields */                                                                                                           \
+  /**********************/                                                                                                           \
+  nonstatic_field(PSVirtualSpace,              _alignment,                                    const size_t)                          \
+  nonstatic_field(PSVirtualSpace,              _reserved_low_addr,                            char*)                                 \
+  nonstatic_field(PSVirtualSpace,              _reserved_high_addr,                           char*)                                 \
+  nonstatic_field(PSVirtualSpace,              _committed_low_addr,                           char*)                                 \
+  nonstatic_field(PSVirtualSpace,              _committed_high_addr,                          char*)                                 \
+                                                                                                                                     \
+  nonstatic_field(ImmutableSpace,              _bottom,                                       HeapWord*)                             \
+  nonstatic_field(ImmutableSpace,              _end,                                          HeapWord*)                             \
+                                                                                                                                     \
+  nonstatic_field(MutableSpace,                _top,                                          HeapWord*)                             \
+                                                                                                                                     \
+  nonstatic_field(PSYoungGen,                  _reserved,                                     MemRegion)                             \
+  nonstatic_field(PSYoungGen,                  _virtual_space,                                PSVirtualSpace*)                       \
+  nonstatic_field(PSYoungGen,                  _eden_space,                                   MutableSpace*)                         \
+  nonstatic_field(PSYoungGen,                  _from_space,                                   MutableSpace*)                         \
+  nonstatic_field(PSYoungGen,                  _to_space,                                     MutableSpace*)                         \
+  nonstatic_field(PSYoungGen,                  _init_gen_size,                                const size_t)                          \
+  nonstatic_field(PSYoungGen,                  _min_gen_size,                                 const size_t)                          \
+  nonstatic_field(PSYoungGen,                  _max_gen_size,                                 const size_t)                          \
+                                                                                                                                     \
+  nonstatic_field(PSOldGen,                    _reserved,                                     MemRegion)                             \
+  nonstatic_field(PSOldGen,                    _virtual_space,                                PSVirtualSpace*)                       \
+  nonstatic_field(PSOldGen,                    _object_space,                                 MutableSpace*)                         \
+  nonstatic_field(PSOldGen,                    _init_gen_size,                                const size_t)                          \
+  nonstatic_field(PSOldGen,                    _min_gen_size,                                 const size_t)                          \
+  nonstatic_field(PSOldGen,                    _max_gen_size,                                 const size_t)                          \
+                                                                                                                                     \
+  nonstatic_field(PSPermGen,                   _last_used,                                    size_t)                                \
+                                                                                                                                     \
+     static_field(ParallelScavengeHeap,        _young_gen,                                    PSYoungGen*)                           \
+     static_field(ParallelScavengeHeap,        _old_gen,                                      PSOldGen*)                             \
+     static_field(ParallelScavengeHeap,        _perm_gen,                                     PSPermGen*)                            \
+     static_field(ParallelScavengeHeap,        _psh,                                          ParallelScavengeHeap*)                 \
+                                                                                                                                     \
+
+#define VM_TYPES_PARALLELGC(declare_type,                                 \
+                            declare_toplevel_type)                        \
+                                                                          \
+  /*****************************************/                             \
+  /* Parallel GC - space, gen abstractions */                             \
+  /*****************************************/                             \
+           declare_type(ParallelScavengeHeap,         CollectedHeap)      \
+                                                                          \
+  declare_toplevel_type(PSVirtualSpace)                                   \
+  declare_toplevel_type(ImmutableSpace)                                   \
+           declare_type(MutableSpace, ImmutableSpace)                     \
+  declare_toplevel_type(PSYoungGen)                                       \
+           declare_type(ASPSYoungGen, PSYoungGen)                         \
+  declare_toplevel_type(PSOldGen)                                         \
+           declare_type(ASPSOldGen, PSOldGen)                             \
+           declare_type(PSPermGen, PSOldGen)                              \
+                                                                          \
+  /*****************************/                                         \
+  /* Parallel GC pointer types */                                         \
+  /*****************************/                                         \
+                                                                          \
+  declare_toplevel_type(PSVirtualSpace*)                                  \
+  declare_toplevel_type(ImmutableSpace*)                                  \
+  declare_toplevel_type(MutableSpace*)                                    \
+  declare_toplevel_type(PSYoungGen*)                                      \
+  declare_toplevel_type(ASPSYoungGen*)                                    \
+  declare_toplevel_type(PSOldGen*)                                        \
+  declare_toplevel_type(ASPSOldGen*)                                      \
+  declare_toplevel_type(PSPermGen*)                                       \
+  declare_toplevel_type(ParallelScavengeHeap*)
--- a/hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)markSweep.inline.hpp	1.16 07/05/05 17:05:34 JVM"
+#pragma ident "@(#)markSweep.inline.hpp	1.17 07/05/29 09:44:12 JVM"
 #endif
 /*
  * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -47,10 +47,12 @@
 
 inline void MarkSweep::mark_object(oop obj) {
 
+#ifndef SERIALGC
   if (UseParallelOldGC && VerifyParallelOldWithMarkSweep) {
     assert(PSParallelCompact::mark_bitmap()->is_marked(obj),
       "Should be marked in the marking bitmap");
   }
+#endif // SERIALGC
 
   // some marks may contain information we need to preserve so we store them away
   // and overwrite the mark.  We'll restore it at the end of markSweep.
--- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)vmGCOperations.cpp	1.20 07/05/05 17:05:35 JVM"
+#pragma ident "@(#)vmGCOperations.cpp	1.21 07/05/29 09:44:12 JVM"
 #endif
 /*
  * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -30,6 +30,17 @@
 HS_DTRACE_PROBE_DECL1(hotspot, gc__begin, bool);
 HS_DTRACE_PROBE_DECL(hotspot, gc__end);
 
+// The same dtrace probe can't be inserted in two different files, so we
+// have to call it here, so it's only in one file.  Can't create new probes
+// for the other file anymore.   The dtrace probes have to remain stable.
+void VM_GC_Operation::notify_gc_begin(bool full) {
+  HS_DTRACE_PROBE1(hotspot, gc__begin, full);
+}
+
+void VM_GC_Operation::notify_gc_end() {
+  HS_DTRACE_PROBE(hotspot, gc__end);
+}
+
 void VM_GC_Operation::acquire_pending_list_lock() {
   // we may enter this with pending exception set
   instanceRefKlass::acquire_pending_list_lock(&_pending_list_basic_lock);
@@ -114,7 +125,7 @@
 
 void VM_GenCollectForAllocation::doit() {
   JvmtiGCForAllocationMarker jgcm;
-  HS_DTRACE_PROBE1(hotspot, gc__begin, false);
+  notify_gc_begin(false);
 
   GenCollectedHeap* gch = GenCollectedHeap::heap();
   GCCauseSetter gccs(gch, _gc_cause);
@@ -124,182 +135,15 @@
   if (_res == NULL && GC_locker::is_active_and_needs_gc()) {
     set_gc_locked();
   }
-  HS_DTRACE_PROBE(hotspot, gc__end);
+  notify_gc_end();
 } 			
 
 void VM_GenCollectFull::doit() {
   JvmtiGCFullMarker jgcm;
-  HS_DTRACE_PROBE1(hotspot, gc__begin, true);
+  notify_gc_begin(true);
 
   GenCollectedHeap* gch = GenCollectedHeap::heap();
   GCCauseSetter gccs(gch, _gc_cause);
   gch->do_full_collection(gch->must_clear_all_soft_refs(), _max_level);
-  HS_DTRACE_PROBE(hotspot, gc__end);
+  notify_gc_end();
 } 			
-
-// VM operation to invoke a concurrent collection of a
-// GenCollectedHeap heap.
-void VM_GenCollectFullConcurrent::doit() {
-  assert(Thread::current()->is_VM_thread(), "Should be VM thread");
-  
-  GenCollectedHeap* gch = GenCollectedHeap::heap();
-  if (_gc_count_before == gch->total_collections()) {
-    // The "full" of do_full_collection call below "forces"
-    // a collection; the second arg, 0, below ensures that
-    // only the young gen is collected. XXX In the future,
-    // we'll probably need to have something in this interface
-    // to say do this only if we are sure we will not bail
-    // out to a full collection in this attempt, but that's
-    // for the future.
-    assert(SafepointSynchronize::is_at_safepoint(),
-      "We can only be executing this arm of if at a safepoint");
-    GCCauseSetter gccs(gch, _gc_cause);
-    gch->do_full_collection(gch->must_clear_all_soft_refs(),
-                            0 /* collect only youngest gen */);
-  } // Else no need for a foreground young gc
-  assert((_gc_count_before < gch->total_collections()) ||
-         (GC_locker::is_active() /* gc may have been skipped */
-          && (_gc_count_before == gch->total_collections())),
-         "total_collections() should be monotonically increasing");
-
-  MutexLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
-  if (gch->total_full_collections() == _full_gc_count_before) {
-    // Disable iCMS until the full collection is done.
-    CMSCollector::disable_icms();
-    // In case CMS thread was in icms_wait(), wake it up.
-    CMSCollector::start_icms();
-    // Nudge the CMS thread to start a concurrent collection    
-    CMSCollector::request_full_gc(_full_gc_count_before);
-  } else {
-    FullGCCount_lock->notify_all();  // Inform the Java thread its work is done
-  }
-}
-
-bool VM_GenCollectFullConcurrent::evaluate_at_safepoint() const {
-  Thread* thr = Thread::current();
-  assert(thr != NULL, "Unexpected tid");
-  if (!thr->is_Java_thread()) {
-    assert(thr->is_VM_thread(), "Expected to be evaluated by VM thread");
-    GenCollectedHeap* gch = GenCollectedHeap::heap();
-    if (_gc_count_before != gch->total_collections()) {
-      // No need to do a young gc, we'll just nudge the CMS thread
-      // in the doit() method above, to be executed soon.
-      assert(_gc_count_before < gch->total_collections(),
-             "total_collections() should be monotnically increasing");
-      return false;  // no need for foreground young gc
-    }
-  }
-  return true;       // may still need foreground young gc
-}
-
-
-void VM_GenCollectFullConcurrent::doit_epilogue() {
-  Thread* thr = Thread::current();
-  assert(thr->is_Java_thread(), "just checking");
-  JavaThread* jt = (JavaThread*)thr;
-  // Release the Heap_lock first.
-  Heap_lock->unlock();
-  release_and_notify_pending_list_lock();
-
-  // It is fine to test whether completed collections has
-  // exceeded our request count without locking because
-  // the completion count is monotonically increasing;
-  // this will break for very long-running apps when the
-  // count overflows and wraps around. XXX fix me !!!
-  // e.g. at the rate of 1 full gc per ms, this could
-  // overflow in about 1000 years.
-  GenCollectedHeap* gch = GenCollectedHeap::heap();
-  if (gch->total_full_collections_completed() <= _full_gc_count_before) {
-    // Now, wait for witnessing concurrent gc cycle to complete,
-    // but do so in native mode, because we want to lock the
-    // FullGCEvent_lock, which may be needed by the VM thread
-    // or by the CMS thread, so we do not want to be suspended
-    // while holding that lock.
-    ThreadToNativeFromVM native(jt);
-    MutexLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
-    // Either a concurrent or a stop-world full gc is sufficient
-    // witness to our request.
-    while (gch->total_full_collections_completed() <= _full_gc_count_before) {
-      FullGCCount_lock->wait(Mutex::_no_safepoint_check_flag);
-    }
-  }
-  // Enable iCMS back.
-  CMSCollector::enable_icms();
-}
-
-
-// The following methods are used by the parallel scavenge collector
-VM_ParallelGCFailedAllocation::VM_ParallelGCFailedAllocation(size_t size,
-  bool is_tlab, unsigned int gc_count) :
-  VM_GC_Operation(gc_count),
-  _size(size),
-  _is_tlab(is_tlab),
-  _result(NULL)
-{
-}
-
-void VM_ParallelGCFailedAllocation::doit() {
-  JvmtiGCForAllocationMarker jgcm;
-  HS_DTRACE_PROBE1(hotspot, gc__begin, false);
-
-  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
-  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "must be a ParallelScavengeHeap");
-
-  GCCauseSetter gccs(heap, _gc_cause);
-  _result = heap->failed_mem_allocate(_size, _is_tlab);
- 
-  if (_result == NULL && GC_locker::is_active_and_needs_gc()) {
-    set_gc_locked();
-  }
-
-  HS_DTRACE_PROBE(hotspot, gc__end);
-}
-
-VM_ParallelGCFailedPermanentAllocation::VM_ParallelGCFailedPermanentAllocation(size_t size,
-  unsigned int gc_count, unsigned int full_gc_count) :
-  VM_GC_Operation(gc_count, full_gc_count, true /* full */),
-  _size(size),
-  _result(NULL)
-{
-}
-
-void VM_ParallelGCFailedPermanentAllocation::doit() {
-  JvmtiGCFullMarker jgcm;
-  HS_DTRACE_PROBE1(hotspot, gc__begin, true);
-
-  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
-  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "must be a ParallelScavengeHeap");
-
-  GCCauseSetter gccs(heap, _gc_cause);
-  _result = heap->failed_permanent_mem_allocate(_size);
-  HS_DTRACE_PROBE(hotspot, gc__end);
-}
-
-// Only used for System.gc() calls
-VM_ParallelGCSystemGC::VM_ParallelGCSystemGC(unsigned int gc_count,
-                                             unsigned int full_gc_count,
-                                             GCCause::Cause gc_cause) :
-  VM_GC_Operation(gc_count, full_gc_count, true /* full */)
-{
-  _gc_cause = gc_cause;
-}
-
-void VM_ParallelGCSystemGC::doit() {
-  JvmtiGCFullMarker jgcm;
-  HS_DTRACE_PROBE1(hotspot, gc__begin, true);
-
-  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
-  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, 
-    "must be a ParallelScavengeHeap");
-
-  GCCauseSetter gccs(heap, _gc_cause);
-  if (_gc_cause == GCCause::_gc_locker 
-      DEBUG_ONLY(|| _gc_cause == GCCause::_scavenge_alot)) {
-    // If (and only if) the scavenge fails, this will invoke a full gc.
-    heap->invoke_scavenge();
-  } else {
-    heap->invoke_full_gc(false);
-  }
-  HS_DTRACE_PROBE(hotspot, gc__end);
-}
-
--- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)vmGCOperations.hpp	1.12 07/05/05 17:05:35 JVM"
+#pragma ident "@(#)vmGCOperations.hpp	1.14 07/05/29 09:44:12 JVM"
 #endif
 /*
  * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -105,6 +105,8 @@
   void set_gc_locked() { _gc_locked = true; }
   bool gc_locked() const  { return _gc_locked; }
 
+  static void notify_gc_begin(bool full = false);
+  static void notify_gc_end();
 };
 
 
@@ -122,57 +124,10 @@
   }
 
   ~VM_GC_HeapInspection() {}
+  virtual VMOp_Type type() const { return VMOp_GC_HeapInspection; }
   virtual bool skip_operation() const;
   virtual bool doit_prologue();
   virtual void doit();
-  virtual const char* name() const {
-    return "heap inspection";
-  }
-};
-
-
-
-// VM operation to invoke a collection of the heap as a
-// GenCollectedHeap heap.
-class VM_GenCollectFull: public VM_GC_Operation {
- private:
-  int _max_level;
- public:
-  VM_GenCollectFull(unsigned int gc_count_before,
-                    unsigned int full_gc_count_before,
-                    GCCause::Cause gc_cause,
-                    int max_level) 
-    : VM_GC_Operation(gc_count_before, full_gc_count_before, true /* full */),
-      _max_level(max_level)
-      { _gc_cause = gc_cause; }
-  ~VM_GenCollectFull() {}
-  virtual void doit();
-  virtual const char* name() const { 
-    return "full generation collection"; 
-  }
-};
-
-// VM operation to invoke a concurrent collection of the heap as a
-// GenCollectedHeap heap.
-class VM_GenCollectFullConcurrent: public VM_GC_Operation {
- public:
-  VM_GenCollectFullConcurrent(unsigned int gc_count_before,
-                              unsigned int full_gc_count_before,
-                              GCCause::Cause gc_cause)
-    : VM_GC_Operation(gc_count_before, full_gc_count_before, true /* full */) {
-    _gc_cause = gc_cause;
-    assert(FullGCCount_lock != NULL && UseConcMarkSweepGC &&
-           ExplicitGCInvokesConcurrent, "Otherwise shouldn't be here");
-    assert(UseAsyncConcMarkSweepGC, "Else will hang caller");
-  }
-  ~VM_GenCollectFullConcurrent() {}
-  virtual void doit();
-  virtual void doit_epilogue();
-  virtual bool is_cheap_allocated() const { return false; }
-  virtual bool evaluate_at_safepoint() const;
-  virtual const char* name() const {
-    return "full generation mostly-concurrent collection";
-  }
 };
 
 
@@ -190,61 +145,27 @@
       _tlab(tlab) {
     _res = NULL;
   }
-  ~VM_GenCollectForAllocation()        {}
+  ~VM_GenCollectForAllocation()  {}
+  virtual VMOp_Type type() const { return VMOp_GenCollectForAllocation; }    
   virtual void doit();
-  virtual const char* name() const { 
-    return "generation collection for allocation"; 
-  }
-  HeapWord* result() const { return _res; }
+  HeapWord* result() const       { return _res; }
 };
 
 
-class VM_ParallelGCFailedAllocation: public VM_GC_Operation {
+// VM operation to invoke a collection of the heap as a
+// GenCollectedHeap heap.
+class VM_GenCollectFull: public VM_GC_Operation {
  private:
-  size_t    _size;
-  bool      _is_tlab;
-  HeapWord* _result;
-
- public:
-  VM_ParallelGCFailedAllocation(size_t size, bool is_tlab,
-                                unsigned int gc_count);
-
-  virtual void doit();
-  virtual const char* name() const { 
-    return "parallel gc failed allocation"; 
-  }
-
-  HeapWord* result() const { return _result; }
-};
-
-class VM_ParallelGCFailedPermanentAllocation: public VM_GC_Operation {
- private:
-  size_t    _size;
-  HeapWord* _result;
-
+  int _max_level;
  public:
-  VM_ParallelGCFailedPermanentAllocation(size_t size,
-                                         unsigned int gc_count,
-                                         unsigned int full_gc_count);
-
+  VM_GenCollectFull(unsigned int gc_count_before,
+                    unsigned int full_gc_count_before,
+                    GCCause::Cause gc_cause,
+                      int max_level) 
+    : VM_GC_Operation(gc_count_before, full_gc_count_before, true /* full */),
+      _max_level(max_level)
+  { _gc_cause = gc_cause; }
+  ~VM_GenCollectFull() {}
+  virtual VMOp_Type type() const { return VMOp_GenCollectFull; }
   virtual void doit();
-  virtual const char* name() const { 
-    return "parallel gc failed permanent allocation"; 
-  }
-
-  HeapWord* result() const { return _result; }
 };
-
-class VM_ParallelGCSystemGC: public VM_GC_Operation {
- public:
-  VM_ParallelGCSystemGC(unsigned int gc_count, unsigned int full_gc_count,
-                        GCCause::Cause gc_cause);
-
-  virtual void doit();
-  virtual const char* name() const { 
-    return "parallel gc system gc"; 
-  }
-};
-
-
-
--- a/hotspot/src/share/vm/includeDB_core	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/includeDB_core	Fri Jun 22 00:46:43 2007 +0000
@@ -31,9 +31,6 @@
 // "x.cpp must include y.hpp".  Similarly, "y.hpp z.hpp" means "any file including
 // y.hpp must also include z.hpp, and z.hpp must be included before y.hpp".
 //
-// To make a change, edit this file and then do a "make lists"
-// in the binary dirs.
-//
 // Style hint: we try to keep the entries ordered alphabetically, both
 // globally (left-hand sides) and within a given file (right-hand sides)
 //
@@ -41,8 +38,6 @@
 // do not delete, move, or reformat pre-existing lines.  Do not attempt
 // to "optimize" this file incrementally.
 //
-// Note that dependencies of "HP" (non-basic) files are declared in includeDB2.
-//
 // ============ Platform dependent include files ===========
 //
 // Some header files occur in clusters.  Header files which depend
@@ -81,7 +76,7 @@
 // source file), you should consider if the error arises from a missing
 // class definition C.  If that is the case, find the header file H which
 // contains C (often, H=C.hpp, but you may have to search for C's definition).
-// Then, add a line to includeDB or includeDB2, as appropriate.
+// Then, add a line to the includeDB file as appropriate.
 //
 //
 // Here are some typical compiler errors that may require changes to includeDB.
@@ -1010,11 +1005,10 @@
 collectorPolicy.cpp                     adaptiveSizePolicy.hpp
 collectorPolicy.cpp                     arguments.hpp
 collectorPolicy.cpp                     cardTableRS.hpp
-collectorPolicy.cpp                     cmsAdaptiveSizePolicy.hpp
-collectorPolicy.cpp                     cmsGCAdaptivePolicyCounters.hpp
 collectorPolicy.cpp                     collectorPolicy.hpp
 collectorPolicy.cpp                     gcLocker.inline.hpp
 collectorPolicy.cpp                     genCollectedHeap.hpp
+collectorPolicy.cpp                     gcPolicyCounters.hpp
 collectorPolicy.cpp                     generationSpec.hpp
 collectorPolicy.cpp                     globals_extension.hpp
 collectorPolicy.cpp                     handles.inline.hpp
@@ -1033,7 +1027,6 @@
 compactPermGen.hpp                      permGen.hpp
 
 compactingPermGenGen.cpp                compactingPermGenGen.hpp
-compactingPermGenGen.cpp                concurrentMarkSweepGeneration.inline.hpp
 compactingPermGenGen.cpp                filemap.hpp
 compactingPermGenGen.cpp                genOopClosures.inline.hpp
 compactingPermGenGen.cpp                generation.inline.hpp
@@ -1043,6 +1036,7 @@
 compactingPermGenGen.cpp                symbolTable.hpp
 compactingPermGenGen.cpp                systemDictionary.hpp
 
+compactingPermGenGen.hpp                generationCounters.hpp
 compactingPermGenGen.hpp                space.hpp
 
 compilationPolicy.cpp                   compilationPolicy.hpp
@@ -1360,7 +1354,6 @@
 debug_<arch>.cpp                        top.hpp
 
 defNewGeneration.cpp                    collectorCounters.hpp
-defNewGeneration.cpp                    concurrentMarkSweepGeneration.inline.hpp
 defNewGeneration.cpp                    copy.hpp
 defNewGeneration.cpp                    defNewGeneration.hpp
 defNewGeneration.cpp                    defNewGeneration.inline.hpp
@@ -1669,11 +1662,9 @@
 
 genCollectedHeap.cpp                    aprofiler.hpp
 genCollectedHeap.cpp                    biasedLocking.hpp
-genCollectedHeap.cpp                    cmsAdaptiveSizePolicy.hpp
 genCollectedHeap.cpp                    collectedHeap.inline.hpp
 genCollectedHeap.cpp                    collectorCounters.hpp
 genCollectedHeap.cpp                    compactPermGen.hpp
-genCollectedHeap.cpp                    concurrentMarkSweepGeneration.inline.hpp
 genCollectedHeap.cpp                    filemap.hpp
 genCollectedHeap.cpp                    fprofiler.hpp
 genCollectedHeap.cpp                    gcLocker.inline.hpp
@@ -1706,7 +1697,6 @@
 
 genMarkSweep.cpp                        codeCache.hpp
 genMarkSweep.cpp                        collectedHeap.inline.hpp
-genMarkSweep.cpp                        concurrentMarkSweepGeneration.inline.hpp
 genMarkSweep.cpp                        copy.hpp
 genMarkSweep.cpp                        events.hpp
 genMarkSweep.cpp                        fprofiler.hpp
@@ -1736,14 +1726,11 @@
 genOopClosures.hpp                      oop.hpp
 
 genOopClosures.inline.hpp               cardTableRS.hpp
-genOopClosures.inline.hpp               concurrentMarkSweepGeneration.inline.hpp
-genOopClosures.inline.hpp               concurrentMarkSweepThread.hpp
 genOopClosures.inline.hpp               defNewGeneration.hpp
 genOopClosures.inline.hpp               genCollectedHeap.hpp
 genOopClosures.inline.hpp               genOopClosures.hpp
 genOopClosures.inline.hpp               genRemSet.hpp
 genOopClosures.inline.hpp               generation.hpp
-genOopClosures.inline.hpp               parNewGeneration.hpp
 genOopClosures.inline.hpp               sharedHeap.hpp
 genOopClosures.inline.hpp               space.hpp
 
@@ -1772,7 +1759,6 @@
 generation.cpp                          blockOffsetTable.hpp
 generation.cpp                          cardTableRS.hpp
 generation.cpp                          collectedHeap.inline.hpp
-generation.cpp                          concurrentMarkSweepGeneration.inline.hpp
 generation.cpp                          copy.hpp
 generation.cpp                          events.hpp
 generation.cpp                          gcLocker.inline.hpp
@@ -1801,15 +1787,12 @@
 generation.inline.hpp                   generation.hpp
 generation.inline.hpp                   space.hpp
 
-generationSpec.cpp                      asParNewGeneration.hpp
 generationSpec.cpp                      compactPermGen.hpp
-generationSpec.cpp                      concurrentMarkSweepGeneration.inline.hpp
 generationSpec.cpp                      defNewGeneration.hpp
 generationSpec.cpp                      filemap.hpp
 generationSpec.cpp                      genRemSet.hpp
 generationSpec.cpp                      generationSpec.hpp
 generationSpec.cpp                      java.hpp
-generationSpec.cpp                      parNewGeneration.hpp
 generationSpec.cpp                      tenuredGeneration.hpp
 
 generationSpec.hpp                      generation.hpp
@@ -1866,7 +1849,6 @@
 handles.inline.hpp                      thread_<os_family>.inline.hpp
 
 hashtable.cpp                           allocation.inline.hpp
-hashtable.cpp                           concurrentMarkSweepGeneration.hpp
 hashtable.cpp                           dtrace.hpp
 hashtable.cpp                           hashtable.hpp
 hashtable.cpp                           hashtable.inline.hpp
@@ -1895,7 +1877,6 @@
 heapDumper.cpp                          jniHandles.hpp
 heapDumper.cpp                          objArrayKlass.hpp
 heapDumper.cpp                          ostream.hpp
-heapDumper.cpp                          parallelScavengeHeap.hpp
 heapDumper.cpp                          reflectionUtils.hpp
 heapDumper.cpp                          symbolTable.hpp
 heapDumper.cpp                          systemDictionary.hpp
@@ -1916,7 +1897,6 @@
 heapInspection.cpp                      heapInspection.hpp
 heapInspection.cpp                      klassOop.hpp
 heapInspection.cpp                      os.hpp
-heapInspection.cpp                      parallelScavengeHeap.hpp
 heapInspection.cpp                      resourceArea.hpp
 
 heapInspection.hpp                      allocation.inline.hpp
@@ -1998,7 +1978,6 @@
 
 instanceKlass.cpp                       collectedHeap.inline.hpp
 instanceKlass.cpp                       compileBroker.hpp
-instanceKlass.cpp                       concurrentMarkSweepGeneration.inline.hpp
 instanceKlass.cpp                       fieldDescriptor.hpp
 instanceKlass.cpp                       genOopClosures.inline.hpp
 instanceKlass.cpp                       handles.inline.hpp
@@ -2013,12 +1992,9 @@
 instanceKlass.cpp                       mutexLocker.hpp
 instanceKlass.cpp                       objArrayKlassKlass.hpp
 instanceKlass.cpp                       oop.inline.hpp
-instanceKlass.cpp                       oop.psgc.inline.hpp
 instanceKlass.cpp                       oopFactory.hpp
 instanceKlass.cpp                       oopMapCache.hpp
 instanceKlass.cpp                       permGen.hpp
-instanceKlass.cpp                       psPromotionManager.inline.hpp
-instanceKlass.cpp                       psScavenge.inline.hpp
 instanceKlass.cpp                       rewriter.hpp
 instanceKlass.cpp                       symbolOop.hpp
 instanceKlass.cpp                       systemDictionary.hpp
@@ -2051,10 +2027,7 @@
 instanceKlassKlass.cpp                  objArrayOop.hpp
 instanceKlassKlass.cpp                  oop.inline.hpp
 instanceKlassKlass.cpp                  oop.inline2.hpp
-instanceKlassKlass.cpp                  oop.psgc.inline.hpp
 instanceKlassKlass.cpp                  oopMapCache.hpp
-instanceKlassKlass.cpp                  psPromotionManager.inline.hpp
-instanceKlassKlass.cpp                  psScavenge.inline.hpp
 instanceKlassKlass.cpp                  symbolOop.hpp
 instanceKlassKlass.cpp                  systemDictionary.hpp
 instanceKlassKlass.cpp                  typeArrayOop.hpp
@@ -2067,17 +2040,13 @@
 
 instanceRefKlass.cpp                    collectedHeap.hpp
 instanceRefKlass.cpp                    collectedHeap.inline.hpp
-instanceRefKlass.cpp                    concurrentMarkSweepGeneration.inline.hpp
 instanceRefKlass.cpp                    genCollectedHeap.hpp
 instanceRefKlass.cpp                    genOopClosures.inline.hpp
 instanceRefKlass.cpp                    instanceRefKlass.hpp
 instanceRefKlass.cpp                    javaClasses.hpp
 instanceRefKlass.cpp                    markSweep.hpp
 instanceRefKlass.cpp                    oop.inline.hpp
-instanceRefKlass.cpp                    oop.psgc.inline.hpp
 instanceRefKlass.cpp                    preserveException.hpp
-instanceRefKlass.cpp                    psPromotionManager.inline.hpp
-instanceRefKlass.cpp                    psScavenge.inline.hpp
 instanceRefKlass.cpp                    systemDictionary.hpp
 
 instanceRefKlass.hpp                    instanceKlass.hpp
@@ -2260,7 +2229,6 @@
 java.cpp                                compilationPolicy.hpp
 java.cpp                                compileBroker.hpp
 java.cpp                                compilerOracle.hpp
-java.cpp                                concurrentMarkSweepThread.hpp
 java.cpp                                constantPoolOop.hpp
 java.cpp                                dtrace.hpp
 java.cpp                                fprofiler.hpp
@@ -2281,9 +2249,6 @@
 java.cpp                                oop.hpp
 java.cpp                                oop.inline.hpp
 java.cpp                                oopFactory.hpp
-java.cpp                                psMarkSweep.hpp
-java.cpp                                psScavenge.hpp
-java.cpp                                psScavenge.inline.hpp
 java.cpp                                sharedRuntime.hpp
 java.cpp                                statSampler.hpp
 java.cpp                                symbolOop.hpp
@@ -2690,7 +2655,6 @@
 jvmtiExport.cpp                         objArrayOop.hpp
 jvmtiExport.cpp                         objectMonitor.inline.hpp
 jvmtiExport.cpp                         pcDesc.hpp
-jvmtiExport.cpp                         psMarkSweep.hpp
 jvmtiExport.cpp                         resourceArea.hpp
 jvmtiExport.cpp                         scopeDesc.hpp
 jvmtiExport.cpp                         serviceUtil.hpp
@@ -2790,7 +2754,6 @@
 jvmtiTagMap.cpp                         mutexLocker.hpp
 jvmtiTagMap.cpp                         objArrayKlass.hpp
 jvmtiTagMap.cpp                         oop.inline2.hpp
-jvmtiTagMap.cpp                         parallelScavengeHeap.hpp
 jvmtiTagMap.cpp                         reflectionUtils.hpp
 jvmtiTagMap.cpp                         serviceUtil.hpp
 jvmtiTagMap.cpp                         symbolTable.hpp
@@ -2841,6 +2804,7 @@
 klass.hpp                               genOopClosures.hpp
 klass.hpp                               iterator.hpp
 klass.hpp                               klassOop.hpp
+klass.hpp                               klassPS.hpp
 klass.hpp                               memRegion.hpp
 klass.hpp                               oop.hpp
 klass.hpp                               specialized_oop_closures.hpp
@@ -3028,20 +2992,15 @@
 memoryPool.cpp                          memoryManager.hpp
 memoryPool.cpp                          memoryPool.hpp
 memoryPool.cpp                          oop.inline.hpp
-memoryPool.cpp                          psPermGen.hpp                                  
-
-memoryPool.hpp                          compactibleFreeListSpace.hpp
+
 memoryPool.hpp                          defNewGeneration.hpp
 memoryPool.hpp                          heap.hpp
 memoryPool.hpp                          memoryUsage.hpp
 memoryPool.hpp                          mutableSpace.hpp
-memoryPool.hpp                          psOldGen.hpp
-memoryPool.hpp                          psYoungGen.hpp
 memoryPool.hpp                          space.hpp
 
 memoryService.cpp                       classLoadingService.hpp
 memoryService.cpp                       collectorPolicy.hpp
-memoryService.cpp                       concurrentMarkSweepGeneration.hpp
 memoryService.cpp                       defNewGeneration.hpp
 memoryService.cpp                       genCollectedHeap.hpp
 memoryService.cpp                       generation.hpp
@@ -3057,12 +3016,7 @@
 memoryService.cpp                       memoryService.hpp
 memoryService.cpp                       mutableSpace.hpp
 memoryService.cpp                       oop.inline.hpp
-memoryService.cpp                       parNewGeneration.hpp
-memoryService.cpp                       parallelScavengeHeap.hpp
 memoryService.cpp                       permGen.hpp
-memoryService.cpp                       psOldGen.hpp
-memoryService.cpp                       psPermGen.hpp
-memoryService.cpp                       psYoungGen.hpp
 memoryService.cpp                       systemDictionary.hpp
 memoryService.cpp                       tenuredGeneration.hpp
 memoryService.cpp                       vmSymbols.hpp
@@ -3110,7 +3064,6 @@
 methodDataKlass.cpp                     methodDataOop.hpp
 methodDataKlass.cpp                     oop.inline.hpp
 methodDataKlass.cpp                     oop.inline2.hpp
-methodDataKlass.cpp                     psScavenge.inline.hpp
 methodDataKlass.cpp                     resourceArea.hpp
 methodDataKlass.cpp                     universe.inline.hpp
 
@@ -3300,7 +3253,6 @@
 nmethod.hpp                             pcDesc.hpp
 
 objArrayKlass.cpp                       collectedHeap.inline.hpp
-objArrayKlass.cpp                       concurrentMarkSweepGeneration.inline.hpp
 objArrayKlass.cpp                       copy.hpp
 objArrayKlass.cpp                       genOopClosures.inline.hpp
 objArrayKlass.cpp                       handles.inline.hpp
@@ -3311,9 +3263,6 @@
 objArrayKlass.cpp                       objArrayOop.hpp
 objArrayKlass.cpp                       oop.inline.hpp
 objArrayKlass.cpp                       oop.inline2.hpp
-objArrayKlass.cpp                       oop.psgc.inline.hpp
-objArrayKlass.cpp                       psPromotionManager.inline.hpp
-objArrayKlass.cpp                       psScavenge.inline.hpp
 objArrayKlass.cpp                       resourceArea.hpp
 objArrayKlass.cpp                       symbolOop.hpp
 objArrayKlass.cpp                       systemDictionary.hpp
@@ -3364,7 +3313,6 @@
 oop.cpp                                 handles.inline.hpp
 oop.cpp                                 javaClasses.hpp
 oop.cpp                                 oop.inline.hpp
-oop.cpp                                 parNewGeneration.hpp
 oop.cpp                                 thread_<os_family>.inline.hpp
 
 oop.hpp                                 iterator.hpp
@@ -3398,15 +3346,6 @@
 oop.inline2.hpp                         permGen.hpp
 oop.inline2.hpp                         universe.hpp
 
-oop.pcgc.inline.hpp                     parallelScavengeHeap.hpp
-oop.pcgc.inline.hpp                     psCompactionManager.hpp
-oop.pcgc.inline.hpp                     psParallelCompact.hpp
-oop.pcgc.inline.hpp                     psScavenge.hpp
-oop.pcgc.inline.hpp                     psScavenge.inline.hpp
-oop.psgc.inline.hpp                     parallelScavengeHeap.hpp
-oop.psgc.inline.hpp                     psScavenge.hpp
-oop.psgc.inline.hpp                     psScavenge.inline.hpp
-
 oopFactory.cpp                          collectedHeap.inline.hpp
 oopFactory.cpp                          compiledICHolderKlass.hpp
 oopFactory.cpp                          constMethodKlass.hpp
@@ -3695,7 +3634,6 @@
 permGen.cpp                             cSpaceCounters.hpp
 permGen.cpp                             collectedHeap.inline.hpp
 permGen.cpp                             compactPermGen.hpp
-permGen.cpp                             concurrentMarkSweepGeneration.inline.hpp
 permGen.cpp                             genCollectedHeap.hpp
 permGen.cpp                             generation.inline.hpp
 permGen.cpp                             java.hpp
@@ -3703,7 +3641,6 @@
 permGen.cpp                             permGen.hpp
 permGen.cpp                             universe.hpp
 
-permGen.hpp                             concurrentMarkSweepGeneration.hpp
 permGen.hpp                             gcCause.hpp
 permGen.hpp                             generation.hpp
 permGen.hpp                             handles.hpp
@@ -3911,8 +3848,6 @@
 
 safepoint.cpp                           codeCache.hpp
 safepoint.cpp                           collectedHeap.hpp
-safepoint.cpp                           concurrentGCThread.hpp
-safepoint.cpp                           concurrentMarkSweepThread.hpp
 safepoint.cpp                           deoptimization.hpp
 safepoint.cpp                           events.hpp
 safepoint.cpp                           frame.inline.hpp
@@ -4250,7 +4185,6 @@
 symbolOop.hpp                           utf8.hpp
 
 symbolTable.cpp                         collectedHeap.inline.hpp
-symbolTable.cpp                         concurrentMarkSweepGeneration.inline.hpp
 symbolTable.cpp                         filemap.hpp
 symbolTable.cpp                         gcLocker.inline.hpp
 symbolTable.cpp                         hashtable.inline.hpp
@@ -4391,7 +4325,6 @@
 thread.cpp                              biasedLocking.hpp
 thread.cpp                              classLoader.hpp
 thread.cpp                              compileBroker.hpp
-thread.cpp                              concurrentMarkSweepThread.hpp
 thread.cpp                              defaultStream.hpp
 thread.cpp                              deoptimization.hpp
 thread.cpp                              dtrace.hpp
@@ -4423,10 +4356,8 @@
 thread.cpp                              oopFactory.hpp
 thread.cpp                              osThread.hpp
 thread.cpp                              os_<os_family>.inline.hpp
-thread.cpp                              pcTasks.hpp
 thread.cpp                              preserveException.hpp
 thread.cpp                              privilegedStack.hpp
-thread.cpp                              psTasks.hpp
 thread.cpp                              safepoint.hpp
 thread.cpp                              scopeDesc.hpp
 thread.cpp                              sharedRuntime.hpp
@@ -4634,7 +4565,6 @@
 universe.cpp                            objArrayKlassKlass.hpp
 universe.cpp                            oop.inline.hpp
 universe.cpp                            oopFactory.hpp
-universe.cpp                            parallelScavengeHeap.hpp
 universe.cpp                            permGen.hpp
 universe.cpp                            preserveException.hpp
 universe.cpp                            sharedRuntime.hpp
@@ -4822,8 +4752,6 @@
 vmStructs.cpp                           arrayKlass.hpp
 vmStructs.cpp                           arrayKlassKlass.hpp
 vmStructs.cpp                           arrayOop.hpp
-vmStructs.cpp                           asPSOldGen.hpp            
-vmStructs.cpp                           asPSYoungGen.hpp
 vmStructs.cpp                           bytecodes.hpp
 vmStructs.cpp                           cInterpreter.hpp
 vmStructs.cpp                           cardTableRS.hpp
@@ -4831,12 +4759,9 @@
 vmStructs.cpp                           codeCache.hpp
 vmStructs.cpp                           collectedHeap.hpp
 vmStructs.cpp                           compactPermGen.hpp
-vmStructs.cpp                           compactibleFreeListSpace.hpp
 vmStructs.cpp                           compiledICHolderKlass.hpp
 vmStructs.cpp                           compiledICHolderOop.hpp
 vmStructs.cpp                           compressedStream.hpp
-vmStructs.cpp                           concurrentMarkSweepGeneration.hpp
-vmStructs.cpp                           concurrentMarkSweepThread.hpp
 vmStructs.cpp                           constMethodKlass.hpp
 vmStructs.cpp                           constMethodOop.hpp
 vmStructs.cpp                           constantPoolKlass.hpp
@@ -4879,16 +4804,10 @@
 vmStructs.cpp                           objArrayOop.hpp
 vmStructs.cpp                           oop.hpp
 vmStructs.cpp                           oopMap.hpp
-vmStructs.cpp                           parNewGeneration.hpp
-vmStructs.cpp                           parallelScavengeHeap.hpp   
 vmStructs.cpp                           pcDesc.hpp
 vmStructs.cpp                           perfMemory.hpp
 vmStructs.cpp                           permGen.hpp
 vmStructs.cpp                           placeholders.hpp
-vmStructs.cpp                           psOldGen.hpp
-vmStructs.cpp                           psPermGen.hpp
-vmStructs.cpp                           psVirtualspace.hpp
-vmStructs.cpp                           psYoungGen.hpp
 vmStructs.cpp                           sharedRuntime.hpp
 vmStructs.cpp                           space.hpp
 vmStructs.cpp                           stubRoutines.hpp
@@ -4945,7 +4864,6 @@
 vm_operations.cpp                       compilerOracle.hpp
 vm_operations.cpp                       deoptimization.hpp
 vm_operations.cpp                       interfaceSupport.hpp
-vm_operations.cpp                       psParallelCompact.hpp
 vm_operations.cpp                       resourceArea.hpp
 vm_operations.cpp                       threadService.hpp
 vm_operations.cpp                       thread_<os_family>.inline.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/includeDB_gc_parallel	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,136 @@
+//
+// Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+//   
+// This code is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License version 2 only, as
+// published by the Free Software Foundation.
+//   
+// This code 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
+// version 2 for more details (a copy is included in the LICENSE file that
+// accompanied this code).
+//  
+// You should have received a copy of the GNU General Public License version
+// 2 along with this work; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+//   
+// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+// CA 95054 USA or visit www.sun.com if you need additional information or
+// have any questions.
+//  
+
+collectorPolicy.cpp                     cmsAdaptiveSizePolicy.hpp
+collectorPolicy.cpp                     cmsGCAdaptivePolicyCounters.hpp
+
+compiledICHolderKlass.cpp               oop.pcgc.inline.hpp
+
+genCollectedHeap.cpp                    concurrentMarkSweepThread.hpp
+genCollectedHeap.cpp                    vmCMSOperations.hpp
+
+generationSpec.cpp                      asParNewGeneration.hpp
+generationSpec.cpp                      cmsPermGen.hpp
+generationSpec.cpp                      parNewGeneration.hpp
+
+heapDumper.cpp                          parallelScavengeHeap.hpp
+
+heapInspection.cpp                      parallelScavengeHeap.hpp
+
+instanceKlass.cpp                       oop.pcgc.inline.hpp
+instanceKlass.cpp                       psPromotionManager.inline.hpp
+instanceKlass.cpp                       psScavenge.inline.hpp
+
+instanceKlassKlass.cpp                  psPromotionManager.inline.hpp
+instanceKlassKlass.cpp                  psScavenge.inline.hpp
+
+instanceRefKlass.cpp                    psPromotionManager.inline.hpp
+instanceRefKlass.cpp                    psScavenge.inline.hpp
+
+java.cpp                                concurrentMarkSweepThread.hpp
+java.cpp                                psScavenge.hpp
+java.cpp                                psScavenge.inline.hpp
+
+jvmtiExport.cpp                         psMarkSweep.hpp
+
+jvmtiTagMap.cpp                         parallelScavengeHeap.hpp
+
+klassKlass.cpp                          oop.pcgc.inline.hpp
+
+klass.hpp                               cmsOopClosures.hpp
+klass.hpp                               parOopClosures.hpp
+
+memoryPool.hpp                          compactibleFreeListSpace.hpp
+
+memoryService.cpp                       cmsPermGen.hpp
+memoryService.cpp                       concurrentMarkSweepGeneration.hpp
+memoryService.cpp                       parNewGeneration.hpp
+memoryService.cpp                       parallelScavengeHeap.hpp
+memoryService.cpp                       psMemoryPool.hpp
+memoryService.cpp                       psOldGen.hpp
+memoryService.cpp                       psPermGen.hpp
+memoryService.cpp                       psYoungGen.hpp
+
+methodDataKlass.cpp                     oop.pcgc.inline.hpp
+methodDataKlass.cpp                     psScavenge.inline.hpp
+
+objArrayKlass.cpp                       oop.pcgc.inline.hpp
+objArrayKlass.cpp                       psPromotionManager.inline.hpp
+objArrayKlass.cpp                       psScavenge.inline.hpp
+
+oop.pcgc.inline.hpp                     parNewGeneration.hpp
+oop.pcgc.inline.hpp                     parallelScavengeHeap.hpp
+oop.pcgc.inline.hpp                     psCompactionManager.hpp
+oop.pcgc.inline.hpp                     psParallelCompact.hpp
+oop.pcgc.inline.hpp                     psScavenge.hpp
+oop.pcgc.inline.hpp                     psScavenge.inline.hpp
+
+oop.psgc.inline.hpp                     parallelScavengeHeap.hpp
+oop.psgc.inline.hpp                     psScavenge.hpp
+oop.psgc.inline.hpp                     psScavenge.inline.hpp
+
+psMemoryPool.cpp                        handles.inline.hpp
+psMemoryPool.cpp                        javaCalls.hpp
+psMemoryPool.cpp                        lowMemoryDetector.hpp
+psMemoryPool.cpp                        management.hpp
+psMemoryPool.cpp                        memoryManager.hpp
+psMemoryPool.cpp                        oop.inline.hpp
+psMemoryPool.cpp                        psMemoryPool.hpp
+psMemoryPool.cpp                        psPermGen.hpp
+psMemoryPool.cpp                        systemDictionary.hpp
+psMemoryPool.cpp                        vmSymbols.hpp
+
+psMemoryPool.hpp                        defNewGeneration.hpp
+psMemoryPool.hpp                        heap.hpp
+psMemoryPool.hpp                        memoryUsage.hpp
+psMemoryPool.hpp                        memoryPool.hpp
+psMemoryPool.hpp                        mutableSpace.hpp
+psMemoryPool.hpp                        psOldGen.hpp
+psMemoryPool.hpp                        psYoungGen.hpp
+psMemoryPool.hpp                        space.hpp
+
+safepoint.cpp                           concurrentGCThread.hpp
+safepoint.cpp                           concurrentMarkSweepThread.hpp
+
+thread.cpp                              concurrentMarkSweepThread.hpp
+thread.cpp                              pcTasks.hpp
+
+universe.cpp                            parallelScavengeHeap.hpp
+universe.cpp                            cmsCollectorPolicy.hpp
+universe.cpp                            cmsAdaptiveSizePolicy.hpp
+
+vmStructs.cpp                           asPSOldGen.hpp            
+vmStructs.cpp                           asPSYoungGen.hpp
+vmStructs.cpp                           cmsPermGen.hpp
+vmStructs.cpp                           compactibleFreeListSpace.hpp
+vmStructs.cpp                           concurrentMarkSweepGeneration.hpp
+vmStructs.cpp                           concurrentMarkSweepThread.hpp
+vmStructs.cpp                           parNewGeneration.hpp
+vmStructs.cpp                           parallelScavengeHeap.hpp   
+vmStructs.cpp                           psOldGen.hpp
+vmStructs.cpp                           psPermGen.hpp
+vmStructs.cpp                           psVirtualspace.hpp
+vmStructs.cpp                           psYoungGen.hpp
+vmStructs.cpp                           vmStructs_cms.hpp
+vmStructs.cpp                           vmStructs_parallelgc.hpp
+vmStructs.cpp                           vmStructs_parNew.hpp
--- a/hotspot/src/share/vm/interpreter/bytecodeStream.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/interpreter/bytecodeStream.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)bytecodeStream.cpp	1.45 07/05/05 17:05:37 JVM"
+#pragma ident "@(#)bytecodeStream.cpp	1.46 07/06/04 15:38:06 JVM"
 #endif
 /*
  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -47,6 +47,5 @@
     }
   }
   _code = code;
-  assert(code == Bytecodes::_illegal || code == Bytecodes::java_code(code), "code has been rewritten");
   return code;
 }
--- a/hotspot/src/share/vm/interpreter/bytecodeStream.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/interpreter/bytecodeStream.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)bytecodeStream.hpp	1.51 07/05/05 17:05:36 JVM"
+#pragma ident "@(#)bytecodeStream.hpp	1.53 07/06/13 12:09:38 JVM"
 #endif
 /*
  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -83,10 +83,8 @@
     _bci = _next_bci;
     assert(!is_last_bytecode(), "caller should check is_last_bytecode()");
 
-    // The method cannot have breakpoints in it because it hasn't
-    // been rewritten yet.
     address bcp = RawBytecodeStream::bcp();
-    code        = (Bytecodes::Code)(*bcp);
+    code        = Bytecodes::code_or_bp_at(bcp);
     // Assert that we find no breakpoints or rewritten code.
     assert(code != Bytecodes::_breakpoint, "unexpected breakpoint");
 
@@ -98,8 +96,9 @@
       _is_wide = false;
       _next_bci += l;
       _code = code;
-      assert(code == Bytecodes::java_code(code), "code has been rewritten");
       return code;
+    } else if (code == Bytecodes::_wide && _bci + 1 >= _end_bci) {
+      return Bytecodes::_illegal;
     } else {
       return raw_next_special(code);
     }
@@ -151,7 +150,7 @@
     } else {
       // get bytecode
       address bcp = BytecodeStream::bcp();
-      code        = Bytecodes::java_code(Bytecodes::code_at(bcp));
+      code        = Bytecodes::java_code_at(bcp);
       // set next bytecode position
       //
       // note that we cannot advance before having the
--- a/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)bytecodeTracer.cpp	1.51 07/05/05 17:05:36 JVM"
+#pragma ident "@(#)bytecodeTracer.cpp	1.52 07/06/08 15:21:46 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -85,9 +85,9 @@
     Bytecodes::Code code;
     if (is_wide()) {
       // bcp wasn't advanced if previous bytecode was _wide.
-      code = Bytecodes::cast(*(bcp+1));
+      code = Bytecodes::code_at(bcp+1);
     } else {
-      code = Bytecodes::cast(*bcp);
+      code = Bytecodes::code_at(bcp);
     }
     int bci = bcp - method->code_base();
     tty->print("[%d] ", (int) Thread::current()->osthread()->thread_id());
@@ -110,11 +110,11 @@
   void trace(methodHandle method, address bcp) {
     _current_method = method();
     ResourceMark rm;
-    Bytecodes::Code code = Bytecodes::cast(*bcp);
+    Bytecodes::Code code = Bytecodes::code_at(bcp);
     // Set is_wide 
     _is_wide = (code == Bytecodes::_wide);
     if (is_wide()) {
-      code = Bytecodes::cast(*(bcp+1));
+      code = Bytecodes::code_at(bcp+1);
     }
     int bci = bcp - method->code_base();
     // Print bytecode index and name
--- a/hotspot/src/share/vm/interpreter/bytecodes.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/interpreter/bytecodes.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)bytecodes.cpp	1.95 07/05/05 17:05:37 JVM"
+#pragma ident "@(#)bytecodes.cpp	1.96 07/06/04 15:38:07 JVM"
 #endif
 /*
  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -58,7 +58,7 @@
 }
 
 int Bytecodes::special_length_at(address bcp) {
-  Code code = code_at(bcp);
+  Code code = code_or_bp_at(bcp);
   switch (code) {
   case _wide:
     return wide_length_for(cast(*(bcp + 1)));
@@ -72,6 +72,9 @@
       return (len > 0 && len == (int)len) ? len : -1;
     }
 
+  case _breakpoint:
+    return 1;
+
   case _lookupswitch:      // fall through    
   case _fast_binaryswitch: // fall through    
   case _fast_linearswitch: 
--- a/hotspot/src/share/vm/interpreter/bytecodes.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/interpreter/bytecodes.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)bytecodes.hpp	1.76 07/05/05 17:05:38 JVM"
+#pragma ident "@(#)bytecodes.hpp	1.78 07/06/13 12:09:45 JVM"
 #endif
 /*
  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -311,6 +311,9 @@
    static Code       code_at(address bcp, methodOop method = NULL) { 
           Code code = cast(*bcp); return (code != _breakpoint) ? code : non_breakpoint_code_at(bcp, method); 
    }
+   static Code       java_code_at(address bcp, methodOop method = NULL) { 
+          return java_code(code_at(bcp, method));
+   }
 
    // Fetch a bytecode or a breakpoint:
    static Code       code_or_bp_at(address bcp)    { return (Code)cast(*bcp); }
@@ -334,12 +337,15 @@
   static Code        java_code      (Code code)    { check(code);      return _java_code     [code]; }
   static bool        can_rewrite    (Code code)    { check(code);      return _can_rewrite   [code]; }
   static int         wide_length_for(Code code)    {
+    if (!is_defined(code)) {
+      return 0;
+    }
     const char* wf = wide_format(code);
     return (wf == NULL) ? 0 : (int)strlen(wf);
   }
   static int         special_length_at(address bcp);
   static int         length_at      (address bcp)  { int l = length_for(code_at(bcp)); return l > 0 ? l : special_length_at(bcp); }
-  static int         java_length_at (address bcp)  { int l = length_for(java_code(code_at(bcp))); return l > 0 ? l : special_length_at(bcp); }
+  static int         java_length_at (address bcp)  { int l = length_for(java_code_at(bcp)); return l > 0 ? l : special_length_at(bcp); }
   static bool        is_java_code   (Code code)    { return 0 <= code && code < number_of_java_codes; }
 
   static bool        is_aload       (Code code)    { return (code == _aload  || code == _aload_0  || code == _aload_1   
--- a/hotspot/src/share/vm/interpreter/interpreter.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/interpreter/interpreter.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)interpreter.cpp	1.245 07/05/17 15:54:28 JVM"
+#pragma ident "@(#)interpreter.cpp	1.246 07/06/08 15:21:43 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -911,7 +911,7 @@
 
 address AbstractInterpreter::continuation_for(methodOop method, address bcp, int callee_parameters, bool is_top_frame, bool& use_next_mdp) {
   assert(method->contains(bcp), "just checkin'");
-  Bytecodes::Code code   = Bytecodes::java_code(Bytecodes::cast(*bcp));
+  Bytecodes::Code code   = Bytecodes::java_code_at(bcp);
   int             bci    = method->bci_from(bcp);
   int             length = -1; // initial value for debugging
   // compute continuation length
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)cardTableModRefBS.cpp	1.57 07/05/17 15:54:33 JVM"
+#pragma ident "@(#)cardTableModRefBS.cpp	1.58 07/05/29 09:44:14 JVM"
 #endif
 /*
  * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -282,15 +282,6 @@
   inline_write_ref_field(field, newVal);
 }
 
-size_t CardTableModRefBS::chunks_to_cover(MemRegion mr) {
-  return (size_t)(addr_to_chunk_index(mr.last()) -
-		  addr_to_chunk_index(mr.start()) + 1);
-}
-
-uintptr_t CardTableModRefBS::addr_to_chunk_index(const void* addr) {
-  uintptr_t card = (uintptr_t) byte_for(addr);
-  return card / CardsPerStrideChunk;
-}
 
 void CardTableModRefBS::non_clean_card_iterate(Space* sp,
 					       MemRegion mr,
@@ -300,7 +291,11 @@
   if (!mr.is_empty()) {
     int n_threads = SharedHeap::heap()->n_par_threads();
     if (n_threads > 0) {
+#ifndef SERIALGC
       par_non_clean_card_iterate_work(sp, mr, dcto_cl, cl, clear, n_threads);
+#else  // SERIALGC
+      fatal("Parallel gc not supported here.");
+#endif // SERIALGC
     } else {
       non_clean_card_iterate_work(mr, cl, clear);
     }
@@ -362,48 +357,6 @@
   }
 }
 
-void CardTableModRefBS::par_non_clean_card_iterate_work(Space* sp, MemRegion mr,
-                                                        DirtyCardToOopClosure* dcto_cl,
-                                                        MemRegionClosure* cl,
-                                                        bool clear,
-                                                        int n_threads) {
-  if (n_threads > 0) {
-    assert(n_threads == (int)ParallelGCThreads, "# worker threads != # requested!");
-      
-      // Make sure the LNC array is valid for the space.
-    jbyte**   lowest_non_clean;
-    uintptr_t lowest_non_clean_base_chunk_index;
-    size_t    lowest_non_clean_chunk_size;
-    get_LNC_array_for_space(sp, lowest_non_clean,
-                            lowest_non_clean_base_chunk_index,
-                            lowest_non_clean_chunk_size);
-
-    int n_strides = n_threads * StridesPerThread;
-    SequentialSubTasksDone* pst = sp->par_seq_tasks();
-    pst->set_par_threads(n_threads);
-    pst->set_n_tasks(n_strides);
-
-    int stride = 0;
-    while (!pst->is_task_claimed(/* reference */ stride)) {
-      process_stride(sp, mr, stride, n_strides, dcto_cl, cl, clear,
-                     lowest_non_clean, 
-                     lowest_non_clean_base_chunk_index,
-                     lowest_non_clean_chunk_size);
-    }
-    if (pst->all_tasks_completed()) {
-      // Clear lowest_non_clean array for next time.
-      intptr_t first_chunk_index = addr_to_chunk_index(mr.start());
-      uintptr_t last_chunk_index  = addr_to_chunk_index(mr.last());
-      for (uintptr_t ch = first_chunk_index; ch <= last_chunk_index; ch++) {
-        intptr_t ind = ch - lowest_non_clean_base_chunk_index;
-        assert(0 <= ind && ind < (intptr_t)lowest_non_clean_chunk_size,
-               "Bounds error");
-        lowest_non_clean[ind] = NULL;
-      }
-    }
-  }
-}
-
 void CardTableModRefBS::mod_oop_in_space_iterate(Space* sp,
                                                  OopClosure* cl,
                                                  bool clear,
@@ -536,253 +489,6 @@
   return card_size * os::vm_page_size();
 }
 
-void
-CardTableModRefBS::
-process_stride(Space* sp,
-	       MemRegion used,
-	       jint stride, int n_strides,
-	       DirtyCardToOopClosure* dcto_cl,
-	       MemRegionClosure* cl,
-	       bool clear,
-	       jbyte** lowest_non_clean,
-	       uintptr_t lowest_non_clean_base_chunk_index,
-	       size_t    lowest_non_clean_chunk_size) {
-  // We don't have to go downwards here; it wouldn't help anyway,
-  // because of parallelism.
-
-  // Find the first card address of the first chunk in the stride that is
-  // at least "bottom" of the used region.
-  jbyte*    start_card  = byte_for(used.start());
-  jbyte*    end_card    = byte_after(used.last());
-  uintptr_t start_chunk = addr_to_chunk_index(used.start());
-  uintptr_t start_chunk_stride_num = start_chunk % n_strides;
-  jbyte* chunk_card_start;
-
-  if ((uintptr_t)stride >= start_chunk_stride_num) {
-    chunk_card_start = (jbyte*)(start_card +
-				(stride - start_chunk_stride_num) *
-				CardsPerStrideChunk);
-  } else {
-    // Go ahead to the next chunk group boundary, then to the requested stride.
-    chunk_card_start = (jbyte*)(start_card +
-				(n_strides - start_chunk_stride_num + stride) *
-				CardsPerStrideChunk);
-  }
-
-  while (chunk_card_start < end_card) {
-    // We don't have to go downwards here; it wouldn't help anyway,
-    // because of parallelism.  (We take care with "min_done"; see below.)
-    // Invariant: chunk_mr should be fully contained within the "used" region.
-    jbyte*    chunk_card_end = chunk_card_start + CardsPerStrideChunk;
-    MemRegion chunk_mr       = MemRegion(addr_for(chunk_card_start),
-                                         chunk_card_end >= end_card ?
-                                           used.end() : addr_for(chunk_card_end));
-    assert(chunk_mr.word_size() > 0, "[chunk_card_start > used_end)");
-    assert(used.contains(chunk_mr), "chunk_mr should be subset of used");
-
-    // Process the chunk.
-    process_chunk_boundaries(sp,
-			     dcto_cl,
-			     chunk_mr,
-			     used,
-			     lowest_non_clean,
-			     lowest_non_clean_base_chunk_index,
-			     lowest_non_clean_chunk_size);
-
-    non_clean_card_iterate_work(chunk_mr, cl, clear);
-
-    // Find the next chunk of the stride.
-    chunk_card_start += CardsPerStrideChunk * n_strides;
-  }
-}
-
-void
-CardTableModRefBS::
-process_chunk_boundaries(Space* sp,
-			 DirtyCardToOopClosure* dcto_cl,
-			 MemRegion chunk_mr,
-			 MemRegion used,
-			 jbyte** lowest_non_clean,
-			 uintptr_t lowest_non_clean_base_chunk_index,
-			 size_t    lowest_non_clean_chunk_size)
-{
-  // We must worry about the chunk boundaries.
-
-  // First, set our max_to_do:
-  HeapWord* max_to_do = NULL;
-  uintptr_t cur_chunk_index = addr_to_chunk_index(chunk_mr.start());
-  cur_chunk_index           = cur_chunk_index - lowest_non_clean_base_chunk_index;
-
-  if (chunk_mr.end() < used.end()) {
-    // This is not the last chunk in the used region.  What is the last
-    // object?
-    HeapWord* last_block = sp->block_start(chunk_mr.end());
-    assert(last_block <= chunk_mr.end(), "In case this property changes.");
-    if (last_block == chunk_mr.end()
-	|| !sp->block_is_obj(last_block)) {
-      max_to_do = chunk_mr.end();
-
-    } else {
-      // It is an object and starts before the end of the current chunk.
-      // last_obj_card is the card corresponding to the start of the last object
-      // in the chunk.  Note that the last object may not start in
-      // the chunk.
-      jbyte* last_obj_card = byte_for(last_block);
-      if (!card_may_have_been_dirty(*last_obj_card)) {
-	// The card containing the head is not dirty.  Any marks in
-	// subsequent cards still in this chunk must have been made
-	// precisely; we can cap processing at the end.
-	max_to_do = chunk_mr.end();
-      } else {
-	// The last object must be considered dirty, and extends onto the
-	// following chunk.  Look for a dirty card in that chunk that will
-	// bound our processing.
-	jbyte* limit_card = NULL;
-	size_t last_block_size = sp->block_size(last_block);
-	jbyte* last_card_of_last_obj =
-	  byte_for(last_block + last_block_size - 1);
-	jbyte* first_card_of_next_chunk = byte_for(chunk_mr.end());
-	// This search potentially goes a long distance looking
-	// for the next card that will be scanned.  For example,
-	// an object that is an array of primitives will not
-	// have any cards covering regions interior to the array
-	// that will need to be scanned. The scan can be terminated
-	// at the last card of the next chunk.  That would leave
-	// limit_card as NULL and would result in "max_to_do"
-	// being set with the LNC value or with the end
-	// of the last block.
-	jbyte* last_card_of_next_chunk = first_card_of_next_chunk + 
-	  CardsPerStrideChunk; 
-	assert(byte_for(chunk_mr.end()) - byte_for(chunk_mr.start())
-	  == CardsPerStrideChunk, "last card of next chunk may be wrong");
-	jbyte* last_card_to_check = (jbyte*) MIN2(last_card_of_last_obj,
-					          last_card_of_next_chunk);
-	for (jbyte* cur = first_card_of_next_chunk;
-	     cur <= last_card_to_check; cur++) {
-	  if (card_will_be_scanned(*cur)) {
-	    limit_card = cur; break;
-	  }
-	}
-        assert(0 <= cur_chunk_index+1 &&
-               cur_chunk_index+1 < lowest_non_clean_chunk_size,
-               "Bounds error.");
-	// LNC for the next chunk
-        jbyte* lnc_card = lowest_non_clean[cur_chunk_index+1];
-	if (limit_card == NULL) {
-	  limit_card = lnc_card;
-	}
-	if (limit_card != NULL) {
-	  if (lnc_card != NULL) {
-   	    limit_card = (jbyte*)MIN2((intptr_t)limit_card,
-				      (intptr_t)lnc_card);
-          }
-	  max_to_do = addr_for(limit_card);
-	} else {
-	  max_to_do = last_block + last_block_size;
-	}
-      }
-    }
-    assert(max_to_do != NULL, "OOPS!");
-  } else {
-    max_to_do = used.end();
-  }
-  // Now we can set the closure we're using so it doesn't to beyond
-  // max_to_do.
-  dcto_cl->set_min_done(max_to_do);
-#ifndef PRODUCT
-  dcto_cl->set_last_bottom(max_to_do);
-#endif
-
-  // Now we set *our" lowest_non_clean entry.
-  // Find the object that spans our boundary, if one exists.
-  // Nothing to do on the first chunk.
-  if (chunk_mr.start() > used.start()) {
-    // first_block is the block possibly spanning the chunk start
-    HeapWord* first_block = sp->block_start(chunk_mr.start());
-    // Does the block span the start of the chunk and is it
-    // an object?  
-    if (first_block < chunk_mr.start() &&
-	sp->block_is_obj(first_block)) {
-      jbyte* first_dirty_card = NULL;
-      jbyte* last_card_of_first_obj =
-	  byte_for(first_block + sp->block_size(first_block) - 1);
-      jbyte* first_card_of_cur_chunk = byte_for(chunk_mr.start());
-      jbyte* last_card_of_cur_chunk = byte_for(chunk_mr.last());
-      jbyte* last_card_to_check = 
-	(jbyte*) MIN2((intptr_t) last_card_of_cur_chunk,
-		      (intptr_t) last_card_of_first_obj);
-      for (jbyte* cur = first_card_of_cur_chunk;
-	   cur <= last_card_to_check; cur++) {
-	if (card_will_be_scanned(*cur)) {
-	  first_dirty_card = cur; break;
-	}
-      }
-      if (first_dirty_card != NULL) {
-	assert(0 <= cur_chunk_index &&
-		 cur_chunk_index < lowest_non_clean_chunk_size,
-	       "Bounds error.");
-	lowest_non_clean[cur_chunk_index] = first_dirty_card;
-      }
-    }
-  }
-}
-
-void
-CardTableModRefBS::
-get_LNC_array_for_space(Space* sp,
-			jbyte**& lowest_non_clean,
-			uintptr_t& lowest_non_clean_base_chunk_index,
-			size_t& lowest_non_clean_chunk_size) {
-
-  int       i        = find_covering_region_containing(sp->bottom());
-  MemRegion covered  = _covered[i];
-  size_t    n_chunks = chunks_to_cover(covered);
-  
-  // Only the first thread to obtain the lock will resize the
-  // LNC array for the covered region.  Any later expansion can't affect
-  // the used_at_save_marks region.
-  // (I observed a bug in which the first thread to execute this would
-  // resize, and then it would cause "expand_and_allocates" that would 
-  // Increase the number of chunks in the covered region.  Then a second
-  // thread would come and execute this, see that the size didn't match,
-  // and free and allocate again.  So the first thread would be using a
-  // freed "_lowest_non_clean" array.)
-
-  // Do a dirty read here. If we pass the conditional then take the rare
-  // event lock and do the read again in case some other thread had already
-  // succeeded and done the resize.
-  int cur_collection = Universe::heap()->total_collections();
-  if (_last_LNC_resizing_collection[i] != cur_collection) {
-    MutexLocker x(ParGCRareEvent_lock);
-    if (_last_LNC_resizing_collection[i] != cur_collection) {
-      if (_lowest_non_clean[i] == NULL ||
-	  n_chunks != _lowest_non_clean_chunk_size[i]) {
-	
-	// Should we delete the old?
-	if (_lowest_non_clean[i] != NULL) {
-	  assert(n_chunks != _lowest_non_clean_chunk_size[i],
-		 "logical consequence");
-	  FREE_C_HEAP_ARRAY(CardPtr, _lowest_non_clean[i]);
-	  _lowest_non_clean[i] = NULL;
-	}
-	// Now allocate a new one if necessary.
-	if (_lowest_non_clean[i] == NULL) {
-	  _lowest_non_clean[i]                  = NEW_C_HEAP_ARRAY(CardPtr, n_chunks);
-	  _lowest_non_clean_chunk_size[i]       = n_chunks;
-	  _lowest_non_clean_base_chunk_index[i] = addr_to_chunk_index(covered.start());
-	  for (int j = 0; j < (int)n_chunks; j++)
-	    _lowest_non_clean[i][j] = NULL;
-	}
-      }
-      _last_LNC_resizing_collection[i] = cur_collection;
-    }
-  }
-  // In any case, now do the initialization.
-  lowest_non_clean                  = _lowest_non_clean[i];
-  lowest_non_clean_base_chunk_index = _lowest_non_clean_base_chunk_index[i];
-  lowest_non_clean_chunk_size       = _lowest_non_clean_chunk_size[i];
-}
-
 void CardTableModRefBS::verify_guard() {
   // For product build verification
   guarantee(_byte_map[_guard_index] == last_card,
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)cardTableModRefBS.hpp	1.50 07/05/17 15:54:35 JVM"
+#pragma ident "@(#)cardTableModRefBS.hpp	1.51 07/05/29 09:44:14 JVM"
 #endif
 /*
  * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -219,11 +219,17 @@
 			       size_t& lowest_non_clean_chunk_size);
 
   // Returns the number of chunks necessary to cover "mr".
-  inline size_t chunks_to_cover(MemRegion mr);
+  size_t chunks_to_cover(MemRegion mr) {
+    return (size_t)(addr_to_chunk_index(mr.last()) -
+  		    addr_to_chunk_index(mr.start()) + 1);
+  }
 
   // Returns the index of the chunk in a stride which
   // covers the given address.
-  inline uintptr_t addr_to_chunk_index(const void* addr);
+  uintptr_t addr_to_chunk_index(const void* addr) {
+    uintptr_t card = (uintptr_t) byte_for(addr);
+    return card / CardsPerStrideChunk;
+  }
 
   // Apply cl, which must either itself apply dcto_cl or be dcto_cl,
   // to the cards in the stride (of n_strides) within the given space.
--- a/hotspot/src/share/vm/memory/cardTableRS.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/cardTableRS.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)cardTableRS.cpp	1.41 07/05/05 17:05:44 JVM"
+#pragma ident "@(#)cardTableRS.cpp	1.45 07/05/25 12:54:50 JVM"
 #endif
 /*
  * Copyright 2001-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -148,24 +148,40 @@
     _is_par = (SharedHeap::heap()->n_par_threads() > 0);
   }
   void do_MemRegion(MemRegion mr) {
+    // We start at the high end of "mr", walking backwards
+    // while accumulating a contiguous dirty range of cards in
+    // [start_of_non_clean, end_of_non_clean) which we then
+    // process en masse.
     HeapWord* end_of_non_clean = mr.end();
     HeapWord* start_of_non_clean = end_of_non_clean;
-    jbyte* entry = _ct->byte_for(mr.last());
-    HeapWord* cur = _ct->addr_for(entry);
-    while (mr.contains(cur)) {
-      jbyte entry_val = *entry;
+    jbyte*       entry = _ct->byte_for(mr.last());
+    const jbyte* first_entry = _ct->byte_for(mr.start());
+    while (entry >= first_entry) {
+      HeapWord* cur = _ct->addr_for(entry);
       if (!clear_card(entry)) {
-	if (start_of_non_clean < end_of_non_clean) {
-	  MemRegion mr2(start_of_non_clean, end_of_non_clean);
-	  _dirty_card_closure->do_MemRegion(mr2);
-	}
-	end_of_non_clean = cur;
-	start_of_non_clean = end_of_non_clean;
+        // We hit a clean card; process any non-empty
+        // dirty range accumulated so far.
+        if (start_of_non_clean < end_of_non_clean) {
+          MemRegion mr2(start_of_non_clean, end_of_non_clean);
+          _dirty_card_closure->do_MemRegion(mr2);
+        }
+        // Reset the dirty window while continuing to
+        // look for the next dirty window to process.
+        end_of_non_clean = cur;
+        start_of_non_clean = end_of_non_clean;
       }
-      entry--;
+      // Open the left end of the window one card to the left.
       start_of_non_clean = cur;
-      cur = _ct->addr_for(entry);
+      // Note that "entry" leads "start_of_non_clean" in
+      // its leftward excursion after this point
+      // in the loop and, when we hit the left end of "mr",
+      // will point off of the left end of the card-table
+      // for "mr".
+      entry--;
     }
+    // If the first card of "mr" was dirty, we will have
+    // been left with a dirty window, co-initial with "mr",
+    // which we now process.
     if (start_of_non_clean < end_of_non_clean) {
       MemRegion mr2(start_of_non_clean, end_of_non_clean);
       _dirty_card_closure->do_MemRegion(mr2);
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)collectorPolicy.cpp	1.87 07/05/17 15:54:37 JVM"
+#pragma ident "@(#)collectorPolicy.cpp	1.89 07/06/12 09:41:19 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -218,6 +218,20 @@
   } else {
     _min_gen0_size = align_size_down(_min_heap_byte_size / (NewRatio+1),
 				     min_alignment());
+    // We bound the minimum size by NewSize below (since it historically
+    // would have been NewSize and because the NewRatio calculation could
+    // yield a size that is too small) and bound it by MaxNewSize above.
+    // This is not always best.  The NewSize calculated by CMS (which has
+    // a fixed minimum of 16m) can sometimes be "too" large.  Consider
+    // the case where -Xmx32m.  The CMS calculated NewSize would be about
+    // half the entire heap which seems too large.  But the counter 
+    // example is seen when the client defaults for NewRatio are used.
+    // An initial young generation size of 640k was observed 
+    // with -Xmx128m -XX:MaxNewSize=32m when NewSize was not used
+    // as a lower bound as with
+    // _min_gen0_size = MIN2(_min_gen0_size, MaxNewSize);
+    // and 640k seemed too small a young generation.
+    _min_gen0_size = MIN2(MAX2(_min_gen0_size, NewSize), MaxNewSize);
   }	
 
   // Parameters are valid, compute area sizes.
@@ -497,92 +511,6 @@
              && gch->incremental_collection_will_fail());
 }
 
-//
-// ConcurrentMarkSweepPolicy methods
-//
-
-ConcurrentMarkSweepPolicy::ConcurrentMarkSweepPolicy() {
-  initialize_all();
-}
-
-void ConcurrentMarkSweepPolicy::initialize_generations() {
-  initialize_perm_generation(PermGen::ConcurrentMarkSweep);
-  _generations = new GenerationSpecPtr[number_of_generations()];
-  if (_generations == NULL)
-    vm_exit_during_initialization("Unable to allocate gen spec");
-  
-  if (UseParNewGC && ParallelGCThreads > 0) {
-    if (UseAdaptiveSizePolicy) {
-      _generations[0] = new GenerationSpec(Generation::ASParNew,
-                                           _initial_gen0_size, _max_gen0_size);
-    } else {
-      _generations[0] = new GenerationSpec(Generation::ParNew,
-                                           _initial_gen0_size, _max_gen0_size);
-    }
-  } else {
-    _generations[0] = new GenerationSpec(Generation::DefNew,
-                                         _initial_gen0_size, _max_gen0_size);
-  }
-  if (UseAdaptiveSizePolicy) {
-    _generations[1] = new GenerationSpec(Generation::ASConcurrentMarkSweep,
-                            _initial_gen1_size, _max_gen1_size);
-  } else {
-    _generations[1] = new GenerationSpec(Generation::ConcurrentMarkSweep,
-                            _initial_gen1_size, _max_gen1_size);
-  }
-
-  if (_generations[0] == NULL || _generations[1] == NULL) {
-    vm_exit_during_initialization("Unable to allocate gen spec");
-  }
-}
-
-void ConcurrentMarkSweepPolicy::initialize_size_policy(size_t init_eden_size,
-					       size_t init_promo_size,
-					       size_t init_survivor_size) {
-  double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;
-  double max_gc_pause_sec = ((double) MaxGCPauseMillis)/1000.0;
-  _size_policy = new CMSAdaptiveSizePolicy(init_eden_size,
-					   init_promo_size,
-                                           init_survivor_size,
-                                           max_gc_minor_pause_sec,
-                                           max_gc_pause_sec,
-                                           GCTimeRatio);
-}
-
-void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
-  // initialize the policy counters - 2 collectors, 3 generations
-  if (UseParNewGC && ParallelGCThreads > 0) {
-    _gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 3);
-  }
-  else {
-    _gc_policy_counters = new GCPolicyCounters("Copy:CMS", 2, 3);
-  }
-}
-
-// Returns true if the incremental mode is enabled.
-bool ConcurrentMarkSweepPolicy::has_soft_ended_eden()
-{
-  return CMSIncrementalMode;
-}
-
-
-//
-// ASConcurrentMarkSweepPolicy methods
-//
-
-void ASConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
-
-  assert(size_policy() != NULL, "A size policy is required");
-  // initialize the policy counters - 2 collectors, 3 generations
-  if (UseParNewGC && ParallelGCThreads > 0) {
-    _gc_policy_counters = new CMSGCAdaptivePolicyCounters("ParNew:CMS", 2, 3,
-      size_policy());
-  }
-  else {
-    _gc_policy_counters = new CMSGCAdaptivePolicyCounters("Copy:CMS", 2, 3,
-      size_policy());
-  }
-}
 
 //
 // MarkSweepPolicy methods
--- a/hotspot/src/share/vm/memory/collectorPolicy.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)collectorPolicy.hpp	1.40 07/05/17 15:54:39 JVM"
+#pragma ident "@(#)collectorPolicy.hpp	1.41 07/05/29 09:44:14 JVM"
 #endif
 /*
  * Copyright 2001-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -42,11 +42,13 @@
 // Forward declarations.
 class GenCollectorPolicy;
 class TwoGenerationCollectorPolicy;
+#ifndef SERIALGC
 class ConcurrentMarkSweepPolicy;
-class MarkSweepPolicy;
+#endif // SERIALGC
 class AdaptiveSizePolicy;
 class GCPolicyCounters;
 class PermanentGenerationSpec;
+class MarkSweepPolicy;
 
 class CollectorPolicy : public CHeapObj {
  protected:
@@ -98,13 +100,18 @@
   virtual GenCollectorPolicy*           as_generation_policy()          { return NULL; }
   virtual TwoGenerationCollectorPolicy* as_two_generation_policy()        { return NULL; }
   virtual MarkSweepPolicy*              as_mark_sweep_policy()            { return NULL; }
+#ifndef SERIALGC
   virtual ConcurrentMarkSweepPolicy*    as_concurrent_mark_sweep_policy() { return NULL; }
-
+#endif // SERIALGC 
   // Note that these are not virtual.
   bool is_generation_policy()            { return as_generation_policy() != NULL; }
   bool is_two_generation_policy()        { return as_two_generation_policy() != NULL; }
   bool is_mark_sweep_policy()            { return as_mark_sweep_policy() != NULL; }
+#ifndef SERIALGC
   bool is_concurrent_mark_sweep_policy() { return as_concurrent_mark_sweep_policy() != NULL; }
+#else  // SERIALGC
+  bool is_concurrent_mark_sweep_policy() { return false; }
+#endif // SERIALGC
 
   virtual PermanentGenerationSpec *permanent_generation() {
     assert(_permanent_generation != NULL, "Sanity check");
@@ -244,41 +251,6 @@
   }
 };
 
-class ConcurrentMarkSweepPolicy : public TwoGenerationCollectorPolicy {
- protected:
-  void initialize_generations();
-
- public:
-  ConcurrentMarkSweepPolicy();
-
-  ConcurrentMarkSweepPolicy* as_concurrent_mark_sweep_policy() { return this; }
-
-  void initialize_gc_policy_counters();
-#if 1
-  virtual void initialize_size_policy(size_t init_eden_size,
-				      size_t init_promo_size,
-				      size_t init_survivor_size);
-#endif
-
-  // Returns true if the incremental mode is enabled.
-  virtual bool has_soft_ended_eden();
-};
-
-class ASConcurrentMarkSweepPolicy : public ConcurrentMarkSweepPolicy {
- public:
-
-  // Initialize the jstat counters.  This method requires a
-  // size policy.  The size policy is expected to be created
-  // after the generations are fully initialized so the
-  // initialization of the counters need to be done post
-  // the initialization of the generations.
-  void initialize_gc_policy_counters();
-
-  virtual CollectorPolicy::Name kind() { 
-    return CollectorPolicy::ASConcurrentMarkSweepPolicyKind; 
-  }
-};
-
 class MarkSweepPolicy : public TwoGenerationCollectorPolicy {
  protected:
   void initialize_generations();
--- a/hotspot/src/share/vm/memory/defNewGeneration.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/defNewGeneration.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)defNewGeneration.cpp	1.72 07/05/17 15:54:42 JVM"
+#pragma ident "@(#)defNewGeneration.cpp	1.73 07/05/22 17:24:57 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -582,6 +582,7 @@
     // case there can be live objects in to-space
     // as a result of a partial evacuation of eden
     // and from-space.
+    swap_spaces();   // For the sake of uniformity wrt ParNewGeneration::collect().
     from()->set_next_compaction_space(to());
     gch->set_incremental_collection_will_fail();
 
--- a/hotspot/src/share/vm/memory/dump.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/dump.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)dump.cpp	1.32 07/05/05 17:05:44 JVM"
+#pragma ident "@(#)dump.cpp	1.33 07/05/23 10:53:38 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -882,9 +882,8 @@
     _md_vs = md_vs;
     _mc_vs = mc_vs;
   }
-
-  const char* name() const { return "VM_PopulateSharedSpace"; }
-
+  
+  VMOp_Type type() const { return VMOp_PopulateDumpSharedSpace; }
   void doit() {
     Thread* THREAD = VMThread::vm_thread();
     NOT_PRODUCT(SystemDictionary::verify();)
--- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)genCollectedHeap.cpp	1.187 07/05/17 15:54:50 JVM"
+#pragma ident "@(#)genCollectedHeap.cpp	1.189 07/06/12 09:41:51 JVM"
 #endif
 /*
  * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -145,29 +145,14 @@
   clear_incremental_collection_will_fail();
   clear_last_incremental_collection_failed();
 
+#ifndef SERIALGC
   // If we are running CMS, create the collector responsible
   // for collecting the CMS generations.
   if (collector_policy()->is_concurrent_mark_sweep_policy()) {
-    assert(((_gens[1]->kind() == Generation::ConcurrentMarkSweep) ||
-	   (_gens[1]->kind() == Generation::ASConcurrentMarkSweep)) &&
-           _perm_gen->as_gen()->kind() == Generation::ConcurrentMarkSweep,
-           "Unexpected generation kinds");
-    // Skip two header words in the block content verification
-    NOT_PRODUCT(_skip_header_HeapWords = CMSCollector::skip_header_HeapWords();)
-    CMSCollector* collector = new CMSCollector(
-      (ConcurrentMarkSweepGeneration*)_gens[1],
-      (ConcurrentMarkSweepGeneration*)_perm_gen->as_gen(),
-      _rem_set->as_CardTableRS(), 
-      (ConcurrentMarkSweepPolicy*) collector_policy());
-
-    if (collector == NULL || !collector->completed_initialization()) {
-      if (collector) {
-        delete collector;  // Be nice in embedded situation
-      }
-      vm_shutdown_during_initialization("Could not create CMS collector");
-      return JNI_ENOMEM;
-    }
+    bool success = create_cms_collector();
+    if (!success) return JNI_ENOMEM;
   }
+#endif // SERIALGC
 
   return JNI_OK;
 }
@@ -448,6 +433,7 @@
 	gc_cause_str = "Full GC ";
       }
     }
+    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
     TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
     TraceTime t(gc_cause_str, PrintGCDetails, false, gclog_or_tty);
 
@@ -721,8 +707,12 @@
 
 void GenCollectedHeap::collect(GCCause::Cause cause) {
   if (should_do_concurrent_full_gc(cause)) {
+#ifndef SERIALGC
     // mostly concurrent full collection
     collect_mostly_concurrent(cause);
+#else  // SERIALGC
+    ShouldNotReachHere();
+#endif // SERIALGC
   } else {
 #ifdef ASSERT
     if (cause == GCCause::_scavenge_alot) {
@@ -794,6 +784,31 @@
   }
 }
 
+#ifndef SERIALGC
+bool GenCollectedHeap::create_cms_collector() {
+
+  assert(((_gens[1]->kind() == Generation::ConcurrentMarkSweep) ||
+	 (_gens[1]->kind() == Generation::ASConcurrentMarkSweep)) &&
+         _perm_gen->as_gen()->kind() == Generation::ConcurrentMarkSweep,
+         "Unexpected generation kinds");
+  // Skip two header words in the block content verification
+  NOT_PRODUCT(_skip_header_HeapWords = CMSCollector::skip_header_HeapWords();)
+  CMSCollector* collector = new CMSCollector(
+    (ConcurrentMarkSweepGeneration*)_gens[1],
+    (ConcurrentMarkSweepGeneration*)_perm_gen->as_gen(),
+    _rem_set->as_CardTableRS(), 
+    (ConcurrentMarkSweepPolicy*) collector_policy());
+
+  if (collector == NULL || !collector->completed_initialization()) {
+    if (collector) {
+      delete collector;  // Be nice in embedded situation
+    }
+    vm_shutdown_during_initialization("Could not create CMS collector");
+    return false;
+  }
+  return true;  // success
+}
+
 void GenCollectedHeap::collect_mostly_concurrent(GCCause::Cause cause) {
   assert(!Heap_lock->owned_by_self(), "Should not own Heap_lock");
 
@@ -807,6 +822,7 @@
     VMThread::execute(&op);
   }
 }
+#endif // SERIALGC
 
 
 void GenCollectedHeap::do_full_collection(bool clear_all_soft_refs,
@@ -1154,18 +1170,22 @@
   if (workers() != NULL) {
     workers()->threads_do(tc);
   }
+#ifndef SERIALGC
   if (UseConcMarkSweepGC) {
     ConcurrentMarkSweepThread::threads_do(tc);
   }
+#endif // SERIALGC
 }
 
 void GenCollectedHeap::print_gc_threads_on(outputStream* st) const {
+#ifndef SERIALGC
   if (UseParNewGC) {
     workers()->print_worker_threads_on(st);
   }
   if (UseConcMarkSweepGC) {
     ConcurrentMarkSweepThread::print_all_on(st);
   }
+#endif // SERIALGC
 }
 
 void GenCollectedHeap::print_tracing_info() const {
--- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)genCollectedHeap.hpp	1.103 07/05/17 15:54:53 JVM"
+#pragma ident "@(#)genCollectedHeap.hpp	1.104 07/05/29 09:44:15 JVM"
 #endif
 /*
  * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -477,6 +477,9 @@
   // collect() and collect_locked(). Caller holds the Heap_lock on entry.
   void collect_locked(GCCause::Cause cause, int max_level);
 
+  // Returns success or failure.
+  bool create_cms_collector();
+
   // In support of ExplicitGCInvokesConcurrent functionality
   bool should_do_concurrent_full_gc(GCCause::Cause cause);
   void collect_mostly_concurrent(GCCause::Cause cause);
--- a/hotspot/src/share/vm/memory/genOopClosures.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/genOopClosures.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)genOopClosures.hpp	1.63 07/05/17 15:54:57 JVM"
+#pragma ident "@(#)genOopClosures.hpp	1.64 07/05/29 09:44:15 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -143,118 +143,6 @@
   void do_oop_nv(oop* p);
 };
 
-// Closures for ParNewGeneration
-
-class ParScanThreadState;
-class ParNewGeneration;
-typedef class OopTaskQueueSet ObjToScanQueueSet;
-class ParallelTaskTerminator;
-
-class ParScanClosure: public OopsInGenClosure {
-protected:
-  ParScanThreadState* _par_scan_state;
-  ParNewGeneration* _g;
-  HeapWord* _boundary;
-  void do_oop_work(oop* p,
-			  bool gc_barrier,
-			  bool root_scan);
-
-  void par_do_barrier(oop* p);
-
-public:
-  ParScanClosure(ParNewGeneration* g, ParScanThreadState* par_scan_state);
-};
-
-class ParScanWithBarrierClosure: public ParScanClosure {
-public:
-  void do_oop(oop* p)    { do_oop_work(p, true, false); }
-  void do_oop_nv(oop* p) { do_oop_work(p, true, false); }
-  ParScanWithBarrierClosure(ParNewGeneration* g,
-			    ParScanThreadState* par_scan_state) :
-    ParScanClosure(g, par_scan_state) {}
-};
-
-class ParScanWithoutBarrierClosure: public ParScanClosure {
-public:
-  ParScanWithoutBarrierClosure(ParNewGeneration* g,
-			       ParScanThreadState* par_scan_state) :
-    ParScanClosure(g, par_scan_state) {}
-  void do_oop(oop* p)    { do_oop_work(p, false, false); }
-  void do_oop_nv(oop* p) { do_oop_work(p, false, false); }
-};
-
-class ParRootScanWithBarrierTwoGensClosure: public ParScanClosure {
-public:
-  ParRootScanWithBarrierTwoGensClosure(ParNewGeneration* g,
-				       ParScanThreadState* par_scan_state) :
-    ParScanClosure(g, par_scan_state) {}
-  void do_oop(oop* p) { do_oop_work(p, true, true); }
-};
-
-class ParRootScanWithoutBarrierClosure: public ParScanClosure {
-public:
-  ParRootScanWithoutBarrierClosure(ParNewGeneration* g,
-				   ParScanThreadState* par_scan_state) :
-    ParScanClosure(g, par_scan_state) {}
-  void do_oop(oop* p) { do_oop_work(p, false, true); }
-};
-
-class ParScanWeakRefClosure: public ScanWeakRefClosure {
-protected:
-  ParScanThreadState* _par_scan_state;
-public:
-  ParScanWeakRefClosure(ParNewGeneration* g,
-                        ParScanThreadState* par_scan_state);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p);
-};
-
-class ParEvacuateFollowersClosure: public VoidClosure {
-  ParScanThreadState* _par_scan_state;
-  ParScanThreadState* par_scan_state() { return _par_scan_state; }
-
-  // We want to preserve the specific types here (rather than "OopClosure") 
-  // for later de-virtualization of do_oop calls.
-  ParScanWithoutBarrierClosure* _to_space_closure;
-  ParScanWithoutBarrierClosure* to_space_closure() {
-    return _to_space_closure;
-  }
-  ParRootScanWithoutBarrierClosure* _to_space_root_closure;
-  ParRootScanWithoutBarrierClosure* to_space_root_closure() {
-    return _to_space_root_closure;
-  }
-
-  ParScanWithBarrierClosure* _old_gen_closure;
-  ParScanWithBarrierClosure* old_gen_closure () {
-    return _old_gen_closure;
-  }
-  ParRootScanWithBarrierTwoGensClosure* _old_gen_root_closure;
-  ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure () {
-    return _old_gen_root_closure;
-  }
-
-  ParNewGeneration* _par_gen;
-  ParNewGeneration* par_gen() { return _par_gen; }
-  
-  ObjToScanQueueSet*  _task_queues;
-  ObjToScanQueueSet*  task_queues() { return _task_queues; }
-
-  ParallelTaskTerminator* _terminator;
-  ParallelTaskTerminator* terminator() { return _terminator; }
-
-public:
-  ParEvacuateFollowersClosure(
-    ParScanThreadState* par_scan_state_,
-    ParScanWithoutBarrierClosure* to_space_closure_,
-    ParScanWithBarrierClosure* old_gen_closure_,
-    ParRootScanWithoutBarrierClosure* to_space_root_closure_,
-    ParNewGeneration* par_gen_,
-    ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure_,
-    ObjToScanQueueSet* task_queues_,
-    ParallelTaskTerminator* terminator_);
-  void do_void();
-};
-
 class VerifyOopClosure: public OopClosure {
 public: 
   void do_oop(oop* p) {
@@ -262,312 +150,3 @@
   }
   static VerifyOopClosure verify_oop;
 };
-
-/////////////////////////////////////////////////////////////////
-// Closures used by ConcurrentMarkSweepGeneration's collector
-/////////////////////////////////////////////////////////////////
-class ConcurrentMarkSweepGeneration;
-class CMSBitMap;
-class CMSMarkStack;
-class CMSCollector;
-class OopTaskQueue;
-class OopTaskQueueSet;
-class MarkFromRootsClosure;
-class Par_MarkFromRootsClosure;
-
-class MarkRefsIntoClosure: public OopsInGenClosure {
-  const MemRegion    _span;
-  CMSBitMap*         _bitMap;
-  const bool         _should_do_nmethods;
- public:
-  MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap,
-                      bool should_do_nmethods);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop(p); }
-  bool do_header() { return true; }
-  virtual const bool do_nmethods() const {
-    return _should_do_nmethods;
-  }
-  Prefetch::style prefetch_style() {
-    return Prefetch::do_read;
-  }
-};
-
-// A variant of the above used in certain kinds of CMS
-// marking verification.
-class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
-  const MemRegion    _span;
-  CMSBitMap*         _verification_bm;
-  CMSBitMap*         _cms_bm;
-  const bool         _should_do_nmethods;
- public:
-  MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
-                            CMSBitMap* cms_bm, bool should_do_nmethods);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop(p); }
-  bool do_header() { return true; }
-  virtual const bool do_nmethods() const {
-    return _should_do_nmethods;
-  }
-  Prefetch::style prefetch_style() {
-    return Prefetch::do_read;
-  }
-};
-
-
-// The non-parallel version (the parallel version appears further below).
-class PushAndMarkClosure: public OopClosure {
-  CMSCollector*    _collector;
-  MemRegion        _span;
-  CMSBitMap*       _bit_map;
-  CMSBitMap*       _mod_union_table;
-  CMSMarkStack*    _mark_stack;
-  CMSMarkStack*    _revisit_stack;
-  bool             _concurrent_precleaning;
-  bool     const   _should_remember_klasses;
- public:
-  PushAndMarkClosure(CMSCollector* collector,
-                     MemRegion span,
-                     ReferenceProcessor* rp,
-                     CMSBitMap* bit_map,
-                     CMSBitMap* mod_union_table,
-                     CMSMarkStack*  mark_stack,
-                     CMSMarkStack*  revisit_stack,
-                     bool           concurrent_precleaning);
-
-  void do_oop(oop* p);    
-  void do_oop_nv(oop* p)  { PushAndMarkClosure::do_oop(p); }
-  bool do_header() { return true; }
-  Prefetch::style prefetch_style() {
-    return Prefetch::do_read;
-  }
-  const bool should_remember_klasses() const {
-    return _should_remember_klasses;
-  }
-  void remember_klass(Klass* k);
-};
-
-// In the parallel case, the revisit stack, the bit map and the
-// reference processor are currently all shared. Access to
-// these shared mutable structures must use appropriate
-// synchronization (for instance, via CAS). The marking stack
-// used in the non-parallel case above is here replaced with
-// an OopTaskQueue structure to allow efficient work stealing.
-class Par_PushAndMarkClosure: public OopClosure {
-  CMSCollector*    _collector;
-  MemRegion        _span;
-  CMSBitMap*       _bit_map;
-  OopTaskQueue*    _work_queue;
-  CMSMarkStack*    _revisit_stack;
-  bool     const   _should_remember_klasses;
- public:
-  Par_PushAndMarkClosure(CMSCollector* collector,
-                         MemRegion span,
-                         ReferenceProcessor* rp,
-                         CMSBitMap* bit_map,
-                         OopTaskQueue* work_queue,
-                         CMSMarkStack* revisit_stack);
-
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p)  { Par_PushAndMarkClosure::do_oop(p); }
-  bool do_header() { return true; }
-  Prefetch::style prefetch_style() {
-    return Prefetch::do_read;
-  }
-  const bool should_remember_klasses() const {
-    return _should_remember_klasses;
-  }
-  void remember_klass(Klass* k);
-};
-
-
-// The non-parallel version (the parallel version appears further below).
-class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
-  MemRegion                  _span;
-  CMSBitMap*                 _bit_map;
-  CMSMarkStack*              _mark_stack;
-  PushAndMarkClosure         _pushAndMarkClosure;
-  CMSCollector*              _collector;
-  bool                       _yield;
-  // Whether closure is being used for concurrent precleaning
-  bool                       _concurrent_precleaning;
-  Mutex*                     _freelistLock;
- public:
-  MarkRefsIntoAndScanClosure(MemRegion span,
-                             ReferenceProcessor* rp,
-                             CMSBitMap* bit_map,
-                             CMSBitMap* mod_union_table,
-                             CMSMarkStack*  mark_stack,
-                             CMSMarkStack*  revisit_stack,
-                             CMSCollector* collector,
-                             bool should_yield,
-                             bool concurrent_precleaning);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop(p); }
-  bool do_header() { return true; }
-  virtual const bool do_nmethods() const { return true; }
-  Prefetch::style prefetch_style() {
-    return Prefetch::do_read;
-  }
-  void set_freelistLock(Mutex* m) {
-    _freelistLock = m;
-  }
-
- private:
-  inline void do_yield_check();
-  void do_yield_work();
-  bool take_from_overflow_list();
-};
-
-// Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
-// stack and the bitMap are shared, so access needs to be suitably
-// sycnhronized. An OopTaskQueue structure, supporting efficient
-// workstealing, replaces a CMSMarkStack for storing grey objects.
-class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
-  MemRegion                      _span;
-  CMSBitMap*                     _bit_map;
-  OopTaskQueue*                  _work_queue;
-  const uint                     _low_water_mark;
-  Par_PushAndMarkClosure         _par_pushAndMarkClosure;
- public:
-  Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
-                                 MemRegion span,
-                                 ReferenceProcessor* rp,
-                                 CMSBitMap* bit_map,
-                                 OopTaskQueue* work_queue,
-                                 CMSMarkStack*  revisit_stack);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop(p); }
-  bool do_header() { return true; }
-  virtual const bool do_nmethods() const { return true; }
-  Prefetch::style prefetch_style() {
-    return Prefetch::do_read;
-  }
-  void trim_queue(uint size);
-};
-
-// This closure is used during the concurrent marking phase
-// following the first checkpoint. Its use is buried in
-// the closure MarkFromRootsClosure.
-class PushOrMarkClosure: public OopClosure {
-  CMSCollector*    _collector;
-  MemRegion        _span;
-  CMSBitMap*       _bitMap;
-  CMSMarkStack*    _markStack;
-  CMSMarkStack*    _revisitStack;
-  HeapWord* const  _finger;
-  MarkFromRootsClosure* const _parent;
-  bool                  const _should_remember_klasses;
- public:
-  PushOrMarkClosure(CMSCollector* cms_collector,
-                    MemRegion span,
-                    CMSBitMap* bitMap,
-                    CMSMarkStack*  markStack,
-                    CMSMarkStack*  revisitStack,
-                    HeapWord*      finger,
-                    MarkFromRootsClosure* parent);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p)  { PushOrMarkClosure::do_oop(p); }
-  const bool should_remember_klasses() const {
-    return _should_remember_klasses;
-  }
-  void remember_klass(Klass* k);
-  // Deal with a stack overflow condition
-  void handle_stack_overflow(HeapWord* lost);
- private:
-  inline void do_yield_check();
-};
-
-// A parallel (MT) version of the above.
-// This closure is used during the concurrent marking phase
-// following the first checkpoint. Its use is buried in
-// the closure Par_MarkFromRootsClosure.
-class Par_PushOrMarkClosure: public OopClosure {
-  CMSCollector*    _collector;
-  MemRegion        _whole_span;
-  MemRegion        _span;        // local chunk
-  CMSBitMap*       _bit_map;
-  OopTaskQueue*    _work_queue;
-  CMSMarkStack*    _overflow_stack;
-  CMSMarkStack*    _revisit_stack;
-  HeapWord*  const _finger;
-  HeapWord** const _global_finger_addr;
-  Par_MarkFromRootsClosure* const _parent;
-  bool       const _should_remember_klasses;
- public:
-  Par_PushOrMarkClosure(CMSCollector* cms_collector,
-                    MemRegion span,
-                    CMSBitMap* bit_map,
-                    OopTaskQueue* work_queue,
-                    CMSMarkStack*  mark_stack,
-                    CMSMarkStack*  revisit_stack,
-                    HeapWord*      finger,
-                    HeapWord**     global_finger_addr,
-                    Par_MarkFromRootsClosure* parent);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p)  { Par_PushOrMarkClosure::do_oop(p); }
-  const bool should_remember_klasses() const {
-    return _should_remember_klasses;
-  }
-  void remember_klass(Klass* k);
-  // Deal with a stack overflow condition
-  void handle_stack_overflow(HeapWord* lost);
- private:
-  inline void do_yield_check();
-};
-
-// For objects in CMS generation, this closure marks
-// given objects (transitively) as being reachable/live.
-// This is currently used during the (weak) reference object
-// processing phase of the CMS final checkpoint step.
-class CMSKeepAliveClosure: public OopClosure {
-  CMSCollector* _collector;
-  MemRegion     _span;
-  CMSMarkStack* _mark_stack;
-  CMSBitMap*    _bit_map;
- public:
-  CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
-                      CMSBitMap* bit_map, CMSMarkStack* mark_stack):
-    _collector(collector),
-    _span(span),
-    _bit_map(bit_map),
-    _mark_stack(mark_stack) { }
-
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop(p); }
-};
-
-class CMSInnerParMarkAndPushClosure: public OopClosure {
-  CMSCollector* _collector;
-  MemRegion     _span;
-  OopTaskQueue* _work_queue;
-  CMSBitMap*    _bit_map;
- public:
-  CMSInnerParMarkAndPushClosure(CMSCollector* collector,
-                                MemRegion span, CMSBitMap* bit_map,
-                                OopTaskQueue* work_queue):
-    _collector(collector),
-    _span(span),
-    _bit_map(bit_map),
-    _work_queue(work_queue) { }
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop(p); }
-};
-
-// A parallel (MT) version of the above, used when
-// reference processing is parallel; the only difference
-// is in the do_oop method.
-class CMSParKeepAliveClosure: public OopClosure {
-  CMSCollector* _collector;
-  MemRegion     _span;
-  OopTaskQueue* _work_queue;
-  CMSBitMap*    _bit_map;
-  CMSInnerParMarkAndPushClosure _mark_and_push;
-  const uint    _low_water_mark;
-  void trim_queue(uint max);
- public:
-  CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
-                         CMSBitMap* bit_map, OopTaskQueue* work_queue);
-  void do_oop(oop* p);
-  void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop(p); }
-};
--- a/hotspot/src/share/vm/memory/genOopClosures.inline.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/genOopClosures.inline.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)genOopClosures.inline.hpp	1.39 07/05/17 15:54:59 JVM"
+#pragma ident "@(#)genOopClosures.inline.hpp	1.40 07/05/29 09:44:15 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -120,115 +120,3 @@
 inline void ScanWeakRefClosure::do_oop_nv(oop* p) {
   ScanWeakRefClosure::do_oop(p);
 }
-
-inline void ParScanWeakRefClosure::do_oop(oop* p)
-{
-  oop obj = *p;
-  assert (obj != NULL, "null weak reference?");
-  // weak references are sometimes scanned twice; must check
-  // that to-space doesn't already contain this object
-  if ((HeapWord*)obj < _boundary && !_g->to()->is_in_reserved(obj)) {
-    // we need to ensure that it is copied (see comment in 
-    // ParScanClosure::do_oop_work).
-    klassOop objK = obj->klass();
-    markOop m = obj->mark();
-    if (m->is_marked()) { // Contains forwarding pointer.
-      *p = ParNewGeneration::real_forwardee(obj);
-    } else {
-      size_t obj_sz = obj->size_given_klass(objK->klass_part()); 
-      *p = ((ParNewGeneration*)_g)->copy_to_survivor_space(_par_scan_state,
-                                                           obj, obj_sz, m);
-    }
-  }
-}
-
-inline void ParScanWeakRefClosure::do_oop_nv(oop* p)
-{
-  ParScanWeakRefClosure::do_oop(p);
-}
-
-inline void ParScanClosure::par_do_barrier(oop* p) {
-  assert(generation()->is_in_reserved(p), "expected ref in generation");
-  oop obj = *p;
-  assert(obj != NULL, "expected non-null object");
-  // If p points to a younger generation, mark the card.
-  if ((HeapWord*)obj < gen_boundary()) {
-    rs()->write_ref_field_gc_par(p, obj);
-  }
-}
-
-inline void ParScanClosure::do_oop_work(oop* p,
-                                        bool gc_barrier,
-                                        bool root_scan) {
-  oop obj = *p;
-  assert((!Universe::heap()->is_in_reserved(p) ||
-	  generation()->is_in_reserved(p))
-	 && (generation()->level() == 0 || gc_barrier),
-	 "The gen must be right, and we must be doing the barrier "
-	 "in older generations.");
-  if (obj != NULL) {
-    if ((HeapWord*)obj < _boundary) {
-      assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
-      // OK, we need to ensure that it is copied.
-      // We read the klass and mark in this order, so that we can reliably 
-      // get the size of the object: if the mark we read is not a
-      // forwarding pointer, then the klass is valid: the klass is only
-      // overwritten with an overflow next pointer after the object is
-      // forwarded.
-      klassOop objK = obj->klass();
-      markOop m = obj->mark();
-      if (m->is_marked()) { // Contains forwarding pointer.
-	*p = ParNewGeneration::real_forwardee(obj);
-      } else {
-        size_t obj_sz = obj->size_given_klass(objK->klass_part()); 
-        *p = _g->copy_to_survivor_space(_par_scan_state, obj, obj_sz, m);
-	if (root_scan) {
-	  // This may have pushed an object.  If we have a root
-	  // category with a lot of roots, can't let the queue get too
-	  // full:
-	  (void)_par_scan_state->trim_queues(10 * ParallelGCThreads);
-	}
-      }
-      if (gc_barrier) {
-	// Now call parent closure
-	par_do_barrier(p);
-      }
-    }
-  }
-}
-
-// Trim our work_queue so its length is below max at return
-inline void Par_MarkRefsIntoAndScanClosure::trim_queue(uint max) {
-  while (_work_queue->size() > max) {
-    oop newOop;
-    if (_work_queue->pop_local(newOop)) {
-      assert(newOop->is_oop(), "Expected an oop");
-      assert(_bit_map->isMarked((HeapWord*)newOop),
-             "only grey objects on this stack");
-      // iterate over the oops in this oop, marking and pushing
-      // the ones in CMS heap (i.e. in _span).
-      newOop->oop_iterate(&_par_pushAndMarkClosure);
-    }
-  }
-}
-
-inline void PushOrMarkClosure::remember_klass(Klass* k) {
-  if (!_revisitStack->push(oop(k))) {
-    fatal("Revisit stack overflow in PushOrMarkClosure");
-  }
-}
-
-inline void Par_PushOrMarkClosure::remember_klass(Klass* k) {
-  if (!_revisit_stack->par_push(oop(k))) {
-    fatal("Revisit stack overflow in PushOrMarkClosure");
-  }
-}
-
-inline void PushOrMarkClosure::do_yield_check() {
-  _parent->do_yield_check();
-}
-
-inline void Par_PushOrMarkClosure::do_yield_check() {
-  _parent->do_yield_check();
-}
-
--- a/hotspot/src/share/vm/memory/generationSpec.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/generationSpec.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)generationSpec.cpp	1.28 07/05/05 17:05:51 JVM"
+#pragma ident "@(#)generationSpec.cpp	1.29 07/05/29 09:44:15 JVM"
 #endif
 /*
  * Copyright 2001-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -34,6 +34,10 @@
     case Generation::DefNew:
       return new DefNewGeneration(rs, init_size(), level);
 
+    case Generation::MarkSweepCompact:
+      return new TenuredGeneration(rs, init_size(), level, remset);
+    
+#ifndef SERIALGC
     case Generation::ParNew:
       return new ParNewGeneration(rs, init_size(), level);
 
@@ -43,9 +47,6 @@
 				    init_size() /* min size */,
 				    level);
 
-    case Generation::MarkSweepCompact:
-      return new TenuredGeneration(rs, init_size(), level, remset);
-    
     case Generation::ConcurrentMarkSweep: {
       assert(UseConcMarkSweepGC, "UseConcMarkSweepGC should be set");
       CardTableRS* ctrs = remset->as_CardTableRS();
@@ -85,6 +86,7 @@
 
       return g;
     }
+#endif // SERIALGC
 
     default:
       guarantee(false, "unrecognized GenerationName");
@@ -152,6 +154,7 @@
     case PermGen::MarkSweepCompact:
       return new CompactingPermGen(perm_rs, shared_rs, init_size, remset, this);
       
+#ifndef SERIALGC
     case PermGen::MarkSweep:
       guarantee(false, "NYI");
       return NULL;
@@ -166,6 +169,7 @@
       return new CMSPermGen(perm_rs, init_size, ctrs,
                    (FreeBlockDictionary::DictionaryChoice)CMSDictionaryChoice);
     }
+#endif // SERIALGC
     default:
       guarantee(false, "unrecognized GenerationName");
       return NULL;
--- a/hotspot/src/share/vm/memory/heapInspection.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/heapInspection.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)heapInspection.cpp	1.20 07/05/05 17:05:51 JVM"
+#pragma ident "@(#)heapInspection.cpp	1.21 07/05/29 09:44:16 JVM"
 #endif
 /*
  * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -222,11 +222,13 @@
       ref = gch->perm_gen()->used_region().start();
       break;
     }
+#ifndef SERIALGC
     case CollectedHeap::ParallelScavengeHeap: {
       ParallelScavengeHeap* psh = (ParallelScavengeHeap*)heap;
       ref = psh->perm_gen()->object_space()->used_region().start();
       break;
     }
+#endif // SERIALGC
     default: 
       ShouldNotReachHere(); // Unexpected heap kind for this op
   }
--- a/hotspot/src/share/vm/memory/permGen.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/permGen.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)permGen.cpp	1.53 07/05/17 15:55:06 JVM"
+#pragma ident "@(#)permGen.cpp	1.54 07/05/29 09:44:16 JVM"
 #endif
 /*
  * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -93,86 +93,3 @@
   }
   _capacity_expansion_limit = _gen->capacity() + MaxPermHeapExpansion;
 }
-
-CMSPermGen::CMSPermGen(ReservedSpace rs, size_t initial_byte_size,
-             CardTableRS* ct,
-             FreeBlockDictionary::DictionaryChoice dictionaryChoice) {
-  CMSPermGenGen* g =
-    new CMSPermGenGen(rs, initial_byte_size, -1, ct);
-  if (g == NULL) {
-    vm_exit_during_initialization("Could not allocate a CompactingPermGen");
-  }
-
-  g->initialize_performance_counters();
-
-  _gen = g;
-}
-
-HeapWord* CMSPermGen::mem_allocate(size_t size) {
-  Mutex* lock = _gen->freelistLock();
-  bool lock_owned = lock->owned_by_self();
-  if (lock_owned) {
-    MutexUnlocker mul(lock);
-    return mem_allocate_work(size);
-  } else {
-    return mem_allocate_work(size);
-  }
-}
-  
-HeapWord* CMSPermGen::mem_allocate_work(size_t size) {
-  assert(!_gen->freelistLock()->owned_by_self(), "Potetntial deadlock");
-
-  MutexLocker ml(Heap_lock);
-  HeapWord* obj = NULL;
-
-  obj = _gen->allocate(size, false);
-  // Since we want to minimize pause times, we will prefer
-  // expanding the perm gen rather than doing a stop-world
-  // collection to satisfy the allocation request.
-  if (obj == NULL) {
-    // Try to expand the perm gen and allocate space.
-    obj = _gen->expand_and_allocate(size, false, false);
-    if (obj == NULL) {
-      // Let's see if a normal stop-world full collection will
-      // free up enough space.
-      SharedHeap::heap()->collect_locked(GCCause::_permanent_generation_full);
-      obj = _gen->allocate(size, false);
-      if (obj == NULL) {
-        // The collection above may have shrunk the space, so try
-        // to expand again and allocate space.
-        obj = _gen->expand_and_allocate(size, false, false);
-      }
-      if (obj == NULL) {
-        // We have not been able to allocate space despite a
-        // full stop-world collection. We now make a last-ditch collection
-        // attempt (in which soft refs are all aggressively freed)
-        // that will try to reclaim as much space as possible.
-        SharedHeap::heap()->collect_locked(GCCause::_last_ditch_collection);
-        obj = _gen->allocate(size, false);
-        if (obj == NULL) {
-          // Expand generation in case it was shrunk following the collection.
-          obj = _gen->expand_and_allocate(size, false, false);
-        }
-      }
-    }
-  }
-  return obj;
-}
-
-void CMSPermGen::compute_new_size() {
-  _gen->compute_new_size();
-}
-
-void CMSPermGenGen::initialize_performance_counters() {
-
-  const char* gen_name = "perm";
-
-  // Generation Counters - generation 2, 1 subspace
-  _gen_counters = new GenerationCounters(gen_name, 2, 1, &_virtual_space);
-
-  _gc_counters = NULL;
-
-  _space_counters = new GSpaceCounters(gen_name, 0,
-                                       _virtual_space.reserved_size(),
-                                       this, _gen_counters);
-}
--- a/hotspot/src/share/vm/memory/permGen.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/permGen.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)permGen.hpp	1.37 07/05/05 17:05:53 JVM"
+#pragma ident "@(#)permGen.hpp	1.38 07/05/29 09:44:16 JVM"
 #endif
 /*
  * Copyright 2000-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -30,7 +30,6 @@
 // but unlike one in others, and so is split apart.
 
 class Generation;
-class ConcurrentMarkSweepGeneration;
 class GenRemSet;
 class CSpaceCounters;
 
@@ -76,52 +75,3 @@
   }
 };
 
-class CardTableRS;   // fwd decl
-
-// A PermGen implemented with a CMS space, collected by a CMS collector.
-class CMSPermGen:  public PermGen {
-  friend class VMStructs;
-
-  HeapWord* mem_allocate_work(size_t size);
- protected:
-  // The "generation" view.
-  ConcurrentMarkSweepGeneration* _gen;
-
- public:
-  CMSPermGen(ReservedSpace rs, size_t initial_byte_size,
-             CardTableRS* ct, FreeBlockDictionary::DictionaryChoice);
-
-  HeapWord* mem_allocate(size_t size);
-
-  void compute_new_size();
-
-  Generation* as_gen() const { return _gen; }
-};
-
-// This is the "generation" view of a CMSPermGen.
-class CMSPermGenGen: public ConcurrentMarkSweepGeneration {
-  // Abstractly, this is a subtype that gets access to protected fields.
-  friend class CMSPermGen;
-public:
-  CMSPermGenGen(ReservedSpace rs, size_t initial_byte_size,
-                       int level, CardTableRS* ct):
-    // See comments in the constructor for CompactibleFreeListSpace
-    // regarding not using adaptive free lists for a perm gen.
-    ConcurrentMarkSweepGeneration(rs, initial_byte_size, // MinPermHeapExapnsion
-      level, ct, false /* use adaptive freelists */,
-      (FreeBlockDictionary::DictionaryChoice)CMSDictionaryChoice)
-  {}
-
-  void initialize_performance_counters();
-
-  const char* name() const {
-    return "concurrent-mark-sweep perm gen";
-  }
-
-  const char* short_name() const {
-    return "CMS Perm";
-  }
-
-  bool must_be_youngest() const { return false; }
-  bool must_be_oldest() const { return false; }
-};
--- a/hotspot/src/share/vm/memory/space.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/space.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)space.cpp	1.216 07/05/05 17:05:44 JVM"
+#pragma ident "@(#)space.cpp	1.217 07/05/29 09:44:13 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -593,6 +593,7 @@
   }
 }
 
+#ifndef SERIALGC
 #define ContigSpace_PAR_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)         \
                                                                             \
   void ContiguousSpace::par_oop_iterate(MemRegion mr, OopClosureType* blk) {\
@@ -607,6 +608,7 @@
   ALL_PAR_OOP_ITERATE_CLOSURES(ContigSpace_PAR_OOP_ITERATE_DEFN)
 
 #undef ContigSpace_PAR_OOP_ITERATE_DEFN
+#endif // SERIALGC
 
 void ContiguousSpace::oop_iterate(OopClosure* blk) {
   if (is_empty()) return;
--- a/hotspot/src/share/vm/memory/space.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/space.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)space.hpp	1.148 07/05/17 15:55:13 JVM"
+#pragma ident "@(#)space.hpp	1.149 07/05/29 09:44:14 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -799,12 +799,14 @@
   // limit should be properly initialized
   inline void set_concurrent_iteration_safe_limit(HeapWord* new_limit);
 
+#ifndef SERIALGC
   // In support of parallel oop_iterate.
   #define ContigSpace_PAR_OOP_ITERATE_DECL(OopClosureType, nv_suffix)  \
     void par_oop_iterate(MemRegion mr, OopClosureType* blk);
 
     ALL_PAR_OOP_ITERATE_CLOSURES(ContigSpace_PAR_OOP_ITERATE_DECL)
   #undef ContigSpace_PAR_OOP_ITERATE_DECL
+#endif // SERIALGC
 
   // Compaction support
   virtual void reset_after_compaction() {
--- a/hotspot/src/share/vm/memory/specialized_oop_closures.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/specialized_oop_closures.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)specialized_oop_closures.hpp	1.29 07/05/05 17:05:55 JVM"
+#pragma ident "@(#)specialized_oop_closures.hpp	1.30 07/05/29 09:44:17 JVM"
 #endif
 /*
  * Copyright 2001-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -62,13 +62,24 @@
 // This is split into several because of a Visual C++ 6.0 compiler bug
 // where very long macros cause the compiler to crash
 
-#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)       \
+#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)       \
   f(ScanClosure,_nv)                                    \
   f(FastScanClosure,_nv)                                \
-  f(FilteringClosure,_nv)                               \
+  f(FilteringClosure,_nv)
+
+#ifndef SERIALGC
+#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)       \
   f(ParScanWithBarrierClosure,_nv)	        	\
   f(ParScanWithoutBarrierClosure,_nv)
+#else  // SERIALGC
+#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)
+#endif // SERIALGC
 
+#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)       \
+  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)             \
+  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)
+
+#ifndef SERIALGC
 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f)       \
   f(MarkRefsIntoAndScanClosure,_nv)			\
   f(Par_MarkRefsIntoAndScanClosure,_nv)			\
@@ -78,6 +89,9 @@
   f(Par_PushOrMarkClosure,_nv)                          \
   f(CMSKeepAliveClosure,_nv)                            \
   f(CMSInnerParMarkAndPushClosure,_nv)
+#else  // SERIALGC
+#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f)
+#endif // SERIALGC
 
 // We separate these out, because sometime the general one has
 // a different definition from the specialized ones, and sometimes it
@@ -90,6 +104,7 @@
 #define ALL_OOP_OOP_ITERATE_CLOSURES_3(f)               \
   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f)
 
+#ifndef SERIALGC
 // This macro applies an argument macro to all OopClosures for which we
 // want specialized bodies of a family of methods related to
 // "par_oop_iterate".  The arguments to f are the same as above.
@@ -105,6 +120,7 @@
 #define ALL_PAR_OOP_ITERATE_CLOSURES(f)                \
   f(OopClosure,_v)                                     \
   SPECIALIZED_PAR_OOP_ITERATE_CLOSURES(f)
+#endif // SERIALGC
 
 // This macro applies an argument macro to all OopClosures for which we
 // want specialized bodies of a family of methods related to
@@ -112,11 +128,21 @@
 // The "root_class" is the most general class to define; this may be
 // "OopClosure" in some applications and "OopsInGenClosure" in others.
 
-#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG(f)	\
-  f(ScanClosure,_nv)					\
-  f(FastScanClosure,_nv)				\
-  f(ParScanWithBarrierClosure,_nv)			\
+#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_S(f) \
+  f(ScanClosure,_nv)					 \
+  f(FastScanClosure,_nv)
+
+#ifndef SERIALGC
+#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f) \
+  f(ParScanWithBarrierClosure,_nv)			 \
   f(ParScanWithoutBarrierClosure,_nv)
+#else  // SERIALGC
+#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f)
+#endif // SERIALGC
+
+#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG(f)  \
+  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_S(f)      \
+  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f)
 
 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f)        \
   SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG(f)
--- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)tenuredGeneration.cpp	1.46 07/05/17 15:55:16 JVM"
+#pragma ident "@(#)tenuredGeneration.cpp	1.47 07/05/29 09:44:17 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -28,54 +28,6 @@
 # include "incls/_precompiled.incl"
 # include "incls/_tenuredGeneration.cpp.incl"
 
-class ParGCAllocBufferWithBOT: public ParGCAllocBuffer {
-  BlockOffsetArrayContigSpace _bt;
-  BlockOffsetSharedArray*     _bsa;
-  HeapWord*                   _true_end;  // end of the whole ParGCAllocBuffer
-
-  static const size_t ChunkSizeInWords;
-  static const size_t ChunkSizeInBytes;
-  HeapWord* allocate_slow(size_t word_sz);
-
-  void fill_region_with_block(MemRegion mr, bool contig);
-
-public:
-  ParGCAllocBufferWithBOT(size_t word_sz, BlockOffsetSharedArray* bsa);
-
-  HeapWord* allocate(size_t word_sz) {
-    HeapWord* res = ParGCAllocBuffer::allocate(word_sz);
-    if (res != NULL) {
-      _bt.alloc_block(res, word_sz);
-    } else {
-      res = allocate_slow(word_sz);
-    }
-    return res;
-  }
-
-  void undo_allocation(HeapWord* obj, size_t word_sz);
-
-  void set_buf(HeapWord* buf_start) {
-    ParGCAllocBuffer::set_buf(buf_start);
-    _true_end = _hard_end;
-    _bt.set_region(MemRegion(buf_start, word_sz()));
-    _bt.initialize_threshold();
-  }
-
-  void retire(bool end_of_gc, bool retain);
-
-  MemRegion range() {
-    return MemRegion(_top, _true_end);
-  }
-};
-
-const size_t ParGCAllocBufferWithBOT::ChunkSizeInWords =
-MIN2(CardTableModRefBS::par_chunk_heapword_alignment(),
-     ((size_t)Generation::GenGrain)/HeapWordSize);
-const size_t ParGCAllocBufferWithBOT::ChunkSizeInBytes =
-MIN2(CardTableModRefBS::par_chunk_heapword_alignment() * HeapWordSize,
-     (size_t)Generation::GenGrain);
-
-
 TenuredGeneration::TenuredGeneration(ReservedSpace rs,
 				     size_t initial_byte_size, int level, 
 				     GenRemSet* remset) :
@@ -103,7 +55,7 @@
   _space_counters = new CSpaceCounters(gen_name, 0,
                                        _virtual_space.reserved_size(),
                                        _the_space, _gen_counters);
-
+#ifndef SERIALGC
   if (UseParNewGC && ParallelGCThreads > 0) {
     typedef ParGCAllocBufferWithBOT* ParGCAllocBufferWithBOTPtr;
     _alloc_buffers = NEW_C_HEAP_ARRAY(ParGCAllocBufferWithBOTPtr,
@@ -119,6 +71,7 @@
   } else {
     _alloc_buffers = NULL;
   }
+#endif // SERIALGC
 }
 
 
@@ -352,7 +305,35 @@
 					size, is_tlab);
 }
 
+void TenuredGeneration::update_gc_stats(int current_level, 
+					bool full) {
+  // If the next lower level(s) has been collected, gather any statistics
+  // that are of interest at this point.
+  if (!full && (current_level + 1) == level()) {
+    // Calculate size of data promoted from the younger generations
+    // before doing the collection.
+    size_t used_before_gc = used();
 
+    // If the younger gen collections were skipped, then the
+    // number of promoted bytes will be 0 and adding it to the
+    // average will incorrectly lessen the average.  It is, however,
+    // also possible that no promotion was needed.
+    if (used_before_gc >= _used_at_prologue) {
+      size_t promoted_in_bytes = used_before_gc - _used_at_prologue;
+      gc_stats()->avg_promoted()->sample(promoted_in_bytes);
+    }
+  }
+}
+
+void TenuredGeneration::update_counters() {
+  if (UsePerfData) {
+    _space_counters->update_all();
+    _gen_counters->update_all();
+  }
+}
+
+
+#ifndef SERIALGC
 oop TenuredGeneration::par_promote(int thread_num,
 				   oop old, markOop m, size_t word_sz) {
 
@@ -418,34 +399,6 @@
   buf->retire(true, ParallelGCRetainPLAB);
 }
 
-void TenuredGeneration::update_gc_stats(int current_level, 
-					bool full) {
-  // If the next lower level(s) has been collected, gather any statistics
-  // that are of interest at this point.
-  if (!full && (current_level + 1) == level()) {
-    // Calculate size of data promoted from the younger generations
-    // before doing the collection.
-    size_t used_before_gc = used();
-
-    // If the younger gen collections were skipped, then the
-    // number of promoted bytes will be 0 and adding it to the
-    // average will incorrectly lessen the average.  It is, however,
-    // also possible that no promotion was needed.
-    if (used_before_gc >= _used_at_prologue) {
-      size_t promoted_in_bytes = used_before_gc - _used_at_prologue;
-      gc_stats()->avg_promoted()->sample(promoted_in_bytes);
-    }
-  }
-}
-
-void TenuredGeneration::update_counters() {
-  if (UsePerfData) {
-    _space_counters->update_all();
-    _gen_counters->update_all();
-  }
-}
-
-
 void TenuredGeneration::retire_alloc_buffers_before_full_gc() {
   if (UseParNewGC) {
     for (uint i = 0; i < ParallelGCThreads; i++) {
@@ -463,6 +416,10 @@
     }
   }
 }
+#else  // SERIALGC
+void TenuredGeneration::retire_alloc_buffers_before_full_gc() {}
+void TenuredGeneration::verify_alloc_buffers_clean() {}
+#endif // SERIALGC
 
 bool TenuredGeneration::promotion_attempt_is_safe(
     size_t max_promotion_in_bytes,
@@ -490,211 +447,3 @@
   }
   return result;
 }
-
-ParGCAllocBufferWithBOT::ParGCAllocBufferWithBOT(size_t word_sz,
-						 BlockOffsetSharedArray* bsa) :
-  ParGCAllocBuffer(word_sz),
-  _bsa(bsa),
-  _bt(bsa, MemRegion(_bottom, _hard_end)),
-  _true_end(_hard_end)
-{}
-
-// The buffer comes with its own BOT, with a shared (obviously) underlying
-// BlockOffsetSharedArray. We manipulate this BOT in the normal way
-// as we would for any contiguous space. However, on accasion we
-// need to do some buffer surgery at the extremities before we
-// start using the body of the buffer for allocations. Such surgery
-// (as explained elsewhere) is to prevent allocation on a card that
-// is in the process of being walked concurrently by another GC thread.
-// When such surgery happens at a point that is far removed (to the
-// right of the current allocation point, top), we use the "contig"
-// parameter below to directly manipulate the shared array without
-// modifying the _next_threshold state in the BOT.
-void ParGCAllocBufferWithBOT::fill_region_with_block(MemRegion mr,
-						     bool contig) {
-  SharedHeap::fill_region_with_object(mr);
-  if (contig) {
-    _bt.alloc_block(mr.start(), mr.end());
-  } else {
-    _bt.BlockOffsetArray::alloc_block(mr.start(), mr.end());
-  }
-}
-
-HeapWord* ParGCAllocBufferWithBOT::allocate_slow(size_t word_sz) {
-  HeapWord* res = NULL;
-  if (_true_end > _hard_end) {
-    assert((HeapWord*)align_size_down(intptr_t(_hard_end),
-				      ChunkSizeInBytes) == _hard_end,
-	   "or else _true_end should be equal to _hard_end");
-    assert(_retained, "or else _true_end should be equal to _hard_end");
-    assert(_retained_filler.end() <= _top, "INVARIANT");
-    SharedHeap::fill_region_with_object(_retained_filler);
-    if (_top < _hard_end) {
-      fill_region_with_block(MemRegion(_top, _hard_end), true);
-    }
-    HeapWord* next_hard_end = MIN2(_true_end, _hard_end + ChunkSizeInWords);
-    _retained_filler = MemRegion(_hard_end, FillerHeaderSize);
-    _bt.alloc_block(_retained_filler.start(), _retained_filler.word_size());
-    _top      = _retained_filler.end();
-    _hard_end = next_hard_end;
-    _end      = _hard_end - AlignmentReserve;
-    res       = ParGCAllocBuffer::allocate(word_sz);
-    if (res != NULL) {
-      _bt.alloc_block(res, word_sz);
-    }
-  }
-  return res;
-}
-
-void
-ParGCAllocBufferWithBOT::undo_allocation(HeapWord* obj, size_t word_sz) {
-  ParGCAllocBuffer::undo_allocation(obj, word_sz);
-  // This may back us up beyond the previous threshold, so reset.
-  _bt.set_region(MemRegion(_top, _hard_end));
-  _bt.initialize_threshold();
-}
-
-void ParGCAllocBufferWithBOT::retire(bool end_of_gc, bool retain) {
-  assert(!retain || end_of_gc, "Can only retain at GC end.");
-  if (_retained) {
-    // We're about to make the retained_filler into a block.
-    _bt.BlockOffsetArray::alloc_block(_retained_filler.start(),
-				      _retained_filler.end());
-  }
-  // Reset _hard_end to _true_end (and update _end)
-  if (retain && _hard_end != NULL) {
-    assert(_hard_end <= _true_end, "Invariant.");
-    _hard_end = _true_end;
-    _end      = MAX2(_top, _hard_end - AlignmentReserve);
-    assert(_end <= _hard_end, "Invariant.");
-  }
-  _true_end = _hard_end;
-  HeapWord* pre_top = _top;
-
-  ParGCAllocBuffer::retire(end_of_gc, retain);
-  // Now any old _retained_filler is cut back to size, the free part is
-  // filled with a filler object, and top is past the header of that
-  // object.
-
-  if (retain && _top < _end) {
-    assert(end_of_gc && retain, "Or else retain should be false.");
-    // If the lab does not start on a card boundary, we don't want to
-    // allocate onto that card, since that might lead to concurrent
-    // allocation and card scanning, which we don't support.  So we fill
-    // the first card with a garbage object.
-    size_t first_card_index = _bsa->index_for(pre_top);
-    HeapWord* first_card_start = _bsa->address_for_index(first_card_index);
-    if (first_card_start < pre_top) {
-      HeapWord* second_card_start =
-	_bsa->address_for_index(first_card_index + 1);
-
-      // Ensure enough room to fill with the smallest block
-      second_card_start = MAX2(second_card_start, pre_top + AlignmentReserve);
-
-      // If the end is already in the first card, don't go beyond it!
-      // Or if the remainder is too small for a filler object, gobble it up.
-      if (_hard_end < second_card_start ||
-          pointer_delta(_hard_end, second_card_start) < AlignmentReserve) {
-        second_card_start = _hard_end;
-      }
-      if (pre_top < second_card_start) {
-	MemRegion first_card_suffix(pre_top, second_card_start);
-	fill_region_with_block(first_card_suffix, true);
-      }
-      pre_top = second_card_start;
-      _top = pre_top;
-      _end = MAX2(_top, _hard_end - AlignmentReserve);
-    }
-
-    // If the lab does not end on a card boundary, we don't want to
-    // allocate onto that card, since that might lead to concurrent
-    // allocation and card scanning, which we don't support.  So we fill
-    // the last card with a garbage object.
-    size_t last_card_index = _bsa->index_for(_hard_end);
-    HeapWord* last_card_start = _bsa->address_for_index(last_card_index);
-    if (last_card_start < _hard_end) {
-
-      // Ensure enough room to fill with the smallest block
-      last_card_start = MIN2(last_card_start, _hard_end - AlignmentReserve);
-
-      // If the top is already in the last card, don't go back beyond it!
-      // Or if the remainder is too small for a filler object, gobble it up.
-      if (_top > last_card_start ||
-          pointer_delta(last_card_start, _top) < AlignmentReserve) {
-        last_card_start = _top;
-      }
-      if (last_card_start < _hard_end) {
-	MemRegion last_card_prefix(last_card_start, _hard_end);
-	fill_region_with_block(last_card_prefix, false);
-      }
-      _hard_end = last_card_start;
-      _end      = MAX2(_top, _hard_end - AlignmentReserve);
-      _true_end = _hard_end;
-      assert(_end <= _hard_end, "Invariant.");
-    }
-
-    // At this point:
-    //   1) we had a filler object from the original top to hard_end.
-    //   2) We've filled in any partial cards at the front and back.
-    if (pre_top < _hard_end) {
-      // Now we can reset the _bt to do allocation in the given area.
-      MemRegion new_filler(pre_top, _hard_end);
-      fill_region_with_block(new_filler, false);
-      _top = pre_top + ParGCAllocBuffer::FillerHeaderSize;
-      // If there's no space left, don't retain.
-      if (_top >= _end) {
-	_retained = false;
-        invalidate();
-	return;
-      } 
-      _retained_filler = MemRegion(pre_top, _top);
-      _bt.set_region(MemRegion(_top, _hard_end));
-      _bt.initialize_threshold();
-      assert(_bt.threshold() > _top, "initialize_threshold failed!");
-
-      // There may be other reasons for queries into the middle of the
-      // filler object.  When such queries are done in parallel with
-      // allocation, bad things can happen, if the query involves object
-      // iteration.  So we ensure that such queries do not involve object
-      // iteration, by putting another filler object on the boundaries of
-      // such queries.  One such is the object spanning a parallel card
-      // chunk boundary.
-
-      // "chunk_boundary" is the address of the first chunk boundary less
-      // than "hard_end".
-      HeapWord* chunk_boundary = 
-        (HeapWord*)align_size_down(intptr_t(_hard_end-1), ChunkSizeInBytes); 
-      assert(chunk_boundary < _hard_end, "Or else above did not work."); 
-      assert(pointer_delta(_true_end, chunk_boundary) >= AlignmentReserve,
-             "Consequence of last card handling above.");
- 
-      if (_top <= chunk_boundary) { 
-	assert(_true_end == _hard_end, "Invariant.");
-	while (_top <= chunk_boundary) {
-          assert(pointer_delta(_hard_end, chunk_boundary) >= AlignmentReserve,
-                 "Consequence of last card handling above.");
-	  MemRegion chunk_portion(chunk_boundary, _hard_end);
-	  _bt.BlockOffsetArray::alloc_block(chunk_portion.start(),
-                                            chunk_portion.end());
-	  SharedHeap::fill_region_with_object(chunk_portion);
-	  _hard_end = chunk_portion.start();
-	  chunk_boundary -= ChunkSizeInWords;
-	}
-        _end = _hard_end - AlignmentReserve;
-        assert(_top <= _end, "Invariant.");
-	// Now reset the initial filler chunk so it doesn't overlap with
-	// the one(s) inserted above.
-	MemRegion new_filler(pre_top, _hard_end);
-	fill_region_with_block(new_filler, false);
-      }
-    } else {
-      _retained = false;
-      invalidate();
-    }
-  } else {
-    assert(!end_of_gc ||
-	   (!_retained && _true_end == _hard_end), "Checking.");
-  }
-  assert(_end <= _hard_end, "Invariant.");
-  assert(_top < _end || _top == _hard_end, "Invariant");
-}
--- a/hotspot/src/share/vm/memory/tenuredGeneration.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)tenuredGeneration.hpp	1.26 07/05/17 15:55:18 JVM"
+#pragma ident "@(#)tenuredGeneration.hpp	1.27 07/05/29 09:44:17 JVM"
 #endif
 /*
  * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -40,9 +40,11 @@
   size_t _capacity_at_prologue;
   size_t _used_at_prologue;
 
+#ifndef SERIALGC
   // To support parallel promotion: an array of parallel allocation
   // buffers, one per thread, initially NULL.
   ParGCAllocBufferWithBOT** _alloc_buffers;
+#endif // SERIALGC
 
   // Retire all alloc buffers before a full GC, so that they will be
   // re-allocated at the start of the next young GC.
@@ -87,12 +89,14 @@
                        size_t size, 
                        bool is_tlab);
 
+#ifndef SERIALGC
   // Overrides.
   virtual oop par_promote(int thread_num,
 			  oop obj, markOop m, size_t word_sz);
   virtual void par_promote_alloc_undo(int thread_num,
 				      HeapWord* obj, size_t word_sz);
   virtual void par_promote_alloc_done(int thread_num);
+#endif // SERIALGC
 
   // Performance Counter support
   void update_counters();
--- a/hotspot/src/share/vm/memory/universe.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/memory/universe.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)universe.cpp	1.358 07/05/17 15:55:21 JVM"
+#pragma ident "@(#)universe.cpp	1.359 07/05/29 09:44:16 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -668,7 +668,11 @@
 jint Universe::initialize_heap() {
 
   if (UseParallelGC) {
+#ifndef SERIALGC
     Universe::_collectedHeap = new ParallelScavengeHeap();
+#else  // SERIALGC
+    fatal("UseParallelGC not supported in java kernel vm.");
+#endif // SERIALGC
 
   } else {
     GenCollectorPolicy *gc_policy;
@@ -676,11 +680,15 @@
     if (UseSerialGC) {
       gc_policy = new MarkSweepPolicy();
     } else if (UseConcMarkSweepGC) {
+#ifndef SERIALGC
       if (UseAdaptiveSizePolicy) {
 	gc_policy = new ASConcurrentMarkSweepPolicy();
       } else {
 	gc_policy = new ConcurrentMarkSweepPolicy();
       }
+#else   // SERIALGC
+    fatal("UseConcMarkSweepGC not supported in java kernel vm.");
+#endif // SERIALGC
     } else { // default old generation
       gc_policy = new MarkSweepPolicy();
     }
@@ -1135,11 +1143,13 @@
     permanent_reserved = gch->perm_gen()->reserved();
     break;
   }
+#ifndef SERIALGC
   case CollectedHeap::ParallelScavengeHeap: {
     ParallelScavengeHeap* psh = (ParallelScavengeHeap*) Universe::heap();
     permanent_reserved = psh->perm_gen()->reserved();
     break;
   }
+#endif // SERIALGC
   }
   calculate_verify_data(_verify_klass_data,
                         permanent_reserved.start(), 
--- a/hotspot/src/share/vm/oops/arrayKlassKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/arrayKlassKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)arrayKlassKlass.cpp	1.55 07/05/05 17:05:58 JVM"
+#pragma ident "@(#)arrayKlassKlass.cpp	1.56 07/05/29 09:44:17 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -58,6 +58,7 @@
   klassKlass::oop_follow_contents(obj);
 }
 
+#ifndef SERIALGC
 void arrayKlassKlass::oop_follow_contents(ParCompactionManager* cm,
 					  oop obj) {
   assert(obj->is_klass(), "must be klass");
@@ -71,6 +72,7 @@
   }
   klassKlass::oop_follow_contents(cm, obj);
 }
+#endif // SERIALGC
 
 
 int arrayKlassKlass::oop_adjust_pointers(oop obj) {
@@ -108,6 +110,7 @@
   return klassKlass::oop_oop_iterate_m(obj, blk, mr);
 }
 
+#ifndef SERIALGC
 void arrayKlassKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->blueprint()->oop_is_arrayKlass(),"must be an array klass");
 }
@@ -149,6 +152,7 @@
   }
   return klassKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/arrayKlassKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/arrayKlassKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)arrayKlassKlass.hpp	1.38 07/05/05 17:05:58 JVM"
+#pragma ident "@(#)arrayKlassKlass.hpp	1.39 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -51,15 +51,8 @@
   int oop_adjust_pointers(oop obj);
   bool oop_is_parsable(oop obj) const;
 
-  // ParallelScavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg, HeapWord* end);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Iterators
   int oop_oop_iterate(oop obj, OopClosure* blk);
--- a/hotspot/src/share/vm/oops/compiledICHolderKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/compiledICHolderKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)compiledICHolderKlass.cpp	1.40 07/05/05 17:05:59 JVM"
+#pragma ident "@(#)compiledICHolderKlass.cpp	1.41 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -64,6 +64,7 @@
   MarkSweep::mark_and_push(c->adr_holder_klass());
 }
 
+#ifndef SERIALGC
 void compiledICHolderKlass::oop_follow_contents(ParCompactionManager* cm,
 						oop obj) {
   assert(obj->is_compiledICHolder(), "must be compiledICHolder");
@@ -73,6 +74,7 @@
   PSParallelCompact::mark_and_push(cm, c->adr_holder_method());
   PSParallelCompact::mark_and_push(cm, c->adr_holder_klass());
 }
+#endif // SERIALGC
 
 
 int compiledICHolderKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
@@ -120,6 +122,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 void compiledICHolderKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_compiledICHolder(), "must be compiledICHolder");
 }
@@ -152,6 +155,7 @@
   PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   return c->object_size();
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/compiledICHolderKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/compiledICHolderKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)compiledICHolderKlass.hpp	1.31 07/05/05 17:05:59 JVM"
+#pragma ident "@(#)compiledICHolderKlass.hpp	1.32 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -60,15 +60,8 @@
   void oop_follow_contents(oop obj);
   int  oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Allocation profiling support
   juint alloc_size() const              { return _alloc_size; }
--- a/hotspot/src/share/vm/oops/constMethodKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/constMethodKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)constMethodKlass.cpp	1.23 07/05/05 17:05:59 JVM"
+#pragma ident "@(#)constMethodKlass.cpp	1.24 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -93,6 +93,7 @@
   // know that Universe::constMethodKlassObj never moves.
 }
 
+#ifndef SERIALGC
 void constMethodKlass::oop_follow_contents(ParCompactionManager* cm,
 					   oop obj) {
   assert (obj->is_constMethod(), "object must be constMethod");
@@ -103,6 +104,7 @@
   // Performance tweak: We skip iterating over the klass pointer since we 
   // know that Universe::constMethodKlassObj never moves.
 }
+#endif // SERIALGC
 
 int constMethodKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   assert (obj->is_constMethod(), "object must be constMethod");
@@ -150,6 +152,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 void constMethodKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_constMethod(), "should be constMethod");
 }
@@ -188,6 +191,7 @@
 
   return cm_oop->object_size();
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/constMethodKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/constMethodKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)constMethodKlass.hpp	1.14 07/05/05 17:05:59 JVM"
+#pragma ident "@(#)constMethodKlass.hpp	1.15 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -65,15 +65,8 @@
   void oop_follow_contents(oop obj);
   int  oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Allocation profiling support
   juint alloc_size() const              { return _alloc_size; }
--- a/hotspot/src/share/vm/oops/constantPoolKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/constantPoolKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)constantPoolKlass.cpp	1.104 07/05/05 17:05:59 JVM"
+#pragma ident "@(#)constantPoolKlass.cpp	1.105 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -94,6 +94,7 @@
   }
 }
 
+#ifndef SERIALGC
 void constantPoolKlass::oop_follow_contents(ParCompactionManager* cm,
 					    oop obj) {
   assert (obj->is_constantPool(), "obj must be constant pool");
@@ -118,6 +119,7 @@
     PSParallelCompact::mark_and_push(cm, cp->pool_holder_addr());
   }
 }
+#endif // SERIALGC
 
 
 int constantPoolKlass::oop_adjust_pointers(oop obj) {
@@ -206,6 +208,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 int constantPoolKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
   assert (obj->is_constantPool(), "obj must be constant pool");
   constantPoolOop cp = (constantPoolOop) obj;
@@ -265,6 +268,7 @@
 void constantPoolKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_constantPool(), "should be constant pool");
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/constantPoolKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/constantPoolKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)constantPoolKlass.hpp	1.50 07/05/05 17:06:00 JVM"
+#pragma ident "@(#)constantPoolKlass.hpp	1.51 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -53,15 +53,8 @@
   void oop_follow_contents(oop obj);
   int oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Iterators
   int oop_oop_iterate(oop obj, OopClosure* blk);
--- a/hotspot/src/share/vm/oops/cpCacheKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/cpCacheKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)cpCacheKlass.cpp	1.45 07/05/05 17:06:01 JVM"
+#pragma ident "@(#)cpCacheKlass.cpp	1.46 07/05/29 09:44:18 JVM"
 #endif
 /*
  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -68,6 +68,7 @@
   while (i-- > 0) cache->entry_at(i)->follow_contents();
 }
 
+#ifndef SERIALGC
 void constantPoolCacheKlass::oop_follow_contents(ParCompactionManager* cm,
 						 oop obj) {
   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
@@ -80,6 +81,7 @@
   int i = cache->length();
   while (i-- > 0) cache->entry_at(i)->follow_contents(cm);
 }
+#endif // SERIALGC
 
 
 int constantPoolCacheKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
@@ -131,6 +133,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 void constantPoolCacheKlass::oop_copy_contents(PSPromotionManager* pm, 
 					       oop obj) {
   assert(obj->is_constantPoolCache(), "should be constant pool");
@@ -175,6 +178,7 @@
   }
   return cache->object_size();
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/cpCacheKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/cpCacheKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)cpCacheKlass.hpp	1.32 07/05/05 17:06:01 JVM"
+#pragma ident "@(#)cpCacheKlass.hpp	1.33 07/05/29 09:44:19 JVM"
 #endif
 /*
  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -51,15 +51,8 @@
   void oop_follow_contents(oop obj);
   int oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Iterators
   int oop_oop_iterate(oop obj, OopClosure* blk);
--- a/hotspot/src/share/vm/oops/cpCacheOop.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/cpCacheOop.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)cpCacheOop.cpp	1.78 07/05/05 17:06:02 JVM"
+#pragma ident "@(#)cpCacheOop.cpp	1.79 07/05/29 09:44:19 JVM"
 #endif
 /*
  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -259,6 +259,7 @@
   }
 }
 
+#ifndef SERIALGC
 void ConstantPoolCacheEntry::follow_contents(ParCompactionManager* cm) {
   assert(in_words(size()) == 4, "check code below - may need adjustment");
   // field[1] is always oop or NULL
@@ -267,6 +268,7 @@
     PSParallelCompact::mark_and_push(cm, (oop*)&_f2);
   }
 }
+#endif // SERIALGC
 
 void ConstantPoolCacheEntry::adjust_pointers() {
   assert(in_words(size()) == 4, "check code below - may need adjustment");
@@ -277,6 +279,7 @@
   }
 }
 
+#ifndef SERIALGC
 void ConstantPoolCacheEntry::update_pointers() {
   assert(in_words(size()) == 4, "check code below - may need adjustment");
   // field[1] is always oop or NULL
@@ -295,6 +298,7 @@
     PSParallelCompact::adjust_pointer((oop*)&_f2, beg_addr, end_addr);
   }
 }
+#endif // SERIALGC
 
 // RedefineClasses() API support:
 // If this constantPoolCacheEntry refers to old_method then update it
--- a/hotspot/src/share/vm/oops/cpCacheOop.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/cpCacheOop.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)cpCacheOop.hpp	1.73 07/05/05 17:06:02 JVM"
+#pragma ident "@(#)cpCacheOop.hpp	1.74 07/05/29 09:44:19 JVM"
 #endif
 /*
  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -254,8 +254,11 @@
   void follow_contents();
   void adjust_pointers();
 
+#ifndef SERIALGC
   // Parallel Old
   void follow_contents(ParCompactionManager* cm);
+#endif // SERIALGC
+
   void update_pointers();
   void update_pointers(HeapWord* beg_addr, HeapWord* end_addr);
 
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)instanceKlass.cpp	1.321 07/05/17 15:55:40 JVM"
+#pragma ident "@(#)instanceKlass.cpp	1.322 07/05/29 09:44:19 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1206,6 +1206,7 @@
   }
 }
 
+#ifndef SERIALGC
 void instanceKlass::follow_static_fields(ParCompactionManager* cm) {
   oop* start = start_of_static_fields();
   oop* end   = start + static_oop_field_size();
@@ -1217,6 +1218,7 @@
     start++;
   }
 }
+#endif // SERIALGC
 
 
 void instanceKlass::adjust_static_fields() {
@@ -1228,6 +1230,7 @@
   }
 }
 
+#ifndef SERIALGC
 void instanceKlass::update_static_fields() {
   oop* const start = start_of_static_fields();
   oop* const beg_oop = start;
@@ -1246,6 +1249,7 @@
     PSParallelCompact::adjust_pointer(cur_oop);
   }
 }
+#endif // SERIALGC
 
 void instanceKlass::oop_follow_contents(oop obj) {
   assert (obj!=NULL, "can't follow the content of NULL object");
@@ -1267,6 +1271,7 @@
   }
 }
 
+#ifndef SERIALGC
 void instanceKlass::oop_follow_contents(ParCompactionManager* cm,
 					oop obj) {
   assert (obj!=NULL, "can't follow the content of NULL object");
@@ -1286,6 +1291,7 @@
     map++;
   }
 }
+#endif // SERIALGC
 
 #define invoke_closure_on(start, closure, nv_suffix) {                          \
   oop obj = *(start);                                                           \
@@ -1460,6 +1466,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 void instanceKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(!pm->depth_first(), "invariant");
   // Compute oopmap block range. The common case is nonstatic_oop_map_size == 1.
@@ -1589,6 +1596,7 @@
     start++;
   }
 }
+#endif // SERIALGC
 
 // This klass is alive but the implementor link is not followed/updated.
 // Subklass and sibling links are handled by Klass::follow_weak_klass_links
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)instanceKlass.hpp	1.198 07/05/05 17:06:03 JVM"
+#pragma ident "@(#)instanceKlass.hpp	1.199 07/05/29 09:44:20 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -595,22 +595,20 @@
     BoolObjectClosure* is_alive, OopClosure* keep_alive);
   void release_C_heap_structures();
 
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
+
+#ifndef SERIALGC
   // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
   void copy_static_fields(PSPromotionManager* pm);
   void push_static_fields(PSPromotionManager* pm);
 
   // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
   void follow_static_fields(ParCompactionManager* cm);
   void copy_static_fields(ParCompactionManager* cm);
   void update_static_fields();
   void update_static_fields(HeapWord* beg_addr, HeapWord* end_addr);
+#endif // SERIALGC
 
   // Naming
   char* signature_name() const;
--- a/hotspot/src/share/vm/oops/instanceKlassKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlassKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)instanceKlassKlass.cpp	1.155 07/05/05 17:06:02 JVM"
+#pragma ident "@(#)instanceKlassKlass.cpp	1.156 07/05/29 09:44:20 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -100,6 +100,7 @@
   iterate_c_heap_oops(ik, &MarkSweep::mark_and_push_closure);
 }
 
+#ifndef SERIALGC
 void instanceKlassKlass::oop_follow_contents(ParCompactionManager* cm,
 					     oop obj) {
   assert(obj->is_klass(),"must be a klass");
@@ -138,6 +139,7 @@
   PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
   iterate_c_heap_oops(ik, &mark_and_push_closure);
 }
+#endif // SERIALGC
 
 int instanceKlassKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   assert(obj->is_klass(),"must be a klass");
@@ -280,6 +282,7 @@
   return klassKlass::oop_adjust_pointers(obj);
 }
 
+#ifndef SERIALGC
 void instanceKlassKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(!pm->depth_first(), "invariant");
   instanceKlass* ik = instanceKlass::cast(klassOop(obj));
@@ -378,6 +381,7 @@
   klassKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
   return ik->object_size();
 }
+#endif // SERIALGC
 
 klassOop instanceKlassKlass::allocate_instance_klass(int vtable_len, int itable_len, int static_field_size, 
                                                      int nonstatic_oop_map_size, ReferenceType rt, TRAPS) {
--- a/hotspot/src/share/vm/oops/instanceKlassKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlassKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)instanceKlassKlass.hpp	1.53 07/05/05 17:06:02 JVM"
+#pragma ident "@(#)instanceKlassKlass.hpp	1.54 07/05/29 09:44:21 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -61,15 +61,8 @@
   int  oop_adjust_pointers(oop obj);
   bool oop_is_parsable(oop obj) const;
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Iterators
   int oop_oop_iterate(oop obj, OopClosure* blk);
--- a/hotspot/src/share/vm/oops/instanceRefKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/instanceRefKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)instanceRefKlass.cpp	1.89 07/05/05 17:06:01 JVM"
+#pragma ident "@(#)instanceRefKlass.cpp	1.90 07/05/29 09:44:20 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -69,6 +69,7 @@
   instanceKlass::oop_follow_contents(obj);
 }
 
+#ifndef SERIALGC
 void instanceRefKlass::oop_follow_contents(ParCompactionManager* cm,
 					   oop obj) {
   oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
@@ -110,6 +111,7 @@
   PSParallelCompact::mark_and_push(cm, next_addr);
   instanceKlass::oop_follow_contents(cm, obj);
 }
+#endif // SERIALGC
 
 
 int instanceRefKlass::oop_adjust_pointers(oop obj) {
@@ -211,6 +213,7 @@
 ALL_OOP_OOP_ITERATE_CLOSURES_3(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m)
 
 
+#ifndef SERIALGC
 void instanceRefKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(!pm->depth_first(), "invariant");
   oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
@@ -315,6 +318,7 @@
 
   return size_helper();
 }
+#endif // SERIALGC
 
 void instanceRefKlass::update_nonstatic_oop_maps(klassOop k) {
   // Clear the nonstatic oop-map entries corresponding to referent
--- a/hotspot/src/share/vm/oops/instanceRefKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/instanceRefKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)instanceRefKlass.hpp	1.61 07/05/05 17:06:04 JVM"
+#pragma ident "@(#)instanceRefKlass.hpp	1.62 07/05/29 09:44:21 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -60,15 +60,8 @@
   int  oop_adjust_pointers(oop obj);
   void oop_follow_contents(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   int oop_oop_iterate(oop obj, OopClosure* blk) {
     return oop_oop_iterate_v(obj, blk);
--- a/hotspot/src/share/vm/oops/klass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/klass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)klass.hpp	1.141 07/05/17 15:55:46 JVM"
+#pragma ident "@(#)klass.hpp	1.142 07/05/29 09:44:17 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -554,19 +554,9 @@
   // garbage collection support
   virtual void oop_follow_contents(oop obj) = 0;
   virtual int  oop_adjust_pointers(oop obj) = 0;
-  virtual void oop_copy_contents(PSPromotionManager* pm, oop obj) = 0;
-  virtual void oop_push_contents(PSPromotionManager* pm, oop obj) = 0;
 
-  // Parallel Old GC support
-  //
-  // The 2-arg version of oop_update_pointers is for objects that are known not
-  // to cross chunk boundaries.  The 4-arg version is for objects that do (or
-  // may) cross chunk boundaries; it updates only those oops that are in the
-  // region [beg_addr, end_addr).
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj) = 0;
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj) = 0;
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr) = 0;
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS_PV
 
  public:
   // type testing operations
--- a/hotspot/src/share/vm/oops/klassKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/klassKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)klassKlass.cpp	1.68 07/05/05 17:06:04 JVM"
+#pragma ident "@(#)klassKlass.cpp	1.69 07/05/29 09:44:21 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -62,6 +62,7 @@
   obj->follow_header();
 }
 
+#ifndef SERIALGC
 void klassKlass::oop_follow_contents(ParCompactionManager* cm,
 				     oop obj) {
   Klass* k = Klass::cast(klassOop(obj));
@@ -80,6 +81,7 @@
   PSParallelCompact::revisit_weak_klass_link(cm, k);
   obj->follow_header(cm);
 }
+#endif // SERIALGC
 
 int klassKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   // Get size before changing pointers
@@ -161,6 +163,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 void klassKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
 }
 
@@ -191,6 +194,7 @@
 
   return oop_size(obj);
 }
+#endif // SERIALGC
 
 
 #ifndef PRODUCT
--- a/hotspot/src/share/vm/oops/klassKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/klassKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)klassKlass.hpp	1.43 07/05/05 17:06:04 JVM"
+#pragma ident "@(#)klassKlass.hpp	1.44 07/05/29 09:44:21 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -59,15 +59,8 @@
   void oop_follow_contents(oop obj);
   int  oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Iterators
   int  oop_oop_iterate(oop obj, OopClosure* blk);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/oops/klassPS.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,60 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)klassPS.hpp	1.1 07/05/14 06:13:07 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+#ifndef KLASS_PS_H
+#define KLASS_PS_H
+
+  // Expands to Parallel Scavenge and Parallel Old declarations
+
+#ifndef SERIALGC
+#define PARALLEL_GC_DECLS \
+  virtual void oop_copy_contents(PSPromotionManager* pm, oop obj);          \
+  virtual void oop_push_contents(PSPromotionManager* pm, oop obj);          \
+  /* Parallel Old GC support                                                \
+                                                                            \
+   The 2-arg version of oop_update_pointers is for objects that are         \
+   known not to cross chunk boundaries.  The 4-arg version is for           \
+   objects that do (or may) cross chunk boundaries; it updates only those   \
+   oops that are in the region [beg_addr, end_addr).  */                    \
+  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);      \
+  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);      \
+  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,       \
+				   HeapWord* beg_addr, HeapWord* end_addr);
+
+// Pure virtual version for klass.hpp
+#define PARALLEL_GC_DECLS_PV \
+  virtual void oop_copy_contents(PSPromotionManager* pm, oop obj) = 0;      \
+  virtual void oop_push_contents(PSPromotionManager* pm, oop obj) = 0;      \
+  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj) = 0;  \
+  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj) = 0;  \
+  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,       \
+				   HeapWord* beg_addr, HeapWord* end_addr) = 0;
+#else  // SERIALGC
+#define PARALLEL_GC_DECLS
+#define PARALLEL_GC_DECLS_PV
+#endif // SERIALGC
+
+#endif // KLASS_PS_H
--- a/hotspot/src/share/vm/oops/klassVtable.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)klassVtable.cpp	1.144 07/05/05 17:06:04 JVM"
+#pragma ident "@(#)klassVtable.cpp	1.145 07/05/29 09:44:22 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -646,12 +646,14 @@
   }
 }
 
+#ifndef SERIALGC
 void klassVtable::oop_follow_contents(ParCompactionManager* cm) {
   int len = length();
   for (int i = 0; i < len; i++) {
     PSParallelCompact::mark_and_push(cm, adr_method_at(i));
   }
 }
+#endif // SERIALGC
 
 void klassVtable::oop_adjust_pointers() {
   int len = length();
@@ -660,6 +662,7 @@
   }
 }
 
+#ifndef SERIALGC
 void klassVtable::oop_update_pointers(ParCompactionManager* cm) {
   const int n = length();
   for (int i = 0; i < n; i++) {
@@ -685,6 +688,7 @@
     PSParallelCompact::adjust_pointer(cur_oop);
   }
 }
+#endif // SERIALGC
 
 // Iterators
 void klassVtable::oop_oop_iterate(OopClosure* blk) {
@@ -758,6 +762,7 @@
   }
 }
 
+#ifndef SERIALGC
 void klassItable::oop_follow_contents(ParCompactionManager* cm) {
   // offset table
   itableOffsetEntry* ioe = offset_entry(0);
@@ -773,6 +778,7 @@
     ime++;
   }
 }
+#endif // SERIALGC
 
 void klassItable::oop_adjust_pointers() {
   // offset table
@@ -790,6 +796,7 @@
   }
 }
 
+#ifndef SERIALGC
 void klassItable::oop_update_pointers(ParCompactionManager* cm) {
   // offset table
   itableOffsetEntry* ioe = offset_entry(0);
@@ -824,6 +831,7 @@
     ime++;
   }
 }
+#endif // SERIALGC
 
 // Iterators
 void klassItable::oop_oop_iterate(OopClosure* blk) {
--- a/hotspot/src/share/vm/oops/klassVtable.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/klassVtable.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)klassVtable.hpp	1.60 07/05/05 17:06:05 JVM"
+#pragma ident "@(#)klassVtable.hpp	1.61 07/05/29 09:44:22 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -89,11 +89,13 @@
   void oop_follow_contents();
   void oop_adjust_pointers();
 
+#ifndef SERIALGC
   // Parallel Old
   void oop_follow_contents(ParCompactionManager* cm);
   void oop_update_pointers(ParCompactionManager* cm);
   void oop_update_pointers(ParCompactionManager* cm,
 			   HeapWord* beg_addr, HeapWord* end_addr);
+#endif // SERIALGC
 
   // Iterators
   void oop_oop_iterate(OopClosure* blk);
@@ -281,11 +283,13 @@
   void oop_follow_contents();
   void oop_adjust_pointers();
 
+#ifndef SERIALGC
   // Parallel Old
   void oop_follow_contents(ParCompactionManager* cm);
   void oop_update_pointers(ParCompactionManager* cm);
   void oop_update_pointers(ParCompactionManager* cm,
 			   HeapWord* beg_addr, HeapWord* end_addr);
+#endif // SERIALGC
 
   // Iterators
   void oop_oop_iterate(OopClosure* blk);
--- a/hotspot/src/share/vm/oops/methodDataKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/methodDataKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)methodDataKlass.cpp	1.35 07/05/05 17:06:05 JVM"
+#pragma ident "@(#)methodDataKlass.cpp	1.36 07/05/29 09:44:22 JVM"
 #endif
 /*
  * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -81,6 +81,7 @@
   }
 }
 
+#ifndef SERIALGC
 void methodDataKlass::oop_follow_contents(ParCompactionManager* cm,
 					  oop obj) {
   assert (obj->is_methodData(), "object must be method data");
@@ -95,6 +96,7 @@
     data->follow_contents(cm);
   }
 }
+#endif // SERIALGC
 
 int methodDataKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   assert (obj->is_methodData(), "object must be method data");
@@ -154,6 +156,7 @@
 }
 
 
+#ifndef SERIALGC
 void methodDataKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert (obj->is_methodData(), "object must be method data");
   methodDataOop m = methodDataOop(obj);  
@@ -200,6 +203,7 @@
   }
   return m->object_size();
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/methodDataKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/methodDataKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)methodDataKlass.hpp	1.29 07/05/05 17:06:05 JVM"
+#pragma ident "@(#)methodDataKlass.hpp	1.30 07/05/29 09:44:23 JVM"
 #endif
 /*
  * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -63,15 +63,8 @@
   int  oop_adjust_pointers(oop obj);
   bool oop_is_parsable(oop obj) const;
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Allocation profiling support
   juint alloc_size() const { return _alloc_size; }
--- a/hotspot/src/share/vm/oops/methodDataOop.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/methodDataOop.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)methodDataOop.cpp	1.50 07/05/05 17:06:05 JVM"
+#pragma ident "@(#)methodDataOop.cpp	1.51 07/05/29 09:44:22 JVM"
 #endif
 /*
  * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -155,6 +155,7 @@
   }
 }
 
+#ifndef SERIALGC
 void ReceiverTypeData::follow_contents(ParCompactionManager* cm) {
   for (uint row = 0; row < row_limit(); row++) {
     if (receiver(row) != NULL) {
@@ -162,6 +163,7 @@
     }
   }
 }
+#endif // SERIALGC
 
 void ReceiverTypeData::oop_iterate(OopClosure* blk) {
   for (uint row = 0; row < row_limit(); row++) {
@@ -190,6 +192,7 @@
   }
 }
 
+#ifndef SERIALGC
 void ReceiverTypeData::update_pointers() {
   for (uint row = 0; row < row_limit(); row++) {
     if (receiver_unchecked(row) != NULL) {
@@ -208,6 +211,7 @@
     }
   }
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 void ReceiverTypeData::print_receiver_data_on(outputStream* st) {
--- a/hotspot/src/share/vm/oops/methodDataOop.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/methodDataOop.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)methodDataOop.hpp	1.52 07/05/05 17:06:06 JVM"
+#pragma ident "@(#)methodDataOop.hpp	1.53 07/05/29 09:44:23 JVM"
 #endif
 /*
  * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -424,10 +424,12 @@
   virtual void oop_iterate_m(OopClosure* blk, MemRegion mr) {}
   virtual void adjust_pointers() {}
 
+#ifndef SERIALGC
   // Parallel old support
   virtual void follow_contents(ParCompactionManager* cm) {}
   virtual void update_pointers() {}
   virtual void update_pointers(HeapWord* beg_addr, HeapWord* end_addr) {}
+#endif // SERIALGC
 
   // CI translation: ProfileData can represent both MethodDataOop data 
   // as well as CIMethodData data. This function is provided for translating 
@@ -672,10 +674,12 @@
   virtual void oop_iterate_m(OopClosure* blk, MemRegion mr);
   virtual void adjust_pointers();
 
+#ifndef SERIALGC
   // Parallel old support
   virtual void follow_contents(ParCompactionManager* cm);
   virtual void update_pointers();
   virtual void update_pointers(HeapWord* beg_addr, HeapWord* end_addr);
+#endif // SERIALGC
 
   oop* adr_receiver(uint row) {
     return adr_oop_at(receiver_cell_index(row));
--- a/hotspot/src/share/vm/oops/methodKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/methodKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)methodKlass.cpp	1.119 07/05/17 15:56:56 JVM"
+#pragma ident "@(#)methodKlass.cpp	1.120 07/05/29 09:44:23 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -115,6 +115,7 @@
   }
 }
 
+#ifndef SERIALGC
 void methodKlass::oop_follow_contents(ParCompactionManager* cm,
 				      oop obj) {
   assert (obj->is_method(), "object must be method");
@@ -129,6 +130,7 @@
   }
 #endif // COMPILER2
 }
+#endif // SERIALGC
 
 int methodKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   assert (obj->is_method(), "object must be method");
@@ -184,6 +186,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 void methodKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_method(), "should be method");
 }
@@ -225,6 +228,7 @@
 #endif // COMPILER2
   return m->object_size();
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/methodKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/methodKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)methodKlass.hpp	1.48 07/05/05 17:06:05 JVM"
+#pragma ident "@(#)methodKlass.hpp	1.49 07/05/29 09:44:23 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -60,15 +60,8 @@
   int  oop_adjust_pointers(oop obj);
   bool oop_is_parsable(oop obj) const;
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Allocation profiling support
   juint alloc_size() const              { return _alloc_size; }
--- a/hotspot/src/share/vm/oops/methodOop.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/methodOop.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)methodOop.cpp	1.311 07/05/17 15:57:00 JVM"
+#pragma ident "@(#)methodOop.cpp	1.312 07/06/08 15:21:45 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -433,11 +433,11 @@
 bool methodOopDesc::is_accessor() const {
   if (code_size() != 5) return false;
   if (size_of_parameters() != 1) return false;
-  if (Bytecodes::java_code(Bytecodes::cast(code_base()[0])) != Bytecodes::_aload_0 ) return false;
-  if (Bytecodes::java_code(Bytecodes::cast(code_base()[1])) != Bytecodes::_getfield) return false;
-  Bytecodes::Code ret_bc = Bytecodes::java_code(Bytecodes::cast(code_base()[4]));
-  if (Bytecodes::java_code(Bytecodes::cast(code_base()[4])) != Bytecodes::_areturn &&
-      Bytecodes::java_code(Bytecodes::cast(code_base()[4])) != Bytecodes::_ireturn ) return false;
+  if (Bytecodes::java_code_at(code_base()+0) != Bytecodes::_aload_0 ) return false;
+  if (Bytecodes::java_code_at(code_base()+1) != Bytecodes::_getfield) return false;
+  Bytecodes::Code ret_bc = Bytecodes::java_code_at(code_base()+4);
+  if (Bytecodes::java_code_at(code_base()+4) != Bytecodes::_areturn &&
+      Bytecodes::java_code_at(code_base()+4) != Bytecodes::_ireturn ) return false;
   return true;
 }
 
--- a/hotspot/src/share/vm/oops/objArrayKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)objArrayKlass.cpp	1.146 07/05/17 15:57:07 JVM"
+#pragma ident "@(#)objArrayKlass.cpp	1.147 07/05/29 09:44:23 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -265,6 +265,7 @@
   }  
 }
 
+#ifndef SERIALGC
 void objArrayKlass::oop_follow_contents(ParCompactionManager* cm,
 					oop obj) {
   assert (obj->is_array(), "obj must be array");
@@ -279,6 +280,7 @@
     base++;
   }  
 }
+#endif // SERIALGC
 
 #define invoke_closure_on(base, closure, nv_suffix) {                                  \
   if (*(base) != NULL) {                                                               \
@@ -378,6 +380,7 @@
   return size;
 }
 
+#ifndef SERIALGC
 void objArrayKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(!pm->depth_first(), "invariant");
   assert(obj->is_objArray(), "obj must be obj array");
@@ -442,6 +445,7 @@
   }
   return a->object_size();
 }
+#endif // SERIALGC
 
 // JVM support
 
--- a/hotspot/src/share/vm/oops/objArrayKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/objArrayKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)objArrayKlass.hpp	1.86 07/05/05 17:06:06 JVM"
+#pragma ident "@(#)objArrayKlass.hpp	1.87 07/05/29 09:44:23 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -91,15 +91,8 @@
   void oop_follow_contents(oop obj);
   int  oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Iterators
   int oop_oop_iterate(oop obj, OopClosure* blk) {
--- a/hotspot/src/share/vm/oops/objArrayKlassKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/objArrayKlassKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)objArrayKlassKlass.cpp	1.78 07/05/05 17:06:06 JVM"
+#pragma ident "@(#)objArrayKlassKlass.cpp	1.79 07/05/29 09:44:24 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -176,6 +176,7 @@
   arrayKlassKlass::oop_follow_contents(obj);
 }
 
+#ifndef SERIALGC
 void objArrayKlassKlass::oop_follow_contents(ParCompactionManager* cm,
 					     oop obj) {
   assert(obj->is_klass(), "must be klass");
@@ -187,6 +188,7 @@
 
   arrayKlassKlass::oop_follow_contents(cm, obj);
 }
+#endif // SERIALGC
 
 
 int objArrayKlassKlass::oop_adjust_pointers(oop obj) {
@@ -229,6 +231,7 @@
   return arrayKlassKlass::oop_oop_iterate(obj, blk);
 }
 
+#ifndef SERIALGC
 void objArrayKlassKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->blueprint()->oop_is_objArrayKlass(),"must be an obj array klass");
 }
@@ -263,6 +266,7 @@
 
   return arrayKlassKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/oops/objArrayKlassKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/objArrayKlassKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)objArrayKlassKlass.hpp	1.47 07/05/05 17:06:07 JVM"
+#pragma ident "@(#)objArrayKlassKlass.hpp	1.48 07/05/29 09:44:24 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -56,15 +56,8 @@
   void oop_follow_contents(oop obj);
   int oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Iterators
   int oop_oop_iterate(oop obj, OopClosure* blk);
--- a/hotspot/src/share/vm/oops/oop.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/oop.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)oop.cpp	1.98 07/05/05 17:06:05 JVM"
+#pragma ident "@(#)oop.cpp	1.99 07/05/29 09:44:21 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -133,24 +133,3 @@
 }
 
 VerifyOopClosure VerifyOopClosure::verify_oop;
-
-oop oopDesc::forward_to_atomic(oop p) {
-  assert(ParNewGeneration::is_legal_forward_ptr(p),
-	 "illegal forwarding pointer value.");
-  markOop oldMark = mark();
-  markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
-  markOop curMark;
-
-  assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
-  assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
-
-  while (!is_forwarded()) {
-    curMark = (markOop)Atomic::cmpxchg_ptr(forwardPtrMark, &_mark, oldMark);
-    if (curMark == oldMark) {
-      assert(is_forwarded(), "the CAS should have succeeded.");
-      return NULL;
-    }
-    oldMark = curMark;
-  }
-  return forwardee();
-}
--- a/hotspot/src/share/vm/oops/oop.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/oop.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)oop.hpp	1.115 07/05/05 17:06:06 JVM"
+#pragma ident "@(#)oop.hpp	1.116 07/05/29 09:44:21 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -234,6 +234,7 @@
   void follow_contents();
   void follow_header();
 
+#ifndef SERIALGC
   // Parallel Scavenge
   void copy_contents(PSPromotionManager* pm);
   void push_contents(PSPromotionManager* pm);
@@ -250,6 +251,7 @@
 
   void follow_contents(ParCompactionManager* cm);
   void follow_header(ParCompactionManager* cm);
+#endif // SERIALGC
 
   bool is_perm() const;
   bool is_perm_and_alloced() const;
@@ -263,11 +265,13 @@
   void forward_to(oop p);
   bool cas_forward_to(oop p, markOop compare);
 
+#ifndef SERIALGC
   // Like "forward_to", but inserts the forwarding pointer atomically.
   // Exactly one thread succeeds in inserting the forwarding pointer, and
   // this call returns "NULL" for that thread; any other thread has the
   // value of the forwarding pointer returned and does not modify "this".
   oop forward_to_atomic(oop p);
+#endif // SERIALGC
 
   oop forwardee() const;
 
@@ -280,9 +284,11 @@
   int adjust_pointers();
   void adjust_header();
 
+#ifndef SERIALGC
   // Parallel old
   void update_header();
   void update_header(HeapWord* beg_addr, HeapWord* end_addr);
+#endif // SERIALGC
 
   // mark-sweep support
   void follow_body(int begin, int end);
--- a/hotspot/src/share/vm/oops/oop.inline.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/oop.inline.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)oop.inline.hpp	1.139 07/05/05 17:06:06 JVM"
+#pragma ident "@(#)oop.inline.hpp	1.141 07/06/12 15:40:38 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -186,12 +186,26 @@
       s = (int)((size_t)round_to(size_in_bytes, MinObjAlignmentInBytes) / 
 	HeapWordSize);
 
-      // Temporarily weaken this assert until CR 6275407 can
-      // be dealt with more cleanly; this is too strong for when
-      // ParNew runs with promotion labs.
+      // UseParNewGC can change the length field of an "old copy" of an object
+      // array in the young gen so it indicates the stealable portion of
+      // an already copied array. This will cause the first disjunct below
+      // to fail if the sizes are computed across such a concurrent change.
+      // UseParNewGC also runs with promotion labs (which look like int
+      // filler arrays) which are subject to changing their declared size
+      // when finally retiring a PLAB; this also can cause the first disjunct
+      // to fail for another worker thread that is concurrently walking the block
+      // offset table. Both these invariant failures are benign for their
+      // current uses; we relax the assertion checking to cover these two cases below:
+      //     is_objArray() && is_forwarded()   // covers first scenario above
+      //  || is_typeArray()                    // covers second scenario above
+      // If and when UseParallelGC uses the same obj array oop stealing/chunking
+      // technique, or when G1 is integrated (and currently uses this array chunking
+      // technique) we will need to suitably modify the assertion.
       assert((s == klass->oop_size(this)) ||
-             (UseParNewGC && !UseConcMarkSweepGC &&
-              Universe::heap()->is_gc_active()), "wrong array object size");
+             ((UseParNewGC && Universe::heap()->is_gc_active()) &&
+              (is_typeArray() ||
+               (is_objArray() && is_forwarded()))),
+             "wrong array object size");
     } else {
       // Must be zero, so bite the bullet and take the virtual call.
       s = klass->oop_size(this);
@@ -341,11 +355,6 @@
   blueprint()->oop_follow_contents(this);
 }
 
-// Used by parallel old GC.
-
-inline void oopDesc::follow_header(ParCompactionManager* cm) {
-  PSParallelCompact::mark_and_push(cm, (oop*)&_klass);
-}
 
 // Used by scavengers
 
@@ -447,14 +456,6 @@
   MarkSweep::adjust_pointer((oop*)&_klass);
 }
 
-inline void oopDesc::update_header() {
-  PSParallelCompact::adjust_pointer((oop*)&_klass);
-}
-
-inline void oopDesc::update_header(HeapWord* beg_addr, HeapWord* end_addr) {
-  PSParallelCompact::adjust_pointer((oop*)&_klass, beg_addr, end_addr);
-}
-
 #define OOP_ITERATE_DEFN(OopClosureType, nv_suffix)                        \
                                                                            \
 inline int oopDesc::oop_iterate(OopClosureType* blk) {                     \
--- a/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)oop.pcgc.inline.hpp	1.15 07/05/05 17:06:07 JVM"
+#pragma ident "@(#)oop.pcgc.inline.hpp	1.16 07/05/29 09:44:24 JVM"
 #endif
 /*
  * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -89,3 +89,37 @@
   blueprint()->oop_follow_contents(cm, this);
 }
 
+// Used by parallel old GC.
+
+inline void oopDesc::follow_header(ParCompactionManager* cm) {
+  PSParallelCompact::mark_and_push(cm, (oop*)&_klass);
+}
+
+inline oop oopDesc::forward_to_atomic(oop p) {
+  assert(ParNewGeneration::is_legal_forward_ptr(p),
+	 "illegal forwarding pointer value.");
+  markOop oldMark = mark();
+  markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
+  markOop curMark;
+
+  assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
+  assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
+
+  while (!is_forwarded()) {
+    curMark = (markOop)Atomic::cmpxchg_ptr(forwardPtrMark, &_mark, oldMark);
+    if (curMark == oldMark) {
+      assert(is_forwarded(), "the CAS should have succeeded.");
+      return NULL;
+    }
+    oldMark = curMark;
+  }
+  return forwardee();
+}
+
+inline void oopDesc::update_header() {
+  PSParallelCompact::adjust_pointer((oop*)&_klass);
+}
+
+inline void oopDesc::update_header(HeapWord* beg_addr, HeapWord* end_addr) {
+  PSParallelCompact::adjust_pointer((oop*)&_klass, beg_addr, end_addr);
+}
--- a/hotspot/src/share/vm/oops/symbolKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/symbolKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)symbolKlass.cpp	1.65 07/05/05 17:06:08 JVM"
+#pragma ident "@(#)symbolKlass.cpp	1.66 07/05/29 09:44:24 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -141,12 +141,14 @@
   // Note: do not follow next link here (see SymbolTable::follow_contents)
 }
 
+#ifndef SERIALGC
 void symbolKlass::oop_follow_contents(ParCompactionManager* cm, oop obj) {
   assert (obj->is_symbol(), "object must be symbol");
   // Performance tweak: We skip iterating over the klass pointer since we 
   // know that Universe::symbolKlassObj never moves.
   // Note: do not follow next link here (see SymbolTable::follow_contents)
 }
+#endif // SERIALGC
 
 int symbolKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   assert(obj->is_symbol(), "object must be symbol");
@@ -184,6 +186,7 @@
 }
 
 
+#ifndef SERIALGC
 void symbolKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_symbol(), "should be symbol");
 }
@@ -202,6 +205,7 @@
   assert(obj->is_symbol(), "should be symbol");
   return symbolOop(obj)->object_size();
 }
+#endif // SERIALGC
 
 #ifndef PRODUCT
 // Printing
--- a/hotspot/src/share/vm/oops/symbolKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/symbolKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)symbolKlass.hpp	1.41 07/05/05 17:06:07 JVM"
+#pragma ident "@(#)symbolKlass.hpp	1.42 07/05/29 09:44:24 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -57,15 +57,8 @@
   int  oop_adjust_pointers(oop obj);
   bool oop_is_parsable(oop obj) const;
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
   // Allocation profiling support
   juint alloc_size() const              { return _alloc_size; }
--- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)typeArrayKlass.cpp	1.124 07/05/17 15:57:12 JVM"
+#pragma ident "@(#)typeArrayKlass.cpp	1.125 07/05/29 09:44:24 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -196,11 +196,13 @@
   // know that Universe::typeArrayKlass never moves.
 }
 
+#ifndef SERIALGC
 void typeArrayKlass::oop_follow_contents(ParCompactionManager* cm, oop obj) {
   assert(obj->is_typeArray(),"must be a type array");
   // Performance tweak: We skip iterating over the klass pointer since we 
   // know that Universe::typeArrayKlass never moves.
 }
+#endif // SERIALGC
 
 int typeArrayKlass::oop_adjust_pointers(oop obj) {
   assert(obj->is_typeArray(),"must be a type array");
@@ -226,6 +228,7 @@
   return t->object_size();
 }
 
+#ifndef SERIALGC
 void typeArrayKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_typeArray(),"must be a type array");
 }
@@ -246,6 +249,7 @@
   assert(obj->is_typeArray(),"must be a type array");
   return typeArrayOop(obj)->object_size();
 }
+#endif // SERIALGC
 
 void typeArrayKlass::initialize(TRAPS) {
   // Nothing to do. Having this function is handy since objArrayKlasses can be
--- a/hotspot/src/share/vm/oops/typeArrayKlass.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)typeArrayKlass.hpp	1.68 07/05/05 17:06:08 JVM"
+#pragma ident "@(#)typeArrayKlass.hpp	1.69 07/05/29 09:44:25 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -65,15 +65,8 @@
   void oop_follow_contents(oop obj);
   int  oop_adjust_pointers(oop obj);
 
-  // Parallel Scavenge
-  void oop_copy_contents(PSPromotionManager* pm, oop obj);
-  void oop_push_contents(PSPromotionManager* pm, oop obj);
-
-  // Parallel Old
-  virtual void oop_follow_contents(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj);
-  virtual int  oop_update_pointers(ParCompactionManager* cm, oop obj,
-				   HeapWord* beg_addr, HeapWord* end_addr);
+  // Parallel Scavenge and Parallel Old
+  PARALLEL_GC_DECLS
 
  protected:
   // Find n'th dimensional array
--- a/hotspot/src/share/vm/opto/loopTransform.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)loopTransform.cpp	1.115 07/05/05 17:06:20 JVM"
+#pragma ident "@(#)loopTransform.cpp	1.116 07/06/01 11:35:03 JVM"
 #endif
 /*
  * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -177,9 +177,8 @@
   if (neg_inv1) {
     Node *zero = phase->_igvn.intcon(0); 
     phase->set_ctrl(zero, phase->C->root());
-    Node* minus_inv1 = new (phase->C, 3) SubINode(zero, inv1);
-    n_inv1 = phase->_igvn.register_new_node_with_optimizer(minus_inv1);
-    phase->set_ctrl(n_inv1, inv1_c);
+    n_inv1 = new (phase->C, 3) SubINode(zero, inv1);
+    phase->register_new_node(n_inv1, inv1_c);
   } else {
     n_inv1 = inv1;
   }
@@ -189,8 +188,7 @@
   } else {
     inv = new (phase->C, 3) AddINode(n_inv1, inv2);
   }
-  inv = phase->_igvn.register_new_node_with_optimizer(inv);
-  phase->set_early_ctrl(inv);
+  phase->register_new_node(inv, phase->get_early_ctrl(inv));
 
   Node* addx;
   if (neg_x) {
@@ -198,8 +196,7 @@
   } else {
     addx = new (phase->C, 3) AddINode(x, inv);
   }
-  Node* x_c = phase->get_ctrl(x);
-  phase->register_node(addx, this, x_c, phase->dom_depth(x_c));
+  phase->register_new_node(addx, phase->get_ctrl(x));
   phase->_igvn.hash_delete(n1);
   phase->_igvn.subsume_node(n1, addx);
   return addx;
--- a/hotspot/src/share/vm/opto/loopopts.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/opto/loopopts.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)loopopts.cpp	1.218 07/05/05 17:06:20 JVM"
+#pragma ident "@(#)loopopts.cpp	1.219 07/06/06 06:35:01 JVM"
 #endif
 /*
  * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -2518,6 +2518,27 @@
 
   // Step 3b: retarget control
 
+  // Redirect control to the new loop head if a cloned node in
+  // the not_peeled region has control that points into the peeled region.
+  // This necessary because the cloned peeled region will be outside
+  // the loop.
+  //                            from    to
+  //          cloned-peeled    <---+
+  //    new_head_clone:            |    <--+
+  //          cloned-not_peeled  in(0)    in(0)
+  //          orig-peeled
+
+  for(i = 0; i < loop->_body.size(); i++ ) {
+    Node *n = loop->_body.at(i);
+    if (!n->is_CFG()           && n->in(0) != NULL        &&
+        not_peel.test(n->_idx) && peel.test(n->in(0)->_idx)) {
+      Node* n_clone = old_new[n->_idx];
+      _igvn.hash_delete(n_clone);
+      n_clone->set_req(0, new_head_clone);
+      _igvn._worklist.push(n_clone);
+    }
+  }
+
   // Backedge of the surviving new_head (the clone) is original last_peel
   _igvn.hash_delete(new_head_clone);
   new_head_clone->set_req(LoopNode::LoopBackControl, last_peel);
--- a/hotspot/src/share/vm/opto/node.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/opto/node.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)node.cpp	1.226 07/05/17 17:44:21 JVM"
+#pragma ident "@(#)node.cpp	1.227 07/05/21 15:45:56 JVM"
 #endif
 /*
  * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1465,51 +1465,71 @@
 }
 
 //------------------------------dump_nodes-------------------------------------
+
+// Helper class  for dump_nodes. Wraps an old and new VectorSet.
+class OldNewVectorSet : public StackObj {
+   Arena*    _node_arena;
+   VectorSet _old_vset, _new_vset;
+   VectorSet* select(Node* n) {
+     return _node_arena->contains(n) ? &_new_vset : &_old_vset;
+   }
+  public:
+  OldNewVectorSet(Arena* node_arena, ResourceArea* area) :
+     _node_arena(node_arena),
+     _old_vset(area), _new_vset(area) {}
+
+  void set(Node* n)      { select(n)->set(n->_idx); }
+  bool test_set(Node* n) { return select(n)->test_set(n->_idx) != 0; }
+  bool test(Node* n)     { return select(n)->test(n->_idx) != 0; }
+  void del(Node* n)      { (*select(n)) >>= n->_idx; }
+};
+
+
 static void dump_nodes(const Node* start, int d, bool only_ctrl) {
-  if (NotANode(start)) return;
-  ResourceMark rm;
+  Node* s = (Node*)start; // remove const
+  if (NotANode(s)) return;
+
   Compile* C = Compile::current();
-  Arena* arena = Thread::current()->resource_area();
-  Node_Stack stack(arena, MIN2((uint)ABS(d), C->unique() >> 1));
-  VectorSet on_stack(arena);
-  // visited sets for old and new spaces
-  VectorSet old_space(arena), new_space(arena);
+  ResourceArea *area = Thread::current()->resource_area();
+  Node_Stack      stack(area, MIN2((uint)ABS(d), C->unique() >> 1));
+  OldNewVectorSet visited(C->node_arena(), area);
+  OldNewVectorSet on_stack(C->node_arena(), area);
 
-  VectorSet *v = arena->contains(start) ? &new_space : &old_space;
-  v->set(start->_idx);
-  stack.push((Node*)start, 0);
-  on_stack.set(start->_idx);
-  if (d < 0) start->dump();
+  visited.set(s);
+  on_stack.set(s);
+  stack.push(s, 0);
+  if (d < 0) s->dump();
 
   // Do a depth first walk over edges
   while (stack.is_nonempty()) {
-    Node* m   = stack.node();
+    Node* tp  = stack.node();
     uint  idx = stack.index();
-    uint  limit = d > 0 ? m->len() : m->outcnt();
-    if (idx < limit) {
+    uint  limit = d > 0 ? tp->len() : tp->outcnt();
+    if (idx >= limit) {
+      // no more arcs to visit
+      if (d > 0) tp->dump();
+      on_stack.del(tp);
+      stack.pop();
+    } else {
+      // process the "idx"th arc
       stack.set_index(idx + 1);
-      Node* n = NULL;
-      if (d > 0) {
-        n = m->in(idx);
-      } else {
-        n = m->raw_out(idx);
-      }
+      Node* n = d > 0 ? tp->in(idx) : tp->raw_out(idx);
+
       if (NotANode(n))  continue;
       // do not recurse through top or the root (would reach unrelated stuff)
       if (n->is_Root() || n->is_top())  continue;
       if (only_ctrl && !n->is_CFG()) continue;
-      VectorSet *v = arena->contains(n) ? &new_space : &old_space;
-      if (!v->test_set(n->_idx)) {  // forward arc
+
+      if (!visited.test_set(n)) {  // forward arc
         // Limit depth
         if (stack.size() < (uint)ABS(d)) {
           if (d < 0) n->dump();
           stack.push(n, 0);
-          on_stack.set(n->_idx);
+          on_stack.set(n);
         }
       } else {  // back or cross arc
-        if (on_stack.test(n->_idx)) {  // back arc
-
-          // print it if there are no phis or regions in the mix
+        if (on_stack.test(n)) {  // back arc
+          // print loop if there are no phis or regions in the mix
           bool found_loop_breaker = false;
           int k;
           for (k = stack.size() - 1; k >= 0; k--) {
@@ -1535,10 +1555,6 @@
           }
         }
       }
-    } else {
-      if (d > 0) m->dump();
-      on_stack >>= m->_idx;
-      stack.pop();
     }
   }
 }
--- a/hotspot/src/share/vm/opto/parseHelper.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/opto/parseHelper.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)parseHelper.cpp	1.195 07/05/17 16:00:23 JVM"
+#pragma ident "@(#)parseHelper.cpp	1.196 07/05/23 17:37:28 JVM"
 #endif
 /*
  * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -47,19 +47,10 @@
 
   // For some reason, this call reads only raw memory.
   const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
-  Node* raw_mem = memory(raw_adr_type);
-  Node* all_mem = reset_memory();
-  map()->set_memory(raw_mem);  // force make_runtime_call to take narrow memory
-
   make_runtime_call(RC_LEAF | RC_NARROW_MEM,
                     call_type, call_address, 
                     call_name, raw_adr_type,
                     thread, method_node);
-
-  // Rewhack the memory effects.
-  Node* call_mem = memory(raw_adr_type);
-  set_all_memory(all_mem);
-  set_memory(call_mem, raw_adr_type);
 }
 
 
--- a/hotspot/src/share/vm/prims/jni.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jni.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)jni.cpp	1.433 07/05/17 16:02:44 JVM"
+#pragma ident "@(#)jni.cpp	1.434 07/05/29 10:01:44 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -3363,9 +3363,10 @@
   thread->record_stack_base_and_size();
   thread->initialize_thread_local_storage();
 
-  if (!os::create_attached_thread(thread))
-     return JNI_ERR;
-
+  if (!os::create_attached_thread(thread)) {
+    delete thread;
+    return JNI_ERR;
+  }
   thread->initialize_tlab();
 
   // Crucial that we do not have a safepoint check for this thread, since it has
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)jvmtiEnv.cpp	1.161 07/05/17 16:03:46 JVM"
+#pragma ident "@(#)jvmtiEnv.cpp	1.162 07/05/23 10:53:40 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -59,7 +59,8 @@
   VM_JNIFunctionTableCopier(const struct JNINativeInterface_ *func_tbl) {
     _function_table = func_tbl;
   };
-  const char* name() const       { return "VM_JNIFunctionTableCopier";};
+
+  VMOp_Type type() const { return VMOp_JNIFunctionTableCopier; }
   void doit() {
     copy_jni_function_table(_function_table);
   };
--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)jvmtiEnvBase.hpp	1.67 07/05/17 16:05:01 JVM"
+#pragma ident "@(#)jvmtiEnvBase.hpp	1.68 07/05/23 10:53:43 JVM"
 #endif
 /*
  * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -331,11 +331,11 @@
     _owned_monitors_list = owned_monitor_list;
     _result = JVMTI_ERROR_NONE;
   }
+  VMOp_Type type() const { return VMOp_GetOwnedMonitorInfo; }
   void doit() {
     ((JvmtiEnvBase *)_env)->get_owned_monitors(_calling_thread, _java_thread,
                                                          _owned_monitors_list);
   }
-  const char* name() const { return "get owned monitor stack depth info"; }          
   jvmtiError result() { return _result; }
 };
 
@@ -356,11 +356,12 @@
     _calling_thread = calling_thread;
     _info_ptr = info_ptr;
   }
+  VMOp_Type type() const { return VMOp_GetObjectMonitorUsage; }
   jvmtiError result() { return _result; }
   void doit() {
     _result = ((JvmtiEnvBase*) _env)->get_object_monitor_usage(_calling_thread, _object, _info_ptr);
   }
-  const char* name() const { return "get object monitor usage"; }      
+
 };
 
 // VM operation to get current contended monitor.
@@ -379,11 +380,11 @@
     _java_thread = java_thread;
     _owned_monitor_ptr = mon_ptr;
   }
+  VMOp_Type type() const { return VMOp_GetCurrentContendedMonitor; }
   jvmtiError result() { return _result; }
   void doit() {
     _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr);
   }
-  const char* name() const { return "get current contended monitor"; }      
 };
 
 // VM operation to get stack trace at safepoint.
@@ -409,12 +410,12 @@
     _count_ptr = count_ptr;
   }
   jvmtiError result() { return _result; }
+  VMOp_Type type() const { return VMOp_GetStackTrace; }
   void doit() {
     _result = ((JvmtiEnvBase *)_env)->get_stack_trace(_java_thread,
                                                       _start_depth, _max_count,
                                                       _frame_buffer, _count_ptr);
   }
-  const char* name() const { return "get stack trace"; }          
 };
 
 // forward declaration
@@ -448,10 +449,9 @@
     _head = NULL;
     _result = JVMTI_ERROR_NONE;
   }
+  VMOp_Type type() const             { return VMOp_GetMultipleStackTraces; }
   jvmtiStackInfo *stack_info()       { return _stack_info; }
   jvmtiError result()                { return _result; }
-
-  const char* name() const { return "abstract get multiple stack traces"; }          
 };
 
 
@@ -467,10 +467,9 @@
       : VM_GetMultipleStackTraces(env, max_frame_count) {
     _calling_thread = calling_thread;
   }
+  VMOp_Type type() const          { return VMOp_GetAllStackTraces; }
   void doit();
   jint final_thread_count()       { return _final_thread_count; }
-
-  const char* name() const        { return "get all stack traces"; }          
 };
 
 // VM operation to get stack trace at safepoint.
@@ -485,9 +484,8 @@
     _thread_count = thread_count;
     _thread_list = thread_list;
   }
+  VMOp_Type type() const { return VMOp_GetThreadListStackTraces; }
   void doit();
-
-  const char* name() const        { return "get thread list stack traces"; }          
 };
 
 
@@ -505,12 +503,11 @@
     _state = state;
     _count_ptr = count_ptr;
   }
-
-  jvmtiError result() { return _result; }
+  VMOp_Type type() const { return VMOp_GetFrameCount; }
+  jvmtiError result()    { return _result; }
   void doit() {
     _result = ((JvmtiEnvBase*)_env)->get_frame_count(_state, _count_ptr);
   }
-  const char* name() const { return "get frame count"; }          
 };
 
 // VM operation to frame location at safepoint.
@@ -532,13 +529,12 @@
     _method_ptr = method_ptr;
     _location_ptr = location_ptr;
   }
-
-  jvmtiError result() { return _result; }
+  VMOp_Type type() const { return VMOp_GetFrameLocation; }
+  jvmtiError result()    { return _result; }
   void doit() {
     _result = ((JvmtiEnvBase*)_env)->get_frame_location(_java_thread, _depth,
                                                         _method_ptr, _location_ptr);
   }
-  const char* name() const { return "get frame location"; }          
 };
 
 
--- a/hotspot/src/share/vm/prims/jvmtiEnvThreadState.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEnvThreadState.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)jvmtiEnvThreadState.cpp	1.22 07/05/05 17:06:37 JVM"
+#pragma ident "@(#)jvmtiEnvThreadState.cpp	1.23 07/05/23 10:53:46 JVM"
 #endif
 /*
  * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -252,23 +252,23 @@
    int _bci;
 
  public:
-   VM_GetCurrentLocation(JavaThread *thread) {
+  VM_GetCurrentLocation(JavaThread *thread) {
      _thread = thread;
    }
-   void doit() {
-     ResourceMark rmark; // _thread != Thread::current()
-     RegisterMap rm(_thread, false);
-     javaVFrame* vf = _thread->last_java_vframe(&rm);
-     assert(vf != NULL, "must have last java frame");
-     methodOop method = vf->method();
-     _method_id = method->jmethod_id();
-     _bci = vf->bci();
-   }
-   void get_current_location(jmethodID *method_id, int *bci) {
-     *method_id = _method_id;
-     *bci = _bci;
-   }
-   const char* name() const { return "get current location"; }
+  VMOp_Type type() const { return VMOp_GetCurrentLocation; }
+  void doit() {
+    ResourceMark rmark; // _thread != Thread::current()
+    RegisterMap rm(_thread, false);
+    javaVFrame* vf = _thread->last_java_vframe(&rm);
+    assert(vf != NULL, "must have last java frame");
+    methodOop method = vf->method();
+    _method_id = method->jmethod_id();
+    _bci = vf->bci();
+  }
+  void get_current_location(jmethodID *method_id, int *bci) {
+    *method_id = _method_id;
+    *bci = _bci;
+  }
 };
 
 void JvmtiEnvThreadState::reset_current_location(jvmtiEvent event_type, bool enabled) {
--- a/hotspot/src/share/vm/prims/jvmtiEventController.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEventController.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)jvmtiEventController.cpp	1.55 07/05/05 17:06:37 JVM"
+#pragma ident "@(#)jvmtiEventController.cpp	1.56 07/05/23 10:53:48 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -180,7 +180,7 @@
   VM_EnterInterpOnlyMode(JvmtiThreadState *state);
   
   bool allow_nested_vm_operations() const        { return true; }
-  const char* name() const                       { return "JVMTI enter interp_only_mode"; }
+  VMOp_Type type() const { return VMOp_EnterInterpOnlyMode; }
   void doit();
 
   // to do: this same function is in jvmtiImpl - should be in one place
@@ -237,9 +237,8 @@
 
 public:
   VM_ChangeSingleStep(bool on);
-  
+  VMOp_Type type() const                         { return VMOp_ChangeSingleStep; }
   bool allow_nested_vm_operations() const        { return true; }
-  const char* name() const                       { return "JVMTI enter/leave single step"; }
   void doit();   // method definition is after definition of JvmtiEventControllerPrivate because of scoping
 };
 
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)jvmtiExport.cpp	1.124 07/05/05 17:06:39 JVM"
+#pragma ident "@(#)jvmtiExport.cpp	1.125 07/05/29 09:44:25 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -2453,8 +2453,12 @@
       assert(gch->n_gens() == 2, "configuration not recognized");
       _invocation_count = (unsigned int)gch->get_gen(1)->stat_record()->invocations;
     } else {
+#ifndef SERIALGC
       assert(Universe::heap()->kind() == CollectedHeap::ParallelScavengeHeap, "checking");
       _invocation_count = PSMarkSweep::total_invocations();
+#else  // SERIALGC
+      fatal("SerialGC only supported in this configuration.");
+#endif // SERIALGC
     }
   }
 
@@ -2483,9 +2487,13 @@
         _full = true;      
       }
     } else {
+#ifndef SERIALGC
       if (_invocation_count != PSMarkSweep::total_invocations()) {
         _full = true;
       }
+#else  // SERIALGC
+      fatal("SerialGC only supported in this configuration.");
+#endif // SERIALGC
     }
   }
 
--- a/hotspot/src/share/vm/prims/jvmtiImpl.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)jvmtiImpl.hpp	1.101 07/05/17 16:05:07 JVM"
+#pragma ident "@(#)jvmtiImpl.hpp	1.102 07/05/23 10:53:50 JVM"
 #endif
 /*
  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -222,9 +222,10 @@
     assert(bp != NULL, "bp != NULL");
     assert(operation == SET_BREAKPOINT || operation == CLEAR_BREAKPOINT , "unknown breakpoint operation");
   }    
+
+  VMOp_Type type() const { return VMOp_ChangeBreakpoints; }
   void doit();
-  void oops_do(OopClosure* f);
-  const char* name() const                       { return "change breakpoints"; }  
+  void oops_do(OopClosure* f);   
 };
  
 
@@ -440,8 +441,9 @@
   VM_GetOrSetLocal(JavaThread* thread, JavaThread* calling_thread, jint depth,
                    int index);
 
-  jvalue value()       { return _value; }
-  jvmtiError result()  { return _result; }
+  VMOp_Type type() const { return VMOp_GetOrSetLocal; }
+  jvalue value()         { return _value; }
+  jvmtiError result()    { return _result; }
 
   bool doit_prologue();
   void doit();
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)jvmtiRedefineClasses.hpp	1.39 07/05/05 17:06:40 JVM"
+#pragma ident "@(#)jvmtiRedefineClasses.hpp	1.40 07/05/23 10:53:53 JVM"
 #endif
 /*
  * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -580,12 +580,11 @@
   VM_RedefineClasses(jint class_count, 
                      const jvmtiClassDefinition *class_defs,
                      JvmtiClassLoadKind class_load_kind);
-
+  VMOp_Type type() const { return VMOp_RedefineClasses; }
   bool doit_prologue();
   void doit();
   void doit_epilogue();
 
-  const char* name() const                       { return "VM_RedefineClasses"; }
   bool allow_nested_vm_operations() const        { return true; }
   jvmtiError check_error()                       { return _res; }
 
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)jvmtiTagMap.cpp	1.80 07/05/05 17:06:40 JVM"
+#pragma ident "@(#)jvmtiTagMap.cpp	1.84 07/06/06 13:18:31 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -407,8 +407,12 @@
     GenCollectedHeap* gch = GenCollectedHeap::heap();
     _young_gen = gch->get_gen(0)->reserved();
   } else {
+#ifndef SERIALGC
     ParallelScavengeHeap* psh = ParallelScavengeHeap::heap();
     _young_gen= psh->young_gen()->reserved();
+#else  // SERIALGC
+    fatal("SerialGC only supported in this configuration.");
+#endif // SERIALGC
   }
 }
 
@@ -827,14 +831,14 @@
 class ClassFieldDescriptor: public CHeapObj {
  private:
   int _field_index;
-  int _field_type;
   int _field_offset;
+  char _field_type;
  public:
-  ClassFieldDescriptor(int index, int type, int offset) :
+  ClassFieldDescriptor(int index, char type, int offset) :
     _field_index(index), _field_type(type), _field_offset(offset) { 
   }
   int field_index()  const  { return _field_index; }
-  int field_type()   const  { return _field_type; }
+  char field_type()  const  { return _field_type; }
   int field_offset() const  { return _field_offset; }
 };
 
@@ -851,7 +855,7 @@
   ClassFieldMap();
 
   // add a field
-  void add(int index, int type, int offset);   
+  void add(int index, char type, int offset);   
 
   // returns the field count for the given class
   static int compute_field_count(instanceKlassHandle ikh);
@@ -879,7 +883,7 @@
   delete _fields;
 }
 
-void ClassFieldMap::add(int index, int type, int offset) {
+void ClassFieldMap::add(int index, char type, int offset) {
   ClassFieldDescriptor* field = new ClassFieldDescriptor(index, type, offset);
   _fields->append(field);
 }
@@ -1087,10 +1091,25 @@
 }
 
 // helper function to tell if a field is a primitive field or not
-static inline bool is_primitive_field_type(int type) {
+static inline bool is_primitive_field_type(char type) {
   return (type != 'L' && type != '[');
 }
 
+// helper function to copy the value from location addr to jvalue.
+static inline void copy_to_jvalue(jvalue *v, address addr, jvmtiPrimitiveType value_type) {
+  switch (value_type) {
+    case JVMTI_PRIMITIVE_TYPE_BOOLEAN : { v->z = *(jboolean*)addr; break; }
+    case JVMTI_PRIMITIVE_TYPE_BYTE    : { v->b = *(jbyte*)addr;    break; }
+    case JVMTI_PRIMITIVE_TYPE_CHAR    : { v->c = *(jchar*)addr;    break; }
+    case JVMTI_PRIMITIVE_TYPE_SHORT   : { v->s = *(jshort*)addr;   break; }
+    case JVMTI_PRIMITIVE_TYPE_INT     : { v->i = *(jint*)addr;     break; }
+    case JVMTI_PRIMITIVE_TYPE_LONG    : { v->j = *(jlong*)addr;    break; }
+    case JVMTI_PRIMITIVE_TYPE_FLOAT   : { v->f = *(jfloat*)addr;   break; }
+    case JVMTI_PRIMITIVE_TYPE_DOUBLE  : { v->d = *(jdouble*)addr;  break; }
+    default: ShouldNotReachHere();
+  }
+}
+
 // helper function to invoke string primitive value callback
 // returns visit control flags
 static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
@@ -1184,7 +1203,7 @@
     ClassFieldDescriptor* field = field_map->field_at(i);
 
     // ignore non-primitive fields
-    int type = field->field_type();
+    char type = field->field_type();
     if (!is_primitive_field_type(type)) {
       continue;
     }
@@ -1194,7 +1213,8 @@
     // get offset and field value
     int offset = field->field_offset();
     address addr = (address)k + offset;
-    jvalue* value = (jvalue*)addr;
+    jvalue value;
+    copy_to_jvalue(&value, addr, value_type);
 
     // field index
     reference_info.field.index = field->field_index();
@@ -1204,7 +1224,7 @@
 	             &reference_info,
                      wrapper->klass_tag(), 
 		     wrapper->obj_tag_p(),
-                     *value, 
+                     value, 
 		     value_type, 
 		     user_data);                                            
     if (res & JVMTI_VISIT_ABORT) {
@@ -1236,7 +1256,7 @@
     ClassFieldDescriptor* field = fields->field_at(i);
 
     // ignore non-primitive fields
-    int type = field->field_type();
+    char type = field->field_type();
     if (!is_primitive_field_type(type)) {
       continue;
     }
@@ -1246,7 +1266,8 @@
     // get offset and field value
     int offset = field->field_offset();
     address addr = (address)obj + offset;
-    jvalue* value = (jvalue*)addr;
+    jvalue value;
+    copy_to_jvalue(&value, addr, value_type);
 
     // field index
     reference_info.field.index = field->field_index();
@@ -1256,7 +1277,7 @@
 	             &reference_info,
                      wrapper->klass_tag(), 
 		     wrapper->obj_tag_p(),
-                     *value, 
+                     value, 
 		     value_type, 
 		     user_data);                                            
     if (res & JVMTI_VISIT_ABORT) {
@@ -1275,6 +1296,7 @@
  public:
   VM_HeapIterateOperation(ObjectClosure* blk) { _blk = blk; }
 
+  VMOp_Type type() const { return VMOp_HeapIterateOperation; }
   void doit() {        
     // allows class files maps to be cached during iteration    
     ClassFieldMapCacheMark cm;
@@ -1300,7 +1322,6 @@
     }
   }
 
-  const char* name() const { return "jvmti heap iterate"; }
 };
 
 
@@ -1936,7 +1957,7 @@
 
   // used to report the value of primitive fields
   static inline bool report_primitive_field
-    (jvmtiHeapReferenceKind ref_kind, oop obj, jint index, address addr, int type);
+    (jvmtiHeapReferenceKind ref_kind, oop obj, jint index, address addr, char type);
 
  public:     
   // initialize for basic mode
@@ -1971,8 +1992,8 @@
   static inline bool report_constant_pool_reference(oop referrer, oop referree, jint index);
   static inline bool report_primitive_array_values(oop array);
   static inline bool report_string_value(oop str);
-  static inline bool report_primitive_instance_field(oop o, jint index, address value, int type);
-  static inline bool report_primitive_static_field(oop o, jint index, address value, int type);
+  static inline bool report_primitive_instance_field(oop o, jint index, address value, char type);
+  static inline bool report_primitive_static_field(oop o, jint index, address value, char type);
 };
 
 // statics
@@ -2371,7 +2392,7 @@
                                                     oop obj,
                                                     jint index,
                                                     address addr,
-                                                    int type) 
+                                                    char type) 
 {
   // for primitive fields only the index will be set
   static jvmtiHeapReferenceInfo reference_info = { 0 };
@@ -2400,25 +2421,15 @@
   jvmtiPrimitiveType value_type = (jvmtiPrimitiveType)type;
 
   // setup the jvalue  
-  jvalue v;
-  switch (value_type) { 
-    case JVMTI_PRIMITIVE_TYPE_BOOLEAN : { v.z = *(jboolean*)addr; break; }
-    case JVMTI_PRIMITIVE_TYPE_BYTE    : { v.b = *(jbyte*)addr;    break; }
-    case JVMTI_PRIMITIVE_TYPE_CHAR    : { v.c = *(jchar*)addr;    break; }
-    case JVMTI_PRIMITIVE_TYPE_SHORT   : { v.s = *(jshort*)addr;   break; }
-    case JVMTI_PRIMITIVE_TYPE_INT     : { v.i = *(jint*)addr;     break; }
-    case JVMTI_PRIMITIVE_TYPE_LONG    : { v.j = *(jlong*)addr;    break; }
-    case JVMTI_PRIMITIVE_TYPE_FLOAT   : { v.f = *(jfloat*)addr;   break; }
-    case JVMTI_PRIMITIVE_TYPE_DOUBLE  : { v.d = *(jdouble*)addr;  break; }
-    default: ShouldNotReachHere();
-  }
+  jvalue value;
+  copy_to_jvalue(&value, addr, value_type);
 
   jvmtiPrimitiveFieldCallback cb = context->primitive_field_callback();
   int res = (*cb)(ref_kind, 
                   &reference_info,
                   wrapper.klass_tag(),
                   wrapper.obj_tag_p(),
-                  v,
+                  value,
                   value_type,
                   (void*)user_data());
   return (!(res & JVMTI_VISIT_ABORT)); 
@@ -2429,7 +2440,7 @@
 inline bool CallbackInvoker::report_primitive_instance_field(oop obj, 
 							     jint index, 
 							     address value, 
-                                                             int type) {
+                                                             char type) {
   return report_primitive_field(JVMTI_HEAP_REFERENCE_FIELD, 
                                 obj, 
 				index, 
@@ -2441,7 +2452,7 @@
 inline bool CallbackInvoker::report_primitive_static_field(oop obj, 
 							   jint index, 
 							   address value, 
-                                                           int type) {
+                                                           char type) {
   return report_primitive_field(JVMTI_HEAP_REFERENCE_STATIC_FIELD, 
                                 obj, 
 				index, 
@@ -2766,8 +2777,8 @@
 
   ~VM_HeapWalkOperation();
 
+  VMOp_Type type() const { return VMOp_HeapWalkOperation; }
   void doit(); 
-  const char* name() const { return "JVMTI VM_HeapWalkOperation"; }
 };
 
 
@@ -2962,7 +2973,7 @@
     ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k);
     for (i=0; i<field_map->field_count(); i++) {
       ClassFieldDescriptor* field = field_map->field_at(i);
-      int type = field->field_type();  
+      char type = field->field_type();  
       if (!is_primitive_field_type(type)) {	 
         address addr = (address)k + field->field_offset();
 	oop* f = (oop*)addr;
@@ -3007,7 +3018,7 @@
   ClassFieldMap* field_map = JvmtiCachedClassFieldMap::get_map_of_instance_fields(o);
   for (int i=0; i<field_map->field_count(); i++) {
     ClassFieldDescriptor* field = field_map->field_at(i);
-    int type = field->field_type();
+    char type = field->field_type();
     if (!is_primitive_field_type(type)) {
       address addr = (address)o + field->field_offset();
       oop* f = (oop*)addr;
--- a/hotspot/src/share/vm/runtime/arguments.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)arguments.cpp	1.328 07/05/17 16:05:13 JVM"
+#pragma ident "@(#)arguments.cpp	1.329 07/05/29 09:44:26 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1299,6 +1299,20 @@
   return false;
 }
 
+static void set_serial_gc_flags() {
+  FLAG_SET_DEFAULT(UseSerialGC, true);
+  FLAG_SET_DEFAULT(UseParNewGC, false);
+  FLAG_SET_DEFAULT(UseConcMarkSweepGC, false);
+  FLAG_SET_DEFAULT(UseParallelGC, false);
+  FLAG_SET_DEFAULT(UseParallelOldGC, false);
+}
+
+static bool verify_serial_gc_flags() {
+  return (UseSerialGC && 
+        !(UseParNewGC || UseConcMarkSweepGC || UseParallelGC || 
+          UseParallelOldGC));
+}
+
 // Check the consistency of vm_init_args
 bool Arguments::check_vm_args_consistency() {
   // Method for adding checks for flag consistency.
@@ -1382,11 +1396,7 @@
     // Either force sharing on by forcing the other options off, or
     // force sharing off.
     if (DumpSharedSpaces || ForceSharedSpaces) {
-      FLAG_SET_DEFAULT(UseSerialGC, true);
-      FLAG_SET_DEFAULT(UseParNewGC, false);
-      FLAG_SET_DEFAULT(UseConcMarkSweepGC, false);
-      FLAG_SET_DEFAULT(UseParallelGC, false);
-      FLAG_SET_DEFAULT(UseParallelOldGC, false);
+      set_serial_gc_flags();
       FLAG_SET_DEFAULT(SOLARIS_ONLY(UseISM) NOT_SOLARIS(UseLargePages), false);
     } else {
       no_shared_spaces();
@@ -2416,6 +2426,10 @@
     }
   }
 
+#ifdef SERIALGC
+  set_serial_gc_flags();
+#endif // SERIALGC
+  
   // Set some flags for ParallelGC if needed.
   set_parallel_gc_flags();
 
@@ -2425,6 +2439,10 @@
   // Set flags based on ergonomics.
   set_ergonomics_flags();
 
+#ifdef SERIALGC
+  assert(verify_serial_gc_flags(), "SerialGC unset");
+#endif // SERIALGC
+
   // Set bytecode rewriting flags
   set_bytecode_flags();
 
--- a/hotspot/src/share/vm/runtime/biasedLocking.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/biasedLocking.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)biasedLocking.cpp	1.14 07/05/17 16:05:19 JVM"
+#pragma ident "@(#)biasedLocking.cpp	1.15 07/05/23 10:53:58 JVM"
 #endif
 
 /*
@@ -42,6 +42,7 @@
 class VM_EnableBiasedLocking: public VM_Operation {
  public:
   VM_EnableBiasedLocking() {}
+  VMOp_Type type() const   { return VMOp_EnableBiasedLocking; }
   void doit() {
     // Iterate the system dictionary enabling biased locking for all
     // currently loaded classes
@@ -53,7 +54,7 @@
       tty->print_cr("Biased locking enabled");
     }
   }
-  const char* name() const                       { return "enable-biased-locking"; }
+
   bool allow_nested_vm_operations() const        { return false; }
 };
 
@@ -445,6 +446,8 @@
     , _requesting_thread(requesting_thread)
     , _status_code(BiasedLocking::NOT_BIASED) {}
 
+  virtual VMOp_Type type() const { return VMOp_RevokeBias; }
+  
   virtual bool doit_prologue() {
     // Verify that there is actual work to do since the callers just
     // give us locked object(s). If we don't find any biased objects
@@ -481,10 +484,6 @@
     }
   }
 
-  virtual const char* name() const {
-    return "biased locking revoker";
-  }
-
   BiasedLocking::Condition status_code() const {
     return _status_code;
   }
@@ -504,16 +503,13 @@
     , _bulk_rebias(bulk_rebias)
     , _attempt_rebias_of_object(attempt_rebias_of_object) {}
 
-  virtual bool doit_prologue() { return true; }
+  virtual VMOp_Type type() const { return VMOp_BulkRevokeBias; }  
+  virtual bool doit_prologue()   { return true; }
 
   virtual void doit() {
     _status_code = bulk_revoke_or_rebias_at_safepoint((*_obj)(), _bulk_rebias, _attempt_rebias_of_object, _requesting_thread);
     clean_up_cached_monitor_info();
   }
-
-  virtual const char* name() const {
-    return "biased locking bulk revoker";
-  }
 };
 
 
--- a/hotspot/src/share/vm/runtime/globals.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)globals.hpp	1.962 07/05/17 16:05:39 JVM"
+#pragma ident "@(#)globals.hpp	1.965 07/06/13 16:22:03 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -931,6 +931,12 @@
   product(bool, UseAddressNop, false,                                       \
           "Use '0F 1F [addr]' NOP instructions on x86 cpus")                \
                                                                             \
+  product(bool, UseXmmLoadAndClearUpper, true,                              \
+          "Load low part of XMM register and clear upper part")             \
+                                                                            \
+  product(bool, UseXmmRegToRegMoveAll, false,                               \
+          "Copy all XMM register bits when moving value between registers") \
+                                                                            \
   product(intx, FieldsAllocationStyle, 1,                                   \
           "0 - type based with oops first, 1 - with oops last")             \
                                                                             \
@@ -1783,6 +1789,9 @@
   manageable(bool, PrintGCDetails, false,                                   \
           "Print more details at garbage collect")                          \
                                                                             \
+  manageable(bool, PrintGCDateStamps, false,                                \
+          "Print date stamps at garbage collect")                           \
+                                                                            \
   manageable(bool, PrintGCTimeStamps, false,                                \
           "Print timestamps at garbage collect")                            \
                                                                             \
@@ -1976,9 +1985,17 @@
   develop_pd(bool, ImplicitNullChecks,                                      \
           "generate code for implicit null checks")                         \
                                                                             \
-  develop(bool, PrintSafepointStatistics, false,                            \
+  product(bool, PrintSafepointStatistics, false,                            \
           "print statistics about safepoint synchronization")               \
                                                                             \
+  product(intx, PrintSafepointStatisticsCount, 300,                         \
+          "total number of safepoint statistics collected "                 \
+          "before printing them out")                                       \
+                                                                            \
+  product(intx, PrintSafepointStatisticsTimeout,  -1,                       \
+          "print safepoint statistics only when safepoint takes"            \
+          " more than PrintSafepointSatisticsTimeout in millis")            \
+                                                                            \
   develop(bool, InlineAccessors, true,                                      \
           "inline accessor methods (get/set)")                              \
                                                                             \
@@ -2978,6 +2995,11 @@
           "constructors generated for serialization, so can not be enabled "\
           "in product.")                                                    \
                                                                             \
+  product(bool, ReflectionWrapResolutionErrors, true,                       \
+          "Temporary flag for transition to AbstractMethodError wrapped "   \
+          "in InvocationTargetException. See 6531596")                      \
+                                                                            \
+                                                                            \
   develop(intx, FastSuperclassLimit, 8,                                     \
           "Depth of hardwired instanceof accelerator array")                \
                                                                             \
--- a/hotspot/src/share/vm/runtime/init.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/init.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)init.cpp	1.121 07/05/17 16:05:50 JVM"
+#pragma ident "@(#)init.cpp	1.122 07/05/23 10:54:05 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -139,6 +139,10 @@
   if (!destructorsCalled) {
     destructorsCalled = true;
     perfMemory_exit();
+    if (PrintSafepointStatistics) {
+      // Print the collected safepoint statistics.
+      SafepointSynchronize::print_stat_on_exit();
+    }
     ostream_exit();
   }
 }
--- a/hotspot/src/share/vm/runtime/java.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/java.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)java.cpp	1.220 07/05/17 16:06:10 JVM"
+#pragma ident "@(#)java.cpp	1.221 07/05/29 09:44:26 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -405,10 +405,12 @@
     TimeMillisUpdateTask::disengage();
   }
 
+#ifndef SERIALGC
   // stop CMS threads
   if (UseConcMarkSweepGC) {
     ConcurrentMarkSweepThread::stop();
   }
+#endif // SERIALGC
 
   // Print GC/heap related information.
   if (PrintGCDetails) {
--- a/hotspot/src/share/vm/runtime/os.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/os.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)os.cpp	1.180 07/05/17 16:06:20 JVM"
+#pragma ident "@(#)os.cpp	1.182 07/06/10 14:43:17 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -113,6 +113,96 @@
 #endif
 }
 
+// Fill in buffer with current local time as an ISO-8601 string.
+// E.g., yyyy-mm-ddThh:mm:ss-zzzz.
+// Returns buffer, or NULL if it failed.
+// This would mostly be a call to 
+//     strftime(...., "%Y-%m-%d" "T" "%H:%M:%S" "%z", ....)
+// except that on Windows the %z behaves badly, so we do it ourselves.
+// Also, people wanted milliseconds on there, 
+// and strftime doesn't do milliseconds.
+char* os::iso8601_time(char* buffer, size_t buffer_length) {  
+  // Output will be of the form "YYYY-MM-DDThh:mm:ss.mmm+zzzz\0"
+  //                                      1         2
+  //                             12345678901234567890123456789
+  static const char* iso8601_format =
+    "%04d-%02d-%02dT%02d:%02d:%02d.%03d%c%02d%02d";
+  static const size_t needed_buffer = 29;
+
+  // Sanity check the arguments
+  if (buffer == NULL) {
+    assert(false, "NULL buffer");
+    return NULL;
+  }
+  if (buffer_length < needed_buffer) {
+    assert(false, "buffer_length too small");
+    return NULL;
+  }
+  // Get the current time
+  jlong milliseconds_since_19700101 = timeofday();
+  const int milliseconds_per_microsecond = 1000;
+  const time_t seconds_since_19700101 =
+    milliseconds_since_19700101 / milliseconds_per_microsecond;
+  const int milliseconds_after_second =
+    milliseconds_since_19700101 % milliseconds_per_microsecond;
+  // Convert the time value to a tm and timezone variable
+  const struct tm *time_struct_temp = localtime(&seconds_since_19700101);
+  if (time_struct_temp == NULL) {
+    assert(false, "Failed localtime");
+    return NULL;
+  }
+  // Save the results of localtime
+  const struct tm time_struct = *time_struct_temp;
+  const time_t zone = timezone;
+  
+  // If daylight savings time is in effect, 
+  // we are 1 hour East of our time zone
+  const time_t seconds_per_minute = 60;
+  const time_t minutes_per_hour = 60;
+  const time_t seconds_per_hour = seconds_per_minute * minutes_per_hour;
+  time_t UTC_to_local = zone;
+  if (time_struct.tm_isdst > 0) {
+    UTC_to_local = UTC_to_local - seconds_per_hour;
+  }
+  // Compute the time zone offset.
+  //    localtime(3C) sets timezone to the difference (in seconds)
+  //    between UTC and and local time.
+  //    ISO 8601 says we need the difference between local time and UTC, 
+  //    we change the sign of the localtime(3C) result.
+  const time_t local_to_UTC = -(UTC_to_local);
+  // Then we have to figure out if if we are ahead (+) or behind (-) UTC.
+  char sign_local_to_UTC = '+';
+  time_t abs_local_to_UTC = local_to_UTC;
+  if (local_to_UTC < 0) {
+    sign_local_to_UTC = '-';
+    abs_local_to_UTC = -(abs_local_to_UTC);
+  }
+  // Convert time zone offset seconds to hours and minutes.
+  const time_t zone_hours = (abs_local_to_UTC / seconds_per_hour);
+  const time_t zone_min =
+    ((abs_local_to_UTC % seconds_per_hour) / seconds_per_minute);
+  
+  // Print an ISO 8601 date and time stamp into the buffer
+  const int year = 1900 + time_struct.tm_year;
+  const int month = 1 + time_struct.tm_mon;
+  const int printed = jio_snprintf(buffer, buffer_length, iso8601_format,
+                                   year,
+                                   month,
+                                   time_struct.tm_mday,
+                                   time_struct.tm_hour,
+                                   time_struct.tm_min,
+                                   time_struct.tm_sec,
+                                   milliseconds_after_second,
+                                   sign_local_to_UTC,
+                                   zone_hours,
+                                   zone_min);
+  if (printed == 0) {
+    assert(false, "Failed jio_printf");
+    return NULL;
+  }
+  return buffer;
+}
+
 OSReturn os::set_priority(Thread* thread, ThreadPriority p) {
 #ifdef ASSERT
   if (!(!thread->is_Java_thread() ||
--- a/hotspot/src/share/vm/runtime/os.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/os.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)os.hpp	1.218 07/05/17 16:06:23 JVM"
+#pragma ident "@(#)os.hpp	1.219 07/06/08 23:16:34 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -106,10 +106,14 @@
   static jlong elapsed_counter();
   static jlong elapsed_frequency();
 
-  // Return current local time in a string (YYYY-MM-DD HH:MM:SS, i.e.
-  // ISO 8601). It is MT safe, but not async-safe, as reading time zone 
+  // Return current local time in a string (YYYY-MM-DD HH:MM:SS). 
+  // It is MT safe, but not async-safe, as reading time zone 
   // information may require a lock on some platforms.
   static char* local_time_string(char *buf, size_t buflen);
+  // Fill in buffer with current local time as an ISO-8601 string.
+  // E.g., YYYY-MM-DDThh:mm:ss.mmm+zzzz.
+  // Returns buffer, or NULL if it failed.
+  static char* iso8601_time(char* buffer, size_t buffer_length);
 
   // Interface for detecting multiprocessor system
   static inline bool is_MP() {
--- a/hotspot/src/share/vm/runtime/reflection.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/reflection.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)reflection.cpp	1.177 07/05/05 17:06:55 JVM"
+#pragma ident "@(#)reflection.cpp	1.178 07/05/23 10:54:08 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -841,8 +841,24 @@
     } else {
       // resolve based on the receiver
       if (instanceKlass::cast(reflected_method->method_holder())->is_interface()) {
-	// resolve interface call
-	method = resolve_interface_call(klass, reflected_method, target_klass, receiver, CHECK_(NULL));
+        // resolve interface call
+        if (ReflectionWrapResolutionErrors) {
+          // new default: 6531596
+          // Match resolution errors with those thrown due to reflection inlining
+          // Linktime resolution & IllegalAccessCheck already done by Class.getMethod()
+	  method = resolve_interface_call(klass, reflected_method, target_klass, receiver, THREAD); 
+          if (HAS_PENDING_EXCEPTION) {
+          // Method resolution threw an exception; wrap it in an InvocationTargetException
+            oop resolution_exception = PENDING_EXCEPTION;
+            CLEAR_PENDING_EXCEPTION;
+            JavaCallArguments args(Handle(THREAD, resolution_exception));
+            THROW_ARG_0(vmSymbolHandles::java_lang_reflect_InvocationTargetException(),
+                vmSymbolHandles::throwable_void_signature(),
+                &args);
+          }
+        } else {
+	  method = resolve_interface_call(klass, reflected_method, target_klass, receiver, CHECK_(NULL));
+        }
       }  else {
         // if the method can be overridden, we resolve using the vtable index.
         int index  = reflected_method->vtable_index();
@@ -856,17 +872,33 @@
         if (!method.is_null()) {
           // Check for abstract methods as well
           if (method->is_abstract()) {
-            ResourceMark rm(THREAD);
-            THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(),
+            // new default: 6531596
+            if (ReflectionWrapResolutionErrors) {
+              ResourceMark rm(THREAD);
+              Handle h_origexception = Exceptions::new_exception(THREAD,
+                     vmSymbols::java_lang_AbstractMethodError(),
+                     methodOopDesc::name_and_sig_as_C_string(Klass::cast(target_klass()),
+                     method->name(),
+                     method->signature()));
+              JavaCallArguments args(h_origexception);
+              THROW_ARG_0(vmSymbolHandles::java_lang_reflect_InvocationTargetException(),
+                vmSymbolHandles::throwable_void_signature(),
+                &args);
+            } else {
+              ResourceMark rm(THREAD);
+              THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(),
                         methodOopDesc::name_and_sig_as_C_string(Klass::cast(target_klass()),
                                                                 method->name(),
                                                                 method->signature()));
+            }
           }
         }
       }
     }
   }
 
+  // I believe this is a ShouldNotGetHere case which requires
+  // an internal vtable bug. If you ever get this please let Karen know.
   if (method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
--- a/hotspot/src/share/vm/runtime/safepoint.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)safepoint.cpp	1.303 07/05/05 17:06:57 JVM"
+#pragma ident "@(#)safepoint.cpp	1.305 07/05/29 09:44:27 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -33,7 +33,7 @@
 
 SafepointSynchronize::SynchronizeState volatile SafepointSynchronize::_state = SafepointSynchronize::_not_synchronized;
 volatile int  SafepointSynchronize::_waiting_to_block = 0;
-long SafepointSynchronize::_last_safepoint = 0;
+jlong SafepointSynchronize::_last_safepoint = 0;
 volatile int SafepointSynchronize::_safepoint_counter = 0;
 static volatile int PageArmed = 0 ;        // safepoint polling page is RO|RW vs PROT_NONE
 static volatile int TryingToBlock = 0 ;    // proximate value -- for advisory use only
@@ -44,6 +44,9 @@
   Thread* myThread = Thread::current();
   assert(myThread->is_VM_thread(), "Only VM thread may execute a safepoint");
 
+  _last_safepoint = os::javaTimeNanos();
+
+#ifndef SERIALGC
   if (UseConcMarkSweepGC) {
     // In the future we should investigate whether CMS can use the
     // more-general mechanism below.  DLD (01/05).
@@ -51,6 +54,7 @@
   } else {
     ConcurrentGCThread::safepoint_synchronize();
   }
+#endif // SERIALGC
 
   // By getting the Threads_lock, we assure that no threads are about to start or 
   // exit. It is released again in SafepointSynchronize::end().  
@@ -65,9 +69,6 @@
   }
 
   RuntimeService::record_safepoint_begin();
-  if (PrintSafepointStatistics) {
-    begin_statistics(nof_threads);
-  }    
 
   {
   MutexLocker mu(Safepoint_lock);
@@ -157,7 +158,7 @@
       assert(!cur->is_ConcurrentGC_thread(), "A concurrent GC thread is unexpectly being suspended");
       ThreadSafepointState *cur_state = cur->safepoint_state();
       if (cur_state->is_running()) {          
-        cur_state->examine_state_of_thread(iterations);                              
+        cur_state->examine_state_of_thread();                              
         if (!cur_state->is_running()) { 
            still_running--; 
            // consider adjusting steps downward:
@@ -169,7 +170,11 @@
         } 
         if (TraceSafepoint && Verbose) cur_state->print();
       }
-    } 
+    }
+
+    if (PrintSafepointStatistics && iterations == 0) {
+      begin_statistics(nof_threads, still_running);
+    }
 
     if (still_running > 0) {
       // Check for if it takes to long
@@ -276,7 +281,11 @@
     }
     assert(iterations < (uint)max_jint, "We have been iterating in the safepoint loop too long");
   }     
-  assert(still_running == 0, "sanity check");      
+  assert(still_running == 0, "sanity check"); 
+
+  if (PrintSafepointStatistics) {
+    update_statistics_on_spin_end();
+  }
 
   // wait until all threads are stopped    
   while (_waiting_to_block > 0) {
@@ -344,12 +353,12 @@
   }
  
   RuntimeService::record_safepoint_synchronized();
-  if (PrintSafepointStatistics) {    
-    end_statistics(RuntimeService::last_safepoint_time_sec());
+  if (PrintSafepointStatistics) {   
+    update_statistics_on_sync_end(os::javaTimeNanos());
   }    
-
+  
   // Call stuff that needs to be run when a safepoint is just about to be completed
-  do_cleanup_tasks();  
+  do_cleanup_tasks();
   }
 }
 
@@ -366,6 +375,10 @@
   DEBUG_ONLY(Thread* myThread = Thread::current();)
   assert(myThread->is_VM_thread(), "Only VM thread can execute a safepoint");
 
+  if (PrintSafepointStatistics) {
+    end_statistics(os::javaTimeNanos());
+  }
+  
 #ifdef ASSERT
   // A pending_exception cannot be installed during a safepoint.  The threads
   // may install an async exception after they come back from a safepoint into
@@ -428,15 +441,15 @@
     // blocked in signal_thread_blocked
     Threads_lock->unlock();  
 
-    _last_safepoint = os::javaTimeMillis();
-
   }
+#ifndef SERIALGC
   // If there are any concurrent GC threads resume them.
   if (UseConcMarkSweepGC) {
     ConcurrentMarkSweepThread::desynchronize(false);
   } else {
     ConcurrentGCThread::safepoint_desynchronize();
   }
+#endif // SERIALGC
 }
 
 bool SafepointSynchronize::is_cleanup_needed() {
@@ -470,14 +483,25 @@
 }
 
 // Various cleaning tasks that should be done periodically at safepoints
-void SafepointSynchronize::do_cleanup_tasks() {  
+void SafepointSynchronize::do_cleanup_tasks() {
+  jlong cleanup_time;
+  
   // Update fat-monitor pool, since this is a safepoint.
+  if (TraceSafepoint) {
+    cleanup_time = os::javaTimeNanos();
+  }
+  
   ObjectSynchronizer::deflate_idle_monitors();
   InlineCacheBuffer::update_inline_caches();  
   if(UseCounterDecay && CounterDecay::is_decay_needed()) {
     CounterDecay::decay();
   }
-  NMethodSweeper::sweep(); 
+  NMethodSweeper::sweep();
+
+  if (TraceSafepoint) {
+    tty->print_cr("do_cleanup_tasks takes "INT64_FORMAT_W(6) "ms",
+                  (os::javaTimeNanos() - cleanup_time) / MICROUNITS);
+  }
 }
 
 
@@ -705,6 +729,10 @@
     tty->print("handle_polling_page_exception: ");  
   }  
 
+  if (PrintSafepointStatistics) {
+    inc_page_trap_count();
+  }
+
   ThreadSafepointState* state = thread->safepoint_state();
 
   state->handle_polling_page_exception();  
@@ -733,7 +761,7 @@
   }
 }
 
-void ThreadSafepointState::examine_state_of_thread(int iterations) {  
+void ThreadSafepointState::examine_state_of_thread() {  
   assert(is_running(), "better be running or just have hit safepoint poll");
 
   JavaThreadState state = _thread->thread_state();  
@@ -926,59 +954,249 @@
   }
 }
 
+
+//
+//                     Statistics & Instrumentations
+// 
+SafepointSynchronize::SafepointStats*  SafepointSynchronize::_safepoint_stats = NULL;
+int    SafepointSynchronize::_cur_stat_index = 0;
+julong SafepointSynchronize::_safepoint_reasons[VM_Operation::VMOp_Terminating];
+julong SafepointSynchronize::_coalesced_vmop_count = 0;
+jlong  SafepointSynchronize::_max_sync_time = 0;         
+
+// last_safepoint_start_time records the start time of last safepoint.
+static jlong  last_safepoint_start_time = 0;
+static jlong  sync_end_time = 0;  
+static bool   need_to_track_page_armed_status = false;
+
+void SafepointSynchronize::initialize_stat() {
+  if (PrintSafepointStatisticsCount <= 0) {
+    fatal("Wrong PrintSafepointStatisticsCount");
+  }
+  
+  // If PrintSafepointStatisticsTimeout is specified, the statistics data will 
+  // be printed right away, in which case, _safepoint_stats will regress to 
+  // a single element array. Otherwise, it is a circular ring buffer with default
+  // size of PrintSafepointStatisticsCount.
+  int stats_array_size;
+  if (PrintSafepointStatisticsTimeout > 0) {
+    stats_array_size = 1;
+    PrintSafepointStatistics = true;
+  } else {
+    stats_array_size = PrintSafepointStatisticsCount;
+  }
+  _safepoint_stats = (SafepointStats*)os::malloc(stats_array_size
+                                                 * sizeof(SafepointStats));
+  guarantee(_safepoint_stats != NULL, 
+            "not enough memory for safepoint instrumentation data");
+
+  if (UseCompilerSafepoints && DeferPollingPageLoopCount >= 0) {
+    need_to_track_page_armed_status = true;
+  }
+
+  tty->print("     vmop_name               "
+             "[threads: total initially_running wait_to_block] ");
+  tty->print("[time: spin block sync] "
+             "[vmop_time  time_elapsed] ");
+
+  // no page armed status printed out if it is always armed.
+  if (need_to_track_page_armed_status) {
+    tty->print("page_armed ");
+  }
+ 
+  tty->print_cr("page_trap_count");
+}
+
+void SafepointSynchronize::begin_statistics(int nof_threads, int nof_running) {
+  
+  SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
+
+  VM_Operation *op = VMThread::vm_operation();
+  spstat->_vmop_type = (op != NULL ? op->type() : -1);
+  if (op != NULL) {
+    _safepoint_reasons[spstat->_vmop_type]++;
+  }
+
+  spstat->_nof_total_threads = nof_threads;
+  spstat->_nof_initial_running_threads = nof_running;
+  spstat->_nof_threads_hit_page_trap = 0;
+  
+  // Records the start time of spinning. The real time spent on spinning
+  // will be adjusted when spin is done. Same trick is applied for time
+  // spent on waiting for threads to block.
+  if (nof_running != 0) {
+    spstat->_time_to_spin = os::javaTimeNanos();
+  }  else {
+    spstat->_time_to_spin = 0;
+  }
+
+  if (last_safepoint_start_time == 0) {
+    spstat->_time_elapsed_since_last_safepoint = 0;
+  } else {
+    spstat->_time_elapsed_since_last_safepoint = _last_safepoint -
+      last_safepoint_start_time;
+  }
+  last_safepoint_start_time = _last_safepoint;
+}
+
+void SafepointSynchronize::update_statistics_on_spin_end() {
+  SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
+
+  jlong cur_time = os::javaTimeNanos();
+  
+  spstat->_nof_threads_wait_to_block = _waiting_to_block;
+  if (spstat->_nof_initial_running_threads != 0) {
+    spstat->_time_to_spin = cur_time - spstat->_time_to_spin;
+  }
+ 
+  if (need_to_track_page_armed_status) {
+    spstat->_page_armed = (PageArmed == 1);
+  }
+
+  // Records the start time of waiting for to block. Updated when block is done.
+  if (_waiting_to_block != 0) {
+    spstat->_time_to_wait_to_block = cur_time;
+  } else {
+    spstat->_time_to_wait_to_block = 0;
+  }
+}
+
+void SafepointSynchronize::update_statistics_on_sync_end(jlong end_time) {
+  SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
+  
+  if (spstat->_nof_threads_wait_to_block != 0) {
+    spstat->_time_to_wait_to_block = end_time -
+      spstat->_time_to_wait_to_block;
+  }
+  
+  // Records the end time of sync which will be used to calculate the total
+  // vm operation time. Again, the real time spending in syncing will be deducted
+  // from the start of the sync time later when end_statistics is called.
+  spstat->_time_to_sync = end_time - _last_safepoint;
+  if (spstat->_time_to_sync > _max_sync_time) {
+    _max_sync_time = spstat->_time_to_sync;
+  } 
+  sync_end_time = end_time;
+}
+
+void SafepointSynchronize::end_statistics(jlong vmop_end_time) {
+  SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
+
+  // Update the vm operation time.
+  spstat->_time_to_exec_vmop = vmop_end_time -  sync_end_time;
+  // Only the sync time longer than the specified 
+  // PrintSafepointStatisticsTimeout will be printed out right away.
+  // By default, it is -1 meaning all samples will be put into the list.
+  if ( PrintSafepointStatisticsTimeout > 0) {
+    if (spstat->_time_to_sync > PrintSafepointStatisticsTimeout * MICROUNITS) {
+      print_statistics();
+    } 
+  } else {
+    // The safepoint statistics will be printed out when the _safepoin_stats
+    // array fills up. 
+    if (_cur_stat_index != PrintSafepointStatisticsCount - 1) {
+      _cur_stat_index ++;
+    } else {
+      print_statistics();
+      _cur_stat_index = 0;
+      tty->print_cr("");
+    }
+  }
+}
+
+void SafepointSynchronize::print_statistics() {
+  int index;
+  SafepointStats* sstats = _safepoint_stats;
+  
+  for (index = 0; index <= _cur_stat_index; index++) {
+    sstats = &_safepoint_stats[index];
+    tty->print("%-28s       ["
+               INT32_FORMAT_W(8)INT32_FORMAT_W(11)INT32_FORMAT_W(15)
+               "]   ",
+               sstats->_vmop_type == -1 ? "no vm operation" :
+               VM_Operation::name(sstats->_vmop_type),
+               sstats->_nof_total_threads,
+               sstats->_nof_initial_running_threads,
+               sstats->_nof_threads_wait_to_block);
+    // "/ MICROUNITS " is to convert the unit from nanos to millis.
+    tty->print("       ["
+               INT64_FORMAT_W(6)INT64_FORMAT_W(6)INT64_FORMAT_W(6)
+               "]     "
+               "["INT64_FORMAT_W(6)INT64_FORMAT_W(9) "]          ",
+               sstats->_time_to_spin / MICROUNITS, 
+               sstats->_time_to_wait_to_block / MICROUNITS,
+               sstats->_time_to_sync / MICROUNITS, 
+               sstats->_time_to_exec_vmop / MICROUNITS,
+               sstats->_time_elapsed_since_last_safepoint / MICROUNITS);
+
+    if (need_to_track_page_armed_status) {
+      tty->print(INT32_FORMAT"         ", sstats->_page_armed);
+    }
+    tty->print_cr(INT32_FORMAT"   ", sstats->_nof_threads_hit_page_trap);
+  }
+}
+
+// This method will be called when VM exits. It will first call
+// print_statistics to print out the rest of the sampling.  Then
+// it tries to summarize the sampling.
+void SafepointSynchronize::print_stat_on_exit() {
+  assert(Thread::current()->is_VM_thread(), 
+         "print_stat_on_exit not called on VMThread");
+
+  SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
+  
+  // During VM exit, end_statistics may not get called and in that
+  // case, if the sync time is less than PrintSafepointStatisticsTimeout,
+  // don't print it out.
+  // Approximate the vm op time.
+  _safepoint_stats[_cur_stat_index]._time_to_exec_vmop = 
+    os::javaTimeNanos() - sync_end_time;
+  
+  if ( PrintSafepointStatisticsTimeout < 0 ||  
+       spstat->_time_to_sync > PrintSafepointStatisticsTimeout * MICROUNITS) {
+    print_statistics();
+  }
+  tty->print_cr("");
+
+  // Print out polling page sampling status.
+  if (!need_to_track_page_armed_status) {
+    if (UseCompilerSafepoints) {
+      tty->print_cr("Polling page always armed");
+    }
+  } else {
+    tty->print_cr("Defer polling page loop count = %d\n", 
+                 DeferPollingPageLoopCount);
+  }
+
+  for (int index = 0; index < VM_Operation::VMOp_Terminating; index++) {
+    if (_safepoint_reasons[index] != 0) {
+      tty->print_cr("%-26s"UINT64_FORMAT_W(10), VM_Operation::name(index),
+                    _safepoint_reasons[index]); 
+    }
+  }
+
+  tty->print_cr(UINT64_FORMAT_W(5)" VM operations coalesced during safepoint",
+                _coalesced_vmop_count);        
+  tty->print_cr("Maximum sync time  "INT64_FORMAT_W(5)" ms", 
+                _max_sync_time / MICROUNITS);
+}
+
 // ------------------------------------------------------------------------------------------------
 // Non-product code
 
 #ifndef PRODUCT
-//
-// Statistics
-// 
-
-long      SafepointSynchronize::_total_safepoints = 0;
-long      SafepointSynchronize::_total_threads    = 0;
-long      SafepointSynchronize::_max_threads      = 0;
-double    SafepointSynchronize::_total_secs       = 0;
-double    SafepointSynchronize::_max_secs         = 0;
-double    SafepointSynchronize::_min_secs         = 3600; // One hour (should be high enough)
-
-void SafepointSynchronize::begin_statistics(int nof_threads) {
-  _total_safepoints += 1;
-  _total_threads    += nof_threads;
-  if (nof_threads>_max_threads)
-    _max_threads = nof_threads;
-}
-
-void SafepointSynchronize::end_statistics(double secs) {
-  _total_secs += secs;
-  if (_min_secs>secs) _min_secs = secs;
-  if (_max_secs<secs) _max_secs = secs;
-
-  print_statistics(secs);
-}
-
-void SafepointSynchronize::print_statistics(double secs) {
-  tty->print_cr("Safepoint#%Ld: Threads:(avg: %3.1f, max: %3Ld), "
-		"Time: (last: %2.5f, avg: %2.5f, min: %2.5f, max:%2.5f), "
-		"Suspends: (current: %Ld, cumulative: %Ld)",
-    _total_safepoints,
-    (double) _total_threads/_total_safepoints,
-    _max_threads,
-    secs,
-    _total_secs/_total_safepoints,
-    _min_secs,
-    _max_secs);
-}
 
 void SafepointSynchronize::print_state() {
   if (_state == _not_synchronized) {
     tty->print_cr("not synchronized");
   } else if (_state == _synchronizing || _state == _synchronized) {
-    tty->print_cr("State: %s", (_state == _synchronizing) ? "synchronizing" : "synchronized");
+    tty->print_cr("State: %s", (_state == _synchronizing) ? "synchronizing" : 
+                  "synchronized");
 
     for(JavaThread *cur = Threads::first(); cur; cur = cur->next()) {       
        cur->safepoint_state()->print();
     }  
-  } 
+  }
 }
 
 void SafepointSynchronize::safepoint_msg(const char* format, ...) {
--- a/hotspot/src/share/vm/runtime/safepoint.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/safepoint.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)safepoint.hpp	1.101 07/05/05 17:06:55 JVM"
+#pragma ident "@(#)safepoint.hpp	1.103 07/05/26 16:02:40 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -62,6 +62,20 @@
       _other_thread = 2
   };
 
+  typedef struct { 
+    int    _vmop_type;                         // type of VM operation triggers the safepoint
+    int    _nof_total_threads;                 // total number of Java threads
+    int    _nof_initial_running_threads;       // total number of initially seen running threads
+    int    _nof_threads_wait_to_block;         // total number of threads waiting for to block
+    bool   _page_armed;                        // true if polling page is armed, false otherwise 
+    int    _nof_threads_hit_page_trap;         // total number of threads hitting the page trap
+    jlong  _time_to_spin;                      // total time in millis spent in spinning
+    jlong  _time_to_wait_to_block;             // total time in millis spent in waiting for to block
+    jlong  _time_to_sync;                      // total time in millis spent in getting to _synchronized
+    jlong  _time_to_exec_vmop;                 // total time in millis spent in vm operation itself
+    jlong  _time_elapsed_since_last_safepoint; // time elasped since last safepoint
+  } SafepointStats;
+
  private:
   static volatile SynchronizeState _state;     // Threads might read this flag directly, without acquireing the Threads_lock
   static volatile int _waiting_to_block;       // No. of threads we are waiting for to block.
@@ -72,24 +86,27 @@
   // safepoint. The fact that Threads_lock is held throughout each pair of
   // increments (at the beginning and end of each safepoint) guarantees
   // race freedom.
+public:
   static volatile int _safepoint_counter;
+private:
 
-  static long     _last_safepoint;             // Time of last safepoint
-
+  static jlong   _last_safepoint;      // Time of last safepoint
+  
   // statistics
-#ifndef PRODUCT
-  static long       _total_safepoints;
-  static long       _total_threads;
-  static long       _max_threads;
-  static double     _total_secs;
-  static double     _max_secs;
-  static double     _min_secs;
-#endif
+  static SafepointStats*  _safepoint_stats;     // array of SafepointStats struct
+  static int              _cur_stat_index;      // current index to the above array
+  static julong           _safepoint_reasons[]; // safepoint count for each VM op
+  static julong           _coalesced_vmop_count;// coalesced vmop count
+  static jlong            _max_sync_time;       // maximum sync time in nanos
 
-  static void begin_statistics(int nof_threads) PRODUCT_RETURN;
-  static void end_statistics(double seconds)    PRODUCT_RETURN;
-  static void print_statistics(double seconds)  PRODUCT_RETURN;
-
+  static void begin_statistics(int nof_threads, int nof_running);
+  static void update_statistics_on_spin_end();
+  static void update_statistics_on_sync_end(jlong end_time);
+  static void end_statistics(jlong end_time);
+  static void print_statistics();
+  inline static void inc_page_trap_count() {
+    Atomic::inc(&_safepoint_stats[_cur_stat_index]._nof_threads_hit_page_trap);
+  }
 public:
 
   // Main entry points
@@ -124,6 +141,11 @@
   // debugging
   static void print_state()                                PRODUCT_RETURN;
   static void safepoint_msg(const char* format, ...)       PRODUCT_RETURN;
+  
+  static void initialize_stat();
+  static void print_stat_on_exit();
+  inline static void inc_vmop_coalesced_count() { _coalesced_vmop_count++; }
+
   static void set_is_at_safepoint()                        { _state = _synchronized; }
   static void set_is_not_at_safepoint()                    { _state = _not_synchronized; }
 
@@ -133,7 +155,6 @@
   static address safepoint_counter_addr()                  { return (address)&_safepoint_counter; }
 };
 
-
 // State class for a thread suspended at a safepoint
 class ThreadSafepointState: public CHeapObj {
  public:  
@@ -158,7 +179,7 @@
   ThreadSafepointState(JavaThread *thread);
 
   // examine/roll-forward/restart   
-  void examine_state_of_thread(int iterations);               
+  void examine_state_of_thread();               
   void roll_forward(suspend_type type);
   void restart();  
   
--- a/hotspot/src/share/vm/runtime/synchronizer.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)synchronizer.cpp	1.108 07/05/17 16:06:41 JVM"
+#pragma ident "@(#)synchronizer.cpp	1.110 07/05/26 16:19:45 JVM"
 #endif
 /*
  * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -179,6 +179,8 @@
 
 
 // Tunables ...
+// The knob* variables are effectively final.  Once set they should
+// never be modified hence.
 
 static int Knob_LogSpins           = 0 ;       // enable jvmstat tally for spins
 static int Knob_HandOff            = 0 ;      
@@ -204,7 +206,7 @@
 static int Knob_OState             = 3 ;       // Spinner checks thread state of _owner
 static int Knob_UsePause           = 1 ; 
 static int Knob_ExitPolicy         = 0 ; 
-static int Knob_PreSpin            = 10 ; 
+static int Knob_PreSpin            = 10 ;      // 20-100 likely better
 static int Knob_ResetEvent         = 0 ; 
 static int BackOffMask             = 0 ; 
 
@@ -355,10 +357,8 @@
 
 PerfCounter * ObjectSynchronizer::_sync_Inflations                  = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_Deflations                  = NULL ;
-PerfCounter * ObjectSynchronizer::_sync_MonitorCacheContention      = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_ContendedLockAttempts       = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_FutileWakeups               = NULL ;
-PerfCounter * ObjectSynchronizer::_sync_MetaContention              = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_Parks                       = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_EmptyNotifications          = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_Notifications               = NULL ;
@@ -372,6 +372,7 @@
 PerfCounter * ObjectSynchronizer::_sync_SuccessfulSpins             = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_MonInCirculation            = NULL ;
 PerfCounter * ObjectSynchronizer::_sync_MonScavenged                = NULL ;
+PerfLongVariable * ObjectSynchronizer::_sync_MonExtant              = NULL ;
   
 // One-shot global initialization for the sync subsystem.  
 // We could also defer initialization and initialize on-demand
@@ -384,13 +385,12 @@
   InitializationCompleted = 1 ; 
   if (UsePerfData) { 
       EXCEPTION_MARK ; 
-      #define NEWPERFCOUNTER(n)    {n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events,CHECK); } 
+      #define NEWPERFCOUNTER(n)   {n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events,CHECK); } 
+      #define NEWPERFVARIABLE(n)  {n = PerfDataManager::create_variable(SUN_RT, #n, PerfData::U_Events,CHECK); } 
       NEWPERFCOUNTER(_sync_Inflations) ; 
       NEWPERFCOUNTER(_sync_Deflations) ; 
-      NEWPERFCOUNTER(_sync_MonitorCacheContention); 
       NEWPERFCOUNTER(_sync_ContendedLockAttempts) ; 
       NEWPERFCOUNTER(_sync_FutileWakeups) ; 
-      NEWPERFCOUNTER(_sync_MetaContention) ; 
       NEWPERFCOUNTER(_sync_Parks) ; 
       NEWPERFCOUNTER(_sync_EmptyNotifications) ;
       NEWPERFCOUNTER(_sync_Notifications) ;
@@ -404,6 +404,7 @@
       NEWPERFCOUNTER(_sync_PrivateB) ;
       NEWPERFCOUNTER(_sync_MonInCirculation) ;
       NEWPERFCOUNTER(_sync_MonScavenged) ;
+      NEWPERFVARIABLE(_sync_MonExtant) ; 
       #undef NEWPERFCOUNTER
   }
 }
@@ -504,6 +505,11 @@
 //    implemented in park().  Another alternative would be to provide
 //    multiple instances of the PlatformEvent() for each thread.  One 
 //    instance would be dedicated to muxAcquire-muxRelease, for instance.
+//
+// *  Usage:
+//    -- only as leaf locks
+//    -- for short-term locks only, as blocking MuxAcquire() does _not perform
+//       a state transition.  
 // 
 // Alternatives:
 // *  We could implement muxAcquire and muxRelease with MCS or CLH locks 
@@ -615,11 +621,6 @@
   }
 }
 
-static int muxIsLocked (volatile intptr_t * Lock) {
-  return *Lock != 0 ; 
-}
-
-
 // ObjectMonitor Lifecycle
 // -----------------------
 // Inflation unlinks monitors from the global gFreeList and 
@@ -666,12 +667,17 @@
 //
 
 ObjectMonitor * ObjectSynchronizer::gBlockList = NULL ;
-ObjectMonitor * ObjectSynchronizer::gFreeList  = NULL ;
+ObjectMonitor * volatile ObjectSynchronizer::gFreeList  = NULL ;
 static volatile intptr_t ListLock = 0 ;      // protects global monitor free-list cache
 #define CHAINMARKER ((oop)-1)
 
 ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
-    const int MAXPRIVATE = 2048 ; 
+    // A large MAXPRIVATE value reduces both list lock contention
+    // and list coherency traffic, but also tends to increase the  
+    // number of objectMonitors in circulation as well as the STW
+    // scavenge costs.  As usual, we lean toward time in space-time
+    // tradeoffs.  
+    const int MAXPRIVATE = 1024 ; 
     for (;;) { 
         ObjectMonitor * m ; 
 
@@ -734,7 +740,7 @@
         // will points to next block, which forms the block list. 
         // The trick of using the 1st element in the block as gBlockList
         // linkage should be reconsidered.  A better implementation would
-        // look like:   class Block { Block * next; int N; ObjectMonitor Body [N] ; } 
+        // look like: class Block { Block * next; int N; ObjectMonitor Body [N] ; } 
 
         for (int i = 1; i < _BLOCKSIZE ; i++) {
            temp[i].FreeNext = &temp[i+1];
@@ -746,6 +752,10 @@
         // Element [0] is reserved for global list linkage
         temp[0].set_object(CHAINMARKER);
 
+        // Consider carving out this thread's current request from the 
+        // block in hand.  This avoids some lock traffic and redundant 
+        // list activity.  
+
         // Acquire the ListLock to manipulate BlockList and FreeList.
         // An Oyama-Taura-Yonezawa scheme might be more efficient. 
         muxAcquire (&ListLock, "omAlloc [2]") ; 
@@ -785,11 +795,24 @@
     Self->omFreeCount ++ ; 
 }
 
-// Return the monitors of a moribund thread to the global list.
-// "List" is a null-terminated SLL.  
+// Return the monitors of a moribund thread's local free list to 
+// the global free list.  Typically a thread calls omFlush() when 
+// it's dying.  We could also consider having the VM thread steal 
+// monitors from threads that have not run java code over a few
+// consecutive STW safepoints.  Relatedly, we might decay 
+// omFreeProvision at STW safepoints. 
+//
+// We currently call omFlush() from the Thread:: dtor _after the thread
+// has been excised from the thread list and is no longer a mutator.
+// That means that omFlush() can run concurrently with a safepoint and
+// the scavenge operator.  Calling omFlush() from JavaThread::exit() might 
+// be a better choice as we could safely reason that that the JVM is
+// not at a safepoint at the time of the call, and thus there could
+// be not inopportune interleavings between omFlush() and the scavenge
+// operator.  
 
 void ObjectSynchronizer::omFlush (Thread * Self) {
-    ObjectMonitor * List = Self->omFreeList ; 
+    ObjectMonitor * List = Self->omFreeList ;  // Null-terminated SLL 
     Self->omFreeList = NULL ; 
     if (List == NULL) return ; 
     ObjectMonitor * Tail = NULL ; 
@@ -798,11 +821,10 @@
         Tail = s ;
         guarantee (s->object() == NULL, "invariant") ;
         guarantee (!s->is_busy(), "invariant") ;
-        s->set_owner (NULL) ;
+        s->set_owner (NULL) ;   // redundant but good hygiene
         TEVENT (omFlush - Move one) ;
     }
 
-    TEVENT (omFlush) ;
     guarantee (Tail != NULL && List != NULL, "invariant") ; 
     muxAcquire (&ListLock, "omFlush") ; 
     Tail->FreeNext = gFreeList ;
@@ -1587,8 +1609,21 @@
 // Release all inflated monitors owned by THREAD.  Lightweight monitors are
 // ignored.  This is meant to be called during JNI thread detach which assumes
 // all remaining monitors are heavyweight.  All exceptions are swallowed.
+// Scanning the extant monitor list can be time consuming.
+// A simple optimization is to add a per-thread flag that indicates a thread
+// called jni_monitorenter() during its lifetime.
+//
+// Instead of No_Savepoint_Verifier it might be cheaper to
+// use an idiom of the form:
+//   auto int tmp = SafepointSynchronize::_safepoint_counter ; 
+//   <code that must not run at safepoint>
+//   guarantee (((tmp ^ _safepoint_counter) | (tmp & 1)) == 0) ; 
+// Since the tests are extremely cheap we could leave them enabled
+// for normal product builds.  
+
 void ObjectSynchronizer::release_monitors_owned_by_thread(TRAPS) {
   assert(THREAD == JavaThread::current(), "must be current Java thread");
+  No_Safepoint_Verifier nsv ;       
   ReleaseJavaMonitorsClosure rjmc(THREAD);
   muxAcquire(&ListLock, "release_monitors_owned_by_thread");
   ObjectSynchronizer::monitors_iterate(&rjmc);
@@ -1647,6 +1682,11 @@
 // Deflate_idle_monitors() would scavenge and move monitors to the
 // quiescent list.  
 //
+// Perversely, the heap size -- and thus the STW safepoint rate -- 
+// typically drives the scavenge rate.  Large heaps can mean infrequent GC,
+// which in turn can mean large(r) numbers of objectmonitors in circulation.  
+// This is an unfortunate aspect of this design.
+//
 // Another refinement would be to refrain from calling deflate_idle_monitors()
 // except at stop-the-world points associated with garbage collections.  
 //
@@ -1659,6 +1699,9 @@
   int nInCirculation = 0 ;      // extant
   int nScavenged = 0 ;          // reclaimed
 
+  ObjectMonitor * FreeHead = NULL ;  // Local SLL of scavenged monitors
+  ObjectMonitor * FreeTail = NULL ; 
+
   // Iterate over all extant monitors - Scavenge all idle monitors. 
   TEVENT (deflate_idle_monitors) ; 
   for (ObjectMonitor* block = gBlockList; block != NULL; block = next(block)) {
@@ -1701,22 +1744,39 @@
          // Restore the header back to obj
          obj->release_set_mark(mid->header());
          mid->clear();
-         // Put the monitor back to free list.  
-         // We don't need the freelist lock as we're at a STW safepoint. 
-         // omAlloc() and omFree() can only be called while a thread is _not in safepoint state.
-         // Alternately, we could simply collect the list of to-be-free monitors locally, during 
-         // the scavenge pass, and then splice that list onto the free list in constant-time while 
-         // holding the ListLock. 
-         assert (!muxIsLocked(&ListLock), "invariant") ; 
-         mid->FreeNext = gFreeList;
-         gFreeList = mid;
+
          assert (mid->object() == NULL, "invariant") ;
+
+         // Move the object to the working free list defined by FreeHead,FreeTail.
+         mid->FreeNext = NULL ; 
+         if (FreeHead == NULL) FreeHead = mid ; 
+         if (FreeTail != NULL) FreeTail->FreeNext = mid ; 
+         FreeTail = mid ; 
          nScavenged ++ ; 
       }
     }
   }
 
+  // Move the scavenged monitors back to the global free list.  
+  // In theory we don't need the freelist lock as we're at a STW safepoint. 
+  // omAlloc() and omFree() can only be called while a thread is _not in safepoint state.
+  // But it's remotely possible that omFlush() or release_monitors_owned_by_thread()
+  // might be called while not at a global STW safepoint.  In the interest of
+  // safety we protect the following access with ListLock.  
+  // An even more conservative and prudent approach would be to guard
+  // the main loop in scavenge_idle_monitors() with ListLock.  
+  if (FreeHead != NULL) {
+     guarantee (FreeTail != NULL && nScavenged > 0, "invariant") ; 
+     assert (FreeTail->FreeNext == NULL, "invariant") ; 
+     // constant-time list splice - prepend scavenged segment to gFreeList
+     muxAcquire (&ListLock, "scavenge - return") ;  
+     FreeTail->FreeNext = gFreeList ; 
+     gFreeList = FreeHead ; 
+     muxRelease (&ListLock) ; 
+  } 
+
   if (_sync_Deflations != NULL) _sync_Deflations->inc(nScavenged) ; 
+  if (_sync_MonExtant  != NULL) _sync_MonExtant ->set_value(nInCirculation);  
 
   // TODO: Add objectMonitor leak detection.  
   // Audit/inventory the objectMonitors -- make sure they're all accounted for.
@@ -2211,6 +2271,17 @@
 //       the spin counter to and extend the spin attempt.
 //    -- Doug points out that we should use the same "helping" policy
 //       in thread.yield().  
+//
+// *  Try MONITOR-MWAIT on systems that support those instructions.  
+// 
+// *  The spin statistics that drive spin decisions & frequency are
+//    maintained in the objectmonitor structure so if we deflate and reinflate
+//    we lose spin state.  In practice this is not usually a concern
+//    as the default spin state after inflation is aggressive (optimistic)
+//    and tends toward spinning.  So in the worst case for a lock where
+//    spinning is not profitable we may spin unnecessarily for a brief
+//    period.  But then again, if a lock is contented it'll tend not to deflate\
+//    in the first place.
 
 
 intptr_t ObjectMonitor::SpinCallbackArgument = 0 ; 
@@ -2312,7 +2383,7 @@
             TEVENT (Spin: safepoint) ; 
             goto Abort ;           // abrupt spin egress
          }
-         if (Knob_UsePause) SpinPause () ; 
+         if (Knob_UsePause & 1) SpinPause () ; 
 
          int (*scb)(intptr_t,int) = SpinCallbackFunction ; 
          if (hits > 50 && scb != NULL) { 
@@ -2320,8 +2391,7 @@
          }
       }
 
-      // TODO-FIXME: enable SpinPause()
-      if (false) SpinPause() ; 
+      if (Knob_UsePause & 2) SpinPause() ; 
 
       // Exponential back-off ...  Stay off the bus to reduce coherency traffic.
       // This is useful on classic SMP systems, but is of less utility on 
@@ -2627,6 +2697,8 @@
 //   Note that is is *not* word-tearing, but it does presume that full-word
 //   CAS operations are coherent with intermix with STB operations.  That's true
 //   on most common processors.  
+//
+// * See also http://blogs.sun.com/dave
 
 
 void ATTR ObjectMonitor::EnterI (TRAPS) {  
@@ -3053,6 +3125,7 @@
   }
 
   if (cur == Self) { 
+     // TODO-FIXME: check for integer overflow!  BUGID 6557169.  
      _recursions ++ ; 
      return ; 
   }
@@ -4436,6 +4509,7 @@
 
 // Used for JVMTI raw monitor implementation.
 // All JavaThreads will enter here with state _thread_blocked
+
 int ObjectMonitor::raw_wait(jlong millis, bool interruptible, TRAPS) {
   TEVENT (raw_wait) ; 
   if (THREAD != _owner) {
--- a/hotspot/src/share/vm/runtime/synchronizer.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/synchronizer.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)synchronizer.hpp	1.70 07/05/17 16:06:44 JVM"
+#pragma ident "@(#)synchronizer.hpp	1.71 07/05/26 16:04:34 JVM"
 #endif
 /*
  * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -163,13 +163,12 @@
  private:
   enum { _BLOCKSIZE = 128 };     
   static ObjectMonitor* gBlockList;
-  static ObjectMonitor* gFreeList;
+  static ObjectMonitor * volatile gFreeList;
   
  public:
   static void Initialize () ;
   static PerfCounter * _sync_ContendedLockAttempts ; 
   static PerfCounter * _sync_FutileWakeups ; 
-  static PerfCounter * _sync_MetaContention ;
   static PerfCounter * _sync_Parks ; 
   static PerfCounter * _sync_EmptyNotifications ; 
   static PerfCounter * _sync_Notifications ; 
@@ -185,7 +184,7 @@
   static PerfCounter * _sync_MonScavenged ;
   static PerfCounter * _sync_Inflations ;
   static PerfCounter * _sync_Deflations ; 
-  static PerfCounter * _sync_MonitorCacheContention ;
+  static PerfLongVariable * _sync_MonExtant ;
 
  public:
   static void RegisterSpinCallback (int (*)(intptr_t, int), intptr_t) ;
--- a/hotspot/src/share/vm/runtime/thread.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/thread.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)thread.cpp	1.807 07/05/17 16:06:51 JVM"
+#pragma ident "@(#)thread.cpp	1.809 07/06/01 01:36:09 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -2825,6 +2825,7 @@
   if (!main_thread->set_as_starting_thread()) {
     vm_shutdown_during_initialization(
       "Failed necessary internal allocation. Out of swap space");
+    delete main_thread;
     *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
     return JNI_ENOMEM;
   }
@@ -2841,6 +2842,7 @@
   // Initialize global modules
   jint status = init_globals();
   if (status != JNI_OK) {
+    delete main_thread;
     *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
     return status;
   }
@@ -2998,6 +3000,7 @@
     vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
   }
   
+#ifndef SERIALGC
   // Support for ConcurrentMarkSweep. This should be cleaned up
   // and better encapsulated. XXX YSR
   if (UseConcMarkSweepGC) {
@@ -3006,6 +3009,7 @@
       vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
     }
   }
+#endif // SERIALGC
 
   // Always call even when there are not JVMTI environments yet, since environments
   // may be attached late and JVMTI must track phases of VM execution
@@ -3467,6 +3471,7 @@
     vmt->oops_do(f);
 }
 
+#ifndef SERIALGC
 // Used by ParallelScavenge
 void Threads::create_thread_roots_tasks(GCTaskQueue* q) {
   ALL_JAVA_THREADS(p) {
@@ -3482,6 +3487,7 @@
   }
   q->enqueue(new ThreadRootsMarkingTask(VMThread::vm_thread()));
 }
+#endif // SERIALGC
 
 void Threads::nmethods_do() {
   ALL_JAVA_THREADS(p) {
@@ -3595,11 +3601,13 @@
                );
   st->cr();
 
+#ifndef SERIALGC
   // Dump concurrent locks
   ConcurrentLocksDump concurrent_locks;
   if (print_concurrent_locks) {
     concurrent_locks.dump_at_safepoint();
   }
+#endif // SERIALGC
 
   ALL_JAVA_THREADS(p) {
     ResourceMark rm;
@@ -3612,9 +3620,11 @@
       }
     }
     st->cr();
+#ifndef SERIALGC
     if (print_concurrent_locks) {
       concurrent_locks.print_locks_on(p, st);
     }
+#endif // SERIALGC
   }
 
   VMThread::vm_thread()->print_on(st);
--- a/hotspot/src/share/vm/runtime/vframeArray.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/vframeArray.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vframeArray.cpp	1.143 07/05/05 17:07:01 JVM"
+#pragma ident "@(#)vframeArray.cpp	1.144 07/06/08 15:21:45 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -389,7 +389,7 @@
   } else if (TraceDeoptimization) {
     tty->print("     ");
     method()->print_value();
-    Bytecodes::Code code = Bytecodes::java_code(Bytecodes::cast(*bcp));
+    Bytecodes::Code code = Bytecodes::java_code_at(bcp);
     int bci = method()->bci_from(bcp);
     tty->print(" - %s", Bytecodes::name(code));
     tty->print(" @ bci %d ", bci);
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vmStructs.cpp	1.184 07/05/17 16:07:08 JVM"
+#pragma ident "@(#)vmStructs.cpp	1.185 07/05/29 09:44:29 JVM"
 #endif
 /*
  * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -271,7 +271,6 @@
   unchecked_nonstatic_field(ageTable,          sizes,                                         sizeof(ageTable::sizes))               \
                                                                                                                                      \
   nonstatic_field(BarrierSet,                  _max_covered_regions,                          int)                                   \
-                                                                                                                                     \
   nonstatic_field(BlockOffsetTable,            _bottom,                                       HeapWord*)                             \
   nonstatic_field(BlockOffsetTable,            _end,                                          HeapWord*)                             \
                                                                                                                                      \
@@ -313,17 +312,8 @@
   nonstatic_field(CompactibleSpace,            _first_dead,                                   HeapWord*)                             \
   nonstatic_field(CompactibleSpace,            _end_of_live,                                  HeapWord*)                             \
                                                                                                                                      \
-  nonstatic_field(FreeChunk,                   _next,                                         FreeChunk*)                            \
-  nonstatic_field(FreeChunk,                   _prev,                                         FreeChunk*)                            \
-  nonstatic_field(FreeChunk,                   _size,                                         size_t)                                \
-                                                                                                                                     \
-  nonstatic_field(CompactibleFreeListSpace,    _collector,                                    CMSCollector*)                         \
-  nonstatic_field(CompactibleFreeListSpace,    _bt,                                           BlockOffsetArrayNonContigSpace)        \
-                                                                                                                                     \
   nonstatic_field(CompactingPermGen,           _gen,                                          OneContigSpaceCardGeneration*)         \
                                                                                                                                      \
-  nonstatic_field(CMSPermGen,                  _gen,                                          ConcurrentMarkSweepGeneration*)        \
-                                                                                                                                     \
   nonstatic_field(ContiguousSpace,             _top,                                          HeapWord*)                             \
   nonstatic_field(ContiguousSpace,             _concurrent_iteration_safe_limit,              HeapWord*)                             \
   nonstatic_field(ContiguousSpace,             _saved_mark_word,                              HeapWord*)                             \
@@ -401,15 +391,6 @@
   nonstatic_field(ThreadLocalAllocBuffer,      _desired_size,                                 size_t)                                \
   nonstatic_field(ThreadLocalAllocBuffer,      _refill_waste_limit,                           size_t)                                \
      static_field(ThreadLocalAllocBuffer,      _target_refills,                               unsigned)                              \
-                                                                                                                                     \
-  nonstatic_field(CMSBitMap,                   _bmStartWord,                                  HeapWord*)                             \
-  nonstatic_field(CMSBitMap,                   _bmWordSize,                                   size_t)                                \
-  nonstatic_field(CMSBitMap,                   _shifter,                                      const int)                             \
-  nonstatic_field(CMSBitMap,                   _bm,                                           BitMap)                                \
-  nonstatic_field(CMSBitMap,                   _virtual_space,                                VirtualSpace)                          \
-  nonstatic_field(CMSCollector,                _markBitMap,                                   CMSBitMap)                             \
-  nonstatic_field(ConcurrentMarkSweepGeneration, _cmsSpace,                                   CompactibleFreeListSpace*)             \
-                                                                                                                                     \
   nonstatic_field(VirtualSpace,                _low_boundary,                                 char*)                                 \
   nonstatic_field(VirtualSpace,                _high_boundary,                                char*)                                 \
   nonstatic_field(VirtualSpace,                _low,                                          char*)                                 \
@@ -420,44 +401,6 @@
   nonstatic_field(WaterMark,                   _point,                                        HeapWord*)                             \
   nonstatic_field(WaterMark,                   _space,                                        Space*)                                \
                                                                                                                                      \
-  /**********************/                                                                                                           \
-  /* Parallel GC fields */                                                                                                           \
-  /**********************/                                                                                                           \
-                                                                                                                                     \
-  nonstatic_field(PSVirtualSpace,              _alignment,                                    const size_t)                          \
-  nonstatic_field(PSVirtualSpace,              _reserved_low_addr,                            char*)                                 \
-  nonstatic_field(PSVirtualSpace,              _reserved_high_addr,                           char*)                                 \
-  nonstatic_field(PSVirtualSpace,              _committed_low_addr,                           char*)                                 \
-  nonstatic_field(PSVirtualSpace,              _committed_high_addr,                          char*)                                 \
-                                                                                                                                     \
-  nonstatic_field(ImmutableSpace,              _bottom,                                       HeapWord*)                             \
-  nonstatic_field(ImmutableSpace,              _end,                                          HeapWord*)                             \
-                                                                                                                                     \
-  nonstatic_field(MutableSpace,                _top,                                          HeapWord*)                             \
-                                                                                                                                     \
-  nonstatic_field(PSYoungGen,                  _reserved,                                     MemRegion)                             \
-  nonstatic_field(PSYoungGen,                  _virtual_space,                                PSVirtualSpace*)                       \
-  nonstatic_field(PSYoungGen,                  _eden_space,                                   MutableSpace*)                         \
-  nonstatic_field(PSYoungGen,                  _from_space,                                   MutableSpace*)                         \
-  nonstatic_field(PSYoungGen,                  _to_space,                                     MutableSpace*)                         \
-  nonstatic_field(PSYoungGen,                  _init_gen_size,                                const size_t)                          \
-  nonstatic_field(PSYoungGen,                  _min_gen_size,                                 const size_t)                          \
-  nonstatic_field(PSYoungGen,                  _max_gen_size,                                 const size_t)                          \
-                                                                                                                                     \
-  nonstatic_field(PSOldGen,                    _reserved,                                     MemRegion)                             \
-  nonstatic_field(PSOldGen,                    _virtual_space,                                PSVirtualSpace*)                       \
-  nonstatic_field(PSOldGen,                    _object_space,                                 MutableSpace*)                         \
-  nonstatic_field(PSOldGen,                    _init_gen_size,                                const size_t)                          \
-  nonstatic_field(PSOldGen,                    _min_gen_size,                                 const size_t)                          \
-  nonstatic_field(PSOldGen,                    _max_gen_size,                                 const size_t)                          \
-                                                                                                                                     \
-  nonstatic_field(PSPermGen,                   _last_used,                                    size_t)                                \
-                                                                                                                                     \
-     static_field(ParallelScavengeHeap,        _young_gen,                                    PSYoungGen*)                           \
-     static_field(ParallelScavengeHeap,        _old_gen,                                      PSOldGen*)                             \
-     static_field(ParallelScavengeHeap,        _perm_gen,                                     PSPermGen*)                            \
-     static_field(ParallelScavengeHeap,        _psh,                                          ParallelScavengeHeap*)                 \
-                                                                                                                                     \
   /************************/                                                                                                         \
   /* PerfMemory - jvmstat */                                                                                                         \
   /************************/                                                                                                         \
@@ -725,9 +668,6 @@
   nonstatic_field(JavaThread,                  _osthread,                                     OSThread*)                             \
   nonstatic_field(JavaThread,                  _stack_base,                                   address)                               \
   nonstatic_field(JavaThread,                  _stack_size,                                   size_t)                                \
-     static_field(ConcurrentMarkSweepThread,   _cmst,                                         ConcurrentMarkSweepThread*)            \
-     static_field(ConcurrentMarkSweepThread,   _collector,                                    CMSCollector*)                         \
-     static_field(ConcurrentMarkSweepThread,   _slt,                                          SurrogateLockerThread*)                \
                                                                                                                                      \
   /************/                                                                                                                     \
   /* OSThread */                                                                                                                     \
@@ -1034,32 +974,24 @@
   /******************************************/                            \
                                                                           \
   declare_toplevel_type(CollectedHeap)                                    \
-           declare_type(ParallelScavengeHeap,         CollectedHeap)      \
            declare_type(SharedHeap,                   CollectedHeap)      \
            declare_type(GenCollectedHeap,             SharedHeap)         \
   declare_toplevel_type(Generation)                                       \
            declare_type(DefNewGeneration,             Generation)         \
-           declare_type(ParNewGeneration,             DefNewGeneration)   \
            declare_type(CardGeneration,               Generation)         \
            declare_type(OneContigSpaceCardGeneration, CardGeneration)     \
-           declare_type(ConcurrentMarkSweepGeneration,CardGeneration)     \
-           declare_type(CMSPermGenGen,                ConcurrentMarkSweepGeneration) \
            declare_type(TenuredGeneration,            OneContigSpaceCardGeneration) \
            declare_type(CompactingPermGenGen,         OneContigSpaceCardGeneration) \
   declare_toplevel_type(Space)                                            \
-  declare_toplevel_type(CMSBitMap)                                        \
   declare_toplevel_type(BitMap)                                           \
            declare_type(CompactibleSpace,             Space)              \
-           declare_type(CompactibleFreeListSpace,     CompactibleSpace)   \
            declare_type(ContiguousSpace,              CompactibleSpace)   \
            declare_type(EdenSpace,                    ContiguousSpace)    \
            declare_type(OffsetTableContigSpace,       ContiguousSpace)    \
            declare_type(TenuredSpace,                 OffsetTableContigSpace) \
            declare_type(ContigPermSpace,              OffsetTableContigSpace) \
-  declare_toplevel_type(FreeChunk)                                        \
   declare_toplevel_type(PermGen)                                          \
            declare_type(CompactingPermGen,            PermGen)            \
-           declare_type(CMSPermGen,                   PermGen)            \
   declare_toplevel_type(BarrierSet)                                       \
            declare_type(ModRefBarrierSet,             BarrierSet)         \
            declare_type(CardTableModRefBS,            ModRefBarrierSet)   \
@@ -1082,7 +1014,6 @@
   declare_toplevel_type(ThreadLocalAllocBuffer)                           \
   declare_toplevel_type(VirtualSpace)                                     \
   declare_toplevel_type(WaterMark)                                        \
-  declare_toplevel_type(CMSCollector)                                     \
                                                                           \
   /* Pointers to Garbage Collection types */                              \
                                                                           \
@@ -1092,9 +1023,6 @@
   declare_toplevel_type(CardTableRS*)                                     \
   declare_toplevel_type(CollectedHeap*)                                   \
   declare_toplevel_type(ContiguousSpace*)                                 \
-  declare_toplevel_type(CompactibleFreeListSpace*)                        \
-  declare_toplevel_type(CMSCollector*)                                    \
-  declare_toplevel_type(FreeChunk*)                                       \
   declare_toplevel_type(DefNewGeneration*)                                \
   declare_toplevel_type(EdenSpace*)                                       \
   declare_toplevel_type(GenCollectedHeap*)                                \
@@ -1104,38 +1032,10 @@
   declare_toplevel_type(MemRegion*)                                       \
   declare_toplevel_type(OffsetTableContigSpace*)                          \
   declare_toplevel_type(OneContigSpaceCardGeneration*)                    \
-  declare_toplevel_type(ConcurrentMarkSweepGeneration*)                   \
   declare_toplevel_type(PermGen*)                                         \
   declare_toplevel_type(Space*)                                           \
   declare_toplevel_type(ThreadLocalAllocBuffer*)                          \
                                                                           \
-  /*****************************************/                             \
-  /* Parallel GC - space, gen abstractions */                             \
-  /*****************************************/                             \
-                                                                          \
-  declare_toplevel_type(PSVirtualSpace)                                   \
-  declare_toplevel_type(ImmutableSpace)                                   \
-           declare_type(MutableSpace, ImmutableSpace)                     \
-  declare_toplevel_type(PSYoungGen)                                       \
-           declare_type(ASPSYoungGen, PSYoungGen)                         \
-  declare_toplevel_type(PSOldGen)                                         \
-           declare_type(ASPSOldGen, PSOldGen)                             \
-           declare_type(PSPermGen, PSOldGen)                              \
-                                                                          \
-  /*****************************/                                         \
-  /* Parallel GC pointer types */                                         \
-  /*****************************/                                         \
-                                                                          \
-  declare_toplevel_type(PSVirtualSpace*)                                  \
-  declare_toplevel_type(ImmutableSpace*)                                  \
-  declare_toplevel_type(MutableSpace*)                                    \
-  declare_toplevel_type(PSYoungGen*)                                      \
-  declare_toplevel_type(ASPSYoungGen*)                                    \
-  declare_toplevel_type(PSOldGen*)                                        \
-  declare_toplevel_type(ASPSOldGen*)                                      \
-  declare_toplevel_type(PSPermGen*)                                       \
-  declare_toplevel_type(ParallelScavengeHeap*)                            \
-                                                                          \
   /************************/                                              \
   /* PerfMemory - jvmstat */                                              \
   /************************/                                              \
@@ -1186,11 +1086,9 @@
   declare_toplevel_type(ThreadShadow)                                     \
            declare_type(Thread, ThreadShadow)                             \
            declare_type(NamedThread, Thread)                              \
-              declare_type(ConcurrentMarkSweepThread, NamedThread)        \
            declare_type(WatcherThread, Thread)                            \
            declare_type(JavaThread, Thread)                               \
            declare_type(JvmtiAgentThread, JavaThread)                     \
-           declare_type(SurrogateLockerThread, JavaThread)                \
            declare_type(LowMemoryDetectorThread, JavaThread)              \
   declare_type(CompilerThread, JavaThread)                        \
   declare_toplevel_type(OSThread)                                         \
@@ -1354,8 +1252,6 @@
   declare_toplevel_type(intptr_t*)                                        \
    declare_unsigned_integer_type(InvocationCounter) /* FIXME: wrong type (not integer) */ \
   declare_toplevel_type(JavaThread*)                                      \
-  declare_toplevel_type(SurrogateLockerThread*)                           \
-  declare_toplevel_type(ConcurrentMarkSweepThread*)                       \
   declare_toplevel_type(jbyte*)                                           \
   declare_toplevel_type(jbyte**)                                          \
   declare_toplevel_type(jint*)                                            \
@@ -1461,9 +1357,7 @@
   /* constants from Generation::Name enum */                              \
                                                                           \
   declare_constant(Generation::DefNew)                                    \
-  declare_constant(Generation::ParNew)                                    \
   declare_constant(Generation::MarkSweepCompact)                          \
-  declare_constant(Generation::ConcurrentMarkSweep)                       \
   declare_constant(Generation::Other)                                     \
                                                                           \
   declare_constant(Generation::LogOfGenGrain)                             \
@@ -1477,7 +1371,6 @@
                                                                           \
   declare_constant(PermGen::MarkSweepCompact)                             \
   declare_constant(PermGen::MarkSweep)                                    \
-  declare_constant(PermGen::ConcurrentMarkSweep)                          \
                                                                           \
   /************************/                                              \
   /* PerfMemory - jvmstat */                                              \
@@ -2059,6 +1952,14 @@
              GENERATE_C2_UNCHECKED_STATIC_VM_STRUCT_ENTRY, \
              GENERATE_VM_STRUCT_LAST_ENTRY)
 
+#ifndef SERIALGC
+  VM_STRUCTS_PARALLELGC(GENERATE_NONSTATIC_VM_STRUCT_ENTRY, \
+                        GENERATE_STATIC_VM_STRUCT_ENTRY)
+
+  VM_STRUCTS_CMS(GENERATE_NONSTATIC_VM_STRUCT_ENTRY, \
+                 GENERATE_STATIC_VM_STRUCT_ENTRY)
+#endif // SERIALGC
+
   VM_STRUCTS_CPU(GENERATE_NONSTATIC_VM_STRUCT_ENTRY, \
                  GENERATE_STATIC_VM_STRUCT_ENTRY, \
                  GENERATE_UNCHECKED_NONSTATIC_VM_STRUCT_ENTRY, \
@@ -2092,6 +1993,15 @@
            GENERATE_C2_TOPLEVEL_VM_TYPE_ENTRY,
            GENERATE_VM_TYPE_LAST_ENTRY)
 
+#ifndef SERIALGC
+  VM_TYPES_PARALLELGC(GENERATE_VM_TYPE_ENTRY,
+                      GENERATE_TOPLEVEL_VM_TYPE_ENTRY)
+
+  VM_TYPES_CMS(GENERATE_VM_TYPE_ENTRY,
+               GENERATE_TOPLEVEL_VM_TYPE_ENTRY)
+
+  VM_TYPES_PARNEW(GENERATE_VM_TYPE_ENTRY)
+#endif // SERIALGC
 
   VM_TYPES_CPU(GENERATE_VM_TYPE_ENTRY,
                GENERATE_TOPLEVEL_VM_TYPE_ENTRY,
@@ -2123,6 +2033,12 @@
                    GENERATE_C2_PREPROCESSOR_VM_INT_CONSTANT_ENTRY,
                    GENERATE_VM_INT_CONSTANT_LAST_ENTRY)
 
+#ifndef SERIALGC
+  VM_INT_CONSTANTS_CMS(GENERATE_VM_INT_CONSTANT_ENTRY)
+
+  VM_INT_CONSTANTS_PARNEW(GENERATE_VM_INT_CONSTANT_ENTRY)
+#endif // SERIALGC
+
   VM_INT_CONSTANTS_CPU(GENERATE_VM_INT_CONSTANT_ENTRY,
                        GENERATE_PREPROCESSOR_VM_INT_CONSTANT_ENTRY,
                        GENERATE_C1_VM_INT_CONSTANT_ENTRY,
@@ -2177,6 +2093,13 @@
              CHECK_NO_OP,
              CHECK_SENTINEL);
 
+#ifndef SERIALGC
+  VM_STRUCTS_PARALLELGC(CHECK_NONSTATIC_VM_STRUCT_ENTRY,
+             CHECK_STATIC_VM_STRUCT_ENTRY);
+
+  VM_STRUCTS_CMS(CHECK_NONSTATIC_VM_STRUCT_ENTRY,
+             CHECK_STATIC_VM_STRUCT_ENTRY);
+#endif // SERIALGC
 
   VM_STRUCTS_CPU(CHECK_NONSTATIC_VM_STRUCT_ENTRY,
                  CHECK_STATIC_VM_STRUCT_ENTRY,
@@ -2208,6 +2131,15 @@
            CHECK_C2_TOPLEVEL_VM_TYPE_ENTRY,
            CHECK_SENTINEL);
 
+#ifndef SERIALGC
+  VM_TYPES_PARALLELGC(CHECK_VM_TYPE_ENTRY,
+                      CHECK_SINGLE_ARG_VM_TYPE_NO_OP);
+
+  VM_TYPES_CMS(CHECK_VM_TYPE_ENTRY,
+               CHECK_SINGLE_ARG_VM_TYPE_NO_OP);
+
+  VM_TYPES_PARNEW(CHECK_VM_TYPE_ENTRY)
+#endif // SERIALGC
 
   VM_TYPES_CPU(CHECK_VM_TYPE_ENTRY,
                CHECK_SINGLE_ARG_VM_TYPE_NO_OP,
@@ -2266,6 +2198,12 @@
                         CHECK_NO_OP, \
                         CHECK_NO_OP, \
                         CHECK_SENTINEL));
+#ifndef SERIALGC
+  debug_only(VM_STRUCTS_PARALLELGC(ENSURE_FIELD_TYPE_PRESENT, \
+                                   ENSURE_FIELD_TYPE_PRESENT));
+  debug_only(VM_STRUCTS_CMS(ENSURE_FIELD_TYPE_PRESENT, \
+                            ENSURE_FIELD_TYPE_PRESENT));
+#endif // SERIALGC
   debug_only(VM_STRUCTS_CPU(ENSURE_FIELD_TYPE_PRESENT, \
                             ENSURE_FIELD_TYPE_PRESENT, \
                             CHECK_NO_OP, \
--- a/hotspot/src/share/vm/runtime/vmThread.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/vmThread.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vmThread.cpp	1.90 07/05/05 17:07:02 JVM"
+#pragma ident "@(#)vmThread.cpp	1.91 07/05/23 10:54:15 JVM"
 #endif
 /*
  * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -29,9 +29,9 @@
 # include "incls/_vmThread.cpp.incl"
 
 // Dummy VM operation to act as first element in our circular double-linked list
-class VM_First: public VM_Operation {
+class VM_Dummy: public VM_Operation {
+  VMOp_Type type() const { return VMOp_Dummy; }
   void  doit() {};
-  const char* name() const { return "dummy"; };
 };
 
 VMOperationQueue::VMOperationQueue() {
@@ -40,7 +40,7 @@
   for(int i = 0; i < nof_priorities; i++) {
     _queue_length[i] = 0;
     _queue_counter = 0;
-    _queue[i] = new VM_First(); 
+    _queue[i] = new VM_Dummy(); 
     _queue[i]->set_next(_queue[i]);
     _queue[i]->set_prev(_queue[i]);
   }
@@ -204,6 +204,11 @@
                  PerfDataManager::create_counter(SUN_THREADS, "vmOperationTime",
                                                  PerfData::U_Ticks, CHECK);
   }
+
+  // Initialize safepoint intrumentation buffer etc.
+  if (PrintSafepointStatistics || PrintSafepointStatisticsTimeout > 0){
+    SafepointSynchronize::initialize_stat();
+  }
 }
 
 
@@ -255,7 +260,7 @@
     xtty->end_elem();
     assert(should_terminate(), "termination flag must be set");
   }
-
+  
   // 4526887 let VM thread exit at Safepoint
   SafepointSynchronize::begin();
 
@@ -450,6 +455,9 @@
 	      _vm_queue->set_drain_list(next); 
 	      evaluate_operation(_cur_vm_operation);
 	      _cur_vm_operation = next;
+              if (PrintSafepointStatistics) {
+                SafepointSynchronize::inc_vmop_coalesced_count();
+              }
 	    } while (_cur_vm_operation != NULL);
 	  }
 	  // There is a chance that a thread enqueued a safepoint op
@@ -523,8 +531,8 @@
         SafepointSynchronize::begin();
         SafepointSynchronize::end();
       }
-    }    
-  } 
+    }
+  }
 }
 
 void VMThread::execute(VM_Operation* op) {     
--- a/hotspot/src/share/vm/runtime/vm_operations.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/vm_operations.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vm_operations.cpp	1.191 07/05/05 17:07:03 JVM"
+#pragma ident "@(#)vm_operations.cpp	1.192 07/05/23 10:54:18 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -28,6 +28,11 @@
 # include "incls/_precompiled.incl"
 # include "incls/_vm_operations.cpp.incl"
 
+#define VM_OP_NAME_INITIALIZE(name) #name,  
+
+const char* VM_Operation::_names[VM_Operation::VMOp_Terminating] = \
+  { VM_OPS_DO(VM_OP_NAME_INITIALIZE) };
+
 void VM_Operation::set_calling_thread(Thread* thread, ThreadPriority priority) { 
   _calling_thread = thread; 
   assert(MinPriority <= priority && priority <= MaxPriority, "sanity check");
@@ -417,7 +422,7 @@
   // Among 16276 JCK tests, 94% of them come here without any threads still
   // running in native; the other 6% are quiescent within 250ms (Ultra 80).
   wait_for_threads_in_native_to_block();
-
+  
   set_vm_exited();
 
   // cleanup globals resources before exiting. exit_globals() currently
--- a/hotspot/src/share/vm/runtime/vm_operations.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/runtime/vm_operations.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)vm_operations.hpp	1.129 07/05/05 17:07:03 JVM"
+#pragma ident "@(#)vm_operations.hpp	1.130 07/05/23 10:54:21 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -29,6 +29,59 @@
 // initiated by a Java thread but that must
 // take place in the VMThread.
 
+#define VM_OP_ENUM(type)   VMOp_##type,
+
+// Note: When new VM_XXX comes up, add 'XXX' to the template table. 
+#define VM_OPS_DO(template)                       \
+  template(Dummy)                                 \
+  template(ThreadStop)                            \
+  template(ThreadDump)                            \
+  template(PrintThreads)                          \
+  template(FindDeadlocks)                         \
+  template(ForceSafepoint)                        \
+  template(ForceAsyncSafepoint)                   \
+  template(Deoptimize)                            \
+  template(DeoptimizeFrame)                       \
+  template(DeoptimizeAll)                         \
+  template(ZombieAll)                             \
+  template(Verify)                                \
+  template(PrintJNI)                              \
+  template(HeapDumper)                            \
+  template(DeoptimizeTheWorld)                    \
+  template(GC_HeapInspection)                     \
+  template(GenCollectFull)                        \
+  template(GenCollectFullConcurrent)              \
+  template(GenCollectForAllocation)               \
+  template(ParallelGCFailedAllocation)            \
+  template(ParallelGCFailedPermanentAllocation)   \
+  template(ParallelGCSystemGC)                    \
+  template(CMS_Initial_Mark)                      \
+  template(CMS_Final_Remark)                      \
+  template(EnableBiasedLocking)                   \
+  template(RevokeBias)                            \
+  template(BulkRevokeBias)                        \
+  template(PopulateDumpSharedSpace)               \
+  template(JNIFunctionTableCopier)                \
+  template(RedefineClasses)                       \
+  template(GetOwnedMonitorInfo)                   \
+  template(GetObjectMonitorUsage)                 \
+  template(GetCurrentContendedMonitor)            \
+  template(GetStackTrace)                         \
+  template(GetMultipleStackTraces)                \
+  template(GetAllStackTraces)                     \
+  template(GetThreadListStackTraces)              \
+  template(GetFrameCount)                         \
+  template(GetFrameLocation)                      \
+  template(ChangeBreakpoints)                     \
+  template(GetOrSetLocal)                         \
+  template(GetCurrentLocation)                    \
+  template(EnterInterpOnlyMode)                   \
+  template(ChangeSingleStep)                      \
+  template(HeapWalkOperation)                     \
+  template(HeapIterateOperation)                  \
+  template(ReportJavaOutOfMemory)                 \
+  template(Exit)                                  \
+
 class VM_Operation: public CHeapObj {
  public:
   enum Mode {
@@ -37,13 +90,22 @@
     _concurrent,      // non-blocking, no safepoint, vm_op C-Heap allocated
     _async_safepoint  // non-blocking,    safepoint, vm_op C-Heap allocated 
   };
-              
+
+  enum VMOp_Type {
+    VM_OPS_DO(VM_OP_ENUM)
+    VMOp_Terminating
+  };
+                
  private:
   Thread*	  _calling_thread;
   ThreadPriority  _priority;
   long            _timestamp;
   VM_Operation*	  _next;  
   VM_Operation*   _prev;
+  
+  // The VM operation name array
+  static const char* _names[];
+
  public:
   VM_Operation()  { _calling_thread = NULL; _next = NULL; _prev = NULL; }
   virtual ~VM_Operation() {}
@@ -54,7 +116,7 @@
   void set_calling_thread(Thread* thread, ThreadPriority priority);
   
   long timestamp() const              { return _timestamp; }
-  void set_timestamp(long timestamp)  { _timestamp = timestamp; }  
+  void set_timestamp(long timestamp)  { _timestamp = timestamp; } 
     
   // Called by VM thread - does in turn invoke doit(). Do not override this
   void evaluate();  
@@ -79,8 +141,8 @@
   void set_next(VM_Operation *next)		 { _next = next; }
   void set_prev(VM_Operation *prev)		 { _prev = prev; }
   
-  // Configuration. Override these appropriatly in subclasses.
-  virtual const char* name() const                = 0;  
+  // Configuration. Override these appropriatly in subclasses.             
+  virtual VMOp_Type type() const = 0;
   virtual Mode evaluation_mode() const            { return _safepoint; }  
   virtual bool allow_nested_vm_operations() const { return false; }    
   virtual bool is_cheap_allocated() const         { return false; }
@@ -104,6 +166,11 @@
 
   // Debugging
   void print_on_error(outputStream* st) const;
+  const char* name() const { return _names[type()]; }
+  static const char* name(int type) { 
+    assert(type >= 0 && type < VMOp_Terminating, "invalid VM operation type"); 
+    return _names[type]; 
+  }
 #ifndef PRODUCT
   void print_on(outputStream* st) const { print_on_error(st); }
 #endif
@@ -120,10 +187,10 @@
     _thread    = thread;  
     _throwable = throwable;
   }
+  VMOp_Type type() const                         { return VMOp_ThreadStop; }
   oop target_thread() const                      { return _thread; }
   oop throwable() const                          { return _throwable;}
   void doit();
-  const char* name() const                       { return "thread stop"; }
   // We deoptimize if top-most frame is compiled - this might require a C2I adapter to be generated
   bool allow_nested_vm_operations() const        { return true; }
   Mode evaluation_mode() const                   { return _async_safepoint; }
@@ -138,17 +205,17 @@
 // dummy vm op, evaluated just to force a safepoint
 class VM_ForceSafepoint: public VM_Operation {
  public:
-  VM_ForceSafepoint() { }  
-  void doit() {}
-  const char* name() const                       { return "VM_ForceSafepoint"; }  
+  VM_ForceSafepoint() {}  
+  void doit()         {}
+  VMOp_Type type() const { return VMOp_ForceSafepoint; }
 };
 
 // dummy vm op, evaluated just to force a safepoint
 class VM_ForceAsyncSafepoint: public VM_Operation {
  public:
-  VM_ForceAsyncSafepoint() { }  
-  void doit() {}
-  const char* name() const                       { return "VM_ForceAsyncSafepoint"; }
+  VM_ForceAsyncSafepoint() {}  
+  void doit()              {}
+  VMOp_Type type() const                         { return VMOp_ForceAsyncSafepoint; }
   Mode evaluation_mode() const                   { return _async_safepoint; }
   bool is_cheap_allocated() const                { return true; }
 };
@@ -156,8 +223,8 @@
 class VM_Deoptimize: public VM_Operation {
  public:
   VM_Deoptimize() {}
+  VMOp_Type type() const                        { return VMOp_Deoptimize; }
   void doit();
-  const char* name() const                       { return "deoptimize"; }
   bool allow_nested_vm_operations() const        { return true; }
 };
 
@@ -167,8 +234,8 @@
   intptr_t*   _id;
  public:
   VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id);
+  VMOp_Type type() const                         { return VMOp_DeoptimizeFrame; }
   void doit();
-  const char* name() const                       { return "deoptimize frame"; }
   bool allow_nested_vm_operations() const        { return true;  }
 };
 
@@ -178,8 +245,8 @@
   KlassHandle _dependee;
  public:
   VM_DeoptimizeAll() {}
+  VMOp_Type type() const                         { return VMOp_DeoptimizeAll; }
   void doit();
-  const char* name() const                       { return "deoptimize-all"; }
   bool allow_nested_vm_operations() const        { return true; }
 };
 
@@ -187,8 +254,8 @@
 class VM_ZombieAll: public VM_Operation {
  public:
   VM_ZombieAll() {}
+  VMOp_Type type() const                         { return VMOp_ZombieAll; }
   void doit();
-  const char* name() const                       { return "zombie-all"; }
   bool allow_nested_vm_operations() const        { return true; }
 };
 #endif // PRODUCT
@@ -198,8 +265,8 @@
   KlassHandle _dependee;
  public:
   VM_Verify() {}
+  VMOp_Type type() const { return VMOp_Verify; }
   void doit();
-  const char* name() const                       { return "verify"; }
 };
 
 
@@ -210,10 +277,10 @@
  public:
   VM_PrintThreads()                                                { _out = tty; _print_concurrent_locks = PrintConcurrentLocks; }
   VM_PrintThreads(outputStream* out, bool print_concurrent_locks)  { _out = out; _print_concurrent_locks = print_concurrent_locks; }
+  VMOp_Type type() const                                           {  return VMOp_PrintThreads; }
   void doit();
   bool doit_prologue();
   void doit_epilogue();
-  const char* name() const { return "print threads"; }
 };
 
 class VM_PrintJNI: public VM_Operation {
@@ -222,8 +289,8 @@
  public:
   VM_PrintJNI() 			{ _out = tty; }
   VM_PrintJNI(outputStream* out)  	{ _out = out; }
+  VMOp_Type type() const                { return VMOp_PrintJNI; }
   void doit();
-  const char* name() const { return "print JNI state"; }
 };
 
 class DeadlockCycle;
@@ -238,10 +305,10 @@
   VM_FindDeadlocks(outputStream* st) : _concurrent_locks(true), _out(st), _deadlocks(NULL) {};
   ~VM_FindDeadlocks();
 
-  DeadlockCycle* result()  { return _deadlocks; };
+  DeadlockCycle* result()      { return _deadlocks; };
+  VMOp_Type type() const       { return VMOp_FindDeadlocks; }
   void doit();
   bool doit_prologue();
-  const char* name() const { return "find deadlocks"; }
 };
 
 class ThreadDumpResult;
@@ -272,10 +339,10 @@
                 bool with_locked_monitors, 
                 bool with_locked_synchronizers);
 
+  VMOp_Type type() const { return VMOp_ThreadDump; }
   void doit();
   bool doit_prologue();
   void doit_epilogue();
-  const char* name() const               { return "thread dump"; }
 };
 
 
@@ -297,6 +364,6 @@
       wait_if_vm_exited();
     }
   }
+  VMOp_Type type() const { return VMOp_Exit; }
   void doit();
-  const char* name() const                     { return "exit"; }
 };
--- a/hotspot/src/share/vm/services/dtraceAttacher.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/services/dtraceAttacher.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)dtraceAttacher.cpp	1.7 07/05/05 17:07:04 JVM"
+#pragma ident "@(#)dtraceAttacher.cpp	1.8 07/05/23 10:54:23 JVM" 
 #endif
 /*
  * Copyright 2006-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -30,12 +30,11 @@
 
 #ifdef SOLARIS
 
-class VM_DeoptimizeTheWorldOperation : public VM_Operation {
+class VM_DeoptimizeTheWorld : public VM_Operation {
  public:
-  const char* name() const {
-    return "VM_DeoptimizeTheWorldOperation";
+  VMOp_Type type() const {
+    return VMOp_DeoptimizeTheWorld;
   }
-
   void doit() {
     CodeCache::mark_all_nmethods_for_deoptimization();
     ResourceMark rm;
@@ -72,7 +71,7 @@
 
   if (changed) {
     // one or more flags changed, need to deoptimize
-    VM_DeoptimizeTheWorldOperation op;
+    VM_DeoptimizeTheWorld op;
     VMThread::execute(&op);
   }
 }
@@ -95,7 +94,7 @@
   }
   if (changed) {
     // one or more flags changed, need to deoptimize
-    VM_DeoptimizeTheWorldOperation op;
+    VM_DeoptimizeTheWorld op;
     VMThread::execute(&op);
   }
 }
--- a/hotspot/src/share/vm/services/heapDumper.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/services/heapDumper.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)heapDumper.cpp	1.18 07/05/05 17:07:04 JVM"
+#pragma ident "@(#)heapDumper.cpp	1.20 07/05/29 09:44:30 JVM"
 #endif
 /*
  * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1302,10 +1302,9 @@
     _dump_start = (jlong)-1;
   }
 
+  VMOp_Type type() const { return VMOp_HeapDumper; }
   // used to mark sub-record boundary 
   void check_segment_length();
-  
-  const char* name() const		{ return "VM_HeapDumper";};
   void doit();
 };
 
@@ -1557,11 +1556,15 @@
   // Write the file header - use 1.0.2 for large heaps, otherwise 1.0.1
   size_t used;
   const char* header;
+#ifndef SERIALGC
   if (Universe::heap()->kind() == CollectedHeap::GenCollectedHeap) {
     used = GenCollectedHeap::heap()->used();
   } else {
     used = ParallelScavengeHeap::heap()->used();
   }
+#else // SERIALGC
+  used = GenCollectedHeap::heap()->used();
+#endif // SERIALGC
   if (used > (size_t)SegmentedHeapDumpThreshold) {
     set_segmented_dump();
     header = "JAVA PROFILE 1.0.2";
--- a/hotspot/src/share/vm/services/memoryPool.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/services/memoryPool.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)memoryPool.cpp	1.34 07/05/05 17:07:06 JVM"
+#pragma ident "@(#)memoryPool.cpp	1.35 07/05/29 09:44:30 JVM"
 #endif
 /*
  * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -203,6 +203,7 @@
   return MemoryUsage(initial_size(), used, committed, maxSize);
 }
 
+#ifndef SERIALGC
 CompactibleFreeListSpacePool::CompactibleFreeListSpacePool(CompactibleFreeListSpace* space, 
                                                            const char* name,
                                                            PoolType type, 
@@ -219,76 +220,7 @@
 
   return MemoryUsage(initial_size(), used, committed, maxSize);
 }
-
-PSGenerationPool::PSGenerationPool(PSOldGen* gen, 
-                                   const char* name, 
-                                   PoolType type,
-                                   bool support_usage_threshold) :
-  CollectedMemoryPool(name, type, gen->capacity_in_bytes(), 
-                      gen->reserved().byte_size(), support_usage_threshold), _gen(gen) {
-}
-
-PSGenerationPool::PSGenerationPool(PSPermGen* gen, 
-                                   const char* name, 
-                                   PoolType type,
-                                   bool support_usage_threshold) :
-  CollectedMemoryPool(name, type, gen->capacity_in_bytes(), 
-                      gen->reserved().byte_size(), support_usage_threshold), _gen(gen) {
-}
-
-MemoryUsage PSGenerationPool::get_memory_usage() {
-  size_t maxSize   = (available_for_allocation() ? max_size() : 0);
-  size_t used      = used_in_bytes();
-  size_t committed = _gen->capacity_in_bytes();
-
-  return MemoryUsage(initial_size(), used, committed, maxSize);
-}
-
-// The max size of EdenMutableSpacePool =
-//     max size of the PSYoungGen - capacity of two survivor spaces
-//
-// Max size of PS eden space is changing due to ergonomic.
-// PSYoungGen, PSOldGen, Eden, Survivor spaces are all resizable.
-//
-EdenMutableSpacePool::EdenMutableSpacePool(PSYoungGen* gen,
-                                           MutableSpace* space,
-                                           const char* name, 
-                                           PoolType type,
-                                           bool support_usage_threshold) :
-  CollectedMemoryPool(name, type, space->capacity_in_bytes(), 
-                      (gen->max_size() - gen->from_space()->capacity_in_bytes() - gen->to_space()->capacity_in_bytes()), 
-                       support_usage_threshold), 
-  _gen(gen), _space(space) {
-}
-
-MemoryUsage EdenMutableSpacePool::get_memory_usage() {
-  size_t maxSize   = (available_for_allocation() ? max_size() : 0);
-  size_t used = used_in_bytes();
-  size_t committed = _space->capacity_in_bytes();
-
-  return MemoryUsage(initial_size(), used, committed, maxSize);
-}
-
-// The max size of SurvivorMutableSpacePool =
-//     current capacity of the from-space
-//
-// PS from and to survivor spaces could have different sizes.
-//
-SurvivorMutableSpacePool::SurvivorMutableSpacePool(PSYoungGen* gen,
-                                                   const char* name, 
-                                                   PoolType type,
-                                                   bool support_usage_threshold) :
-  CollectedMemoryPool(name, type, gen->from_space()->capacity_in_bytes(),
-                      gen->from_space()->capacity_in_bytes(),
-                      support_usage_threshold), _gen(gen) {
-}
-
-MemoryUsage SurvivorMutableSpacePool::get_memory_usage() {
-  size_t maxSize = (available_for_allocation() ? max_size() : 0);
-  size_t used    = used_in_bytes();
-  size_t committed = committed_in_bytes();
-  return MemoryUsage(initial_size(), used, committed, maxSize);
-}
+#endif // SERIALGC
 
 GenerationPool::GenerationPool(Generation* gen,
                                const char* name, 
--- a/hotspot/src/share/vm/services/memoryPool.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/services/memoryPool.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)memoryPool.hpp	1.24 07/05/05 17:07:05 JVM"
+#pragma ident "@(#)memoryPool.hpp	1.25 07/05/29 09:44:30 JVM"
 #endif
 /*
  * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
@@ -178,64 +178,7 @@
   }
 };
 
-class PSGenerationPool : public CollectedMemoryPool {
-private:
-  PSOldGen* _gen;
-
-public:
-  PSGenerationPool(PSOldGen* pool, const char* name, PoolType type, bool support_usage_threshold);
-  PSGenerationPool(PSPermGen* pool, const char* name, PoolType type, bool support_usage_threshold);
-
-  MemoryUsage get_memory_usage();
-  size_t used_in_bytes()	      { return _gen->used_in_bytes(); }
-  size_t max_size() const             { return _gen->reserved().byte_size(); }
-};
-
-class EdenMutableSpacePool : public CollectedMemoryPool {
-private:
-  PSYoungGen*   _gen;
-  MutableSpace* _space;
-
-public:
-  EdenMutableSpacePool(PSYoungGen* gen, 
-                       MutableSpace* space, 
-                       const char* name, 
-                       PoolType type, 
-                       bool support_usage_threshold);
-
-  MutableSpace* space()			    { return _space; }
-  MemoryUsage get_memory_usage();
-  size_t used_in_bytes()		    { return space()->used_in_bytes(); }
-  size_t max_size() const { 
-    // Eden's max_size = max_size of Young Gen - the current committed size of survivor spaces
-    return _gen->max_size() - _gen->from_space()->capacity_in_bytes() - _gen->to_space()->capacity_in_bytes();
-  }
-};
-
-class SurvivorMutableSpacePool : public CollectedMemoryPool {
-private:
-  PSYoungGen*   _gen;
-
-public:
-  SurvivorMutableSpacePool(PSYoungGen* gen,
-                           const char* name,
-                           PoolType type,
-                           bool support_usage_threshold);
-
-  MemoryUsage get_memory_usage();
-
-  size_t used_in_bytes() {
-    return _gen->from_space()->used_in_bytes();
-  }
-  size_t committed_in_bytes() {
-    return _gen->from_space()->capacity_in_bytes();
-  }
-  size_t max_size() const { 
-    // Return current committed size of the from-space
-    return _gen->from_space()->capacity_in_bytes(); 
-  }
-};
-
+#ifndef SERIALGC
 class CompactibleFreeListSpacePool : public CollectedMemoryPool {
 private:
   CompactibleFreeListSpace* _space;
@@ -249,6 +192,7 @@
   MemoryUsage get_memory_usage();
   size_t used_in_bytes() 	    { return _space->used(); }
 };
+#endif // SERIALGC
 
 
 class GenerationPool : public CollectedMemoryPool {
--- a/hotspot/src/share/vm/services/memoryService.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/services/memoryService.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)memoryService.cpp	1.34 07/05/05 17:07:06 JVM"
+#pragma ident "@(#)memoryService.cpp	1.35 07/05/29 09:44:30 JVM"
 #endif
 /*
  * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
@@ -57,10 +57,13 @@
       add_gen_collected_heap_info(GenCollectedHeap::heap());
       break;
     }
+#ifndef SERIALGC
     case CollectedHeap::ParallelScavengeHeap : {
       add_parallel_scavenge_heap_info(ParallelScavengeHeap::heap());
       break;
-    default:
+    }
+#endif // SERIALGC
+    default: {
       guarantee(false, "Not recognized kind of heap");
     }
   }
@@ -97,18 +100,22 @@
       case Generation::DefNew:
         _minor_gc_manager = MemoryManager::get_copy_memory_manager();
         break;
+#ifndef SERIALGC
       case Generation::ParNew: 
       case Generation::ASParNew: 
         _minor_gc_manager = MemoryManager::get_parnew_memory_manager();
         break;
+#endif // SERIALGC
       default:
         guarantee(false, "Unrecognized generation spec");
         break;
     }
     if (policy->is_mark_sweep_policy()) {
       _major_gc_manager = MemoryManager::get_msc_memory_manager();
+#ifndef SERIALGC
     } else if (policy->is_concurrent_mark_sweep_policy()) {
       _major_gc_manager = MemoryManager::get_cms_memory_manager();
+#endif // SERIALGC
     } else {
       guarantee(false, "Unknown two-gen policy");
     }
@@ -128,17 +135,20 @@
       add_compact_perm_gen_memory_pool(perm_gen, _major_gc_manager);
       break;
     }
+#ifndef SERIALGC
     case PermGen::ConcurrentMarkSweep: {
       CMSPermGenGen* cms_gen = (CMSPermGenGen*) heap->perm_gen();
       add_cms_perm_gen_memory_pool(cms_gen, _major_gc_manager);
       break;
     }
+#endif // SERIALGC
     default:
       guarantee(false, "Unrecognized perm generation");
         break;
   }
 }
 
+#ifndef SERIALGC
 // Add memory pools for ParallelScavengeHeap 
 // This function currently only supports two generations collected heap.
 // The collector for ParallelScavengeHeap will have two memory managers.
@@ -153,6 +163,7 @@
   add_psOld_memory_pool(heap->old_gen(), _major_gc_manager);
   add_psPerm_memory_pool(heap->perm_gen(), _major_gc_manager);
 }
+#endif // SERIALGC
 
 MemoryPool* MemoryService::add_gen(Generation* gen, 
                                    const char* name, 
@@ -189,6 +200,7 @@
   return (MemoryPool*) pool;
 }
 
+#ifndef SERIALGC
 MemoryPool* MemoryService::add_cms_space(CompactibleFreeListSpace* space,
                                          const char* name,
                                          bool is_heap,
@@ -199,6 +211,7 @@
   _pools_list->append(pool);
   return (MemoryPool*) pool;
 }
+#endif // SERIALGC
 
 // Add memory pool(s) for one generation
 void MemoryService::add_generation_memory_pool(Generation* gen, 
@@ -226,6 +239,7 @@
       break;
     }
 
+#ifndef SERIALGC
     case Generation::ParNew:
     case Generation::ASParNew: 
     {
@@ -246,6 +260,7 @@
       
       break;
     }
+#endif // SERIALGC
 
     case Generation::MarkSweepCompact: {
       assert(major_mgr != NULL && minor_mgr == NULL, "Should have only one manager");
@@ -256,6 +271,7 @@
       break;
     }
 
+#ifndef SERIALGC
     case Generation::ConcurrentMarkSweep: 
     case Generation::ASConcurrentMarkSweep: 
     {
@@ -268,6 +284,7 @@
                                        true  /* support_usage_threshold */);
       break;
     }
+#endif // SERIALGC
 
     default:
       assert(false, "should not reach here");
@@ -313,6 +330,7 @@
   }
 }
 
+#ifndef SERIALGC
 void MemoryService::add_cms_perm_gen_memory_pool(CMSPermGenGen* cms_gen,
                                                  MemoryManager* mgr) {
 
@@ -365,6 +383,7 @@
   mgr->add_pool(perm_gen);
   _pools_list->append(perm_gen);
 }
+#endif // SERIALGC
 
 void MemoryService::add_code_heap_memory_pool(CodeHeap* heap) {
   _code_heap_pool = new CodeHeapPool(heap,
@@ -504,13 +523,17 @@
 TraceMemoryManagerStats::TraceMemoryManagerStats(Generation::Name kind) {
   switch (kind) {
     case Generation::DefNew:
+#ifndef SERIALGC
     case Generation::ParNew: 
     case Generation::ASParNew: 
+#endif // SERIALGC
       _fullGC=false;
       break;
     case Generation::MarkSweepCompact:
+#ifndef SERIALGC
     case Generation::ConcurrentMarkSweep:
     case Generation::ASConcurrentMarkSweep:
+#endif // SERIALGC
       _fullGC=true;
       break;
     default:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/services/psMemoryPool.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,99 @@
+#ifdef USE_PRAGMA_IDENT_SRC
+#pragma ident "@(#)psMemoryPool.cpp	1.1 07/05/01 16:48:51 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+# include "incls/_precompiled.incl"
+# include "incls/_psMemoryPool.cpp.incl"
+
+PSGenerationPool::PSGenerationPool(PSOldGen* gen, 
+                                   const char* name, 
+                                   PoolType type,
+                                   bool support_usage_threshold) :
+  CollectedMemoryPool(name, type, gen->capacity_in_bytes(), 
+                      gen->reserved().byte_size(), support_usage_threshold), _gen(gen) {
+}
+
+PSGenerationPool::PSGenerationPool(PSPermGen* gen, 
+                                   const char* name, 
+                                   PoolType type,
+                                   bool support_usage_threshold) :
+  CollectedMemoryPool(name, type, gen->capacity_in_bytes(), 
+                      gen->reserved().byte_size(), support_usage_threshold), _gen(gen) {
+}
+
+MemoryUsage PSGenerationPool::get_memory_usage() {
+  size_t maxSize   = (available_for_allocation() ? max_size() : 0);
+  size_t used      = used_in_bytes();
+  size_t committed = _gen->capacity_in_bytes();
+
+  return MemoryUsage(initial_size(), used, committed, maxSize);
+}
+
+// The max size of EdenMutableSpacePool =
+//     max size of the PSYoungGen - capacity of two survivor spaces
+//
+// Max size of PS eden space is changing due to ergonomic.
+// PSYoungGen, PSOldGen, Eden, Survivor spaces are all resizable.
+//
+EdenMutableSpacePool::EdenMutableSpacePool(PSYoungGen* gen,
+                                           MutableSpace* space,
+                                           const char* name, 
+                                           PoolType type,
+                                           bool support_usage_threshold) :
+  CollectedMemoryPool(name, type, space->capacity_in_bytes(), 
+                      (gen->max_size() - gen->from_space()->capacity_in_bytes() - gen->to_space()->capacity_in_bytes()), 
+                       support_usage_threshold), 
+  _gen(gen), _space(space) {
+}
+
+MemoryUsage EdenMutableSpacePool::get_memory_usage() {
+  size_t maxSize   = (available_for_allocation() ? max_size() : 0);
+  size_t used = used_in_bytes();
+  size_t committed = _space->capacity_in_bytes();
+
+  return MemoryUsage(initial_size(), used, committed, maxSize);
+}
+
+// The max size of SurvivorMutableSpacePool =
+//     current capacity of the from-space
+//
+// PS from and to survivor spaces could have different sizes.
+//
+SurvivorMutableSpacePool::SurvivorMutableSpacePool(PSYoungGen* gen,
+                                                   const char* name, 
+                                                   PoolType type,
+                                                   bool support_usage_threshold) :
+  CollectedMemoryPool(name, type, gen->from_space()->capacity_in_bytes(),
+                      gen->from_space()->capacity_in_bytes(),
+                      support_usage_threshold), _gen(gen) {
+}
+
+MemoryUsage SurvivorMutableSpacePool::get_memory_usage() {
+  size_t maxSize = (available_for_allocation() ? max_size() : 0);
+  size_t used    = used_in_bytes();
+  size_t committed = committed_in_bytes();
+  return MemoryUsage(initial_size(), used, committed, maxSize);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/services/psMemoryPool.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,84 @@
+#ifdef USE_PRAGMA_IDENT_HDR
+#pragma ident "@(#)psMemoryPool.hpp	1.1 07/05/01 16:48:51 JVM"
+#endif
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *   
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *   
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *   
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *  
+ */
+
+class PSGenerationPool : public CollectedMemoryPool {
+private:
+  PSOldGen* _gen;
+
+public:
+  PSGenerationPool(PSOldGen* pool, const char* name, PoolType type, bool support_usage_threshold);
+  PSGenerationPool(PSPermGen* pool, const char* name, PoolType type, bool support_usage_threshold);
+
+  MemoryUsage get_memory_usage();
+  size_t used_in_bytes()	      { return _gen->used_in_bytes(); }
+  size_t max_size() const             { return _gen->reserved().byte_size(); }
+};
+
+class EdenMutableSpacePool : public CollectedMemoryPool {
+private:
+  PSYoungGen*   _gen;
+  MutableSpace* _space;
+
+public:
+  EdenMutableSpacePool(PSYoungGen* gen, 
+                       MutableSpace* space, 
+                       const char* name, 
+                       PoolType type, 
+                       bool support_usage_threshold);
+
+  MutableSpace* space()			    { return _space; }
+  MemoryUsage get_memory_usage();
+  size_t used_in_bytes()		    { return space()->used_in_bytes(); }
+  size_t max_size() const { 
+    // Eden's max_size = max_size of Young Gen - the current committed size of survivor spaces
+    return _gen->max_size() - _gen->from_space()->capacity_in_bytes() - _gen->to_space()->capacity_in_bytes();
+  }
+};
+
+class SurvivorMutableSpacePool : public CollectedMemoryPool {
+private:
+  PSYoungGen*   _gen;
+
+public:
+  SurvivorMutableSpacePool(PSYoungGen* gen,
+                           const char* name,
+                           PoolType type,
+                           bool support_usage_threshold);
+
+  MemoryUsage get_memory_usage();
+
+  size_t used_in_bytes() {
+    return _gen->from_space()->used_in_bytes();
+  }
+  size_t committed_in_bytes() {
+    return _gen->from_space()->capacity_in_bytes();
+  }
+  size_t max_size() const { 
+    // Return current committed size of the from-space
+    return _gen->from_space()->capacity_in_bytes(); 
+  }
+};
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)globalDefinitions.hpp	1.216 07/05/17 16:07:16 JVM"
+#pragma ident "@(#)globalDefinitions.hpp	1.217 07/05/23 10:54:27 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1052,6 +1052,9 @@
 // Format 32-bit quantities.
 #define INT32_FORMAT  "%d"
 #define UINT32_FORMAT "%u"
+#define INT32_FORMAT_W(width)	"%" #width "d"
+#define UINT32_FORMAT_W(width)	"%" #width "u"
+
 #define PTR32_FORMAT  "0x%08x"
 
 // Format 64-bit quantities.
@@ -1059,6 +1062,19 @@
 #define UINT64_FORMAT "%" FORMAT64_MODIFIER "u"
 #define PTR64_FORMAT  "0x%016" FORMAT64_MODIFIER "x"
 
+#define INT64_FORMAT_W(width)  "%" #width FORMAT64_MODIFIER "d"
+#define UINT64_FORMAT_W(width) "%" #width FORMAT64_MODIFIER "u"
+
+// Format macros that allow the field width to be specified.  The width must be
+// a string literal (e.g., "8") or a macro that evaluates to one.
+#ifdef _LP64
+#define SSIZE_FORMAT_W(width)	INT64_FORMAT_W(width)
+#define SIZE_FORMAT_W(width)	UINT64_FORMAT_W(width)
+#else
+#define SSIZE_FORMAT_W(width)	INT32_FORMAT_W(width)
+#define SIZE_FORMAT_W(width)	UINT32_FORMAT_W(width)
+#endif // _LP64
+
 // Format pointers and size_t (or size_t-like integer types) which change size
 // between 32- and 64-bit.
 #ifdef	_LP64
--- a/hotspot/src/share/vm/utilities/macros.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/utilities/macros.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)macros.hpp	1.40 07/05/05 17:07:09 JVM"
+#pragma ident "@(#)macros.hpp	1.41 07/05/29 09:44:30 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -34,6 +34,12 @@
 // Makes a string of the macro expansion of a
 #define XSTR(a) STR(a)
 
+// KERNEL variant
+#ifdef KERNEL
+#define COMPILER1
+#define SERIALGC
+#endif // KERNEL
+
 // COMPILER1 variant
 #ifdef COMPILER1
 #ifdef COMPILER2
@@ -51,6 +57,7 @@
 #define COMPILER2_PRESENT(code)
 #endif // COMPILER2
 
+
 // PRODUCT variant
 #ifdef PRODUCT
 #define PRODUCT_ONLY(code) code
--- a/hotspot/src/share/vm/utilities/ostream.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/utilities/ostream.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)ostream.cpp	1.77 07/05/05 17:07:08 JVM"
+#pragma ident "@(#)ostream.cpp	1.78 07/06/08 23:17:46 JVM"
 #endif
 /*
  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -165,6 +165,26 @@
   print_raw(buf);
 }
 
+void outputStream::date_stamp(bool guard,
+                              const char* prefix,
+                              const char* suffix) {
+  if (!guard) {
+    return;
+  }
+  print_raw(prefix);
+  static const char error_time[] = "yyyy-mm-ddThh:mm:ss.mmm+zzzz";
+  static const int buffer_length = 32;
+  char buffer[buffer_length];
+  const char* iso8601_result = os::iso8601_time(buffer, buffer_length);
+  if (iso8601_result != NULL) {
+    print_raw(buffer);
+  } else {
+    print_raw(error_time);
+  }
+  print_raw(suffix);
+  return;
+}
+
 void outputStream::indent() {
   while (_position < _indentation) sp();
 }
@@ -535,7 +555,7 @@
   }
   strncpy(buffer, s, len);
   buffer[len] = '\0';
-  jio_print(s);
+  jio_print(buffer);
 }
 
 
--- a/hotspot/src/share/vm/utilities/ostream.hpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/utilities/ostream.hpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_HDR
-#pragma ident "@(#)ostream.hpp	1.42 07/05/05 17:07:08 JVM"
+#pragma ident "@(#)ostream.hpp	1.43 07/06/08 23:18:20 JVM"
 #endif
 /*
  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
@@ -88,6 +88,12 @@
    // Time stamp
    TimeStamp& time_stamp() { return _stamp; }
    void stamp();
+   // Date stamp
+   void date_stamp(bool guard, const char* prefix, const char* suffix);
+   // A simplified call that includes a suffix of ": "
+   void date_stamp(bool guard) {
+     date_stamp(guard, "", ": ");
+   }
 
    // portable printing of 64 bit integers
    void print_jlong(jlong value);
--- a/hotspot/src/share/vm/utilities/vmError.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/hotspot/src/share/vm/utilities/vmError.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 #ifdef USE_PRAGMA_IDENT_SRC
-#pragma ident "@(#)vmError.cpp	1.30 07/05/05 17:07:11 JVM"
+#pragma ident "@(#)vmError.cpp	1.31 07/05/23 10:54:29 JVM"
 #endif
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -839,7 +839,7 @@
   VMError *_err;
  public:
   VM_ReportJavaOutOfMemory(VMError *err) { _err = err; }
-  const char* name() const       { return "VM_ReportJavaOutOfMemory";};
+  VMOp_Type type() const                 { return VMOp_ReportJavaOutOfMemory; }
   void doit();
 };
 
--- a/j2se/make/README-builds.html	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/README-builds.html	Fri Jun 22 00:46:43 2007 +0000
@@ -279,7 +279,7 @@
         </ul>
     </blockquote>
     
-    <h4>Ubuntu 7.4</h4>
+    <h4>Ubuntu 7.04</h4>
     
     <p>
     Using the Synaptic Package Manager, download the following
@@ -1186,7 +1186,7 @@
     <p>
     The provided regression tests can be run with the <tt>jtreg</tt>
     utility from 
-    <a href="https://openjdk.java.net/jtreg/">the jtreg site</a>.
+    <a href="http://openjdk.java.net/jtreg/">the jtreg site</a>.
 </blockquote>
 
 <!-- ------------------------------------------------------ -->
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)com_sun_corba_se_impl_encoding.jmk	1.10 07/05/05
-
 com_sun_corba_se_impl_encoding_java = \
 	$(TARGDIR)com/sun/corba/se/impl/encoding/BufferManagerFactory.java \
 	$(TARGDIR)com/sun/corba/se/impl/encoding/BufferQueue.java \
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_interceptors.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_interceptors.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,6 @@
 #
 
 #
-# @(#)com_sun_corba_se_impl_interceptors.jmk	1.19 07/05/05
 # Portable Interceptors Files
 #
 # $(TARGDIR)com/sun/corba/se/impl/interceptors/PIORB.java \
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)com_sun_corba_se_impl_ior.jmk	1.41 07/05/05
-
 com_sun_corba_se_impl_ior_java = \
 	$(TARGDIR)com/sun/corba/se/impl/ior/ByteBuffer.java \
 	$(TARGDIR)com/sun/corba/se/impl/ior/EncapsulationUtility.java \
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_legacy.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_legacy.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)com_sun_corba_se_impl_legacy.jmk	1.5 07/05/05
-
 com_sun_corba_se_impl_legacy_java = \
 	$(TARGDIR)com/sun/corba/se/impl/legacy/connection/DefaultSocketFactory.java \
 	$(TARGDIR)com/sun/corba/se/impl/legacy/connection/EndPointInfoImpl.java \
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_naming_pcosnaming.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_naming_pcosnaming.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,6 @@
 #
 
 #
-# @(#)com_sun_corba_se_impl_naming_pcosnaming.jmk	1.12 07/05/05
 # Files for Persistent CosNaming
 #
 
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_oa_poa.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_oa_poa.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,6 @@
 #
 
 #
-# @(#)com_sun_corba_se_impl_oa_poa.jmk	1.41 07/05/05
 # Files for POA implementation 
 #
 
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_transport.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_impl_transport.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)com_sun_corba_se_impl_transport.jmk	1.29 07/05/05
-
 com_sun_corba_se_impl_transport_java = \
 	$(TARGDIR)com/sun/corba/se/impl/transport/ByteBufferPoolImpl.java \
 	$(TARGDIR)com/sun/corba/se/impl/transport/CorbaConnectionCacheBase.java \
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_activation.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_activation.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,6 @@
 #
 
 #
-# @(#)com_sun_corba_se_spi_activation.jmk	1.21 07/05/05
 # Server Activation IDL Generated Files
 #
 
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_extension.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_extension.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,6 @@
 #
 
 #
-# @(#)com_sun_corba_se_spi_extension.jmk	1.12
 # Files for extension
 #
 
--- a/j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_ior.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/com_sun_corba_se_spi_ior.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)com_sun_corba_se_spi_ior.jmk	1.10 07/05/05
-
 com_sun_corba_se_spi_ior_java = \
 	$(TARGDIR)com/sun/corba/se/spi/ior/EncapsulationFactoryBase.java \
 	$(TARGDIR)com/sun/corba/se/spi/ior/IOR.java \
--- a/j2se/make/com/sun/corba/minclude/org_omg_CORBA.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_CORBA.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-# @(#)org_omg_CORBA.jmk	1.30 07/05/05
 #
 # Files
 
--- a/j2se/make/com/sun/corba/minclude/org_omg_CORBAX.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_CORBAX.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)org_omg_CORBAX.jmk	1.5 02/12/05
-#
 # CORBA IDL Generated Files
 #
 
--- a/j2se/make/com/sun/corba/minclude/org_omg_CosNaming.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_CosNaming.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)org_omg_CosNaming.jmk	1.21 07/05/05
-#
-
 NS_GENERATED_java = \
 	$(TARGDIR)org/omg/CosNaming/IstringHelper.java \
 	$(TARGDIR)org/omg/CosNaming/Binding.java \
--- a/j2se/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_DynamicAny.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-# @(#)org_omg_DynamicAny.jmk	1.13 07/05/05
 #
 # Files
 #   Please keep this sorted. 
--- a/j2se/make/com/sun/corba/minclude/org_omg_IOP.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_IOP.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)org_omg_IOP.jmk	1.15 07/05/05
-#
 # IOP IDL Generated Files
 #
 
--- a/j2se/make/com/sun/corba/minclude/org_omg_Messaging.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_Messaging.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)org_omg_Messaging.jmk	1.8 07/05/05
-#
 # Messaging IDL Generated Files
 #
 
--- a/j2se/make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)org_omg_PortableInterceptor.jmk	1.12 05/05/07
-#
 # Interceptors IDL Generated Files
 #
 
--- a/j2se/make/com/sun/corba/minclude/org_omg_PortableServer.jmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/minclude/org_omg_PortableServer.jmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)org_omg_PortableServer.jmk	1.16 07/05/05
-#
-
 PortableServer_java = \
 	$(TARGDIR)org/omg/PortableServer/Servant.java \
 	$(TARGDIR)org/omg/PortableServer/ServantLocatorPackage/CookieHolder.java \
--- a/j2se/make/com/sun/corba/se/PortableActivationIDL/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/PortableActivationIDL/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.1 00/12/01
-
 BUILDDIR = ../../../../..
 PACKAGE = com.sun.corba.se.PortableActivation
 PRODUCT = org
--- a/j2se/make/com/sun/corba/se/connection/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/connection/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,6 @@
 #
 
 #
-# @(#)FILES_java.gmk	1.11 07/05/05
 # Files for connection
 #
 
--- a/j2se/make/com/sun/corba/se/corespi/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/corespi/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.8 07/05/05
-
 BUILDDIR = ../../../../..
 
 PACKAGE = com.sun.corba.se.impl.corespi
--- a/j2se/make/com/sun/corba/se/impl/logging/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/impl/logging/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.8 07/05/05
-
 BUILDDIR = ../../../../../..
 PACKAGE = com.sun.corba.se.impl.logging
 PRODUCT = sun
--- a/j2se/make/com/sun/corba/se/impl/monitoring/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/impl/monitoring/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.7 07/05/05
-
 BUILDDIR = ../../../../../..
 PACKAGE = com.sun.corba.se.impl.monitoring
 PRODUCT = sun
--- a/j2se/make/com/sun/corba/se/impl/naming/namingutil/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/impl/naming/namingutil/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.9 07/05/05
-
 BUILDDIR = ../../../../../../..
 PACKAGE = com.sun.corba.se.impl.namingutil
 PRODUCT = sun
--- a/j2se/make/com/sun/corba/se/interceptor/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/interceptor/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,6 @@
 #
 
 #
-# @(#)FILES_java.gmk	1.7 07/05/05
 # Files for interceptor
 #
 
--- a/j2se/make/com/sun/corba/se/pept/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/pept/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.11 07/05/05
-
 BUILDDIR = ../../../../..
 PACKAGE = com.sun.corba.se.pept
 PRODUCT = sun
--- a/j2se/make/com/sun/corba/se/rmi/rmic/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/rmi/rmic/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,19 +34,23 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
+# Resources
+#
+LOCALE_SET_DEFINITION = j2sdk
+RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/rmic.properties
+
+#
 # Files to compile.
 #
-
 include SUN_RMI_RMIC_IIOP_java.gmk
 include SUN_RMI_RMIC_java.gmk
-
 ifdef PARTNERS_CORBA
-FILES_java = \
+  FILES_java = \
         $(RMIC_java) \
         $(IIOP_java) \
         $(PARTNERS_EDITION_java)
 else
-FILES_java = \
+  FILES_java = \
         $(RMIC_java) \
         $(IIOP_java)
 endif
@@ -57,18 +61,10 @@
 JAVA_ARGS = "{ \"-J-ms8m\", \"sun.rmi.rmic.Main\" }"
 
 ifndef STANDALONE_CORBA_WS
-FILES_c = $(SHARE_SRC)/native/bin/$(PROGRAM).c $(SHARE_SRC)/native/bin/utility.c
-include $(BUILDDIR)/common/Program.gmk
+  FILES_c = $(SHARE_SRC)/native/bin/$(PROGRAM).c \
+	    $(SHARE_SRC)/native/bin/utility.c
+  include $(BUILDDIR)/common/Program.gmk
 else
-include $(BUILDDIR)/common/Classes.gmk
+  include $(BUILDDIR)/common/Classes.gmk
 endif
 
-#
-# Resources.
-#
-LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_PROPERTIES = rmic.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/sun/rmi/rmic/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/sun/rmi/rmic/resources
-include $(BUILDDIR)/common/Resources.gmk
-
--- a/j2se/make/com/sun/corba/se/rmi/rmic/SUN_RMI_RMIC_IIOP_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/rmi/rmic/SUN_RMI_RMIC_IIOP_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)SUN_RMI_RMIC_IIOP_java.gmk	1.29 07/05/05
-#
-
 # Generated by IBM JTC-SV tools.genmake
 # Copyright (c) IBM Corporation 1998.
 SUN_RMI_RMIC_IIOP_java = \
--- a/j2se/make/com/sun/corba/se/rmi/rmic/SUN_RMI_RMIC_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/rmi/rmic/SUN_RMI_RMIC_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)SUN_RMI_RMIC_java.gmk	1.14 07/05/05
-#
-
 # Generated by IBM JTC-SV tools.genmake
 # Copyright (c) IBM Corporation 1998.
 SUN_RMI_RMIC_java = \
--- a/j2se/make/com/sun/corba/se/spi/copyobject/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/spi/copyobject/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.7 07/05/05
 #
 # Build the copyobject files
 #
--- a/j2se/make/com/sun/corba/se/spi/logging/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/spi/logging/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-#   @(#)Makefile	1.8 05/05/07
 #
 # Build the logging files
 #
--- a/j2se/make/com/sun/corba/se/spi/monitoring/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/corba/se/spi/monitoring/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-#   @(#)Makefile	1.7 07/05/05
 #
 # Build the Monitoring files
 #
--- a/j2se/make/com/sun/java/pack/prop/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/java/pack/prop/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -33,15 +33,10 @@
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
 
+OTHER_PROPERTIES  = $(PKGDIR)/intrinsic.properties
+
 #
 # Rules.
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-# 
-# Resources
-#
-OTHER_PROPERTIES  = intrinsic.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/java_cup/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/java_cup/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -33,44 +33,17 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
+# Resources
 #
-# LANGUAGE_VERSION = -source 1.4
+LOCALE_SET_DEFINITION = j2re
 
 #
 # Files to compile
 #
 AUTO_FILES_JAVA_DIRS = $(PKGDIR)/java_cup/internal
 
-# Rule
+#
+# Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
-#
-# Resources
-#
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
-LOCALE_SET_DEFINITION = j2re
-#NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xalan/internal/res/XSLTInfo.properties \
-#   xalan/internal/serialize/serializer.properties \
-#   xalan/internal/serialize/XMLEntities.res \
-#   xalan/internal/serialize/HTMLEntities.res \
-#   xalan/internal/serialize/Encodings.properties \
-#   xalan/internal/templates/output_html.properties \
-#   xalan/internal/templates/output_text.properties \
-#   xalan/internal/templates/output_xml.properties 
-
-
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
-
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/javah/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/javah/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,6 +34,23 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
+# Resources
+#
+LOCALE_SET_DEFINITION = j2sdk
+RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/l10n.properties
+ifeq ($(PLATFORM), solaris)
+  OTHER_PROPERTIES += $(PKGDIR)/resources/SunOS_sparc.properties
+  OTHER_PROPERTIES += $(PKGDIR)/resources/SunOS_sparcv9.properties
+endif 
+ifeq ($(PLATFORM), windows)
+  OTHER_PROPERTIES += $(PKGDIR)/resources/win32_x86.properties
+endif # PLATFORM
+ifeq ($(PLATFORM), linux)
+  OTHER_PROPERTIES += $(PKGDIR)/resources/Linux_ppc.properties
+  OTHER_PROPERTIES += $(PKGDIR)/resources/Linux_sparc.properties
+endif
+
+#
 # Files.
 #
 AUTO_FILES_JAVA_DIRS = com/sun/tools/javah
@@ -43,29 +60,7 @@
 #
 JAVA_ARGS = "{ \"com.sun.tools.javah.Main\" }"
 
-include $(BUILDDIR)/common/Program.gmk
 OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
 
-#
-# Resources.
-#
-
-RESOURCE_BUNDLES_PROPERTIES = l10n.properties
-
-ifeq ($(PLATFORM), solaris)
-OTHER_PROPERTIES = SunOS_sparc.properties SunOS_sparcv9.properties
-endif 
+include $(BUILDDIR)/common/Program.gmk
 
-# property files are at src/share/classes/com/sun/tools/javah/resources/
-ifeq ($(PLATFORM), windows)
-OTHER_PROPERTIES = win32_x86.properties
-endif # PLATFORM
-
-ifeq ($(PLATFORM), linux)
-   OTHER_PROPERTIES = Linux_ppc.properties Linux_sparc.properties
-endif
-
-LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/com/sun/tools/javah/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/com/sun/tools/javah/resources
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/jndi/cosnaming/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/jndi/cosnaming/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -33,6 +33,11 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
+# Resources
+#
+OTHER_PROPERTIES  = $(PKGDIR)/jndiprovider.properties
+
+#
 # Files to compile
 #
 AUTO_FILES_JAVA_DIRS = com/sun/jndi/cosnaming com/sun/jndi/url
@@ -42,11 +47,3 @@
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-#
-# Resources
-#
-OTHER_PROPERTIES  = jndiprovider.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-include $(BUILDDIR)/common/Resources.gmk
-
--- a/j2se/make/com/sun/jndi/ldap/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/jndi/ldap/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -33,6 +33,11 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
+# Resources
+#
+OTHER_PROPERTIES  = $(PKGDIR)/jndiprovider.properties
+
+#
 # Files to compile
 #
 AUTO_FILES_JAVA_DIRS = com/sun/jndi/ldap com/sun/jndi/url/ldap
@@ -42,11 +47,3 @@
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-#
-# Resources
-#
-OTHER_PROPERTIES  = jndiprovider.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-include $(BUILDDIR)/common/Resources.gmk
-
--- a/j2se/make/com/sun/org/apache/bcel/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/bcel/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.11 07/05/05 
-#
 # Makefile for building com.sun.org.apache.bcel
 #
 
@@ -35,30 +33,17 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
+# Resources
 #
-# LANGUAGE_VERSION = -source 1.4
+LOCALE_SET_DEFINITION = j2re
 
 #
 # Files to compile
 #
 AUTO_FILES_JAVA_DIRS = com/sun/org/apache/bcel
 
-
-
+#
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-#
-# Resources
-#
-# RESOURCE_FILES = \
-# OTHER_PROPERTIES = \
-LOCALE_SET_DEFINITION = j2re
-# NEW_RESOURCE_BUNDLES_PROPERTIES = \
-
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/regexp/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/regexp/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building Xalan
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java = \
@@ -58,36 +51,15 @@
 	$(PKGDIR)/regexp/internal/StringCharacterIterator.java \
 	$(PKGDIR)/regexp/internal/recompile.java \
 
+#
+# Resources
+#
+LOCALE_SET_DEFINITION = j2re
+RESOURCE_BUNDLES_JAVA = \
+	$(PKGDIR)/xpath/internal/res/XPATHErrorResources.java
 
-
+#
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-## Messages are in $(PKGDIR)/xalan/res/XSLTErrorResources.java 
-
-#
-# Resources
-#
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
-LOCALE_SET_DEFINITION = j2re
-NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xalan/res/XSLTInfo.properties \
-#   xalan/serialize/serializer.properties \
-#   xalan/serialize/XMLEntities.res \
-#   xalan/serialize/HTMLEntities.res \
-#   xalan/templates/output_html.properties \
-#   xalan/templates/output_text.properties \
-#   xalan/templates/output_xml.properties \
-	xpath/internal/res/XPATHErrorResources.properties
-
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
-
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:	$(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xalan/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xalan/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -43,19 +43,10 @@
 #
 LOCALE_SET_DEFINITION = j2sdk
 NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)
-include $(BUILDDIR)/common/Resources.gmk
-
-#
-# Apache can use a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
 
 #
 # Rules
 #
-
 build: other_files
 
 clean:: classes.clean
--- a/j2se/make/com/sun/org/apache/xalan/internal/other/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xalan/internal/other/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building Xalan
 #
 
@@ -35,22 +33,12 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
-
-
 FILES_java = \
         $(PKGDIR)/client/XSLTProcessorApplet.java \
-        \
         $(PKGDIR)/Version.java \
-        \
         $(PKGDIR)/extensions/ExpressionContext.java \
-        \
         $(PKGDIR)/res/XSLTErrorResources.java \
         $(PKGDIR)/res/XSLTErrorResources_de.java \
         $(PKGDIR)/res/XSLTErrorResources_en.java \
@@ -81,28 +69,14 @@
         $(PKGDIR)/xslt/Process.java \
         $(PKGDIR)/xslt/EnvironmentCheck.java 
 
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/res/XSLTErrorResources.java 
-
 #
 # Resources
 #
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
 LOCALE_SET_DEFINITION = j2re
-NEW_RESOURCE_BUNDLES_PROPERTIES = \
-   res/XSLTInfo.properties \
-
+NEW_RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/res/XSLTInfo.properties
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xalan/internal/xsltc/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xalan/internal/xsltc/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building Xalan
 #
 
@@ -35,15 +33,8 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-#LANGUAGE_VERSION = -source 1.4
-
-#
-#       $(PKGDIR)/xsltc/trax/SmartTransformerFactoryImpl.java \
 # Files to compile
 #
-
 FILES_java = \
         $(PKGDIR)/xsltc/DOMEnhancedForDTM.java \
         $(PKGDIR)/xsltc/CollatorFactory.java \
@@ -328,29 +319,16 @@
         $(PKGDIR)/xsltc/trax/Util.java \
         $(PKGDIR)/xsltc/trax/XSLTCSource.java \
         $(PKGDIR)/xsltc/util/IntegerArray.java \
-        $(PKGDIR)/xsltc/util/JavaCupRedirect.java \
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/res/XSLTErrorResources.java 
+        $(PKGDIR)/xsltc/util/JavaCupRedirect.java
 
 #
 # Resources
 #
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
 LOCALE_SET_DEFINITION = j2re
-NEW_RESOURCE_BUNDLES_PROPERTIES = \
-   res/XSLTInfo.properties \
-
+NEW_RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/res/XSLTInfo.properties 
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -43,19 +43,10 @@
 #
 LOCALE_SET_DEFINITION = j2sdk
 NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)
-include $(BUILDDIR)/common/Resources.gmk
-
-#
-# Apache can use a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res: $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
 
 #
 # Rules
 #
-
 build: other_files
 
 clean:: classes.clean
@@ -66,3 +57,4 @@
 
 $(CLASSBINDIR)/%.xsd: $(SHARE_SRC)/classes/%.xsd
 	$(install-file)
+
--- a/j2se/make/com/sun/org/apache/xerces/internal/dom/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/dom/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.dom
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java =\
@@ -128,36 +121,18 @@
         $(PKGDIR)/dom3/as/DocumentAS.java \
         $(PKGDIR)/dom3/as/DocumentEditAS.java \
         $(PKGDIR)/dom3/as/ElementEditAS.java \
-        $(PKGDIR)/dom3/as/NodeEditAS.java \
-
-
-
-
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
+        $(PKGDIR)/dom3/as/NodeEditAS.java
 
 #
 # Resources
 #
+LOCALE_SET_DEFINITION = j2re
 RESOURCE_FILES = \
-	dom/org.apache.xerces.dom.DOMImplementationSourceImpl \
-	dom/org.w3c.dom.DOMImplementationSourceList \
-#OTHER_PROPERTIES = \
-LOCALE_SET_DEFINITION = j2re
-#NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#	dom/org.apache.xerces.dom.DOMImplementationSourceImpl \
-#	dom/org.w3c.dom.DOMImplementationSourceList \
-
+	$(PKGDIR)/dom/org.apache.xerces.dom.DOMImplementationSourceImpl \
+	$(PKGDIR)/dom/org.w3c.dom.DOMImplementationSourceList
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/internal/impl/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/impl/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.impl
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java =\
@@ -253,38 +246,24 @@
         $(PKGDIR)/impl/xs/util/XSNamedMapImpl.java \
         $(PKGDIR)/impl/xs/util/XSObjectListImpl.java \
 
+#
+# Resources
+#
+LOCALE_SET_DEFINITION = j2re
+NEW_RESOURCE_BUNDLES_PROPERTIES = \
+	$(PKGDIR)/impl/msg/XIncludeMessages.properties \
+	$(PKGDIR)/impl/msg/DOMMessages.properties \
+        $(PKGDIR)/impl/msg/SAXMessages.properties \
+	$(PKGDIR)/impl/msg/XMLMessages.properties \
+	$(PKGDIR)/impl/msg/XMLSchemaMessages.properties \
+	$(PKGDIR)/impl/msg/XMLSerializerMessages.properties \
+	$(PKGDIR)/impl/msg/DatatypeMessages.properties \
+	$(PKGDIR)/impl/xpath/regex/message.properties \
+	$(PKGDIR)/impl/xpath/regex/message_fr.properties \
+	$(PKGDIR)/impl/xpath/regex/message_ja.properties
 
+#
 # Rule
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
-#
-# Resources
-#
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
-LOCALE_SET_DEFINITION = j2re
-NEW_RESOURCE_BUNDLES_PROPERTIES = \
-	impl/msg/XIncludeMessages.properties \
-	impl/msg/DOMMessages.properties \
-        impl/msg/SAXMessages.properties \
-	impl/msg/XMLMessages.properties \
-	impl/msg/XMLSchemaMessages.properties \
-	impl/msg/XMLSerializerMessages.properties \
-	impl/msg/DatatypeMessages.properties \
-	impl/xpath/regex/message.properties \
-	impl/xpath/regex/message_fr.properties \
-	impl/xpath/regex/message_ja.properties \
-
-
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
-
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/internal/jaxp/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/jaxp/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.jaxp
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java =\
@@ -60,36 +53,21 @@
         $(PKGDIR)/jaxp/datatype/DurationImpl.java \
         $(PKGDIR)/jaxp/datatype/XMLGregorianCalendarImpl.java \
 
-
-
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
 #
 # Resources
 #
- RESOURCE_FILES = \
-	jaxp/javax.xml.parsers.DocumentBuilderFactory \
-	jaxp/javax.xml.parsers.SAXParserFactory \
-	jaxp/validation/javax.xml.validation.SchemaFactory \
+LOCALE_SET_DEFINITION = j2re
+RESOURCE_FILES = \
+	$(PKGDIR)/jaxp/javax.xml.parsers.DocumentBuilderFactory \
+	$(PKGDIR)/jaxp/javax.xml.parsers.SAXParserFactory \
+	$(PKGDIR)/jaxp/validation/javax.xml.validation.SchemaFactory
 OTHER_PROPERTIES = \
-	jaxp/javax.xml.parsers.DocumentBuilderFactory \
-	jaxp/javax.xml.parsers.SAXParserFactory \
-	jaxp/validation/javax.xml.validation.SchemaFactory \
-LOCALE_SET_DEFINITION = j2re
-NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xerces/internal/parsers/org.xml.sax.driver \
-
+	$(PKGDIR)/jaxp/javax.xml.parsers.DocumentBuilderFactory \
+	$(PKGDIR)/jaxp/javax.xml.parsers.SAXParserFactory \
+	$(PKGDIR)/jaxp/validation/javax.xml.validation.SchemaFactory
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/internal/parsers/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/parsers/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.parsers
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java =\
@@ -69,38 +62,23 @@
         $(PKGDIR)/parsers/XMLParser.java \
         $(PKGDIR)/parsers/XPointerParserConfiguration.java \
 
+#
+# Resources
+#
+LOCALE_SET_DEFINITION = j2re
+RESOURCE_FILES = \
+	$(PKGDIR)/parsers/org.apache.xerces.xni.parser.DTDConfiguration \
+	$(PKGDIR)/parsers/org.apache.xerces.xni.parser.XML11Configuration \
+	$(PKGDIR)/parsers/org.apache.xerces.xni.parser.XMLParserConfiguration \
+	$(PKGDIR)/parsers/org.xml.sax.driver
+OTHER_PROPERTIES = \
+	$(PKGDIR)/parsers/org.apache.xerces.xni.parser.DTDConfiguration \
+	$(PKGDIR)/parsers/org.apache.xerces.xni.parser.XML11Configuration \
+	$(PKGDIR)/parsers/org.apache.xerces.xni.parser.XMLParserConfiguration \
+	$(PKGDIR)/parsers/org.xml.sax.driver
 
-#        $(PKGDIR)/parsers/DOMBuilderImpl.java \
+#
 # Rule
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
-#
-# Resources
-#
-RESOURCE_FILES = \
-	parsers/org.apache.xerces.xni.parser.DTDConfiguration \
-	parsers/org.apache.xerces.xni.parser.XML11Configuration \
-	parsers/org.apache.xerces.xni.parser.XMLParserConfiguration \
-	parsers/org.xml.sax.driver \
-OTHER_PROPERTIES = \
-	parsers/org.apache.xerces.xni.parser.DTDConfiguration \
-	parsers/org.apache.xerces.xni.parser.XML11Configuration \
-	parsers/org.apache.xerces.xni.parser.XMLParserConfiguration \
-	parsers/org.xml.sax.driver \
-LOCALE_SET_DEFINITION = j2re
-#NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xerces/internal/parsers/org.xml.sax.driver \
-
-
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
-
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/internal/util/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/util/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.util
 #
 
@@ -35,12 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
-#        $(PKGDIR)/util/XMLCatalogResolver.java \
 # Files to compile
 #
 FILES_java =\
@@ -85,30 +77,13 @@
         $(PKGDIR)/util/XMLErrorCode.java \
         $(PKGDIR)/util/DatatypeMessageFormatter.java \
 
-
-
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
 #
 # Resources
 #
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
 LOCALE_SET_DEFINITION = j2re
-#NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xerces/internal/parsers/org.xml.sax.driver \
-
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/internal/xinclude/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/xinclude/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.xinclude
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java =\
@@ -55,30 +48,13 @@
         $(PKGDIR)/xinclude/XPointerSchema.java \
         $(PKGDIR)/xinclude/XInclude11TextReader.java \
 
-
-
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
 #
 # Resources
 #
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
 LOCALE_SET_DEFINITION = j2re
-#NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xerces/internal/parsers/org.xml.sax.driver \
-
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/internal/xni/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/xni/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.xni
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java =\
@@ -80,31 +73,13 @@
         $(PKGDIR)/xni/parser/XMLParserConfiguration.java \
         $(PKGDIR)/xni/parser/XMLPullParserConfiguration.java \
 
-
-
-
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
 #
 # Resources
 #
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
 LOCALE_SET_DEFINITION = j2re
-#NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xerces/internal/parsers/org.xml.sax.driver \
-
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xerces/internal/xs/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xerces/internal/xs/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.21 02/08/02
-#
 # Makefile for building com.sun.org.apache.xerces.internal.xs
 #
 
@@ -35,11 +33,6 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 FILES_java =\
@@ -76,30 +69,13 @@
         $(PKGDIR)/xs/XSTypeDefinition.java \
         $(PKGDIR)/xs/XSWildcard.java \
 
-
-
-# Rule
-#
-include $(BUILDDIR)/common/Classes.gmk
-
-## Messages are in $(PKGDIR)/xalan/internal/res/XSLTErrorResources.java 
-
 #
 # Resources
 #
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
 LOCALE_SET_DEFINITION = j2re
-#NEW_RESOURCE_BUNDLES_PROPERTIES = \
-#   xerces/internal/parsers/org.xml.sax.driver \
-
 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xml/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xml/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.0 02/10/23
-#
 # Makefile for building com.sun.org.apache.xml
 #
 
@@ -35,55 +33,30 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Take out enums flag until source code is updated
-#
-# LANGUAGE_VERSION = -source 1.4
-
-#
 # Files to compile
 #
 AUTO_FILES_JAVA_DIRS = com/sun/org/apache/xml
 
-
-# Rules
-#
-include $(BUILDDIR)/common/Classes.gmk
-
 #
 # Resources
 #
-# RESOURCE_FILES = \
-#OTHER_PROPERTIES = \
 LOCALE_SET_DEFINITION = j2re
 NEW_RESOURCE_BUNDLES_PROPERTIES = \
-   internal/serialize/HTMLEntities.res \
-   internal/serializer/Encodings.properties \
-   internal/serializer/HTMLEntities.properties \
-   internal/serializer/output_html.properties \
-   internal/serializer/output_text.properties \
-   internal/serializer/output_unknown.properties \
-   internal/serializer/output_xml.properties \
-   internal/serializer/XMLEntities.properties \
-   internal/security/resource/config.dtd \
-   internal/security/resource/config.xml \
-   internal/security/resource/xmlsecurity_de.properties \
-   internal/security/resource/xmlsecurity_en.properties \
-
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)
+   $(PKGDIR)/internal/serialize/HTMLEntities.res \
+   $(PKGDIR)/internal/serializer/Encodings.properties \
+   $(PKGDIR)/internal/serializer/HTMLEntities.properties \
+   $(PKGDIR)/internal/serializer/output_html.properties \
+   $(PKGDIR)/internal/serializer/output_text.properties \
+   $(PKGDIR)/internal/serializer/output_unknown.properties \
+   $(PKGDIR)/internal/serializer/output_xml.properties \
+   $(PKGDIR)/internal/serializer/XMLEntities.properties \
+   $(PKGDIR)/internal/security/resource/config.dtd \
+   $(PKGDIR)/internal/security/resource/config.xml \
+   $(PKGDIR)/internal/security/resource/xmlsecurity_de.properties \
+   $(PKGDIR)/internal/security/resource/xmlsecurity_en.properties \
 
-
-## Xalan is using a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res: \
-	$(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
-$(RESOURCE_DEST_DIR)/internal/security/resource/config.dtd: \
-	$(RESOURCE_SRC_DIR)/internal/security/resource/config.dtd
-	$(install-file)
-
-$(RESOURCE_DEST_DIR)/internal/security/resource/config.xml: \
-	$(RESOURCE_SRC_DIR)/internal/security/resource/config.xml
-	$(install-file)
-
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/org/apache/xpath/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/org/apache/xpath/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -43,19 +43,10 @@
 #
 LOCALE_SET_DEFINITION = j2sdk
 NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)
-include $(BUILDDIR)/common/Resources.gmk
-
-#
-# Apache can use a special ".res" extension for entities.
-$(RESOURCE_DEST_DIR)/%.res:        $(RESOURCE_SRC_DIR)/%.res
-	$(install-file)
 
 #
 # Rules
 #
-
 build: other_files
 
 clean:: classes.clean
@@ -64,3 +55,4 @@
 
 # TODO: still relevant?
 other_files: $(MISC_FILES)
+
--- a/j2se/make/com/sun/rowset/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/rowset/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -38,15 +38,13 @@
 AUTO_FILES_JAVA_DIRS = com/sun/rowset
 
 #
-# Rules.
+# Resources
+#
+LOCALE_SET_DEFINITION = j2re
+RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/RowSetResourceBundle.properties
+
+#
+# Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-#
-# Resources
-#
-LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_PROPERTIES = RowSetResourceBundle.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/com/sun/rowset
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/com/sun/rowset
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/com/sun/security/auth/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/security/auth/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)Makefile	1.17 07/05/05
-#
-
 BUILDDIR = ../../../..
 PACKAGE = com.sun.security.auth
 PRODUCT = sun
@@ -41,10 +37,10 @@
 # Resources
 #
 LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_JAVA = $(TARGDIR)/sun/security/util/AuthResources.java
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_JAVA = sun/security/util/AuthResources.java
 
 #
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
+
--- a/j2se/make/com/sun/sql/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/sql/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.3 04/03/11
-#
 FILES_java = \
 	$(TARGDIR)com/sun/rowset/DataSetImpl.java \
 	$(TARGDIR)com/sun/rowset/QueryObjectGeneratorImpl.java
--- a/j2se/make/com/sun/tools/doclets/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/tools/doclets/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -44,8 +44,6 @@
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
 	$(PKGDIR)/internal/toolkit/resources/doclets.properties \
 	$(PKGDIR)/formats/html/resources/standard.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
 
 GIF_FILES =	   $(PKGDIR)/internal/toolkit/resources/inherit.gif
 LAYOUT_XML_FILES = $(PKGDIR)/internal/toolkit/resources/doclet.xml
@@ -69,3 +67,4 @@
 	$(install-file)
 
 .PHONY: gif_files layout_xml_files
+
--- a/j2se/make/com/sun/xml/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/com/sun/xml/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -32,33 +32,31 @@
 PRODUCT = xml
 include $(BUILDDIR)/common/Defs.gmk
 
-
-
 #
 # Files to compile
 #
 include FILES.gmk
-AUTO_FILES_JAVA_DIRS = com/sun/codemodel com/sun/istack com/sun/activation com/sun/xml com/sun/xml/internal/dtdparser com/sun/tools/internal/xjc com/sun/tools/internal/jjxc
+AUTO_FILES_JAVA_DIRS = com/sun/codemodel \
+		       com/sun/istack \
+		       com/sun/activation \
+		       com/sun/xml \
+		       com/sun/xml/internal/dtdparser \
+		       com/sun/tools/internal/xjc \
+		       com/sun/tools/internal/jjxc
 
-
-#Resources (only if you have them)
+#
+# Resources
+#
 LOCALE_SET_DEFINITION = j2sdk
 NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-RESOURCE_DEST_DIR = $(CLASSBINDIR)
-include $(BUILDDIR)/common/Resources.gmk
 
 #
 # Rules
 #
-
 build: other_files
 
 clean:: classes.clean
 
-#
-# Include
-#
 include $(BUILDDIR)/common/Classes.gmk
 
 other_files: $(MISC_FILES)
--- a/j2se/make/common/CancelImplicits.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/CancelImplicits.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)CancelImplicits.gmk	1.7 07/05/05
-#
 # Cancel some GNU make implicit rules.  This causes far fewer stats
 # (crucial in incremental builds, when all that is being done is stats -- I
 # notice upto 20% speedup on local disk). See sections "10.2 Catalogue of
--- a/j2se/make/common/Defs-linux.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Defs-linux.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Defs-linux.gmk	1.164 07/05/08
-#
 # Makefile to specify compiler flags for programs and libraries
 # targeted to Linux.  Should not contain any rules.
 #
@@ -45,6 +43,11 @@
 # Get shared JDK settings
 include $(J2SE_SHARED_DIR)/Defs.gmk
 
+# Linux should use parallel compilation for best build times
+ifndef COMPILE_APPROACH
+  COMPILE_APPROACH = parallel
+endif
+
 # Part of INCREMENTAL_BUILD mechanism.
 #   Compiler emits things like:  path/file.o: file.h
 #   We want something like: relative_path/file.o relative_path/file.d: file.h
@@ -236,6 +239,10 @@
 OTHER_LDFLAGS  += -static-libgcc
 endif
 
+# Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
+#   (See Rules.gmk) The gcc 5 compiler might have an option for this?
+AUTOMATIC_PCH_OPTION = 
+
 #
 # Post Processing of libraries/executables
 #
@@ -283,7 +290,6 @@
 override ALT_CODESET_KEY         = _NL_CTYPE_CODESET_NAME
 override AWT_RUNPATH             =
 override HAVE_ALTZONE            = false
-override HAVE_DGA                = false
 override HAVE_FILIOH             = false
 override HAVE_GETHRTIME          = false
 override HAVE_GETHRVTIME         = false
--- a/j2se/make/common/Defs-solaris.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Defs-solaris.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Defs-solaris.gmk	1.258 07/05/05
-#
 # Makefile to specify compiler flags for programs and libraries
 # targeted to Solaris.  Should not contain any rules.
 #
@@ -46,6 +44,11 @@
 # Get shared JDK settings
 include $(J2SE_SHARED_DIR)/Defs.gmk
 
+# Solaris should use parallel compilation for best build times
+ifndef COMPILE_APPROACH
+  COMPILE_APPROACH = parallel
+endif
+
 ifndef PLATFORM_SRC
 PLATFORM_SRC = $(J2SE_TOPDIR)/src/solaris
 endif # PLATFORM_SRC
@@ -139,8 +142,6 @@
 #        during a debugging session is not possible, but stepping and
 #        printing of global or static variables should be possible.
 #        Performance/size of files should be about the same, maybe smaller.
-#        Compilation time will increase slightly, should be used with
-#        PARALLEL_COMPILES if build time is an issue.
 #
 ifeq ($(FASTDEBUG), true)
   CC_FASTDEBUG_OPT       = $(CC_LOWER_OPT)
@@ -427,6 +428,9 @@
   CC_LOWER_OPT   = -O2
   CFLAGS_REQUIRED_i586  += -fno-omit-frame-pointer
   CFLAGS_REQUIRED_amd64 += -fno-omit-frame-pointer
+  # Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
+  #   (See Rules.gmk) May need to wait for gcc 5?
+  AUTOMATIC_PCH_OPTION = 
 else
   # Highest could be -xO5, but indications are that -xO5 should be reserved
   #    for a per-file use, on sources with known performance impacts.
@@ -498,6 +502,9 @@
     # We MUST allow data alignment of 4 for sparc (sparcv9 is ok at 8s)
     CFLAGS_REQUIRED_sparc += -xmemalign=4s
   endif
+  # Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
+  #   (See Rules.gmk) The SS11 -xpch=auto* options appear to be broken.
+  AUTOMATIC_PCH_OPTION =
 endif
 CC_NO_OPT      = 
 
--- a/j2se/make/common/Defs-windows.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Defs-windows.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-# @(#)Defs-windows.gmk	1.174 07/05/05
 #
 # Makefile to specify compiler flags for programs and libraries
 # targeted to Windows builds.  Should not contain any rules.
@@ -32,9 +31,19 @@
 #          So when it includes other files, it must use J2SE_TOPDIR.
 #
 
+#
+# This may not be working on windows yet.
+#
+override INCREMENTAL_BUILDS = false
+
 # Get shared JDK settings
 include $(J2SE_SHARED_DIR)/Defs.gmk
 
+# Windows should use parallel compilation for best build times
+ifndef COMPILE_APPROACH
+  COMPILE_APPROACH = normal
+endif
+
 # CC compiler object code output directive flag value
 CC_OBJECT_OUTPUT_FLAG = -Fo
 
@@ -130,6 +139,8 @@
   #
   ifeq ($(COMPILER_VERSION), VC6)
     # VC6 (6.2) msvc compiler (the way Tiger and early Mustang were built)
+    # Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
+    AUTOMATIC_PCH_OPTION =
     GX_OPTION = -GX
     ifeq ($(ARCH_DATA_MODEL), 32)
       CC_HIGHEST_OPT = -Ox -Gy -Os -GB
@@ -142,6 +153,8 @@
     endif
   endif
   ifeq ($(COMPILER_VERSION), VS2003)
+    # Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
+    AUTOMATIC_PCH_OPTION = -YX
     # Also known as VC7 compiler
     GX_OPTION = -GX
     ifeq ($(ARCH_DATA_MODEL), 32)
@@ -158,6 +171,8 @@
     endif
   endif
   ifeq ($(COMPILER_VERSION), VS2005)
+    # Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
+    AUTOMATIC_PCH_OPTION =
     # VS2005 compiler, only with Platform SDK right now?
     GX_OPTION = -EHsc
     ifeq ($(ARCH_DATA_MODEL), 32)
@@ -231,7 +246,9 @@
 
 ifeq ($(CC_VERSION),msvc)
   # VS2003 compiler option definitions:
-  #   -Zi      Cause *.pdb file to be created (-Z7 leaves it in obj/exe?)
+  #   -Zi      Cause *.pdb file to be created, full debug information
+  #   -Z7      Full debug inside the .obj, no .pdb
+  #   -Zd      Basic debug, no local variables? In the .obj
   #   -Zl      Don't add runtime library name to obj file?
   #   -Od      Turns off optimization and speeds compilation
   #   -YX -Fp/.../foobar.pch   Use precompiled headers (try someday?)
@@ -249,7 +266,14 @@
   # behavior (as seen in VS2003) to avoid massive code modifications.
   # When/if our code will be "C/C++ Standard"-compliant (at least in the area
   # of handling the wchar_t type), the option won't be necessary.
-  CFLAGS_VS2005 += -Zc:wchar_t-
+  ifeq ($(ARCH_DATA_MODEL), 32)
+    CFLAGS_VS2005 += -Zc:wchar_t-
+  else
+    # The 64bit Platform SDK we use (April 2005) doesn't like this option
+    ifneq ($(CC_VER), 14.00.40310.41)
+      CFLAGS_VS2005 += -Zc:wchar_t-
+    endif
+  endif
 
   # All builds get the same runtime setting
   CFLAGS_COMMON += $(MS_RUNTIME_OPTION) $(CFLAGS_$(COMPILER_VERSION))
@@ -288,9 +312,9 @@
 CPPFLAGS_COMMON += -DWIN32_LEAN_AND_MEAN
 
 #
-# Output options
+# Output options (use specific filenames to avoid parallel compile errors)
 #
-CFLAGS_COMMON += -Fd$(OBJDIR)/ -Fe$(OBJDIR)/ -Fm$(OBJDIR)/ 
+CFLAGS_COMMON += -Fd$(OBJDIR)/$(*F).pdb -Fe$(OBJDIR)/$(*F).obj -Fm$(OBJDIR)/$(*F).map
 
 #
 # Add warnings and extra on 64bit issues
--- a/j2se/make/common/Defs.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Defs.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -290,13 +290,6 @@
  INCREMENTAL_BUILD=false
 endif
 
-#
-# Default for PARALLEL_COMPILES
-#
-ifndef PARALLEL_COMPILES
- PARALLEL_COMPILES=true
-endif
-
 # for generated libraries
 LIBDIR              = $(OUTPUTDIR)/lib
 ABS_LIBDIR          = $(ABS_OUTPUTDIR)/lib
@@ -465,18 +458,14 @@
 #
 # Memory related -J flags that all uses of java tools should use.
 #
+JAVA_MEM_FLAGS   = -Xmx$(MAX_VM_MEMORY)m
 ifeq ($(ARCH), ia64)
   # Special flags for javac on ia64 to work around a VM problem with
   #   bad code generation during inlining (what version had this problem?):
   #   Suspect this may not be needed anymore.
-  JAVA_MEM_FLAGS   = -Xmx512m -Xms512m -XX:-Inline
+  JAVA_MEM_FLAGS   += -Xms$(MAX_VM_MEMORY)m -XX:-Inline
 else
-  # If build machine is low on RAM or physical memory, adjust these down
-  ifeq ($(LOW_MEMORY_MACHINE),true)
-    JAVA_MEM_FLAGS   = -Xmx256m -Xms128m
-  else
-    JAVA_MEM_FLAGS   = -Xmx512m -Xms256m
-  endif
+  JAVA_MEM_FLAGS   += -Xms$(MIN_VM_MEMORY)m -XX:PermSize=32m -XX:MaxPermSize=160m
 endif
 JAVA_MEM_JFLAGS   = $(JAVA_MEM_FLAGS:%=-J%)
 
@@ -486,17 +475,21 @@
 #    In particular, the client VM makes these tools run faster when
 #    it's available.
 #
-ifdef USE_HOTSPOT_INTERPRETER_MODE
-  JAVA_JVM_FLAGS = -Xint
+ADD_CLIENT_VM_OPTION = false
+ifeq ($(PLATFORM), solaris)
+  ADD_CLIENT_VM_OPTION = true
 else
-  ifeq ($(PLATFORM), solaris)
-    JAVA_JVM_FLAGS = -client
-  else
-    ifeq ($(ARCH_DATA_MODEL), 32)
-      JAVA_JVM_FLAGS = -client
-    endif
+  ifeq ($(ARCH_DATA_MODEL), 32)
+    ADD_CLIENT_VM_OPTION = true
   endif
 endif
+ifeq ($(ADD_CLIENT_VM_OPTION), true)
+  JAVA_JVM_FLAGS += -client
+endif
+ifdef USE_HOTSPOT_INTERPRETER_MODE
+  JAVA_JVM_FLAGS += -Xint
+endif
+
 JAVA_JVM_JFLAGS   = $(JAVA_JVM_FLAGS:%=-J%)
 JAVA_TOOLS_FLAGS  = $(JAVA_JVM_FLAGS) $(JAVA_MEM_FLAGS)
 JAVA_TOOLS_JFLAGS = $(JAVA_JVM_JFLAGS) $(JAVA_MEM_JFLAGS)
@@ -639,8 +632,8 @@
 
 # Prepare $@ target, remove old one and making sure directory exists
 define prep-target
-@$(MKDIR) -p $(@D)
-@$(RM) $@
+$(MKDIR) -p $(@D)
+$(RM) $@
 endef
 
 # Simple install of $< file to $@
@@ -656,32 +649,6 @@
 if [ -w $(HOTSPOT_LOG_NAME) ] ; then $(RM) $(HOTSPOT_LOG_NAME); fi
 endef
 
-# Install a stripped down properties file
-define install-stripped-properties-file
-$(prep-target)
-$(JAVA) -classpath $(J2SE_TOPDIR)/make/tools/strip StripProperties < $< > $@
-@$(java-vm-cleanup)
-endef
-
-# Compile a proerty file into a class file
-define compile-properties-file
-$(prep-target)
-$(JAVA) -classpath $(J2SE_TOPDIR)/make/tools/CompileProperties CompileProperties $< $@ $(COMPILED_PROPERTIES_SUPERCLASS)
-@$(java-vm-cleanup)
-endef
-
-# Used to apply to source file $<, checks code conventions, issues warnings.
-define check-conventions
-if [ "$(CONVENTION_WATCH)" = "true" ] ; then \
-  if [ "`$(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]'`" != "" ] ; then \
-    $(ECHO) "WARNING: File contains tabs, ^M, or ^L characters: $<"; \
-    if [ "$(CONVENTION_DETAILS)" = "true" ] ; then \
-      $(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]' ; \
-    fi; \
-  fi; \
-fi
-endef
-
 # Default make settings for processing SUBDIRS with clobber or clean names
 SUBDIRS_MAKEFLAGS-clobber = INCREMENTAL_BUILD=false
 SUBDIRS_MAKEFLAGS-clean   = INCREMENTAL_BUILD=false
@@ -878,4 +845,24 @@
   COPYRIGHT_YEAR = $(shell $(DATE) '+%Y')
 endif
 
+# Install of imported file (JDK_IMPORT_PATH, or some other external location)
+define install-import-file
+@$(ECHO) "ASSEMBLY_IMPORT: $@"
+$(install-file)
+endef
+
+# Install of closed files into an openjdk build image (CLOSED_JDK_IMPORT_PATH)
+define install-closed-file
+@$(ECHO) "ASSEMBLY_EXCEPTION: $(@F)"
+$(install-file)
+endef
+
+# Install closed classes into CLASSDESTDIR (CLOSED_JDK_IMPORT_PATH rt.jar)
+#    Example: $(call install-closed-classes,files_or_dirs)
+define install-closed-classes
+$(MKDIR) -p $(CLASSDESTDIR)
+($(CD) $(CLASSDESTDIR) && $(JAR_BOOT) xvf $(CLOSED_JAR_FILE) $1) \
+ | $(SED) -e "s/^extracted:/ASSEMBLY_EXCEPTION:/"
+endef
+
 .PHONY: all build clean clobber
--- a/j2se/make/common/Library.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Library.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -58,12 +58,10 @@
 FILES_o  += $(patsubst %.s,   %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_s))))
 FILES_o  += $(patsubst %.cpp, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp))))
 
-ifneq ($(PLATFORM),windows)
 ifeq ($(INCREMENTAL_BUILD),true)
 FILES_d   = $(patsubst %.c,   %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c))))
 FILES_d  += $(patsubst %.cpp, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp))))
 endif # INCREMENTAL_BUILD
-endif # PLATFORM
 
 ifeq ($(PLATFORM),solaris)
 # List of all lint files, one for each .c file (only for C)
@@ -101,6 +99,67 @@
 
 $(ACTUAL_LIBRARY):: $(INIT) $(TEMPDIR) $(LIBDIR) $(BINDIR) $(EXTDIR) classheaders
 
+#
+# COMPILE_APPROACH: Different approaches to compile up the native object
+#   files as quickly as possible.
+#   The setting of parallel works best on Unix, batch on Windows.
+#
+
+COMPILE_FILES_o = $(OBJDIR)/.files_compiled
+$(COMPILE_FILES_o): $(FILES_d) $(FILES_o)
+	@$(ECHO) "$<" >> $@
+clean::
+	$(RM) $(COMPILE_FILES_o)
+
+#
+# COMPILE_APPROACH=parallel: Will trigger compilations (just compilations) to
+#   happen in parallel. Greatly decreases Unix build time, even on single CPU
+#   machines, more so on multiple CPU machines. Default is 2 compiles
+#   at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS.
+#   Note that each .d file will also be dependent on it's .o file, see
+#   Rules.gmk.
+#   Note this does not depend on Rules.gmk to work like batch (below)
+#   and this technique doesn't seem to help Windows build time nor does
+#   it work very well, it's possible the Windows Visual Studio compilers
+#   don't work well in a parallel situation, this needs investigation.
+#
+
+ifeq ($(COMPILE_APPROACH),parallel)
+
+.PHONY: library_parallel_compile
+
+library_parallel_compile:
+	@$(ECHO) "Begin parallel compiles: $(shell $(PWD))"
+	@$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(COMPILE_FILES_o)
+	@$(ECHO) "Done with parallel compiles: $(shell $(PWD))"
+
+$(ACTUAL_LIBRARY):: library_parallel_compile
+
+endif
+
+#
+# COMPILE_APPROACH=batch: Will trigger compilations (just compilations) to
+#   happen in batch mode. Greatly decreases Windows build time.
+#   See logic in Rules.gmk for how compiles happen, the $(MAKE) in
+#   library_batch_compile below triggers the actions in Rules.gmk.
+#   Note that each .d file will also be dependent on it's .o file, see
+#   Rules.gmk.
+#
+ifeq ($(COMPILE_APPROACH),batch)
+
+.PHONY: library_batch_compile
+
+library_batch_compile:
+	@$(ECHO) "Begin BATCH compiles: $(shell $(PWD))"
+	$(MAKE) $(COMPILE_FILES_o)
+	$(MAKE) batch_compile
+	@$(ECHO) "Done with BATCH compiles: $(shell $(PWD))"
+	$(MAKE) COMPILE_APPROACH=normal $(COMPILE_FILES_o)
+
+$(ACTUAL_LIBRARY):: library_batch_compile
+
+endif
+
 ifeq ($(PLATFORM), windows)
 
 #
@@ -133,7 +192,7 @@
 
 endif # LIBRARY
 
-$(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(FILES_o) $(FILES_m)
+$(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m)
 	@$(prep-target)
 	@$(MKDIR) -p $(TEMPDIR)
 	@$(ECHO) $(FILES_o) > $@ 
@@ -172,36 +231,11 @@
 else # PLATFORM
 
 #
-# PARALLEL_COMPILES: Will trigger compilations (just compilations) to
-#   happen in parallel. Greatly decreases build time, even on single CPU
-#   machines, more so on multiple CPU machines. Default is 2 compiles
-#   at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS.
-#   Note that each .d file will also be dependent on it's .o file, see
-#   Rules.gmk.
-#
-
-$(OBJDIR)/.files_compiled: $(FILES_d) $(FILES_o)
-	@$(ECHO) "$<" >> $@
-
-ifeq ($(PARALLEL_COMPILES),true)
-
-.PHONY: parallel_compile
-
-parallel_compile:
-	@$(ECHO) "Begin parallel compiles: $(shell $(PWD))"
-	@$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(OBJDIR)/.files_compiled
-	@$(ECHO) "Done with parallel compiles: $(shell $(PWD))"
-
-$(ACTUAL_LIBRARY):: parallel_compile
-
-endif
-
-#
 # On Solaris, use mcs to write the version into the comment section of
 # the shared library.  On other platforms set this to false at the
 # make command line.
 #
-$(ACTUAL_LIBRARY):: $(OBJDIR)/.files_compiled $(FILES_m) $(FILES_reorder)
+$(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder)
 	@$(prep-target)
 	@$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), _OPT=$(_OPT)"
 	@$(ECHO) "Rebuilding $@ because of $?"
@@ -226,28 +260,34 @@
 
 else  # COMPILE_IT
 
+# In this case we are just copying the file.
+
 ifneq ($(LIBRARY), fdlibm)
 # Copies in the file from the JDK_IMPORT_PATH area
 # OpenJDK rule is first so any lib is preferentially copied from that location.
 ifdef USE_CLOSED_LIB
 $(ACTUAL_LIBRARY_DIR)/%: $(CLOSED_LIB_DIR)/%
-	$(ECHO) "Copying closed source library " $(CLOSED_LIB_DIR)/$(ACTUAL_LIBRARY_NAME) into $(ACTUAL_LIBRARY_DIR)
-	@$(install-file)
-endif
+	$(install-closed-file)
+ifeq ($(PLATFORM),windows)
+$(OBJDIR)/%.lib: $(CLOSED_LIB_DIR)/%.lib
+	$(install-closed-file)
+endif # windows
+else
 $(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/%
-	@$(install-file)
+	$(install-import-file)
+endif # USE_CLOSED_LIB
 $(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/native_threads/%
-	@$(install-file)
+	$(install-import-file)
 $(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/headless/%
-	@$(install-file)
+	$(install-import-file)
 $(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/motif21/%
-	@$(install-file)
+	$(install-import-file)
 $(ACTUAL_LIBRARY_DIR)/%: $(JDK_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/xawt/%
-	@$(install-file)
-else
+	$(install-import-file)
+else # fdlibm
 $(ACTUAL_LIBRARY_DIR)/%:
-	@$(prep-target)
-endif
+	$(prep-target)
+endif # fdlibm
 
 endif # COMPILE_IT
 
@@ -267,7 +307,6 @@
 #
 clean::
 	$(RM) -r $(ACTUAL_LIBRARY)
-	$(RM) $(OBJDIR)/.files_compiled
 
 clobber:: clean
 
@@ -279,7 +318,6 @@
 #   release engineering or nightly builds) set INCREMENTAL_BUILD=false.
 #
 
-ifneq ($(PLATFORM), windows)
 ifeq ($(INCREMENTAL_BUILD),true)
 
 #
@@ -298,7 +336,6 @@
 endif # files
 
 endif # INCREMENTAL_BUILD
-endif # PLATFORM
 
 #
 # Default dependencies
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/make/common/NativeCompileRules.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,214 @@
+#
+# Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun in the LICENSE file that accompanied this code.
+#
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+#
+# Native C/C++ Compile Rules
+#
+
+#
+# INCREMENTAL_BUILD: Record the #include file dependencies.
+#
+# NOTE: We build make include files with the suffix
+#       $(DEPEND_SUFFIX) on every compilation. These are initially 
+#       created as temp files just in case a ^C kills it in the middle.
+#	Compiler is smart enough to handle ^C and not create the .o file, or
+#	is supposed to be that smart, but the .$(DEPEND_SUFFIX) file 
+#       creation here isn't.
+#	These .$(DEPEND_SUFFIX) files are included by Library.gmk and 
+#       Program.gmk, when they exist (Search for 'make dependencies').
+#
+
+ifeq ($(INCREMENTAL_BUILD),true)
+
+$(OBJDIR)/%.$(DEPEND_SUFFIX): %.c
+	@$(prep-target)
+	@$(ECHO) "Creating $@"
+	@$(RM) $@.temp
+	@$(CC) $(CC_DEPEND) $(CPPFLAGS) $< 2> $(DEV_NULL) | \
+	    $(CC_DEPEND_FILTER) > $@.temp
+	@$(MV) $@.temp $@
+
+$(OBJDIR)/%.$(DEPEND_SUFFIX): %.cpp
+	@$(prep-target)
+	@$(ECHO) "Creating $@"
+	@$(RM) $@.temp
+	@$(CXX) $(CC_DEPEND) $(CPPFLAGS) $(CXXFLAGS) $< 2> $(DEV_NULL) | \
+	    $(CC_DEPEND_FILTER) > $@.temp
+	@$(MV) $@.temp $@
+
+endif # INCREMENTAL_BUILD
+
+#
+# C, C++, asm files.
+#
+# Normal or parallel compile rule is the same, but batch compiles require
+#  we save up the sources files that use the same compile line so that we
+#  can do one compile line.
+#
+
+ifneq ($(COMPILE_APPROACH), batch)
+
+$(OBJDIR)/%.$(OBJECT_SUFFIX): %.c
+	@$(prep-target)
+	$(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$@ $(CFLAGS_GPROF) $<
+	@$(check-conventions)
+
+$(OBJDIR)/%.$(OBJECT_SUFFIX): %.cpp
+	@$(prep-target)
+	$(COMPILE.cc) $(CC_OBJECT_OUTPUT_FLAG)$@ $(CFLAGS_GPROF) $<
+	@$(check-conventions)
+
+else
+  
+  #
+  # Batch compiling might be faster if the compiler was smart about recognizing
+  #   optimization opportunities available when all files are being compiled
+  #   the same way. Unfortunately this is rare.
+  #   Automatic pre-compiled headers (pch) might be a possibility so we
+  #   add any auto pch options here.
+  # So we save all the source files that have the same compile line as the
+  #   first file. A normal compile pass is made after the batch compile
+  #   to catch anything missed.
+  # If the compilers had a -o option that allowed us to direct where to
+  #   write the object files to, then we would not need to save the object
+  #   file list or move them from the make directory to the build directory.
+  #
+
+  # Source names
+  COMPILE_LIST.c         = $(OBJDIR)/.source_names_c
+  COMPILE_LIST.cpp       = $(OBJDIR)/.source_names_cpp
+
+  # Object file list
+  COMPILE_OBJ_LIST.c     = $(OBJDIR)/.obj_names_c
+  COMPILE_OBJ_LIST.cpp   = $(OBJDIR)/.obj_names_cpp
+  
+  # The compile line
+  COMPILE_BATCH.c        = $(OBJDIR)/.compile_c
+  COMPILE_BATCH.cpp      = $(OBJDIR)/.compile_cpp
+
+  # The compile line for the current target
+  THIS_COMPILE_BATCH.c   = $(COMPILE_BATCH.c)-$(@F)
+  THIS_COMPILE_BATCH.cpp = $(COMPILE_BATCH.cpp)-$(@F)
+
+$(OBJDIR)/%.$(OBJECT_SUFFIX): %.c
+	@$(prep-target)
+	@$(ECHO) "$(COMPILE.c) $(CFLAGS_GPROF)" > $(THIS_COMPILE_BATCH.c)
+	@if [ ! -s $(COMPILE_BATCH.c) ] ; then \
+	  $(CP) $(THIS_COMPILE_BATCH.c) $(COMPILE_BATCH.c) ; \
+	  $(ECHO) $< > $(COMPILE_LIST.c); \
+	  $(ECHO) $(@F) > $(COMPILE_OBJ_LIST.c); \
+	elif [ "`$(DIFF) -w -b $(THIS_COMPILE_BATCH.c) $(COMPILE_BATCH.c)`" \
+	       = "" ] ; then \
+	  $(ECHO) $< >> $(COMPILE_LIST.c); \
+	  $(ECHO) $(@F) >> $(COMPILE_OBJ_LIST.c); \
+	fi
+	@$(RM) $(THIS_COMPILE_BATCH.c)
+	@$(check-conventions)
+
+$(OBJDIR)/%.$(OBJECT_SUFFIX): %.cpp
+	@$(prep-target)
+	@$(ECHO) "$(COMPILE.cpp) $(CFLAGS_GPROF)" > $(THIS_COMPILE_BATCH.cpp)
+	@if [ ! -s $(COMPILE_BATCH.cpp) ] ; then \
+	  $(CP) $(THIS_COMPILE_BATCH.cpp) $(COMPILE_BATCH.cpp) ; \
+	  $(ECHO) $< > $(COMPILE_LIST.cpp); \
+	  $(ECHO) $(@F) > $(COMPILE_OBJ_LIST.cpp); \
+	elif [ "`$(DIFF) -w -b $(THIS_COMPILE_BATCH.cpp) $(COMPILE_BATCH.cpp)`"\
+	       = "" ] ; then \
+	  $(ECHO) $< >> $(COMPILE_LIST.cpp); \
+	  $(ECHO) $(@F) >> $(COMPILE_OBJ_LIST.cpp); \
+	fi
+	@$(RM) $(THIS_COMPILE_BATCH.cpp)
+	@$(check-conventions)
+
+batch_compile: $(FILES_o)
+	@$(ECHO) "Doing batch compilations"
+	@if [ -s $(COMPILE_LIST.c) ] ; then \
+	  $(ECHO) "$(COMPILE.c) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \
+	   `$(CAT) $(COMPILE_LIST.c)`" ; \
+	  ( $(COMPILE.c) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \
+	    `$(CAT) $(COMPILE_LIST.c)` && \
+	    $(ECHO) "$(MV) `$(CAT) $(COMPILE_OBJ_LIST.c)` $(OBJDIR)" && \
+	    $(MV) `$(CAT) $(COMPILE_OBJ_LIST.c)` $(OBJDIR) ) || exit 1 ; \
+	fi
+	@if [ -s $(COMPILE_LIST.cpp) ] ; then \
+	  $(ECHO) "$(COMPILE.cpp) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \
+	   `$(CAT) $(COMPILE_LIST.cpp)`" ; \
+	  ( $(COMPILE.cpp) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \
+	    `$(CAT) $(COMPILE_LIST.cpp)` && \
+	    $(ECHO) "$(MV) `$(CAT) $(COMPILE_OBJ_LIST.cpp)` $(OBJDIR)" && \
+	    $(MV) `$(CAT) $(COMPILE_OBJ_LIST.cpp)` $(OBJDIR) ) || exit 1 ; \
+	fi
+	@$(RM) $(COMPILE_BATCH.c)   $(COMPILE_LIST.c)   $(COMPILE_OBJ_LIST.c)
+	@$(RM) $(COMPILE_BATCH.cpp) $(COMPILE_LIST.cpp) $(COMPILE_OBJ_LIST.cpp)
+
+endif
+
+# newer as does not handle c++ style comments
+$(OBJDIR)/%.$(OBJECT_SUFFIX): %.s
+    ifneq ($(CC_VERSION), gcc)
+	@$(prep-target)
+	$(COMPILE.s) $(CC_OBJECT_OUTPUT_FLAG)$@ $<
+    else
+	@$(prep-target)
+	$(CPP) -x assembler-with-cpp $< | $(COMPILE.s) -o $@
+    endif
+	@$(check-conventions)
+
+#
+# Quick hack for making the compiler generate just the assembly file.
+#	$ gnumake obj/sparc/myfile.s
+#
+$(OBJDIR)/%.s: %.c
+	@$(prep-target)
+	$(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$@ -S $<
+	@$(check-conventions)
+
+# remove the intermediate files from the directories.
+#    (If VARIANT=OPT, this removes all debug and fastdebug files too)
+clobber clean::
+	$(RM) -r $(OBJDIR)
+	$(RM) -r $(OBJDIR)_*
+
+#
+# Lint support
+# (The 'lint' rule below is an older rule not using the .$(LINT_SUFFIX) files)
+#
+
+ifeq ($(PLATFORM), solaris)
+$(OBJDIR)/%.$(LINT_SUFFIX): %.c
+	@$(prep-target)
+	$(LINT.c) -dirout=$(OBJDIR) -c $<
+lint.clean:
+	$(RM) $(OBJDIR)/*.$(LINT_SUFFIX)
+# Old rule
+lint: $(FILES_c)
+        ifneq ($(FILES_c),)
+	  $(LINT.c) -Ncheck -Nlevel=3 $? $(LDLIBS) > lint.$(ARCH) 2>&1
+        endif
+endif
+
+.PHONY: batch_compile
+
+
--- a/j2se/make/common/Program.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Program.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -31,6 +31,13 @@
 #          So when it includes other files, it must use J2SE_TOPDIR.
 #
 
+#
+# If building programs, use a normal compile approach
+#
+ifeq ($(COMPILE_APPROACH),batch)
+  override COMPILE_APPROACH = normal
+endif
+
 ifndef LAUNCHER_PLATFORM_SRC
 LAUNCHER_PLATFORM_SRC = $(PLATFORM_SRC)
 endif
@@ -186,9 +193,9 @@
 
 # Copies in the file from the JDK_IMPORT_PATH area
 $(ACTUAL_PROGRAM_DIR)/%: $(JDK_IMPORT_PATH)/jre/bin/%
-	@$(install-file)
+	@$(install-import-file)
 $(ACTUAL_PROGRAM_DIR)/%: $(JDK_IMPORT_PATH)/bin/%
-	@$(install-file)
+	@$(install-import-file)
 
 endif # COMPILE_IT
 
@@ -213,7 +220,6 @@
 #
 # Now include make dependencies (created during compilation, see Rules.gmk)
 #
-ifneq ($(PLATFORM), windows)
 ifeq ($(INCREMENTAL_BUILD),true)
 # Workaround: gnumake sometimes says files is empty when it shouldn't
 #    was:  files := $(foreach file, $(wildcard */$(ARCH)/*.$(DEPEND_SUFFIX)), $(file))
@@ -222,7 +228,6 @@
 include $(files)
 endif # files
 endif # INCREMENTAL_BUILD
-endif # PLATFORM
 
 ifdef JAVA_ARGS
 OTHER_CPPFLAGS += -DJAVA_ARGS=$(JAVA_ARGS)
--- a/j2se/make/common/Release.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Release.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -27,9 +27,6 @@
 include $(J2SE_TOPDIR)/make/docs/NON_CORE_PKGS.gmk
 
 #
-# @(#)Release.gmk	1.362 07/05/05
-#
-#
 # Perform release engineering tasks.
 #
 # images    An image is what the product looks like when it is
@@ -422,7 +419,6 @@
 	META-INF/services/com.sun.jdi.connect.Connector \
 	META-INF/services/com.sun.jdi.connect.spi.TransportService \
 	sun/tools/asm		\
-	sun/tools/hprof		\
 	sun/tools/jar		\
 	sun/tools/java		\
 	sun/tools/javac		\
--- a/j2se/make/common/Resources.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Resources.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,203 +23,260 @@
 # have any questions.
 #
 
+# 
+# Generic mechanism for installing properties files, resource bundles,
+#   and other resource files.
 #
-# @(#)Resources.gmk	1.29 07/05/05
+# FILES_properties should be defined.
+# FILES_compiled_properties should be defined.
 # 
-# Generic mechanism for installing resource bundles and other properties
-# files.
+# If COMPILED_PROPERTIES_SUPERCLASS is defined, ALL the FILES_properties
+# files will be compiled into java with this super class.
+#
+# You can add locales to LOCALE_SUFFIXES explicitly, or use the
+# LOCALE_SET_DEFINITION variable to add some pre-defined locale lists.
+# The LOCALE_SET_DEFINITION can have the value: j2re, plugin, or j2sdk.
 #
 # Resource bundles to be installed are identified using the following variables.
 # Note that only the file name of the base bundle is given; localized versions
 # are added automatically. For Java files, use a format suitable for inclusion
-# in the FILES_java list; for properties, use a path relative to the values of
-# RESOURCE_SRC_DIR and RESOURCE_DEST_DIR.
-#
-#       NEW_RESOURCE_BUNDLES_JAVA        - new resource bundles implemented in
-#                                          Java, not localized yet
-#       NEW_RESOURCE_BUNDLES_PROPERTIES  - new resource bundles implemented as
-#                                          properties files, not localized yet
-#       RESOURCE_BUNDLES_JAVA            - resource bundles implemented in
-#                                          Java, localization exists
-#       RESOURCE_BUNDLES_PROPERTIES      - new resource bundles implemented as
-#                                          properties files, localization exists
+# in the FILES_java list; dito for properties, all relative paths.
 #
-# The following variable is now used for most .properties files in the
-# JDK. It uses the CompileProperties tool to translate the .properties
-# file into a .java file which is then compiled using javac. The
-# resulting .class files are usually smaller and are always faster to
-# load. It does not use the RESOURCE_DEST_DIR directory and assumes
-# that the filenames provided specify, through their subdirectories,
-# the package names of the resulting .java files. When this variable
-# is used, the inclusion of Resources.gmk must precede the inclusion
-# of the Makefile which contains the rules for classes (usually
-# Classes.gmk, Library.gmk, or Program.gmk), but must also come after
-# the first assignment to FILES_java (typically via an minclude.) This
-# placement of Resources.gmk implies that
-# RESOURCE_BUNDLES_COMPILED_PROPERTIES is incompatible with
-# RESOURCE_BUNDLES_PROPERTIES and OTHER_PROPERTIES, as they add
-# dependencies to the targets set up by e.g., Program.gmk but
-# RESOURCE_BUNDLES_COMPILED_PROPERTIES adds its dependencies to
-# FILES_java.
+#   NEW_RESOURCE_BUNDLES_JAVA        - new resource bundles implemented in
+#                                      Java, not localized
+#   NEW_RESOURCE_BUNDLES_PROPERTIES  - new resource bundles implemented as
+#                                      properties files, not localized
+#   RESOURCE_BUNDLES_JAVA            - resource bundles implemented in
+#                                      Java, localized
+#   RESOURCE_BUNDLES_PROPERTIES      - new resource bundles implemented as
+#                                      properties files, localized
 #
-# This rule also looks at the source directory RESOURCE_SRC_DIR_2 (for
-# situations where properties files from two different source directories
-# must be compiled -- currently only in the sun/awt Makefile.)
+# The following variable is now used for most .properties files in the JDK. 
+# These properties files are converted into java and compiled with javac.
+# The resulting .class files are usually smaller and are always faster to load. 
+# The relative path to the properties file becomes a relative path to a
+# java source file.
 #
-#       RESOURCE_BUNDLES_COMPILED_PROPERTIES - resource bundles implemented as
-#                                          properties files, localization exists,
-#                                          where the .properties file should be
-#                                          compiled into a .java file and from
-#                                          there into a .class
-#
-#       NEW_RESOURCE_BUNDLES_COMPILED_PROPERTIES - same as above but not localized yet
+#   RESOURCE_BUNDLES_COMPILED_PROPERTIES - resource bundles implemented as
+#                                          properties files, localized
+#   NEW_RESOURCE_BUNDLES_COMPILED_PROPERTIES - same as above, not localized
 #
 # Other properties files to be installed are identified using the variable:
 #
-#       OTHER_PROPERTIES
-#
-# The following variable allows you to control which locales are included:
-#
-#       LOCALE_SET_DEFINITION            - values: j2re, plugin, j2sdk;
-#                                          determines set of locales to
-#                                          localize for.
-#
-# The following variables specify source and destination of properties files:
-#
-#	RESOURCE_SRC_DIR
-#	RESOURCE_DEST_DIR
-#	RESOURCE_SRC_DIR_2 (see RESOURCE_BUNDLES_COMPILED_PROPERTIES above)
-#
+#   OTHER_PROPERTIES
 #
 
-# Make sure default rule is all
-resources_default_rule: all
+# Compile properties files into java source?
+ifdef COMPILED_PROPERTIES_SUPERCLASS
+  # Add all properties files to the compiled properties list (all or nothing)
+  COMPILED_PROPERTIES += $(FILES_compiled_properties) $(FILES_properties)
+else
+  COMPILED_PROPERTIES_SUPERCLASS = ListResourceBundle
+  COMPILED_PROPERTIES += $(FILES_compiled_properties)
+endif
 
 # Determine the locale suffixes needed beyond the base bundle
 
 ifeq ($(LOCALE_SET_DEFINITION), plugin)
-LOCALE_SUFFIXES = $(PLUGIN_LOCALES)
-else
+  LOCALE_SUFFIXES += $(PLUGIN_LOCALES)
+endif
 ifeq ($(LOCALE_SET_DEFINITION), j2sdk)
-LOCALE_SUFFIXES = $(J2SDK_LOCALES)
-else
-LOCALE_SUFFIXES = $(J2RE_LOCALES)
+  LOCALE_SUFFIXES += $(J2SDK_LOCALES)
 endif
+ifeq ($(LOCALE_SET_DEFINITION), j2re)
+  LOCALE_SUFFIXES += $(J2RE_LOCALES)
 endif
 
-# for l10n files use
-J2SE_L10N_TMP_OUTPUTDIR = $(OUTPUTDIR)/tmp/l10n/j2se
-
-dummy := $(shell $(MKDIR) -p $(J2SE_L10N_TMP_OUTPUTDIR))
-
-#create HK java file from zh_TW
-define create-hk-java-file
-@if [ ! -f $@ -o -w $@ ]; then \
-        dirname=`$(DIRNAME) $@`; \
-        if [ ! -d $${dirname} ]; then \
-                $(MKDIR) -p $${dirname}; \
-        fi; \
-        $(CAT) $< | $(SED) -e '/class/s/_zh_TW/_zh_HK/' > $@; \
-        $(CHMOD) 777 $@; \
-fi
-endef
+# Java files get tacked onto the standard list of files to compile
+RESOURCE_BUNDLE_FILES_java += $(NEW_RESOURCE_BUNDLES_JAVA)
+RESOURCE_BUNDLE_FILES_java += $(RESOURCE_BUNDLES_JAVA) \
+    $(foreach file,$(RESOURCE_BUNDLES_JAVA), \
+       $(foreach locale,$(LOCALE_SUFFIXES), \
+	  $(basename $(file))_$(locale).java))
 
-#create HK properties file from zh_TW
-define create-hk-properties-file
-@dirname=`$(DIRNAME) $@`; \
-if [ ! -d $${dirname} ]; then \
-     $(MKDIR) -p $${dirname}; \
-fi; \
-$(CP) $< $@; \
-$(CHMOD) 777 $@
-endef
-
-#Java files get tacked onto the standard list of files to compile
-
-RESOURCE_BUNDLE_FILES_java = \
-    $(NEW_RESOURCE_BUNDLES_JAVA)
-RESOURCE_BUNDLE_FILES_java += \
-    $(RESOURCE_BUNDLES_JAVA)
-RESOURCE_BUNDLE_FILES_java += \
-    $(foreach file,$(RESOURCE_BUNDLES_JAVA),$(foreach locale,$(LOCALE_SUFFIXES),$(basename $(file))_$(locale).java))
+# Add to java sources list
 FILES_java += $(RESOURCE_BUNDLE_FILES_java)
 
-
-# Compiled properties files (the new common case) are translated from
-# .properties to .java using the CompileProperties tool and then
-# compiled using javac. The .java files are generated into GENSRCDIR.
-# These rules do not use RESOURCE_DEST_DIR.
-
-COMPILED_PROPERTIES_FILES = \
-    $(RESOURCE_BUNDLES_COMPILED_PROPERTIES)
-COMPILED_PROPERTIES_FILES += \
-    $(NEW_RESOURCE_BUNDLES_COMPILED_PROPERTIES)
-COMPILED_PROPERTIES_FILES += \
-    $(foreach file,$(RESOURCE_BUNDLES_COMPILED_PROPERTIES),$(foreach locale,$(LOCALE_SUFFIXES),$(basename $(file))_$(locale)$(suffix $(file))))
-COMPILED_PROPERTIES_FILES_java = \
-    $(COMPILED_PROPERTIES_FILES:%.properties=$(GENSRCDIR)/%.java)
-# Don't delete these intermediate .java files
-.PRECIOUS: $(COMPILED_PROPERTIES_FILES_java)
-FILES_java += $(COMPILED_PROPERTIES_FILES:%.properties=%.java)
+# Compiled properties files are translated to .java.
+#   The .java files are generated into GENSRCDIR.
+COMPILED_PROPERTIES += $(NEW_RESOURCE_BUNDLES_COMPILED_PROPERTIES)
+COMPILED_PROPERTIES += $(RESOURCE_BUNDLES_COMPILED_PROPERTIES) \
+    $(foreach file,$(RESOURCE_BUNDLES_COMPILED_PROPERTIES),\
+      $(foreach locale,$(LOCALE_SUFFIXES),\
+	 $(basename $(file))_$(locale)$(suffix $(file))))
 
-# Redirect zh_HK java files to tmp directory which created from zh_TW
-$(GENSRCDIR)/%_zh_HK.java: $(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.properties
-	$(compile-properties-file)
-
-$(GENSRCDIR)/%.java: $(RESOURCE_SRC_DIR)/%.properties
-	$(compile-properties-file)
+# Add to java sources list
+FILES_java += $(COMPILED_PROPERTIES:%.properties=%.java)
 
-$(GENSRCDIR)/%.java: $(RESOURCE_SRC_DIR_2)/%.properties
-	$(compile-properties-file)
-
-# Properties files get copied from RESOURCE_SRC_DIR to RESOURCE_DEST_DIR
-
-PROPERTIES_FILES = \
-    $(NEW_RESOURCE_BUNDLES_PROPERTIES)
-PROPERTIES_FILES += \
-    $(RESOURCE_BUNDLES_PROPERTIES)
-PROPERTIES_FILES += \
-    $(foreach file,$(RESOURCE_BUNDLES_PROPERTIES),$(foreach locale,$(LOCALE_SUFFIXES),$(basename $(file))_$(locale)$(suffix $(file))))
+# Non-compiled files
+PROPERTIES_FILES += $(NEW_RESOURCE_BUNDLES_PROPERTIES)
+PROPERTIES_FILES += $(RESOURCE_BUNDLES_PROPERTIES) \
+    $(foreach file,$(RESOURCE_BUNDLES_PROPERTIES), \
+       $(foreach locale,$(LOCALE_SUFFIXES), \
+	  $(basename $(file))_$(locale)$(suffix $(file))))
 PROPERTIES_FILES += $(OTHER_PROPERTIES)
 
-PFILES = $(PROPERTIES_FILES:%=$(RESOURCE_DEST_DIR)/%)
+#
+# Compile Properties tool
+#
+COMPILE_PROP_NAME    = CompileProperties
+COMPILE_PROP_SRCDIR  = $(J2SE_TOPDIR)/make/tools/$(COMPILE_PROP_NAME)
+COMPILE_PROP_TEMPDIR = $(OUTPUTDIR)/$(COMPILE_PROP_NAME)
+COMPILE_PROP_JAVA    = $(COMPILE_PROP_SRCDIR)/$(COMPILE_PROP_NAME).java
+COMPILE_PROP_CLASS   = $(COMPILE_PROP_TEMPDIR)/$(COMPILE_PROP_NAME).class
+COMPILE_PROPERTIES   = \
+    $(BOOTDIR)/bin/java -classpath $(COMPILE_PROP_TEMPDIR) $(COMPILE_PROP_NAME)
+$(COMPILE_PROP_CLASS): $(COMPILE_PROP_JAVA)
+	@$(prep-target)
+	$(BOOTDIR)/bin/javac -d $(@D) $<
+	@$(java-vm-cleanup)
 
-$(RESOURCE_DEST_DIR)/%.properties: $(RESOURCE_SRC_DIR)/%.properties
-	$(install-stripped-properties-file)
+#
+# Strip Properties tool
+#
+STRIP_PROP_NAME    = StripProperties
+STRIP_PROP_SRCDIR  = $(J2SE_TOPDIR)/make/tools/$(STRIP_PROP_NAME)
+STRIP_PROP_TEMPDIR = $(OUTPUTDIR)/$(STRIP_PROP_NAME)
+STRIP_PROP_JAVA    = $(STRIP_PROP_SRCDIR)/$(STRIP_PROP_NAME).java
+STRIP_PROP_CLASS   = $(STRIP_PROP_TEMPDIR)/$(STRIP_PROP_NAME).class
+STRIP_PROPERTIES   = \
+    $(BOOTDIR)/bin/java -classpath $(STRIP_PROP_TEMPDIR) $(STRIP_PROP_NAME)
+$(STRIP_PROP_CLASS): $(STRIP_PROP_JAVA)
+	@$(prep-target)
+	$(BOOTDIR)/bin/javac -d $(@D) $<
+	@$(java-vm-cleanup)
 
-# Redirect zh_HK java files to tmp directory which created from zh_TW
-$(RESOURCE_DEST_DIR)/%_zh_HK.properties: $(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.properties
-	$(install-stripped-properties-file)
+#
+# Process and strip all non-compiled properties files (in a batch mode)
+#
+STRIP_PROP_FILES = $(PROPERTIES_FILES:%=$(CLASSDESTDIR)/%)
+# To efficiently strip properties we use one run of StripProperties. 
+# This macro gathers an option for use later.
+STRIP_PROP_options=$(TEMPDIR)/strip_prop_options
+define install-properties-file
+$(install-file)
+$(CHMOD) a+rw $@
+@$(ECHO) "# Adding to strip properties list: $@"
+$(ECHO) "$@" >> $(STRIP_PROP_options)
+endef
+
+# Constructs command line options file
+$(STRIP_PROP_options): $(STRIP_PROP_FILES)
+	@$(TOUCH) $@
+strip_prop_options_clean:
+	@$(RM) $(STRIP_PROP_options)
 
-# will be compiled to java if they are included in COMPILED_PROPERTIES_FILES
+# Strip the properties files
+strip_all_props: $(STRIP_PROP_CLASS) $(STRIP_PROP_options)
+	@if [ -s $(STRIP_PROP_options) ] ; then \
+          $(ECHO) "$(STRIP_PROPERTIES) -optionsfile $(STRIP_PROP_options)" ; \
+          $(STRIP_PROPERTIES) -optionsfile $(STRIP_PROP_options) ; \
+        fi
+	@$(java-vm-cleanup)
+
+#
+# Creates files in CLASSDESTDIR
+#
 
-# generates zh_HK properties files from zh_TW properties files
-$(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.properties: $(RESOURCE_SRC_DIR)/%_zh_TW.properties
-	$(create-hk-properties-file)
+# In some cases, we move files from package to resources subdir
+$(CLASSDESTDIR)/$(PKGDIR)/resources/%.properties: \
+	     $(SHARE_SRC)/classes/$(PKGDIR)/%.properties
+	$(install-properties-file)
+$(CLASSDESTDIR)/%.properties: $(SHARE_SRC)/classes/%.properties
+	$(install-properties-file)
+$(CLASSDESTDIR)/%.res: $(SHARE_SRC)/classes/%.res
+	$(install-file)
+$(CLASSDESTDIR)/%.dtd: $(SHARE_SRC)/classes/%.dtd
+	$(install-file)
+$(CLASSDESTDIR)/%.xml: $(SHARE_SRC)/classes/%.xml
+	$(install-file)
+$(CLASSDESTDIR)/%.prp: $(SHARE_SRC)/classes/%.prp
+	$(install-file)
 
-$(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.properties: $(RESOURCE_SRC_DIR_2)/%_zh_TW.properties
-	$(create-hk-properties-file)
+#
+# To efficiently compile properties into java sources we use one run
+#   of CompileProperties. This macro gathers an option for use later.
+#   Note: The properties file and java source name can be different
+#         locales, e.g. zh_TW and zh_HK. The java source filename
+#         determines the name of the class.
+COMPILE_PROP_options=$(TEMPDIR)/compile_prop_options
+define add-property-java-file
+@$(prep-target)
+@$(ECHO) "# Adding to compile properties list: $? -> $@"
+$(ECHO) "-compile $? $@ $(COMPILED_PROPERTIES_SUPERCLASS)" \
+   >> $(COMPILE_PROP_options)
+endef
 
-# generates zh_HK java file from zh_TW java file
-$(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.java: $(RESOURCE_SRC_DIR)/%_zh_TW.java
+$(GENSRCDIR)/%.java: $(PLATFORM_SRC)/classes/%.properties
+	$(add-property-java-file)
+$(GENSRCDIR)/%.java: $(SHARE_SRC)/classes/%.properties
+	$(add-property-java-file)
+$(GENSRCDIR)/%.java: $(GENSRCDIR)/%.properties
+	$(add-property-java-file)
+ifndef OPENJDK
+$(GENSRCDIR)/%.java: $(CLOSED_PLATFORM_SRC)/classes/%.properties
+	$(add-property-java-file)
+$(GENSRCDIR)/%.java: $(CLOSED_SHARE_SRC)/classes/%.properties
+	$(add-property-java-file)
+endif
+
+# Create HK java file from zh_TW (explicit resource bundles only)
+define create-hk-java-file
+@$(prep-target)
+$(CAT) $< | $(SED) -e '/class/s/_zh_TW/_zh_HK/' > $@
+endef
+
+# Explicit resource bundles
+$(GENSRCDIR)/%_zh_HK.java: $(PLATFORM_SRC)/classes/%_zh_TW.java
+	$(create-hk-java-file)
+$(GENSRCDIR)/%_zh_HK.java: $(SHARE_SRC)/classes/%_zh_TW.java
 	$(create-hk-java-file)
 
-# needed by common/Rules.gmk except java in gensrc which will get from properties files
-$(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.java: $(SHARE_SRC)/classes/%_zh_TW.java
-	$(create-hk-java-file)
+# Compile of zh_HK properties just uses the zh_TW properties files
+$(GENSRCDIR)/%_zh_HK.java: $(PLATFORM_SRC)/classes/%_zh_TW.properties
+	$(add-property-java-file)
+$(GENSRCDIR)/%_zh_HK.java: $(SHARE_SRC)/classes/%_zh_TW.properties
+	$(add-property-java-file)
 
-$(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.java: $(PLATFORM_SRC)/classes/%_zh_TW.java
-	$(create-hk-java-file)
+# Simple delivery of zh_HK properties files just copies zh_TW properties files
+$(CLASSDESTDIR)/%_zh_HK.properties: \
+             $(PLATFORM_SRC)/classes/%_zh_TW.properties
+	$(install-properties-file)
+$(CLASSDESTDIR)/%_zh_HK.properties: \
+             $(SHARE_SRC)/classes/%_zh_TW.properties
+	$(install-properties-file)
 
-#$(J2SE_L10N_TMP_OUTPUTDIR)/%_zh_HK.java: $(SOURCEPATH)/%_zh_TW.java
-#	$(create-hk-java-file)
+# List of java files converted from properties files needed
+COMPILE_PROP_JAVA_FILES = $(COMPILED_PROPERTIES:%.properties=$(GENSRCDIR)/%.java)
+
+# Constructs command line options file
+$(COMPILE_PROP_options): $(COMPILE_PROP_JAVA_FILES)
+	@$(TOUCH) $@
+compile_prop_options_clean:
+	@$(RM) $(COMPILE_PROP_options)
 
-# IDL has slightly different properties files
+# Make sure all are compiled, one compiler run
+compile_all_props: $(COMPILE_PROP_CLASS) $(COMPILE_PROP_options)
+	$(MKDIR) -p $(GENSRCDIR)
+	@if [ `$(CAT) $(COMPILE_PROP_options) | $(WC) -l` -ge 1 ] ; then \
+	  $(ECHO) "$(COMPILE_PROPERTIES) -optionsfile $(COMPILE_PROP_options)";\
+	  $(COMPILE_PROPERTIES) -optionsfile $(COMPILE_PROP_options) ; \
+	  $(java-vm-cleanup); \
+	fi
 
-$(RESOURCE_DEST_DIR)/%.prp: $(RESOURCE_SRC_DIR)/%.prp
-	$(install-file)
+# Make sure the build rule creates all the properties
+resources: strip_prop_options_clean   strip_all_props \
+           compile_prop_options_clean compile_all_props
 
-# Trigger building all those properties files
+# Cleanup generated sources
+clobber clean:: 
+	$(RM) $(COMPILE_PROP_JAVA_FILES)
+	$(RM) $(COMPILE_PROP_options)
+	$(RM) $(COMPILE_PROP_CLASS)
+	$(RM) $(STRIP_PROP_FILES)
+	$(RM) $(STRIP_PROP_options)
+	$(RM) $(STRIP_PROP_CLASS)
 
-build: $(PFILES)
+.PHONY: compile_prop_options_clean compile_all_props \
+	strip_prop_options_clean   strip_all_props
 
--- a/j2se/make/common/Rules-SCCS.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Rules-SCCS.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,10 +24,6 @@
 #
 
 #
-# @(#)Rules-SCCS.gmk	1.10 07/05/05
-#
-
-#
 # Only get these rules if SCCS is available
 #
 
--- a/j2se/make/common/Rules.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Rules.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -28,6 +28,17 @@
 #
 # Rules shared by all Java makefiles.
 #
+# Used to apply to source file $<, checks code conventions, issues warnings.
+define check-conventions
+  if [ "$(CONVENTION_WATCH)" = "true" ] ; then \
+    if [ "`$(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]'`" != "" ] ; then \
+      $(ECHO) "WARNING: File contains tabs, ^M, or ^L characters: $<"; \
+      if [ "$(CONVENTION_DETAILS)" = "true" ] ; then \
+        $(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]' ; \
+      fi; \
+    fi; \
+  fi
+endef
 
 # Make sure the default rule is all
 rules_default_rule: all
@@ -49,10 +60,6 @@
 endif
 
 #
-# Convert any *.properties files to *.java files with CompileProperties
-#
-
-#
 # If AUTO_FILES_PROPERTIES_DIRS used, automatically find properties files
 #
 ifdef AUTO_FILES_PROPERTIES_DIRS
@@ -81,83 +88,10 @@
 # Add any automatically found properties files to the properties file list
 FILES_properties += $(FILES_properties_auto1)
 
-# Make sure we have at least a dummy rule
-compile_properties::
-compile_properties_clean::
-
-# Compile properties files into java source?
-ifdef COMPILED_PROPERTIES_SUPERCLASS
-
-# Add all properties files to the compiled properties list (all or nothing)
-COMPILED_PROPERTIES := $(FILES_compiled_properties) $(FILES_properties)
-
-# Skip all this logic if there are no properties files to deal with
-ifneq ($(COMPILED_PROPERTIES),)
-
-# Make sure we have a properties compiler
-PCOMPILER_TEMPDIR=$(TEMPDIR)/properties_compiler
-PCOMPILER_JAVA=$(J2SE_TOPDIR)/make/tools/CompileProperties/CompileProperties.java
-PCOMPILER_CLASS=$(PCOMPILER_TEMPDIR)/CompileProperties.class
-PCOMPILER=$(JAVA) -classpath $(PCOMPILER_TEMPDIR) CompileProperties
-
-$(PCOMPILER_CLASS): $(PCOMPILER_JAVA)
-	@$(prep-target)
-	$(JAVAC_BOOT) -d $(PCOMPILER_TEMPDIR) $<
-
-# File that will hold properties compiler options, so we run compiler once
-PCOMPILER_OPTIONS=$(PCOMPILER_TEMPDIR)/pcompiler_options
-
-# On each properties file, if we need a java source file, add to the options
-#    and also add the source name to the list of java sources to compile.
-define add-property-java-file
-$(prep-target)
-$(ECHO) "-compile $? $@ $(COMPILED_PROPERTIES_SUPERCLASS)" >> $(PCOMPILER_OPTIONS)
-$(ECHO) "$@" >> $(JAVA_SOURCE_LIST)
-endef
-
-# Generated and standard locations
-$(GENSRCDIR)/%.java: $(PLATFORM_SRC)/classes/%.properties
-	@$(add-property-java-file)
-$(GENSRCDIR)/%.java: $(SHARE_SRC)/classes/%.properties
-	@$(add-property-java-file)
-
-# Rules for closed files
-ifndef OPENJDK
-$(GENSRCDIR)/%.java: $(CLOSED_PLATFORM_SRC)/classes/%.properties
-	@$(add-property-java-file)
-$(GENSRCDIR)/%.java: $(CLOSED_SHARE_SRC)/classes/%.properties
-	@$(add-property-java-file)
-endif
-
-# List of java files converted from properties files needed
-GENERATED_java = $(COMPILED_PROPERTIES:%.properties=$(GENSRCDIR)/%.java)
-
-# Construct properties compile options file
-pcompiler_options_prime:
-	@$(MKDIR) -p $(PCOMPILER_TEMPDIR)
-$(PCOMPILER_OPTIONS): pcompiler_options_prime $(GENERATED_java)
-	@$(TOUCH) $@
-pcompiler_options_clean::
-	$(RM) $(PCOMPILER_OPTIONS)
-
-# Make sure all are compiled, one compiler run
-compile_properties:: pcompiler_options_prime pcompiler_options_clean pcompile_properties
-pcompile_properties: $(PCOMPILER_CLASS) $(PCOMPILER_OPTIONS)
-	@$(MKDIR) -p $(GENSRCDIR)
-	@if [ `$(CAT) $(PCOMPILER_OPTIONS) | $(WC) -l` -ge 1 ] ; then \
-	  $(ECHO) "$(PCOMPILER) -optionsfile $(PCOMPILER_OPTIONS)"; \
-	  $(PCOMPILER) -optionsfile $(PCOMPILER_OPTIONS) ; \
-	fi
-	@$(java-vm-cleanup)
-
-# Cleanup generated sources
-compile_properties_clean::
-	@$(RM) $(GENERATED_java)
-	$(RM) -r $(PCOMPILER_TEMPDIR)
-
-endif # FILES_compiled_properties
-
-endif # COMPILED_PROPERTIES_SUPERCLASS
+#
+# Get Resources help
+#
+include $(J2SE_TOPDIR)/make/common/Resources.gmk
 
 #
 # Compiling .java files.
@@ -273,8 +207,8 @@
 # Construct list of java sources we need to compile
 source_list_prime:
 	@$(MKDIR) -p $(TEMPDIR)
-# Note that we slip compile_properties in here:
-$(JAVA_SOURCE_LIST) : source_list_prime compile_properties $(FILES_class)
+# Note that we slip resources in so that compiled properties files get created:
+$(JAVA_SOURCE_LIST) : source_list_prime resources $(FILES_class)
 	@$(TOUCH) $@
 
 .delete.classlist:
@@ -294,7 +228,7 @@
 	fi
 	@$(java-vm-cleanup)
 
-clean :: compile_properties_clean
+clobber clean::
 	$(RM) $(JAVA_SOURCE_LIST)
 
 ifndef DONT_CLOBBER_CLASSES
@@ -328,74 +262,7 @@
 #
 # C and C++ make dependencies
 #
-
-#
-# INCREMENTAL_BUILD: Record the #include file dependencies.
-#
-# NOTE: On non-windows, we build make include files with the suffix
-#       $(DEPEND_SUFFIX) on every compilation. These are initially 
-#       created as temp files just in case a ^C kills it in the middle.
-#	Compiler is smart enough to handle ^C and not create the .o file, or
-#	is supposed to be that smart, but the .$(DEPEND_SUFFIX) file creation here isn't.
-#	These .$(DEPEND_SUFFIX) files are included by Library.gmk and Program.gmk, 
-#       when they exist (Search for 'make dependencies').
-#
-
-ifneq ($(PLATFORM), windows)
-ifeq ($(INCREMENTAL_BUILD),true)
-
-$(OBJDIR)/%.$(DEPEND_SUFFIX): %.c
-	@$(prep-target)
-	@$(ECHO) "Creating $@"
-	@$(RM) $@.temp
-	@$(CC) $(CC_DEPEND) $(CPPFLAGS) $< 2> $(DEV_NULL) | \
-	    $(CC_DEPEND_FILTER) > $@.temp
-	@$(MV) $@.temp $@
-
-$(OBJDIR)/%.$(DEPEND_SUFFIX): %.cpp
-	@$(prep-target)
-	@$(ECHO) "Creating $@"
-	@$(RM) $@.temp
-	@$(CXX) $(CC_DEPEND) $(CPPFLAGS) $(CXXFLAGS) $< 2> $(DEV_NULL) | \
-	    $(CC_DEPEND_FILTER) > $@.temp
-	@$(MV) $@.temp $@
-
-endif # INCREMENTAL_BUILD
-endif # PLATFORM
-
-#
-# C, C++, asm files.
-#
-
-$(OBJDIR)/%.$(OBJECT_SUFFIX): %.c
-	@$(prep-target)
-	$(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$@ $(CFLAGS_GPROF) $<
-	@$(check-conventions)
-
-$(OBJDIR)/%.$(OBJECT_SUFFIX): %.cpp
-	@$(prep-target)
-	$(COMPILE.cc) $(CC_OBJECT_OUTPUT_FLAG)$@ $(CFLAGS_GPROF) $<
-	@$(check-conventions)
-
-# newer as does not handle c++ style comments
-$(OBJDIR)/%.$(OBJECT_SUFFIX): %.s
-    ifneq ($(CC_VERSION), gcc)
-	@$(prep-target)
-	$(COMPILE.s) $(CC_OBJECT_OUTPUT_FLAG)$@ $<
-    else
-	@$(prep-target)
-	$(CPP) -x assembler-with-cpp $< | $(COMPILE.s) -o $@
-    endif
-	@$(check-conventions)
-
-#
-# Quick hack for making the compiler generate just the assembly file.
-#	$ gnumake obj/sparc/myfile.s
-#
-$(OBJDIR)/%.s: %.c
-	@$(prep-target)
-	$(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$@ -S $<
-	@$(check-conventions)
+include $(J2SE_TOPDIR)/make/common/NativeCompileRules.gmk
 
 #
 # Running Javah to generate stuff into CClassHeaders.
@@ -438,32 +305,7 @@
 
 endif # FILES_export
 
-
-# remove the intermediate files from the directories.
-#    (If VARIANT=OPT, this removes all debug and fastdebug files too)
-objects.clean:
-	$(RM) -r $(OBJDIR)
-	$(RM) -r $(OBJDIR)_*
-
-#
-# Lint support
-#	(The 'lint' rule below is an older rule not using the .$(LINT_SUFFIX) files)
-#
-
-ifeq ($(PLATFORM), solaris)
-$(OBJDIR)/%.$(LINT_SUFFIX): %.c
-	@$(prep-target)
-	$(LINT.c) -dirout=$(OBJDIR) -c $<
-lint.clean:
-	$(RM) $(OBJDIR)/*.$(LINT_SUFFIX)
-# Old rule
-lint: $(FILES_c)
-        ifneq ($(FILES_c),)
-	  $(LINT.c) -Ncheck -Nlevel=3 $? $(LDLIBS) > lint.$(ARCH) 2>&1
-        endif
-endif
-
-clean clobber:: classheaders.clean classes.clean objects.clean .delete.classlist
+clean clobber:: classheaders.clean classes.clean .delete.classlist
 
 # 
 # Default dependencies
@@ -477,7 +319,6 @@
 
 .PHONY: all build clean clobber \
         .delete.classlist classes .compile.classlist classes.clean \
-	 classheaders classheaders.clean objects.clean \
-	 compile_properties \
-	 pcompiler_options_prime pcompiler_options_clean pcompile_properties
+	 classheaders classheaders.clean \
+	 batch_compile
 
--- a/j2se/make/common/Sanity.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/Sanity.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Sanity.gmk	1.133 07/05/05
-
 # Settings and rules to validate the J2SE build environment.
 
 .PHONY: \
--- a/j2se/make/common/shared/Defs.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/shared/Defs.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -273,8 +273,8 @@
 POPT = $(_OPT$(ALT_OPT))$(ALT_OPT)
 
 # PARALLEL_COMPILE_JOBS: is the number of compiles done in parallel.
-#  If the user sets ALT_PARALLEL_COMPILE_JOBS, then PARALLEL_COMPILES is set
-#  to true. (Not used on Windows, but harmless)
+#  If the user sets ALT_PARALLEL_COMPILE_JOBS, then COMPILE_APPROACH is set
+#  to parallel.
 #
 #  Recommended setting: 2 seems to be ideal for single cpu machines,
 #                       2 times the number of CPU's is a basic formula, 
--- a/j2se/make/common/shared/Platform.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/shared/Platform.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -386,17 +386,45 @@
   REQUIRED_DXSDK_VER = 0x0700
   OS_VENDOR = Microsoft
   # How much RAM does this machine have:
-  #  (Couldn't figure out how to do this on the command line with Windows)
-  MB_OF_MEMORY=512
+  MB_OF_MEMORY := $(shell \
+    if [ -f "C:/cygwin/bin/free.exe" ] ; then \
+      ( C:/cygwin/bin/bash.exe -c "C:/cygwin/bin/free.exe -m" ) | \
+	grep Mem: | \
+	sed -e 's@\ \ *@ @g' | cut -d' ' -f2 ; \
+    else \
+      echo "512"; \
+    fi)
 endif
 
 # Machines with 512Mb or less of real memory are considered low memory
 #    build machines and adjustments will be made to prevent excessing
 #    system swapping during the build.
-ifeq ($(shell expr $(MB_OF_MEMORY) '<=' 512), 1)
-  LOW_MEMORY_MACHINE=true
+#    If we don't know, assume 512. Subtract 128 from MB for VM MAX.
+#    Don't set VM max over 1024-128=896.
+ifneq ($(MB_OF_MEMORY),)
+  LOW_MEMORY_MACHINE := $(shell \
+    if [ $(MB_OF_MEMORY) -le 512 ] ; then \
+      echo "true"; \
+    else \
+      echo "false"; \
+    fi)
+  MAX_VM_MEMORY := $(shell \
+    if [ $(MB_OF_MEMORY) -le 1024 ] ; then \
+      expr $(MB_OF_MEMORY) '-' 128 ; \
+    else \
+      echo "896"; \
+    fi)
+  MIN_VM_MEMORY := $(shell \
+    if [ $(MAX_VM_MEMORY) -le 128 ] ; then \
+      expr $(MAX_VM_MEMORY) '-' 8 ; \
+    else \
+      echo "128"; \
+    fi)
 else
-  LOW_MEMORY_MACHINE=false
+  MB_OF_MEMORY       := unknown
+  LOW_MEMORY_MACHINE := true
+  MAX_VM_MEMORY      := 384
+  MIN_VM_MEMORY      := 128
 endif
 
 REQUIRED_ZIP_VER = 2.2
--- a/j2se/make/common/shared/PrivateDefs.gmk-example	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/shared/PrivateDefs.gmk-example	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,3 @@
-
-# @(#)PrivateDefs.gmk-example	1.1 05/08/24
 
 # This file, when re-named to PrivateDefs.gmk will get included in the
 #   makefile definitions (before the ALT_ variables are read) so that you can
--- a/j2se/make/common/shared/Sanity-Settings.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/common/shared/Sanity-Settings.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -131,8 +131,10 @@
 ALL_SETTINGS+=$(call addOptionalSetting,NO_IMAGES)
 ALL_SETTINGS+=$(call addOptionalSetting,TOOLS_ONLY)
 ALL_SETTINGS+=$(call addOptionalSetting,INSANE)
-ALL_SETTINGS+=$(call addRequiredSetting,PARALLEL_COMPILES)
-ALL_SETTINGS+=$(call addAltSetting,PARALLEL_COMPILE_JOBS)
+ALL_SETTINGS+=$(call addRequiredSetting,COMPILE_APPROACH)
+ifeq ($(COMPILE_APPROACH), parallel)
+  ALL_SETTINGS+=$(call addAltSetting,PARALLEL_COMPILE_JOBS)
+endif
 ALL_SETTINGS+=$(call addOptionalSetting,FASTDEBUG)
 ALL_SETTINGS+=$(call addRequiredSetting,COMPILER_WARNINGS_FATAL)
 ALL_SETTINGS+=$(call addOptionalSetting,COMPILER_WARNING_LEVEL)
--- a/j2se/make/docs/NON_CORE_PKGS.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/docs/NON_CORE_PKGS.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)NON_CORE_PKGS.gmk	1.24 07/05/05
-#
 # This file contains the package names of all the "non-core" 
 # API published in the Java 2 SDK documentation.  "Non-core" means
 # it includes all published API outside of the J2SE API specification.
--- a/j2se/make/java/awt/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/awt/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -69,9 +69,7 @@
 java/awt/image/renderable/RenderedImageFactory.class
 
 copy-closed-src-classes:
-	$(MKDIR) -p $(CLASSDESTDIR)
-	$(ECHO) "Copying classes from $(CLOSED_JAR_FILE)"
-	($(CD) $(CLASSDESTDIR) ; $(JAR_BOOT) xvf $(CLOSED_JAR_FILE) $(CLOSED_AWT_CLASSES))
+	$(call install-closed-classes,$(CLOSED_AWT_CLASSES))
 build:  copy-closed-src-classes
 .PHONY: copy-closed-src-classes
 endif
@@ -83,8 +81,6 @@
 #
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = sun/awt/resources/awt.properties
 LOCALE_SET_DEFINITION = j2re
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
 
 #
 # Rules
--- a/j2se/make/java/fdlibm/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/fdlibm/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.6 07/05/05
-#
-
 FILES_c = \
 	$(CTARGDIR)k_standard.c \
 	$(CTARGDIR)k_rem_pio2.c \
--- a/j2se/make/java/hpi/hpi_common.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/hpi/hpi_common.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)hpi_common.gmk	1.15 07/05/05
-#
 # Shared files between the different threads types on Solaris. Be
 # careful when including this, you must get your variables right.
 #
--- a/j2se/make/java/hpi/windows/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/hpi/windows/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.27 07/05/05
 #
 # Makefile for Windows HPI DLL
 #
--- a/j2se/make/java/instrument/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#
-# Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-#
-
-#
-# %W% %E%
-#
-FILES_c = \
-	EncodingSupport.c \
-	EncodingSupport_md.c \
-	FileSystemSupport_md.c \
-	InstrumentationImplNativeMethods.c \
-	InvocationAdapter.c \
-	JarFacade.c \
-	JPLISAgent.c \
-	JPLISAssert.c \
-	JavaExceptions.c \
-	PathCharsValidator.c \
-	Reentrancy.c \
-	Utilities.c
-
--- a/j2se/make/java/instrument/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/instrument/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -48,7 +48,19 @@
 #
 # Files to compile.
 #
-include FILES_c.gmk
+FILES_c = \
+	EncodingSupport.c \
+	EncodingSupport_md.c \
+	FileSystemSupport_md.c \
+	InstrumentationImplNativeMethods.c \
+	InvocationAdapter.c \
+	JarFacade.c \
+	JPLISAgent.c \
+	JPLISAssert.c \
+	JavaExceptions.c \
+	PathCharsValidator.c \
+	Reentrancy.c \
+	Utilities.c
 
 #
 # -jaragent support requires zip and jar manfiest parser to be compiled
@@ -64,6 +76,12 @@
 FILES_export = \
 	sun/instrument/InstrumentationImpl.java
 
+#
+# This controls the ability to do logging in the library.
+#
+CPPFLAGS_DBG += -DJPLIS_LOGGING
+CPPFLAGS_OPT += -DNO_JPLIS_LOGGING
+
 OTHER_INCLUDES = -I$(SHARE_SRC)/instrument
 OTHER_INCLUDES += -I$(PLATFORM_SRC)/instrument
 OTHER_INCLUDES += -I$(IO_PLATFORM_SRC)
@@ -78,9 +96,15 @@
 # On Windows, this is done by using the same directory as the executable
 # itself, as with all the Windows libraries.
 #
-ifneq (,$(findstring $(PLATFORM), linux solaris))       # UNIX systems
+ifeq ($(PLATFORM), windows)
+  OTHER_LDLIBS += $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static/jli.lib
+  OTHER_LCF += -export:Agent_OnAttach
+  # equivalent of strcasecmp is stricmp on Windows
+  CPPFLAGS_COMMON += -Dstrcasecmp=stricmp
+else
   LDFLAGS += -L $(LIBDIR)/$(LIBARCH)/jli
   OTHER_LDLIBS += -ljli
+  OTHER_LDLIBS += -ldl 
   ifeq ($(PLATFORM), solaris)
     LDFLAGS += -R \$$ORIGIN/jli
   endif
@@ -91,44 +115,6 @@
   endif
 endif
 
-ifeq ($(PLATFORM), windows)
-  OTHER_LDLIBS += $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static/jli.lib
-  OTHER_LDLIBS += $(JVMLIB)
-  # Files built here do not compile with warning level 3 if warnings are fatal
-  # Also zlib files do not compile with warning level 3 if warnings are fatal
-  COMPILER_WARNINGS_FATAL=false
-endif
-
-ifeq ($(PLATFORM), linux)
-  # fork1() is declared in libjvm.so
-  OTHER_LDLIBS += -ldl $(JVMLIB)
-endif # PLATFORM
-
-ifeq ($(PLATFORM), solaris)
-  OTHER_LDLIBS += -ldl 
-  # Use of lint has been helpful, but lots of errors needed to be suppressed:
-  OTHER_LINTFLAGS += -errtags=yes
-  # We only care about errors in user include files
-  OTHER_LINTFLAGS += -errhdr=%user
-  # Logging gives lint fits, so we turn it off
-  # OTHER_LINTFLAGS += -DNO_JPLIS_LOGGING
-  # We don't use the -Ncheck feature yet, it seems somewhat broken
-  # OTHER_LINTFLAGS += -Ncheck -Nlevel=2
-  # Even with above suppression, some files/code are hopelessly non-lintable
-  MY_LINT_FILTER += | $(GREP) -v /usr/include
-endif # PLATFORM
-
-#
-# This controls the ability to do logging in the library.
-#
-CPPFLAGS_DBG += -DJPLIS_LOGGING
-CPPFLAGS_OPT += -DNO_JPLIS_LOGGING
-
-ifeq ($(PLATFORM), windows)
-  # equivalent of strcasecmp is stricmp on Windows
-  CPPFLAGS_COMMON += -Dstrcasecmp=stricmp
-endif
-
 #
 # Library to compile.
 #
@@ -143,18 +129,3 @@
 vpath %.c $(SHARE_SRC)/instrument $(PLATFORM_SRC)/instrument
 vpath %.c $(IO_PLATFORM_SRC)
 
-# Exported symbols 
-ifeq ($(PLATFORM), windows)
-  OTHER_LCF += -export:Agent_OnAttach
-endif
-
-
-#
-# Lint checking rules (we filter out the lint pass and only list errors)
-#
-linterrs: $(FILES_c)
-	$(RM) $@
-	$(MAKE) lint.clean
-	$(MAKE) lint.errors > $@ 2>&1
-	$(CAT) $@ | $(GREP) 'warning:' $(MY_LINT_FILTER)
-
--- a/j2se/make/java/java/Exportedfiles.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/java/Exportedfiles.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Exportedfiles.gmk	1.45 07/05/05
-#
 # These are the names of JAVA classes for which we will make .h files.
 #
 ifneq ($(PLATFORM), windows)
--- a/j2se/make/java/java/localegen.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/java/localegen.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,6 @@
 # have any questions.
 #
 
-# @(#)localegen.sh	1.5 07/05/05
 #
 # This script is to generate the supported locale list string and replace the
 # LocaleDataMetaInfo-XLocales.java in <j2se ws>/src/share/classes/sun/util
--- a/j2se/make/java/java/localelist.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/java/localelist.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,6 @@
 # have any questions.
 #
 
-# @(#)localelist.sh	1.5 07/05/05
 #
 # This script is to generate the supported locale list string and replace the
 # #LOCALE_LIST# in <j2se ws>/src/share/classes/sun/util/CoreResourceBundleControl.java.
--- a/j2se/make/java/java_crw_demo/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/java_crw_demo/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -43,33 +43,10 @@
 #
 # Files to compile.
 #
-FILES_c = 				\
-	$(CTARGDIR)java_crw_demo.c
+FILES_c = $(CTARGDIR)java_crw_demo.c
 
 OTHER_INCLUDES = -I$(SRCDIR)
 
-ifeq ($(PLATFORM), linux)
-  RUN_PREFIX=MALLOC_CHECK_=2
-endif # PLATFORM
-
-ifeq ($(PLATFORM), solaris)
-  RUN_PREFIX=LD_PRELOAD=/usr/lib/watchmalloc.so.1 MALLOC_DEBUG=WATCH
-  # Use of lint has been helpful, but lots of errors needed to be suppressed:
-  OTHER_LINTFLAGS += -errtags=yes
-  # We only care about errors in user include files
-  OTHER_LINTFLAGS += -errhdr=%user
-  OTHER_LINTFLAGS += -erroff=E_CAST_INT_TO_SMALL_INT
-  # Logging gives lint fits, so we turn it off
-  OTHER_LINTFLAGS += -DNDEBUG
-  # We don't use the -Ncheck feature yet, it seems somewhat broken
-  #OTHER_LINTFLAGS += -Ncheck -Nlevel=2
-  # Even with above suppression, some files/code are hopelessly non-lintable
-  #   socket.h has some old style C function prototypes in it (Solaris 9u2)
-  MY_LINT_FILTER += | $(GREP) -v /usr/include
-  # Temporary, FIXUP before FCS
-  CPPFLAGS_COMMON += -D_ALLOW_PRECRASH -D_ALLOW_PAUSE
-endif # PLATFORM
-
 #
 # This removes all asserts in the optimized version
 #
@@ -80,12 +57,6 @@
 #
 include $(BUILDDIR)/common/Library.gmk
 
-ifneq ($(PLATFORM), windows)
-  TEST_PROGRAM = $(OBJDIR)/test_crw
-endif
-
-build: $(TEST_PROGRAM)
-
 # We don't want to link against -ljava
 JAVALIB=
 
@@ -94,141 +65,3 @@
 #
 vpath %.c $(SRCDIR)
 
-#
-# Lint checking rules (we filter out the lint pass and only list errors)
-#
-linterrs: $(TEMPDIR)/linterrs
-$(TEMPDIR)/linterrs: $(FILES_o)
-	$(RM) $@
-	$(MAKE) lint.clean
-	$(MAKE) lint.errors > $@ 2>&1
-	($(CAT) $@ | $(GREP) 'warning:' $(MY_LINT_FILTER) || exit 0)
-
-########################################################################
-#
-# Testing for java_crw_demo.c (Classfile Reader Writer)
-#
-
-CRW_ORIG_DIR=$(TEMPDIR)/test_classes/ORIG
-CRW_CRWD_DIR=$(TEMPDIR)/test_classes/CRWD
-RUN_CRW_PROGRAM=$(RUN_PREFIX) $(OBJDIR)/test_crw
-CRW_OPTIONS=
-
-CRW_TESTS = CrwTest1.java CrwTest2.java
-
-# Need something to separate the *.class and *.dump files from each other
-CLASSIMAGES =     $(CRW_TESTS:%.java=$(CRW_ORIG_DIR)/%.class)
-CRW_CLASSIMAGES = $(CRW_TESTS:%.java=$(CRW_CRWD_DIR)/%.class)
-CLASS_DUMPS =     $(CRW_TESTS:%.java=$(CRW_ORIG_DIR)/%.dump) \
-	          $(CRW_TESTS:%.java=$(CRW_CRWD_DIR)/%.dump)
-CLASS_DIFFS =     $(CRW_TESTS:%.java=$(CRW_CRWD_DIR)/%.diffs)
-
-JAVAP=$(BOOTDIR)/bin/javap
-JAVAP_FLAGS=-s -private -verbose
-
-# Test rule for crw
-test: all crw_sanity_test crw_injection_testing
-
-# Create transformed classimages and dumps using javap
-crw_dumps: $(CLASSIMAGES) $(CRW_CLASSIMAGES) $(CLASS_DUMPS)
-
-# Test for no injection, but classimage re-writing
-crw_sanity_test: crw_dumps $(CLASS_DIFFS)
-
-# Test for bytecodes injection
-crw_injection_testing: $(OBJDIR)/test_crw
-	@$(MKDIR) -p $(CRW_CRWD_DIR)_c
-	$(MAKE) CRW_CRWD_DIR=$(CRW_CRWD_DIR)_c CRW_OPTIONS=-c crw_dumps
-	@$(MKDIR) -p $(CRW_CRWD_DIR)_r
-	$(MAKE) CRW_CRWD_DIR=$(CRW_CRWD_DIR)_r CRW_OPTIONS=-r crw_dumps
-	@$(MKDIR) -p $(CRW_CRWD_DIR)_n
-	$(MAKE) CRW_CRWD_DIR=$(CRW_CRWD_DIR)_n CRW_OPTIONS=-n crw_dumps
-
-# Build crw process
-$(OBJDIR)/test_crw: $(OBJDIR)/java_crw_demo.o $(OBJDIR)/test_crw.o
-	@$(RM) $@
-	$(CC) $(CFLAGS) -g -o $@ $(OBJDIR)/java_crw_demo.o $(OBJDIR)/test_crw.o
-
-# Clean up the crw testing files
-clean clobber:: crw_clean
-crw_clean:
-	$(RM) -r $(TEMPDIR)/test_classes
-
-# Rebuild all crw class images when crw changes
-$(CRW_CLASSIMAGES): $(OBJDIR)/test_crw
-
-# Create original classimage from java source
-$(CRW_ORIG_DIR)/%.class: $(SRCDIR)/test_sources/%.java
-	$(prep-target)
-	$(BOOTDIR)/bin/javac -g -d $(@D) $<
-
-# Run crw process and create crw classimage
-$(CRW_CRWD_DIR)/%.class: $(CRW_ORIG_DIR)/%.class
-	$(prep-target)
-	@$(RM) $@.temp
-	$(RUN_CRW_PROGRAM) $(CRW_OPTIONS) $< $@.temp
-	$(MV) $@.temp $@
-
-# Create a classimage dump
-%.dump: %.class
-	@$(RM) $@
-	@$(RM) $@.temp
-	$(JAVAP) $(JAVAP_FLAGS) -bootclasspath $(@D) `basename $@ .dump` > $@.temp 2>&1
-	@if $(GREP) '^ERROR:' $@.temp ; then \
-	    $(CAT) $@.temp ; \
-	    exit 1; \
-	fi
-	@$(SED) -e 's@Stack=[0-9][0-9]*@Stack=NNN@' $@.temp > $@
-	@$(RM) $@.temp
-
-# Create a diff of two classimage dumps
-$(CRW_CRWD_DIR)/%.diffs: $(CRW_ORIG_DIR)/%.dump
-	@$(RM) $@
-	$(DIFF) -w $< $(@D)/`basename $<`
-	@$(TOUCH) $@
-
-ROUGHDIR=/tmp/bciclasses
-
-rough:
-	$(RM) -r $(ROUGHDIR)
-	@cd $(CLASSDESTDIR) ; \
-	for i in `find . -name \*.class` ; do \
-	    echo "Running javap on original file"; \
-	    $(JAVAP) $(JAVAP_FLAGS) -bootclasspath . \
-		`echo $$i | sed -e 's@^./@@' | sed -e 's@.class@@' | sed -e 's@/@.@g'` \
-		> $$i.dump 2>  $$i.dumperr ; \
-	    if [ -s $$i.dumperr ] ; then \
-		echo "ERROR $$i.dumperr has size?"; \
-	    fi; \
-	    if [ ! -s $$i.dump ] ; then \
-		echo "ERROR Missing $$i.dump, not created by $(JAVAP)?"; \
-	    fi; \
-	    $(RM) core core.*; \
-	    mkdir -p $(ROUGHDIR)/`dirname $$i` ; \
-	    echo "Running test_crw on original file"; \
-	    echo "$(RUN_CRW_PROGRAM) -n -r -c $$i $(ROUGHDIR)/$$i" ; \
-	    $(RUN_CRW_PROGRAM) -n -r -c $$i $(ROUGHDIR)/$$i ; \
-	    if [ ! -s $(ROUGHDIR)/$$i ] ; then \
-		echo "ERROR Missing $(ROUGHDIR)/$$i, not created by $(RUN_CRW_PROGRAM)?"; \
-		exit 1; \
-	    fi; \
-	    if [ "`ls core core.* 2> /dev/null`" != "" ] ; then \
-		echo "ERROR Detected core file"; \
-		exit 1;  \
-	    fi; \
-	    echo "Running javap on processed file"; \
-	    $(JAVAP) $(JAVAP_FLAGS) -bootclasspath $(ROUGHDIR) \
-		`echo $$i | sed -e 's@^./@@' | sed -e 's@.class@@' | sed -e 's@/@.@g'` \
-		> $(ROUGHDIR)/$$i.dump 2>  $(ROUGHDIR)/$$i.dumperr ; \
-	    if [ -s $(ROUGHDIR)/$$i.dumperr ] ; then \
-		echo "ERROR $(ROUGHDIR)/$$i.dumperr has size?"; \
-	    fi; \
-	    if [ ! -s $(ROUGHDIR)/$$i.dump ] ; then \
-		echo "ERROR Missing $(ROUGHDIR)/$$i.dump, not created by $(JAVAP)?"; \
-	    fi; \
-	done
-
-#--------------
-
-everything: all linterrs test doc
-
--- a/j2se/make/java/java_hprof_demo/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/java_hprof_demo/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -92,36 +92,15 @@
 #
 INIT += $(LIBDIR)/jvm.hprof.txt
 
-ifeq ($(PLATFORM), linux)
-  # fork1() is declared in libjvm.so
-  OTHER_LDLIBS += $(JVMLIB)
-endif # PLATFORM
-
-ifeq ($(PLATFORM), solaris)
-  # Use of lint has been helpful, but lots of errors needed to be suppressed:
-  OTHER_LINTFLAGS += -errtags=yes
-  # We only care about errors in user include files
-  OTHER_LINTFLAGS += -errhdr=%user
-  OTHER_LINTFLAGS += -erroff=E_CAST_INT_TO_SMALL_INT
-  # Logging gives lint fits, so we turn it off
-  OTHER_LINTFLAGS += -DNDEBUG
-  # We don't use the -Ncheck feature yet, it seems somewhat broken
-  #OTHER_LINTFLAGS += -Ncheck -Nlevel=2
-  # Even with above suppression, some files/code are hopelessly non-lintable
-  #   socket.h has some old style C function prototypes in it (Solaris 9u2)
-  MY_LINT_FILTER += | $(GREP) -v /usr/include
-endif # PLATFORM
-
 #
 # This removes all asserts in the optimized version
 #
 CPPFLAGS_OPT += -DNDEBUG
 
 #
-# This puts logging code in both versions
+# This puts logging code in
 #
 CPPFLAGS_DBG += -DHPROF_LOGGING
-CPPFLAGS_OPT += -DHPROF_LOGGING
 
 #
 # Library to compile.
@@ -142,44 +121,6 @@
 $(LIBDIR)/jvm.hprof.txt: $(SRCDIR)/jvm.hprof.txt
 	$(install-file)
 
-
-#
-# Lint checking rules (we filter out the lint pass and only list errors)
-#
-linterrs: $(TEMPDIR)/linterrs
-$(TEMPDIR)/linterrs: $(FILES_o)
-	$(prep-target)
-	$(MAKE) lint.clean
-	$(MAKE) lint.errors > $@ 2>&1
-	($(CAT) $@ | $(GREP) 'warning:' $(MY_LINT_FILTER) || exit 0)
-
-########################################################################
-#
-
-$(TEMPDIR)/extern_list.txt : $(FILES_o)
-	$(prep-target)
-	$(RM) $@.temp
-	nm $(FILES_o) | fgrep -v UNDEF | fgrep GLOB | fgrep FUNC | cut -d'|' -f8 | sort | uniq > $@.temp
-	$(MV) $@.temp $@
-
-HTML_SRC_LIST=  $(SHARE_SRC)/classes/com/sun/demo/jvmti/hprof/Tracker.java \
-		$(SHARE_SRC)/../*/demo/jvmti/hprof/hprof*.c \
-		$(SHARE_SRC)/demo/jvmti/java_crw_demo/*.[ch]
-
-HTML_INC_LIST=$(SHARE_SRC)/../*/demo/jvmti/hprof/hprof*.h
-
-doc: $(TEMPDIR)/src_review.html
-
-$(TEMPDIR)/src_review.html : create_html.ksh $(TEMPDIR)/extern_list.txt $(SRCDIR)/README.txt $(HTML_INC_LIST) $(HTML_SRC_LIST)
-	$(prep-target)
-	$(KSH) create_html.ksh $@.temp $(SRCDIR)/README.txt \
-		"$(HTML_INC_LIST)"  "$(HTML_SRC_LIST)" $(TEMPDIR)/extern_list.txt
-	$(MV) $@.temp $@
-
-#--------------
-
-everything: all linterrs test doc
-
 clean clobber::
 	$(RM) $(LIBDIR)/jvm.hprof.txt
 
--- a/j2se/make/java/java_hprof_demo/create_html.ksh	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,230 +0,0 @@
-#!/bin/ksh
-
-#
-# Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-#
-
-
-# KSH script to create a browseable page for the sources supplied to it
-
-html=$1
-README=$2
-includes="$3"
-sources="$4"
-extern_funcs=$5
-
-rm -f -r ${html}
-
-tmpdir=/tmp/create_html.ksh.$$
-rm -f -r ${tmpdir}
-mkdir -p ${tmpdir}
-
-constants=${tmpdir}/constants
-macros=${tmpdir}/macros
-types=${tmpdir}/types
-
-sedfile_file_names=${tmpdir}/sedfile_file_names
-
-sedfile_func_defs=${tmpdir}/sedfile_func_defs
-sedfile_func_uses=${tmpdir}/sedfile_func_uses
-sedfile_constant_defs=${tmpdir}/sedfile_constant_defs
-sedfile_constant_uses=${tmpdir}/sedfile_constant_uses
-sedfile_macro_defs=${tmpdir}/sedfile_macro_defs
-sedfile_macro_uses=${tmpdir}/sedfile_macro_uses
-sedfile_type_defs=${tmpdir}/sedfile_type_defs
-sedfile_type_uses=${tmpdir}/sedfile_type_uses
-
-( cat ${includes} \
-        | egrep '^[\ \	]*[A-Z][a-z_A-Z0-9]*[\ \	]*=' \
-	| sed -e 's@^[\ \	]*\([A-Z][a-z_A-Z0-9]*\).*@\1@' ) \
-    | sort \
-    | uniq > ${constants}
-
-( cat ${includes} \
-        | egrep '^[\ \	]*#define[\ \	]*[a-zA-Z][a-z_A-Z0-9]*' \
-	| sed -e 's@.*#define[\ \	]*\([a-zA-Z][a-z_A-Z0-9]*\).*@\1@' ) \
-    | egrep -v '[A-Z][A-Z_a-z0-9]*_H' \
-    | sort \
-    | uniq > ${macros}
-
-(  ( cat ${includes} \
-	| egrep '^[\ \	]*typedef[\ \	][\ \	]*[a-zA-Z][a-zA-Z_0-9]*[\ \	(*]*[A-Z][a-z_A-Z0-9]*[);]' \
-	| sed -e 's@.*typedef[\ \	][\ \	]*[a-zA-Z][a-zA-Z_0-9]*[\ \	(*]*\([A-Z][a-z_A-Z0-9]*\)[;)].*@\1@' ) ; \
-  ( cat ${includes} \
-          | egrep '[\ \	]struct[\ \	][\ \	]*[A-Z][a-z_A-Z0-9]*' \
-	  | sed -e 's@.*struct[\ \	][\ \	]*\([A-Z][a-z_A-Z0-9]*\).*@\1@' ) ) \
-    | sort \
-    | uniq > ${types}
-
-echo "Extern function count: `cat ${extern_funcs} | wc -l`"
-echo "Constant count: `cat ${constants} | wc -l`"
-echo "Macro count: `cat ${macros} | wc -l`"
-echo "Type count: `cat ${types} | wc -l`"
-
-href()
-{
-    echo "s@\([^><#\"]\)\<${1}\>@\1<a HREF=\"#${1}\">${1}</a>@" >> ${2}
-}
-
-table()
-{
-    counter=0
-    echo "<table>" >> ${html}
-    echo "<tr>" >> ${html}
-    for i in $* ; do
-       echo "<td><a HREF=\"#${i}\"> ${i} </a></td>" >> ${html}
-       counter="`expr ${counter} '+' 1`"
-       if [ ${counter} -gt 4 ] ; then
-	    echo "</tr>" >> ${html}
-	    echo "<tr>" >> ${html}
-	    counter=0
-       fi
-    done
-    echo "</tr>" >> ${html}
-    echo "</table>" >> ${html}
-}
-
-for name in `cat  ${extern_funcs}` ; do
-    echo "s@^\<${name}\>@<a NAME=\"${name}\"><b>${name}</b></a>@" \
-	>> ${sedfile_func_defs}
-done
-for name in `cat  ${constants}` ; do
-    echo "s@\<${name}\>\([\ \	]*=\)@<a NAME=\"${name}\"><b>${name}</b></a>\1@" \
-	>> ${sedfile_constant_defs}
-done
-for name in `cat  ${macros}` ; do
-    echo "s@#define[\ \	][\ \	]*\<${name}\>@#define <a NAME=\"${name}\"><b>${name}</b></a>@" \
-	>> ${sedfile_macro_defs}
-done
-for name in `cat  ${types}` ; do
-    echo "s@struct \<${name}\>[\ \	]*\([{]\)@struct <a NAME=\"${name}\"><b>${name}</b></a> \1@" \
-	>> ${sedfile_type_defs}
-    echo "s@\(typedef[\ \	]*[a-zA-Z].*[\ \	(*]*\)\<${name}\>@\1<a NAME=\"${name}\"><b>${name}</b></a>@" \
-	>> ${sedfile_type_defs}
-done
-
-for name in `cat  ${extern_funcs}` ; do
-    href ${name} ${sedfile_func_uses}
-done
-for name in `cat  ${constants}` ; do
-    href ${name} ${sedfile_constant_uses}
-done
-for name in `cat  ${macros}` ; do
-    href ${name} ${sedfile_macro_uses}
-done
-for name in `cat  ${types}` ; do
-    href ${name} ${sedfile_type_uses}
-done
-
-pwd="`pwd`"
-basedir="`basename ${pwd}`"
-
-echo "<html>" >> ${html}
-echo "<head><title>Source Browsing Page for ${basedir}</title><head>" >> ${html}
-echo "<body>" >> ${html}
-echo "<h1><center>Source Browsing Page for ${basedir}</center><br></h1>" >> ${html}
-echo "<h1><center>`date`</center></h1>" >> ${html}
-
-for filename in ${includes} ; do
-   base="`basename ${filename}`"
-   link="`basename ${base} .h`_INCLUDE"
-   echo "s@\<${base}\>@<a HREF=\"#${link}\">${base}</a>@" \
-	>> ${sedfile_file_names}
-done
-
-for filename in ${sources} ; do
-   base="`basename ${filename}`"
-   link="`basename ${base} .c`_SOURCE"
-   echo "s@\<${base}\>@<a HREF=\"#${link}\">${base}</a>@" \
-	>> ${sedfile_file_names}
-done
-
-base="`basename ${README}`"
-echo "<p><hr><p><h2>${base}</h2>" >> ${html}
-echo "<p><pre>" >> ${html}
-sed -e 's@<@\&lt;@g' -e 's@>@\&gt;@g' ${README} \
-    | sed -f ${sedfile_func_uses} \
-    | sed -f ${sedfile_constant_uses} \
-    | sed -f ${sedfile_macro_uses} \
-    | sed -f ${sedfile_type_uses} \
-    | sed -f ${sedfile_file_names} >> ${html}
-echo "</pre></p>" >> ${html}
-
-for filename in ${includes} ; do
-   base="`basename ${filename}`"
-   link="`basename ${base} .h`_INCLUDE"
-   echo "Processing ${base}:"
-   echo "<p><hr><p><h2>Include File: <a NAME=\"${link}\">${base}</a></h2>" >> ${html}
-   echo "<p><pre><tt>" >> ${html}
-   sed -e 's@<@\&lt;@g' -e 's@>@\&gt;@g' ${filename} \
-       | sed -f ${sedfile_func_uses} \
-       | sed -f ${sedfile_constant_defs} \
-       | sed -f ${sedfile_macro_defs} \
-       | sed -f ${sedfile_type_defs} \
-       | sed -f ${sedfile_constant_uses} \
-       | sed -f ${sedfile_macro_uses} \
-       | sed -f ${sedfile_type_uses} \
-       | cat -n >> ${html}
-   echo "</tt></pre></p>" >> ${html}
-done
-
-for filename in ${sources} ; do
-   base="`basename ${filename}`"
-   link="`basename ${base} .c`_SOURCE"
-   echo "Processing ${base}:"
-   echo "<p><hr><p><h2>Source File: <a NAME=\"${link}\">${base}</a></h2>" >> ${html}
-   echo "<p><pre><tt>" >> ${html}
-   sed -e 's@<@\&lt;@g' -e 's@>@\&gt;@g' ${filename} \
-       | sed -f ${sedfile_func_defs} \
-       | sed -f ${sedfile_constant_defs} \
-       | sed -f ${sedfile_macro_defs} \
-       | sed -f ${sedfile_type_defs} \
-       | sed -f ${sedfile_func_uses} \
-       | sed -f ${sedfile_constant_uses} \
-       | sed -f ${sedfile_macro_uses} \
-       | sed -f ${sedfile_type_uses} \
-       | cat -n >> ${html}
-   echo "</tt></pre></p>" >> ${html}
-done
-
-echo "Creating Index"
-
-echo "<p><h2>Functions</h2>" >> ${html}
-table `cat ${extern_funcs}`
-echo "<p><h2>Constants</h2>" >> ${html}
-table `cat ${constants}`
-echo "<p><h2>Macros</h2>" >> ${html}
-table `cat ${macros}`
-echo "<p><h2>Types</h2>" >> ${html}
-table `cat ${types}`
-
-
-echo "</body>" >> ${html}
-echo "</html>" >> ${html}
-
-echo "Html file is ${html}"
-
-rm -f -r ${tmpdir}
-
-exit 0
--- a/j2se/make/java/jexec/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/jexec/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -36,6 +36,10 @@
 
 include $(BUILDDIR)/common/Defs.gmk
 
+ifeq ($(COMPILE_APPROACH),batch)
+  override COMPILE_APPROACH = normal
+endif
+
 include $(BUILDDIR)/common/Rules.gmk
 
 JEXE_SRC =      $(PLATFORM_SRC)/bin
--- a/j2se/make/java/jvm/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/jvm/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)Makefile	1.170 07/05/05
-#
-
 BUILDDIR = ../..
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/j2se/make/java/logging/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/logging/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -37,10 +37,12 @@
 # Resources
 #
 LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_COMPILED_PROPERTIES = sun/util/logging/resources/logging.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
+RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
+	 sun/util/logging/resources/logging.properties
 
-include $(BUILDDIR)/common/Resources.gmk
+#
+# Rules
+#
 include $(BUILDDIR)/common/Classes.gmk
 
 properties: $(LIBDIR)/logging.properties
--- a/j2se/make/java/management/Exportedfiles.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/management/Exportedfiles.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Exportedfiles.gmk	1.17 07/05/05
-#
 # These are the names of Java classes for which we will make .h files.
 #
 
--- a/j2se/make/java/management/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/management/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.17 07/05/05
-#
 FILES_c = \
 	ClassLoadingImpl.c \
 	FileSystemImpl.c \
--- a/j2se/make/java/management/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/management/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -68,10 +68,8 @@
 #
 LOCALE_SET_DEFINITION = j2re
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = sun/management/resources/agent.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
 
-
+#
 # Find C source files
 #
 vpath %.c $(SHARE_SRC)/native/sun/management
--- a/j2se/make/java/nio/Exportedfiles.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/Exportedfiles.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)Exportedfiles.gmk	1.21 07/05/05
 #   
 # These are the names of Java classes for which we will make .h files.
 #   
--- a/j2se/make/java/nio/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.22 07/05/05
-#
-
 FILES_c = \
         DatagramChannelImpl.c \
         DatagramDispatcher.c \
--- a/j2se/make/java/nio/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.53 07/05/05 
-#
-
 FILES_src = \
 	java/nio/Bits.java \
 	java/nio/Buffer.java \
--- a/j2se/make/java/nio/genBuffer.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/genBuffer.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,6 @@
 # have any questions.
 #
 
-# @(#)genBuffer.sh	1.15 07/05/05
 # Generate concrete buffer classes
 
 # Required environment variables
--- a/j2se/make/java/nio/genCharsetProvider.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/genCharsetProvider.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -49,9 +49,6 @@
 # Header
 #
 cat <<__END__ >$OUT
-/*
- * @(#)$CLASS.java	$ID $DATE
- */
 
 // -- This file was mechanically generated: Do not edit! -- //
 
--- a/j2se/make/java/nio/genCoder.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/genCoder.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,6 @@
 # have any questions.
 #
 
-# @(#)genCoder.sh	1.11 07/05/05
 # Generate charset coder and decoder classes
 
 # Environment variables required from make: SED SPP
--- a/j2se/make/java/nio/genExceptions.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/genExceptions.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -1,6 +1,6 @@
 #! /bin/sh
 #
-# Copyright 2000 Sun Microsystems, Inc.  All Rights Reserved.
+# Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -42,9 +42,7 @@
 
   cat >$out <<__END__
 /*
- * @(#)$ID.java	$SCCS_ID $SCCS_DATE
- *
- * Copyright 2000 by Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2007 by Sun Microsystems, Inc.  All Rights Reserved.
  * 
  * This software is the proprietary information of Sun Microsystems, Inc.  
  * Use is subject to license terms.
@@ -57,7 +55,6 @@
 
 /**$WHAT
  *
- * @version $SCCS_ID, $SCCS_DATE
  * @since $SINCE
  */
 
--- a/j2se/make/java/nio/mapfile-linux	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/mapfile-linux	Fri Jun 22 00:46:43 2007 +0000
@@ -1,6 +1,3 @@
-#
-# @(#)mapfile-linux	1.2 05/11/02
-#
 
 SUNWprivate_1.1 {
 	global:
--- a/j2se/make/java/nio/mapfile-solaris	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/mapfile-solaris	Fri Jun 22 00:46:43 2007 +0000
@@ -1,6 +1,3 @@
-#
-# @(#)mapfile-solaris	1.14 05/11/02
-#
 
 SUNWprivate_1.1 {
 	global:
--- a/j2se/make/java/nio/spp.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/nio/spp.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -25,8 +25,6 @@
 # have any questions.
 #
 
-# @(#)spp.sh	1.13 07/05/05
-
 # SPP: A simple/sed-based/stream preprocessor
 # Mark Reinhold / mr@sun.com
 #
--- a/j2se/make/java/npt/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/npt/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -52,21 +52,6 @@
 
 OTHER_INCLUDES = -I$(SRCDIR) -I$(PSRCDIR)
 
-ifeq ($(PLATFORM), solaris)
-  # Use of lint has been helpful, but lots of errors needed to be suppressed:
-  OTHER_LINTFLAGS += -errtags=yes
-  # We only care about errors in user include files
-  OTHER_LINTFLAGS += -errhdr=%user
-  OTHER_LINTFLAGS += -erroff=E_CAST_INT_TO_SMALL_INT
-  # Logging gives lint fits, so we turn it off
-  OTHER_LINTFLAGS += -DNDEBUG
-  # We don't use the -Ncheck feature yet, it seems somewhat broken
-  #OTHER_LINTFLAGS += -Ncheck -Nlevel=2
-  # Even with above suppression, some files/code are hopelessly non-lintable
-  #   socket.h has some old style C function prototypes in it (Solaris 9u2)
-  MY_LINT_FILTER += | $(GREP) -v /usr/include
-endif # PLATFORM
-
 #
 # This removes all asserts in the optimized version
 #
@@ -90,13 +75,3 @@
 #
 vpath %.c $(SRCDIR):$(PSRCDIR)
 
-#
-# Lint checking rules (we filter out the lint pass and only list errors)
-#
-linterrs: $(TEMPDIR)/linterrs
-$(TEMPDIR)/linterrs: $(FILES_o)
-	$(RM) $@
-	$(MAKE) lint.clean
-	$(MAKE) lint.errors > $@ 2>&1
-	($(CAT) $@ | $(GREP) 'warning:' $(MY_LINT_FILTER) || exit 0)
-
--- a/j2se/make/java/redist/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/redist/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES.gmk	1.13 07/05/05
-#
 # List of lucida font files that we redistribute.
 #
 
--- a/j2se/make/java/redist/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/redist/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -117,13 +117,13 @@
 
 # NOTE: These might actually come from BUILDDIR, depends on the settings.
 $(BINDIR)/msvcrt.dll: $(MSVCRT_DLL_PATH)/msvcrt.dll
-	$(install-file)
+	$(install-import-file)
 	$(CHMOD) a+x $@
 $(BINDIR)/unicows.dll: $(UNICOWS_DLL_PATH)/unicows.dll
-	$(install-file)
+	$(install-import-file)
 	$(CHMOD) a+x $@
 $(BINDIR)/msvcr71.dll: $(MSVCR71_DLL_PATH)/msvcr71.dll
-	$(install-file)
+	$(install-import-file)
 	$(CHMOD) a+x $@
 
 # Get the hotspot .map and .pdb files for client and server
@@ -139,7 +139,7 @@
 endif
 
 $(LIBDIR)/$(JVMLIB_NAME): $(HOTSPOT_LIB_PATH)/$(JVMLIB_NAME)
-	$(install-file)
+	$(install-import-file)
 
 # it is OK for the .map and .pdb files to not exist, so do not force a 
 # dependency on them from the bootstrap location, and allow the copy to fail.
@@ -206,10 +206,10 @@
 endif # PLATFORM
 
 $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME): $(HOTSPOT_CLIENT_PATH)/$(JVM_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(LIBJSIG_NAME): $(HOTSPOT_SERVER_PATH)/$(LIBJSIG_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(LIBJSIG_NAME) \
 $(LIB_LOCATION)/$(SERVER_LOCATION)/$(LIBJSIG_NAME):
@@ -217,25 +217,25 @@
 	$(LN) -s ../$(LIBJSIG_NAME) $@
 
 $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVMDB_NAME): $(HOTSPOT_CLIENT_PATH)/$(JVMDB_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(CLIENT_LOCATION)/64/$(JVMDB_NAME): $(HOTSPOT_CLIENT_PATH)/64/$(JVMDB_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(SERVER_LOCATION)/$(JVMDB_NAME): $(HOTSPOT_SERVER_PATH)/$(JVMDB_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(SERVER_LOCATION)/64/$(JVMDB_NAME): $(HOTSPOT_SERVER_PATH)/64/$(JVMDB_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(SERVER_LOCATION)/$(JVM_NAME): $(HOTSPOT_SERVER_PATH)/$(JVM_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(SERVER_LOCATION)/Xusage.txt : $(HOTSPOT_SERVER_PATH)/Xusage.txt
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(CLIENT_LOCATION)/Xusage.txt : $(HOTSPOT_CLIENT_PATH)/Xusage.txt
-	$(install-file)
+	$(install-import-file)
 
 ifeq ($(INCLUDE_SA), true)
 # The Serviceability Agent is built in the Hotspot workspace.
@@ -245,49 +245,53 @@
 #		        This goes into the same dir as the other
 #			shared libs, eg. libjdwp.so.
 $(LIBDIR)/sa-jdi.jar: $(HOTSPOT_IMPORT_PATH)/lib/sa-jdi.jar
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(SALIB_NAME): $(HOTSPOT_SALIB_PATH)/$(SALIB_NAME)
-	$(install-file)
+	$(install-import-file)
 
 ifeq ($(PLATFORM), windows)
 $(LIB_LOCATION)/$(SAPDB_NAME): $(HOTSPOT_SALIB_PATH)/$(SAPDB_NAME)
-	$(install-file)
+	$(install-import-file)
 
 $(LIB_LOCATION)/$(SAMAP_NAME): $(HOTSPOT_SALIB_PATH)/$(SAMAP_NAME)
-	$(install-file)
+	$(install-import-file)
 endif # windows
 endif # INCLUDE_SA
 
 # Internal import files
 ifdef OPENJDK
 
-JCE_JAR_SRC = $(CLOSED_JDK_IMPORT_PATH)/jre/lib/jce.jar
-SUNJCE_PROVIDER_SRC = $(CLOSED_JDK_IMPORT_PATH)/jre/lib/ext/sunjce_provider.jar
-JCE_EXPORT_POLICY_SRC = $(CLOSED_JDK_IMPORT_PATH)/jre/lib/security/US_export_policy.jar
-JCE_LOCAL_POLICY_SRC = $(CLOSED_JDK_IMPORT_PATH)/jre/lib/security/local_policy.jar
+$(LIBDIR)/jce.jar: \
+	    $(CLOSED_JDK_IMPORT_PATH)/jre/lib/jce.jar
+	$(install-closed-file)
+$(EXTDIR)/sunjce_provider.jar: \
+	    $(CLOSED_JDK_IMPORT_PATH)/jre/lib/ext/sunjce_provider.jar
+	$(install-closed-file)
+$(LIBDIR)/security/US_export_policy.jar: \
+	    $(CLOSED_JDK_IMPORT_PATH)/jre/lib/security/US_export_policy.jar
+	$(install-closed-file)
+$(LIBDIR)/security/local_policy.jar: \
+	    $(CLOSED_JDK_IMPORT_PATH)/jre/lib/security/local_policy.jar
+	$(install-closed-file)
 
 else
 
-JCE_JAR_SRC = $(BUILDDIR)/closed/tools/crypto/jce/jce.jar
-SUNJCE_PROVIDER_SRC = $(BUILDDIR)/closed/tools/crypto/jce/sunjce_provider.jar
-JCE_EXPORT_POLICY_SRC = $(BUILDDIR)/closed/tools/crypto/jce/US_export_policy.jar
-JCE_LOCAL_POLICY_SRC = $(BUILDDIR)/closed/tools/crypto/jce/local_policy.jar
+$(LIBDIR)/jce.jar: \
+	    $(BUILDDIR)/closed/tools/crypto/jce/jce.jar
+	$(install-file)
+$(EXTDIR)/sunjce_provider.jar: \
+	    $(BUILDDIR)/closed/tools/crypto/jce/sunjce_provider.jar
+	$(install-file)
+$(LIBDIR)/security/US_export_policy.jar: \
+	    $(BUILDDIR)/closed/tools/crypto/jce/US_export_policy.jar
+	$(install-file)
+$(LIBDIR)/security/local_policy.jar: \
+	    $(BUILDDIR)/closed/tools/crypto/jce/local_policy.jar
+	$(install-file)
 
 endif #OPENJDK
 
-$(LIBDIR)/jce.jar: $(JCE_JAR_SRC)
-	$(install-file)
-
-$(EXTDIR)/sunjce_provider.jar: $(SUNJCE_PROVIDER_SRC)
-	$(install-file)
-
-$(LIBDIR)/security/US_export_policy.jar: $(JCE_EXPORT_POLICY_SRC)
-	$(install-file)
-
-$(LIBDIR)/security/local_policy.jar: $(JCE_LOCAL_POLICY_SRC)
-	$(install-file)
-
 $(JSUM_CLASSDIR)/AddJsum.class:  $(SHARINGDIR)/AddJsum.java
 	@$(prep-target)
 	$(JAVAC_BOOT) -d $(@D) $<
@@ -366,11 +370,10 @@
 com/sun/jmx/snmp/daemon/SnmpTimerServer.class \
 com/sun/jmx/snmp/daemon/WaitQ.class \
 com/sun/media/sound
+
 build: openjdkredist
 openjdkredist:
-	$(MKDIR) -p $(CLASSDESTDIR); \
-	$(ECHO) "Copying classes from $(CLOSED_JAR_FILE)"; \
-	($(CD) $(CLASSDESTDIR) ; $(JAR_BOOT) xvf $(CLOSED_JAR_FILE) $(CLOSED_CLASSES))
+	$(call install-closed-classes,$(CLOSED_CLASSES))
 
 else  # (!OPENJDK)
 # Lucida font files are not included in the OpenJDK distribution.
--- a/j2se/make/java/text/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/text/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.66 07/05/05
-#
 FILES_java = \
     $(TARGDIR)java/text/Annotation.java \
     $(TARGDIR)java/text/AttributedCharacterIterator.java \
--- a/j2se/make/java/zip/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/zip/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.13 07/05/05
-#
 FILES_c = \
 	$(CTARGDIR)CRC32.c \
 	$(CTARGDIR)Adler32.c \
--- a/j2se/make/java/zip/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/java/zip/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.10 07/05/05
-#
 JAVA_ZIP_java = \
 	$(TARGDIR)java/util/zip/Adler32.java \
 	$(TARGDIR)java/util/zip/CRC32.java \
--- a/j2se/make/javax/accessibility/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/accessibility/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -36,14 +36,13 @@
 #
 # Resources
 #
+LOCALE_SUFFIXES += en
 LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_COMPILED_PROPERTIES = com/sun/accessibility/internal/resources/accessibility.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
-LOCALE_SUFFIXES += en
+RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
+      com/sun/accessibility/internal/resources/accessibility.properties
 
 #
-# Include
+# Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
--- a/j2se/make/javax/imageio/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/imageio/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -38,29 +38,19 @@
 AUTO_FILES_JAVA_DIRS = javax/imageio com/sun/imageio 
 
 #
-# Properties
+# Resources
 #
+LOCALE_SET_DEFINITION = j2re
 OTHER_PROPERTIES = com/sun/imageio/plugins/common/iio-plugin.properties
 
-LOCALE_SET_DEFINITION = j2re
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-RESOURCE_DEST_DIR = $(CLASSBINDIR)
-include $(BUILDDIR)/common/Resources.gmk
-
 #
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-#
-# Rules that copy files.
-#
-
-build: copy-files $(PFILES)
+build: copy-files
 
 copy-files: $(FILES_copy)
 
-#	
-# Declare extra phony targets.
-#
 .PHONY: copy-files
+
--- a/j2se/make/javax/print/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/print/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -56,11 +56,8 @@
 #
 # Resources
 #
-
 LOCALE_SET_DEFINITION = j2re
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = sun/print/resources/serviceui.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
 
 #
 # Rules
--- a/j2se/make/javax/sound/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/sound/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.25 07/05/05
-#
-
 FILES_c = \
 	$(CTARGDIR)Utilities.c \
 	$(CTARGDIR)MixerThread.c \
--- a/j2se/make/javax/sound/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/sound/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -167,9 +167,7 @@
 
 # the package is built before new jar utility so we use boot jar
 copy-closed-class-files:
-	$(MKDIR) -p $(CLASSDESTDIR)
-	$(ECHO) "Copying classes from $(CLOSED_JAR_FILE)"
-	($(CD) $(CLASSDESTDIR) ; $(JAR_BOOT) xvf $(CLOSED_JAR_FILE) com/sun/media/sound)
+	$(call install-closed-classes,com/sun/media/sound)
 
 build: copy-closed-class-files
 
--- a/j2se/make/javax/sql/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/sql/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -37,15 +37,13 @@
 #
 AUTO_FILES_JAVA_DIRS = javax/sql
 
+# 
+# Resources
 #
-# Rules.
+OTHER_PROPERTIES  = $(PKGDIR)/rowset/rowset.properties
+
+#
+# Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
-# 
-# Resources
-#
-OTHER_PROPERTIES  = rowset.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/$(PKGDIR)/rowset
-RESOURCE_DEST_DIR = $(CLASSDESTDIR)/$(PKGDIR)/rowset
-include $(BUILDDIR)/common/Resources.gmk
--- a/j2se/make/javax/swing/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/swing/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES.gmk	1.17 07/05/05
-#
-
 MISC_FILES = \
         $(CLASSBINDIR)/javax/swing/text/html/default.css 			\
         $(CLASSBINDIR)/javax/swing/text/html/parser/html32.bdtd 		\
--- a/j2se/make/javax/swing/beaninfo/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/swing/beaninfo/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES.gmk	1.22 07/05/05
-#
 # There are the Swing classes for which a BeanInfo class is generated.
 #
 
--- a/j2se/make/javax/swing/plaf/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/swing/plaf/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES.gmk	1.37 07/05/05
-#
-
 MISC_SWING_FILES = \
 	$(CLASSBINDIR)/com/sun/java/swing/plaf/windows/icons/Computer.gif \
 	$(CLASSBINDIR)/com/sun/java/swing/plaf/windows/icons/DetailsView.gif \
--- a/j2se/make/javax/swing/plaf/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/swing/plaf/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -47,10 +47,10 @@
 
 FILES_java = $(FILES_SWING_java)
 
-
 #
 # Resources
 #
+LOCALE_SET_DEFINITION = j2re
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
 	com/sun/swing/internal/plaf/basic/resources/basic.properties \
 	com/sun/swing/internal/plaf/metal/resources/metal.properties \
@@ -63,11 +63,6 @@
         com/sun/java/swing/plaf/gtk/resources/gtk.properties
 endif
 
-
-LOCALE_SET_DEFINITION = j2re
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
-
 #
 # Rules.
 # Process LOGO_ICONS and Motif Icons first.
--- a/j2se/make/javax/xml/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/javax/xml/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -38,13 +38,11 @@
 include FILES.gmk
 AUTO_FILES_JAVA_DIRS = javax/xml
 
-
-#Resources 
+#
+# Resources 
+#
 LOCALE_SET_DEFINITION = j2sdk
 NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-RESOURCE_DEST_DIR = $(CLASSBINDIR)
-include $(BUILDDIR)/common/Resources.gmk
 
 #
 # Rules
--- a/j2se/make/jpda/back/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/jpda/back/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.47 07/05/05
-#
 # Makefile for building the JDI back-end implementation
 #
 
@@ -50,34 +48,8 @@
                  -I$(PLATFORM_SRC)/back \
                  -I$(TEMPDIR)/../com.sun.tools.jdwpgen/jdwp
 
-ifeq ($(PLATFORM), windows)
-  OTHER_LDLIBS += $(JVMLIB)
-endif # PLATFORM
-
-ifeq ($(PLATFORM), linux)
-  # fork1() is declared in libjvm.so
-  OTHER_LDLIBS += -ldl $(JVMLIB)
-endif # PLATFORM
-
-ifeq ($(PLATFORM), solaris)
+ifneq ($(PLATFORM), windows)
   OTHER_LDLIBS += -ldl
-  # Use of lint has been helpful, but lots of errors needed to be suppressed:
-  #OTHER_LINTFLAGS += -errtags=yes
-  # The following error tags are all errors that we suppress right now
-  OTHER_LINTFLAGS += -erroff=E_CONST_EXPR
-  OTHER_LINTFLAGS += -erroff=E_CONSTANT_CONDITION
-  OTHER_LINTFLAGS += -erroff=E_SUPPRESSION_DIRECTIVE_UNUSED
-  OTHER_LINTFLAGS += -erroff=E_INCL_NUSD
-  OTHER_LINTFLAGS += -erroff=E_H_C_CHECK0
-  # We only care about errors in user include files
-  OTHER_LINTFLAGS += -errhdr=%user
-  # Logging gives lint fits, so we turn it off
-  OTHER_LINTFLAGS += -DNO_JDWP_LOGGING
-  # We don't use the -Ncheck feature yet, it seems somewhat broken
-  #OTHER_LINTFLAGS += -Ncheck -Nlevel=2
-  # Even with above suppression, some files/code are hopelessly non-lintable
-  #   signal.h has some old style C function prototypes in it (Solaris 9u2)
-  MY_LINT_FILTER += | $(GREP) -v /usr/include
 endif # PLATFORM
 
 #
@@ -151,13 +123,3 @@
 endif # PLATFORM
 vpath %.c $(SHARE_SRC)/back:$(PLATFORM_SRC)/back
 
-#
-# Lint checking rules (we filter out the lint pass and only list errors)
-#
-linterrs: $(TEMPDIR)/linterrs
-$(TEMPDIR)/linterrs: $(FILES_o)
-	$(RM) $@
-	$(MAKE) lint.clean
-	$(MAKE) lint.errors > $@ 2>&1
-	($(CAT) $@ | $(GREP) 'warning:' $(MY_LINT_FILTER) || exit 0)
-
--- a/j2se/make/jpda/front/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/jpda/front/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -48,15 +48,14 @@
 	$(SERVICEDIR)/com.sun.jdi.connect.Connector
 
 #
-# Resources.
+# Resources
 #
 LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_COMPILED_PROPERTIES = com/sun/tools/jdi/resources/jdi.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
+      com/sun/tools/jdi/resources/jdi.properties
 
 #
-# Rules.
+# Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
 
--- a/j2se/make/jpda/transport/shmem/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/jpda/transport/shmem/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.26 07/05/05
 #
 # Makefile for building JDI shared memory transport implementation
 #
--- a/j2se/make/jpda/transport/socket/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/jpda/transport/socket/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.33 07/05/05
-#
 # Makefile for building the JDI back-end implementation
 #
 
--- a/j2se/make/jpda/tty/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/jpda/tty/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -57,11 +57,10 @@
 # Resources
 #
 LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_JAVA = $(TARGDIR)com/sun/tools/example/debug/tty/TTYResources.java
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_JAVA = com/sun/tools/example/debug/tty/TTYResources.java
 
 #
-# Rules.
+# Rules
 #
 include $(BUILDDIR)/common/Program.gmk
 
--- a/j2se/make/mkdemo/applets/DemoApplets.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/applets/DemoApplets.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)DemoApplets.gmk	1.34 07/05/05
-#
 # Boiler plate for demo applets. The following variables should have
 # sensible values before you include this makefile:
 #   		DEMO_dirs DEMO_other DEMO_java DEMONAME
--- a/j2se/make/mkdemo/applets/ImageMap/Makefile	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-#
-# Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-#
-
-#
-# Build applet demo.
-#
-
-BUILDDIR = ../../..
-DEMONAME = ImageMap
-include $(BUILDDIR)/common/Defs.gmk
-DEMOSRCDIR = $(CLOSED_SRC)/share/demo
-
-DEMO_java  = $(DEMODST)/AniArea.java \
-             $(DEMODST)/ButtonFilter.java \
-             $(DEMODST)/ClickArea.java \
-             $(DEMODST)/DelayedSoundArea.java \
-             $(DEMODST)/HighlightArea.java \
-             $(DEMODST)/HighlightFilter.java \
-             $(DEMODST)/HrefButtonArea.java \
-             $(DEMODST)/ImageMap.java \
-             $(DEMODST)/ImageMapArea.java \
-             $(DEMODST)/LinkArea.java \
-             $(DEMODST)/NameArea.java \
-             $(DEMODST)/RoundButtonFilter.java \
-             $(DEMODST)/RoundHrefButtonArea.java \
-             $(DEMODST)/SoundArea.java \
-             $(DEMODST)/TickerArea.java
-
-DEMO_dirs  = $(DEMODST) \
-             $(DEMODST)/audio \
-             $(DEMODST)/images
-
-DEMO_other = $(DEMODST)/example1.html \
-             $(DEMODST)/sources.html \
-             $(DEMODST)/imagemapcheat.html \
-             $(DEMODST)/audio/chirp1.au \
-             $(DEMODST)/audio/hi.au \
-             $(DEMODST)/images/jim.graham.gif
-
-include ../DemoApplets.gmk
-
--- a/j2se/make/mkdemo/applets/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/applets/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -30,7 +30,7 @@
 BUILDDIR = ../..
 include $(BUILDDIR)/common/Defs.gmk
 
-SUBDIRS_CLOSED = Animator  GraphLayout ImageMap JumpingBox TicTacToe 
+SUBDIRS_CLOSED = Animator  GraphLayout JumpingBox TicTacToe 
 SUBDIRS = ArcTest BarChart Blink CardTest Clock DitherTest DrawTest \
           Fractal GraphicsTest MoleculeViewer \
           NervousText SimpleGraph SortDemo SpreadSheet WireFrame
--- a/j2se/make/mkdemo/jfc/CodePointIM/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/jfc/CodePointIM/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES.gmk	1.10 07/05/05
-#
 # CodePointIM
 #
 
--- a/j2se/make/mkdemo/jfc/Font2DTest/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/jfc/Font2DTest/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES.gmk	1.10 07/05/05
-#
 # Font2DTest.
 #
 
--- a/j2se/make/mkdemo/jfc/Font2DTest/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/jfc/Font2DTest/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.29 07/05/05
-#
 # Makefile for building the Font2DTest Demo
 #
 
--- a/j2se/make/mkdemo/jfc/Java2D/DemoJava2D.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/jfc/Java2D/DemoJava2D.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)DemoJava2D.gmk	1.28 07/05/05
-#
 # Boiler plate for Java 2D demo. The following variables should have
 # sensible values before you include this makefile:
 #   		DEMO_dirs DEMO_other DEMO_java DEMONAME
--- a/j2se/make/mkdemo/jfc/Java2D/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/jfc/Java2D/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES.gmk	1.19 07/05/05
-#
 # Java2Demo.
 #
 
--- a/j2se/make/mkdemo/jfc/Java2D/gui/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/jfc/Java2D/gui/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES.gmk	1.18 07/05/05
-#
-
 DEMO_java  = $(DEMODST)/AnimatingContext.java \
 	     $(DEMODST)/CloningFeature.java \
 	     $(DEMODST)/Controls.java \
--- a/j2se/make/mkdemo/jvmti/Demo.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/jvmti/Demo.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -246,7 +246,8 @@
 	    $(CP) $(PSRCDIR)/*.* $(ABS_DEMODESTDIR)/src/$(PLATFORM); \
 	fi
 	@if [ "$(DEMO_NAME)" = hprof ] ; then \
-	    $(CP) $(SHARE_SRC)/classes/sun/tools/hprof/*.java $(ABS_DEMODESTDIR)/src; \
+	    $(CP) $(SHARE_SRC)/classes/com/sun/demo/jvmti/hprof/*.java \
+		$(ABS_DEMODESTDIR)/src; \
 	fi
 
 clean::
--- a/j2se/make/mkdemo/sound/FILES.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/mkdemo/sound/FILES.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES.gmk	1.8	07/05/05
-#
 # JavaSound.
 #
 
--- a/j2se/make/netbeans/common/shared.xml	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/netbeans/common/shared.xml	Fri Jun 22 00:46:43 2007 +0000
@@ -35,7 +35,14 @@
 
     <import file="make.xml"/>
 
-    <target name="-first-init">
+    <target name="-tstamp">
+        <tstamp>
+            <format property="build.time" pattern="MM/dd/yyyy hh:mm aa"/>
+            <format property="build.fullversion.time" pattern="MM/dd/yyyy_HH_mm"/>
+        </tstamp>
+    </target>
+
+    <target name="-first-init" depends="-tstamp">
         <mkdir dir="${user.home}/.openjdk"/>
         <property name="workspace-user-build.properties" location="nbproject/private/build.properties"/>
         <property file="${workspace-user-build.properties}"/>
@@ -62,10 +69,6 @@
     </target>
     <target name="-init" description="Initial configuration used by everything else." depends="-pre-init,-first-init,-project-init,-post-init"/>
     <target name="-project-init" depends="-warn-about-bootstrap.jdk">
-        <tstamp>
-            <format property="build.time" pattern="MM/dd/yyyy hh:mm aa"/>
-            <format property="build.fullversion.time" pattern="MM/dd/yyyy_HH_mm"/>
-        </tstamp>
         <property name="root" location="../../.."/>
         <property file="../common/architectures/name-${os.name}.properties"/>
         <property name="platform" value="windows"/>
--- a/j2se/make/netbeans/compiler/build.properties	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/netbeans/compiler/build.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -53,9 +53,6 @@
     com/sun/source/ \
     com/sun/tools/javac/ 
 
-excludes=\
-    com/sun/tools/javac/resources/version-template.java
-
 javadoc.jls3.url=http://java.sun.com/docs/books/jls/
 javadoc.jls3.cite=&lt;a href=&quot;${javadoc.jls3.url}&quot;&gt;The Java Language Specification, Third Edition&lt;/a&gt;    
 javadoc.options=-tag "jls3:a:See &lt;cite&gt;${javadoc.jls3.cite}&lt;/cite&gt;:"
--- a/j2se/make/netbeans/compiler/build.xml	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/netbeans/compiler/build.xml	Fri Jun 22 00:46:43 2007 +0000
@@ -38,8 +38,12 @@
         <include name="javax/tools/**/*.java"/>
         <include name="com/sun/source/**/*.java"/>
         <include name="com/sun/tools/javac/**/*.java"/>
-        <exclude name="**/*-template.java"/>
     </patternset>
+
+    <fileset id="javac.resources" dir="${src.classes}">
+        <include name="com/sun/tools/javac/resources/*.properties"/>
+        <exclude name="**/*-template.*"/>
+    </fileset>
     
     <target name="-prep" depends="-init">
         <property name="src.bin" value="${root}/src/share/opensource/javac/src/bin"/>
@@ -51,7 +55,6 @@
         <uptodate targetfile="${dist.dir}/lib/javac.jar" property="javac.is.uptodate">
             <srcfiles dir="${src.classes}">
                 <patternset refid="src.javac"/>
-                <include name="${src.classes}/com/sun/tools/javac/resources/version-template.java"/>
                 <include name="${src.classes}/com/sun/tools/javac/resources/*.properties"/>
             </srcfiles>
         </uptodate>
@@ -64,27 +67,15 @@
     <target name="build-lib.javac.jar" depends="check-javac.isuptodate" unless="javac.is.uptodate">
         <!-- to compile javac, set includeAntRuntime=no to prevent javac's 
         own tools.jar incorrectly appearing on the classpath -->
-        <mkdir dir="${gensrc.dir}/com/sun/tools/javac"/>
-        <copy file="${src.classes}/com/sun/tools/javac/resources/version-template.java"
-            tofile="${gensrc.dir}/com/sun/tools/javac/resources/version.java">
-            <filterset begintoken="$(" endtoken=")">
-                <filter token="JDK_VERSION"  value="${build.jdk.version}"/>
-                <filter token="RELEASE"      value="${build.release}"/>
-                <filter token="FULL_VERSION" value="${build.full.version}"/>
-            </filterset>
-        </copy>
         <mkdir dir="${build.bootclasses}"/>
-        <javac srcdir="${src.classes}:${gensrc.dir}" destdir="${build.bootclasses}"
+        <javac srcdir="${src.classes}" destdir="${build.bootclasses}"
             sourcepath=""
             source="${compiler.source.level}"  debug="true" debuglevel="source,lines"
             includeAntRuntime="no">
             <patternset refid="src.javac"/>
-            <include name="com/sun/tools/javac/resources/version.java"/>
         </javac>
         <copy todir="${build.bootclasses}">
-            <fileset dir="${src.classes}">
-                <include name="com/sun/tools/javac/resources/*.properties"/>
-            </fileset>
+            <fileset refid="javac.resources"/>
         </copy>
         <echo message="recompiling compiler with itself"/>
         <pathconvert pathsep=" " property="src.javac.files">
@@ -92,25 +83,31 @@
                 <fileset dir="${src.classes}">
                     <patternset refid="src.javac"/>
                 </fileset>
-                <fileset dir="${gensrc.dir}">
-                    <include name="com/sun/tools/javac/resources/version.java"/>
-                </fileset>
             </path>
         </pathconvert>
         <mkdir dir="${classes.dir}"/>
         <java fork="true" classpath="${build.bootclasses}" classname="com.sun.tools.javac.Main">
+            <arg value="-sourcepath"/>
+            <arg value=""/>
             <arg value="-d"/>
             <arg file="${classes.dir}"/>
             <arg value="-g:source,lines"/>
             <arg line="${src.javac.files}"/>
         </java>
-        <copy todir="${classes.dir}">
-            <fileset dir="${src.classes}">
-                <include name="com/sun/tools/javac/resources/*.properties"/>
-            </fileset>
-        </copy>
+	<copy todir="${classes.dir}">
+            <fileset refid="javac.resources"/>
+	</copy>
+	<copy file="${src.classes}/com/sun/tools/javac/resources/version-template.properties"
+	    tofile="${classes.dir}/com/sun/tools/javac/resources/version.properties">
+	    <filterset begintoken="$(" endtoken=")">
+		<filter token="JDK_VERSION"  value="${build.jdk.version}"/>
+		<filter token="RELEASE"      value="${build.release}"/>
+		<filter token="FULL_VERSION" value="${build.full.version}"/>
+	    </filterset>
+	</copy>
         <mkdir dir="${dist.dir}/lib"/>
-        <jar destfile="${dist.dir}/lib/javac.jar" basedir="${classes.dir}">
+        <jar destfile="${dist.dir}/lib/javac.jar" basedir="${classes.dir}" 
+               includes="${includes}" excludes="${excludes}" >
             <manifest>
                 <attribute name="Built-By" value="${user.name}"/>
                 <attribute name="Built-At" value="${build.time}"/>
@@ -127,7 +124,6 @@
 
     <target name="clean" depends="-prep,shared.clean">
         <delete dir="${build.bootclasses}" includeemptydirs="true"/>
-        <delete dir="${gensrc.dir}/com/sun/tools/javac" includeemptydirs="true"/>
         <delete file="${dist.dir}/bin/javac"/>
         <delete file="${dist.dir}/lib/javac.jar"/>
     </target>
--- a/j2se/make/org/ietf/jgss/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/org/ietf/jgss/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.7 07/05/05
-#
 FILES_java = \
 	$(TARGDIR)org/ietf/jgss/Oid.java \
 	$(TARGDIR)org/ietf/jgss/GSSName.java \
--- a/j2se/make/org/omg/CORBAX_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/org/omg/CORBAX_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)CORBAX_java.gmk	1.9 07/05/05
-#
 # CORBA IDL Generated Files
 #
 
--- a/j2se/make/org/omg/idl/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/org/omg/idl/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.6 07/05/05
-#
-
 IDL = \
         $(TARGDIR)com/sun/tools/corba/se/idl/Arguments.java \
         $(TARGDIR)com/sun/tools/corba/se/idl/AttributeEntry.java \
--- a/j2se/make/org/omg/idl/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/org/omg/idl/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -32,7 +32,7 @@
 PACKAGE = com.sun.tools.corba.se.idl
 PRODUCT = sun
 ifndef STANDALONE_CORBA_WS
-PROGRAM = idlj
+  PROGRAM = idlj
 endif
 
 include $(BUILDDIR)/common/Defs.gmk
@@ -48,24 +48,13 @@
 
 JAVA_ARGS = "{ \"com.sun.tools.corba.se.idl.toJavaPortable.Compile\" }"
 
-ifndef STANDALONE_CORBA_WS
 #
-# Rules.
+# Resources
 #
-include $(BUILDDIR)/common/Program.gmk
-else
-include $(BUILDDIR)/common/Classes.gmk
-endif
-
-#
-# Resources.
-#
-
 LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_PROPERTIES = idl.prp toJavaPortable/toJavaPortable.prp
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/com/sun/tools/corba/se/idl
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/com/sun/tools/corba/se/idl
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_PROPERTIES = \
+	 $(PKGDIR)/idl.prp \
+	 $(PKGDIR)/toJavaPortable/toJavaPortable.prp
 
 #
 # IDL files
@@ -78,6 +67,15 @@
 
 IFILES = $(IDL_FILES:%=$(IDL_DEST_DIR)/%)
 
+#
+# Rules
+#
+ifndef STANDALONE_CORBA_WS
+  include $(BUILDDIR)/common/Program.gmk
+else
+  include $(BUILDDIR)/common/Classes.gmk
+endif
+
 build: $(IFILES)
 
 $(IDL_DEST_DIR)/%: $(IDL_SRC_DIR)/%
--- a/j2se/make/org/w3c/dom/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/org/w3c/dom/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -35,21 +35,10 @@
 #
 # Files to compile
 #
-
 AUTO_FILES_JAVA_DIRS = org/w3c/dom
 
 #
-# Resources (only if you have them)
-#
-# TODO: none known?
-#LOCALE_SET_DEFINITION = j2sdk
-#NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
-#RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-#RESOURCE_DEST_DIR = $(CLASSBINDIR)
-#include $(BUILDDIR)/common/Resources.gmk
-
-#
 # Rules
 #
+include $(BUILDDIR)/common/Classes.gmk
 
-include $(BUILDDIR)/common/Classes.gmk
--- a/j2se/make/org/xml/sax/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/org/xml/sax/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.14 07/05/05
-#
 # Makefile for building SAX API classes
 #
 
--- a/j2se/make/sun/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -31,62 +31,54 @@
 PRODUCT  = sun
 include $(BUILDDIR)/common/Defs.gmk
 
-ifdef J2RE_ONLY
-  TOOLS_SUBDIRS =
-else
-  ifeq ($(PLATFORM), windows)
-    TOOLS_SUBDIRS = javac javap native2ascii serialver hprof jps jstat jstatd
-  else # PLATFORM
-    TOOLS_SUBDIRS = javap native2ascii serialver hprof jps jstat jstatd
-  endif # PLATFORM
-  ifeq ($(INCLUDE_SA), true)
-    TOOLS_SUBDIRS += jsadebugd
-  endif
-  TOOLS_SUBDIRS += jstack jmap jinfo jconsole jrunscript jhat
-endif # J2RE_ONLY
+# Serviceability Agent
+ifeq ($(INCLUDE_SA), true)
+  JSADEBUGD_SUBDIR = jsadebugd
+endif
 
-ifdef OPENJDK
-  HAVE_DGA = false
-  JDBC_SUBDIR =
-else 
-  HAVE_DGA = true
-  JDBC_SUBDIR = jdbc
-endif
-ifeq ($(PLATFORM), windows)
-  HAVE_DGA   = false
-endif
-ifeq ($(PLATFORM), solaris)
-  ifeq ($(ARCH), amd64)
-    HAVE_DGA = false
-  endif
-endif 
-
-ifeq ($(HAVE_DGA),true)
-DGA_SUBDIR = jdga
+# JDK vs. JRE
+ifndef J2RE_ONLY
+  TOOLS_SUBDIRS  = javap native2ascii serialver jps jstat jstatd
+  TOOLS_SUBDIRS += $(JSADEBUGD_SUBDIR)
+  TOOLS_SUBDIRS += jstack jmap jinfo jconsole jrunscript jhat
 endif
 
+# Rhino/Mozilla java sources
 ORG_EXISTS := $(call DirExists,$(CLOSED_SRC)/share/classes/sun/org,,)
-
 ifneq ("$(ORG_EXISTS)", "")
   ORG_SUBDIR = org
 endif
 
+# Non windows subdirs
+ifneq ($(PLATFORM), windows)
+  ifndef OPENJDK
+    ifeq ($(PLATFORM), solaris)
+      ifneq ($(ARCH), amd64)
+        DGA_SUBDIR = jdga
+      endif
+    endif
+  endif
+  ifdef MOTIF_REQUIRED
+    MOTIF_SUBDIRS   = motif12 motif21
+  endif
+  HEADLESS_SUBDIR = headless
+  IMAGE_SUBDIR    = image
+  XAWT_SUBDIR     = xawt
+endif
+
 #
 # corba must always be built before rmi, due to rmi-iiop support
 #
-MOTIF_SUBDIRS = 
-ifdef MOTIF_REQUIRED
-  MOTIF_SUBDIRS = motif12 motif21
+ifndef OPENJDK
+  JDBC_SUBDIR = jdbc
 endif
-ifeq ($(PLATFORM), windows)
-SUBDIRS = jar security javazic dcpr awt splashscreen font jpeg cmm audio net \
-	  applet misc corba rmi $(JDBC_SUBDIR) beans jawt text nio launcher \
-	  management jvmstat $(ORG_SUBDIR) xjc schemagen wsgen wsimport $(TOOLS_SUBDIRS)
-else # PLATFORM
-SUBDIRS = jar security javazic misc net audio dcpr image awt splashscreen xawt $(MOTIF_SUBDIRS) xjc schemagen wsgen wsimport \
-          headless $(DGA_SUBDIR) font jpeg cmm applet corba rmi beans \
-          $(JDBC_SUBDIR) jawt text nio launcher management jvmstat $(ORG_SUBDIR) $(TOOLS_SUBDIRS)
-endif # PLATFORM
+SUBDIRS = jar security javazic misc net audio dcpr $(IMAGE_SUBDIR) \
+	  awt splashscreen $(XAWT_SUBDIR) $(MOTIF_SUBDIRS) \
+	  xjc schemagen wsgen wsimport \
+          $(HEADLESS_SUBDIR) $(DGA_SUBDIR) \
+	  font jpeg cmm applet corba rmi beans $(JDBC_SUBDIR) \
+	  jawt text nio launcher management jvmstat $(ORG_SUBDIR) \
+	  $(TOOLS_SUBDIRS)
 
 all build clean clobber::
 	$(SUBDIRS-loop)
--- a/j2se/make/sun/applet/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/applet/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -41,19 +41,18 @@
 #
 # Resources
 #
-RESOURCE_BUNDLES_JAVA = $(TARGDIR)sun/applet/resources/MsgAppletViewer.java
 LOCALE_SET_DEFINITION = j2re
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_JAVA = sun/applet/resources/MsgAppletViewer.java
 
 ifneq ($(PLATFORM), windows)
-#
-# Anything with a GUI needs X11 to be linked in.
-#
-OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 
+  #
+  # Anything with a GUI needs X11 to be linked in.
+  #
+  OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 
 endif # PLATFORM
 
 #
-# Rules.
+# Rules
 #
 JAVA_ARGS = "{ \"sun.applet.Main\" }"
 include $(BUILDDIR)/common/Program.gmk
--- a/j2se/make/sun/awt/Depend.mak	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/Depend.mak	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,3 @@
-#
-# @(#)Depend.mak	1.36 07/01/25
 #
 # This makefile must be executed on a system with makedepend, such as Solaris.
 # In my copious amount of spare time, I hope to write a Java-based makedepend
--- a/j2se/make/sun/awt/FILES_c_unix.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/FILES_c_unix.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES_c_unix.gmk	1.133 07/05/05
-#
 # The debug_* files included here aren't for 2D specifically but they
 # have no X dependency.
 
@@ -127,6 +125,7 @@
         $(TARGDIR)FourByteAbgrPre.c \
 	$(TARGDIR)BufferedRenderPipe.c \
 	$(TARGDIR)RenderBuffer.c \
+	$(TARGDIR)ShapeSpanIterator.c \
 	$(TARGDIR)SpanClipRenderer.c \
 	$(TARGDIR)awt_ImageRep.c \
         $(TARGDIR)awt_ImagingLib.c \
@@ -223,6 +222,7 @@
         $(TARGDIR)OGLRenderer.c \
         $(TARGDIR)OGLSurfaceData.c \
         $(TARGDIR)OGLTextRenderer.c \
+        $(TARGDIR)OGLVertexCache.c \
         $(TARGDIR)GLXGraphicsConfig.c \
         $(TARGDIR)GLXSurfaceData.c \
         $(TARGDIR)AccelGlyphCache.c \
--- a/j2se/make/sun/awt/FILES_c_windows.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/FILES_c_windows.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -70,6 +70,7 @@
         $(CTARGDIR)FourByteAbgrPre.c \
 	$(CTARGDIR)BufferedRenderPipe.c \
 	$(CTARGDIR)RenderBuffer.c \
+	$(CTARGDIR)ShapeSpanIterator.c \
 	$(CTARGDIR)SpanClipRenderer.c \
 	$(CTARGDIR)SurfaceData.c \
 	$(CTARGDIR)Region.c \
@@ -154,6 +155,7 @@
         $(CTARGDIR)OGLRenderer.c \
         $(CTARGDIR)OGLSurfaceData.c \
         $(CTARGDIR)OGLTextRenderer.c \
+        $(CTARGDIR)OGLVertexCache.c \
         $(CTARGDIR)WGLGraphicsConfig.c \
         $(CTARGDIR)WGLSurfaceData.c \
         $(CTARGDIR)AccelGlyphCache.c
--- a/j2se/make/sun/awt/FILES_export_unix.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/FILES_export_unix.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -106,8 +106,11 @@
 	sun/awt/X11GraphicsConfig.java \
 	sun/awt/CharsetString.java \
 	sun/awt/UNIXToolkit.java \
+	sun/java2d/pipe/BufferedContext.java \
 	sun/java2d/pipe/BufferedOpCodes.java \
+	sun/java2d/pipe/BufferedPaints.java \
 	sun/java2d/pipe/BufferedRenderPipe.java \
+	sun/java2d/pipe/BufferedTextPipe.java \
 	sun/java2d/pipe/RenderBuffer.java \
 	sun/java2d/pipe/ShapeSpanIterator.java \
 	sun/java2d/pipe/SpanClipRenderer.java \
--- a/j2se/make/sun/awt/FILES_export_windows.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/FILES_export_windows.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -220,8 +220,11 @@
 	sun/awt/windows/WTrayIconPeer.java \
 	sun/awt/DebugHelperImpl.java \
 	sun/awt/image/ImagingLib.java \
+        sun/java2d/pipe/BufferedContext.java \
         sun/java2d/pipe/BufferedOpCodes.java \
+        sun/java2d/pipe/BufferedPaints.java \
         sun/java2d/pipe/BufferedRenderPipe.java \
+        sun/java2d/pipe/BufferedTextPipe.java \
         sun/java2d/pipe/RenderBuffer.java \
 	sun/java2d/pipe/ShapeSpanIterator.java \
 	sun/java2d/pipe/SpanClipRenderer.java \
--- a/j2se/make/sun/awt/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -160,23 +160,15 @@
 #
 # Resources
 #
-
 LOCALE_SET_DEFINITION = j2re
-
-RESOURCE_BUNDLES_COMPILED_PROPERTIES = 
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-
 ifeq ($(PLATFORM), windows)
-# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WINDOWS
+  RESOURCE_BUNDLES_COMPILED_PROPERTIES += \
+	sun/awt/windows/awtLocalization.properties
+endif
 
-RESOURCE_BUNDLES_COMPILED_PROPERTIES += sun/awt/windows/awtLocalization.properties
-RESOURCE_SRC_DIR_2 = $(PLATFORM_SRC)/classes
-
-# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ WINDOWS
-endif # PLATFORM
-
-include $(BUILDDIR)/common/Resources.gmk
-
+#
+# Rules
+#
 ifeq ($(PLATFORM), linux)
   FILES_m = mapfile-vers-linux
   # libawt.so on Linux is statically linked with Motif and contains all the
@@ -439,6 +431,7 @@
 	fontconfig.RedHat.properties			\
 	fontconfig.RedHat.2.1.properties		\
 	fontconfig.RedHat.3.properties		\
+	fontconfig.RedHat.4.properties			\
 	fontconfig.Sun.properties			\
 	fontconfig.Turbo.properties			\
 	fontconfig.SuSE.properties
--- a/j2se/make/sun/awt/README	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/README	Fri Jun 22 00:46:43 2007 +0000
@@ -1,4 +1,4 @@
-@(#)README	1.5 02/03/08
+README:
 
 This directory builds the new version of the Windows AWT.  It's been built
 successfully with Visual C++ 4.1, but since it uses very little of VC++'s
--- a/j2se/make/sun/awt/make.depend	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/make.depend	Fri Jun 22 00:46:43 2007 +0000
@@ -1,4 +1,4 @@
-$(OBJDIR)/AccelGlyphCache.obj::	../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h
+$(OBJDIR)/AccelGlyphCache.obj::	../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h
 
 $(OBJDIR)/AlphaMacros.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
 
@@ -22,7 +22,7 @@
 
 $(OBJDIR)/awt_Button.obj::	$(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/awt_Canvas.obj::	$(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/awt_Canvas.obj::	$(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
 $(OBJDIR)/awt_Checkbox.obj::	$(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
@@ -172,29 +172,29 @@
 
 $(OBJDIR)/ComCtl32Util.obj::	$(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DBlitLoops.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DBlitLoops.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DContext.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DRuntimeTest.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DContext.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DRuntimeTest.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DMaskFill.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DMaskFill.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DRenderer.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_windows_DDRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DRenderer.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_windows_DDRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DRuntimeTest.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DRuntimeTest.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTestRaster.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/dxInit.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DRuntimeTest.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DRuntimeTest.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTestRaster.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/dxInit.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBackBufferSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBackBufferSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DTextRenderer_md.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DTextRenderer_md.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/D3DUtils.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/D3DUtils.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DUtils.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
 $(OBJDIR)/DataBufferNative.obj::	$(CLASSHDRDIR)/sun_awt_image_DataBufferNative.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h
 
 $(OBJDIR)/DDBlitLoops.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_DDBlitLoops.h $(CLASSHDRDIR)/sun_java2d_windows_DDScaleLoops.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/ddrawObject.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_DisplayMode.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/ddrawObject.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_DisplayMode.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/ddrawUtils.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/dxInit.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/ddrawUtils.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/dxInit.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
 $(OBJDIR)/DDRenderer.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_DDRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
@@ -222,7 +222,7 @@
 
 $(OBJDIR)/dxCapabilities.obj::	../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h
 
-$(OBJDIR)/dxInit.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DRuntimeTest.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/dxInit.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/dxInit.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DRuntimeTest.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/dxInit.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
 $(OBJDIR)/FillPath.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
 
@@ -388,27 +388,29 @@
 
 $(OBJDIR)/ObjectList.obj::	$(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/OGLBlitLoops.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLBlitLoops.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLBufImgOps.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLBufImgOps.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLContext.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLContext.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
 $(OBJDIR)/OGLFuncs.obj::	../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLMaskBlit.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLMaskBlit.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLMaskFill.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLMaskFill.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLPaints.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLPaints.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedPaints.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLRenderer.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLRenderer.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLRenderQueue.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLRenderQueue.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
 $(OBJDIR)/OGLSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
-$(OBJDIR)/OGLTextRenderer.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLTextRenderer.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+
+$(OBJDIR)/OGLVertexCache.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
 
 $(OBJDIR)/ProcessPath.obj::	$(CLASSHDRDIR)/java_awt_geom_PathIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
 
@@ -420,7 +422,7 @@
 
 $(OBJDIR)/ScaledBlit.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_ScaledBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
 
-$(OBJDIR)/ShapeSpanIterator.obj::	$(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_ShapeSpanIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/dc/doe/doe.h ../../../src/share/native/sun/dc/doe/doeObject.h ../../../src/share/native/sun/dc/doe/dtypes.h ../../../src/share/native/sun/dc/path/dcPathConsumer.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/ShapeSpanIterator.obj::	$(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_ShapeSpanIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/PathConsumer2D.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
 
 $(OBJDIR)/ShellFolder2.obj::	../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
@@ -452,13 +454,13 @@
 
 $(OBJDIR)/WBufferStrategy.obj::	$(CLASSHDRDIR)/sun_awt_windows_WBufferStrategy.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h
 
-$(OBJDIR)/WGLGraphicsConfig.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
+$(OBJDIR)/WGLGraphicsConfig.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
 
-$(OBJDIR)/WGLSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
+$(OBJDIR)/WGLSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
 
-$(OBJDIR)/Win32OffScreenSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_windows_Win32OffScreenSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/Win32OffScreenSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_windows_Win32OffScreenSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
-$(OBJDIR)/Win32SurfaceData.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_windows_Win32SurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
+$(OBJDIR)/Win32SurfaceData.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_windows_Win32SurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/glyphblitting.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
 $(OBJDIR)/WinBackBufferSurfaceData.obj::	$(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_WinBackBufferSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/ddrawUtils.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
 
--- a/j2se/make/sun/awt/mapfile-mawt-vers	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/mapfile-mawt-vers	Fri Jun 22 00:46:43 2007 +0000
@@ -234,6 +234,7 @@
                 Java_sun_awt_motif_MToolkit_isSyncFailed;
                 Java_sun_awt_motif_MToolkit_nativeUnGrab;
                 Java_sun_awt_motif_MToolkit_nativeGrab;
+                Java_sun_awt_motif_MToolkit_getWMName;
 		Java_sun_awt_motif_MWindowAttributes_initIDs;
 		Java_sun_awt_motif_MWindowPeer_pDispose;
 		Java_sun_awt_motif_MWindowPeer_pHide;
@@ -255,6 +256,7 @@
 		Java_sun_awt_motif_MWindowPeer_unregisterX11DropTarget;
 		Java_sun_awt_motif_MWindowPeer_updateAlwaysOnTop;
                 Java_sun_awt_motif_MWindowPeer_setFocusableWindow;
+                Java_sun_awt_motif_MWindowPeer_pToFront;
 		Java_sun_awt_motif_MCustomCursor_cacheInit;
 		Java_sun_awt_motif_MCustomCursor_createCursor;
 		Java_sun_awt_motif_MCustomCursor_queryBestCursor;
--- a/j2se/make/sun/awt/mapfile-vers	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/mapfile-vers	Fri Jun 22 00:46:43 2007 +0000
@@ -69,6 +69,25 @@
                 Java_sun_java2d_pipe_RenderBuffer_copyFromArray;
 		Java_sun_java2d_pipe_SpanClipRenderer_eraseTile;
 		Java_sun_java2d_pipe_SpanClipRenderer_fillTile;
+                Java_sun_java2d_pipe_ShapeSpanIterator_addSegment;
+                Java_sun_java2d_pipe_ShapeSpanIterator_moveTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_lineTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_quadTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_curveTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_closePath;
+                Java_sun_java2d_pipe_ShapeSpanIterator_pathDone;
+                Java_sun_java2d_pipe_ShapeSpanIterator_getNativeConsumer;
+                Java_sun_java2d_pipe_ShapeSpanIterator_appendPoly;
+                Java_sun_java2d_pipe_ShapeSpanIterator_dispose;
+                Java_sun_java2d_pipe_ShapeSpanIterator_getNativeIterator;
+                Java_sun_java2d_pipe_ShapeSpanIterator_getPathBox;
+                Java_sun_java2d_pipe_ShapeSpanIterator_initIDs;
+                Java_sun_java2d_pipe_ShapeSpanIterator_intersectClipBox;
+                Java_sun_java2d_pipe_ShapeSpanIterator_nextSpan;
+                Java_sun_java2d_pipe_ShapeSpanIterator_setNormalize;
+                Java_sun_java2d_pipe_ShapeSpanIterator_setOutputAreaXYXY;
+                Java_sun_java2d_pipe_ShapeSpanIterator_setRule;
+                Java_sun_java2d_pipe_ShapeSpanIterator_skipDownTo;
 
 		Java_java_awt_Dimension_initIDs;
 		Java_java_awt_event_MouseEvent_initIDs;
--- a/j2se/make/sun/awt/mapfile-vers-linux	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/awt/mapfile-vers-linux	Fri Jun 22 00:46:43 2007 +0000
@@ -69,6 +69,25 @@
 		Java_sun_awt_image_ShortComponentRaster_initIDs;
 		Java_sun_java2d_pipe_SpanClipRenderer_eraseTile;
 		Java_sun_java2d_pipe_SpanClipRenderer_fillTile;
+                Java_sun_java2d_pipe_ShapeSpanIterator_addSegment;
+                Java_sun_java2d_pipe_ShapeSpanIterator_moveTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_lineTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_quadTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_curveTo;
+                Java_sun_java2d_pipe_ShapeSpanIterator_closePath;
+                Java_sun_java2d_pipe_ShapeSpanIterator_pathDone;
+                Java_sun_java2d_pipe_ShapeSpanIterator_getNativeConsumer;
+                Java_sun_java2d_pipe_ShapeSpanIterator_appendPoly;
+                Java_sun_java2d_pipe_ShapeSpanIterator_dispose;
+                Java_sun_java2d_pipe_ShapeSpanIterator_getNativeIterator;
+                Java_sun_java2d_pipe_ShapeSpanIterator_getPathBox;
+                Java_sun_java2d_pipe_ShapeSpanIterator_initIDs;
+                Java_sun_java2d_pipe_ShapeSpanIterator_intersectClipBox;
+                Java_sun_java2d_pipe_ShapeSpanIterator_nextSpan;
+                Java_sun_java2d_pipe_ShapeSpanIterator_setNormalize;
+                Java_sun_java2d_pipe_ShapeSpanIterator_setOutputAreaXYXY;
+                Java_sun_java2d_pipe_ShapeSpanIterator_setRule;
+                Java_sun_java2d_pipe_ShapeSpanIterator_skipDownTo;
 
 		Java_java_awt_Dimension_initIDs;
 		Java_java_awt_event_MouseEvent_initIDs;
--- a/j2se/make/sun/cmm/kcms/FILES_c_unix.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/cmm/kcms/FILES_c_unix.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c_unix.gmk	1.12 07/05/05
-#
 FILES_c = \
 	$(TARGDIR)attrmgr.c \
 	$(TARGDIR)auxpt.c \
--- a/j2se/make/sun/cmm/kcms/FILES_c_windows.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/cmm/kcms/FILES_c_windows.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c_windows.gmk	1.14 07/05/05
-#
 FILES_c = \
 	$(CTARGDIR)attrmgr.c \
 	$(CTARGDIR)auxpt.c \
--- a/j2se/make/sun/cmm/lcms/FILES_c_unix.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/cmm/lcms/FILES_c_unix.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c_unix.gmk	1.5 07/05/05
-#
 FILES_c = \
     $(TARGDIR)cmscam02.c \
     $(TARGDIR)cmscam97.c \
--- a/j2se/make/sun/cmm/lcms/FILES_c_windows.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/cmm/lcms/FILES_c_windows.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c_windows.gmk	1.5 07/05/05
-#
 FILES_c = \
     $(CTARGDIR)cmscam02.c \
     $(CTARGDIR)cmscam97.c \
--- a/j2se/make/sun/corba/core/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/corba/core/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -77,20 +77,16 @@
 	com/sun/corba/se/internal/io/ObjectStreamClass.java \
 	com/sun/corba/se/internal/io/LibraryManager.java 
 #
-# Rules.
-#
-include $(BUILDDIR)/common/Library.gmk
-
-#
 # Resources
 #
 LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_PROPERTIES = sunorb.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/com/sun/corba/se/impl/orbutil/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/com/sun/corba/se/impl/orbutil/resources
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_PROPERTIES = \
+      com/sun/corba/se/impl/orbutil/resources/sunorb.properties
 
-
+#
+# Rules
+#
+include $(BUILDDIR)/common/Library.gmk
 
 #
 # Extra clean rules because we build more than one package.
--- a/j2se/make/sun/corba/org/omg/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/corba/org/omg/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.6 07/05/05
-#
-
 SENDINGCONTEXT = \
 	$(TARGDIR)com/sun/org/omg/SendingContext/_CodeBaseStub.java \
         $(TARGDIR)com/sun/org/omg/SendingContext/CodeBase.java \
--- a/j2se/make/sun/dcpr/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/dcpr/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,14 +23,13 @@
 # have any questions.
 #
 
-# @(#)FILES_c.gmk	1.14 07/05/05
-
 FILES_c = \
 	$(CTARGDIR)CJError.c \
 	$(CTARGDIR)doeObject.c \
 	$(CTARGDIR)doeSun.c \
 	$(CTARGDIR)dcPool.c \
 	$(CTARGDIR)CJPathConsumer.c \
+	$(CTARGDIR)CJPathConsumer2D.c \
 	$(CTARGDIR)dcPathConsumer.c \
 	$(CTARGDIR)dcPathStore.c \
 	$(CTARGDIR)dcPathError.c \
@@ -50,4 +49,3 @@
 	$(CTARGDIR)affine.c \
 	$(CTARGDIR)angles.c \
 	$(CTARGDIR)arcs.c \
-        $(CTARGDIR)ShapeSpanIterator.c
--- a/j2se/make/sun/dcpr/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/dcpr/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -36,6 +36,7 @@
 
 ifndef OPENJDK
 FILES_java = \
+ sun/dc/DuctusRenderingEngine.java \
  sun/dc/path/FastPathProducer.java \
  sun/dc/path/PathConsumer.java \
  sun/dc/path/PathError.java \
@@ -50,16 +51,12 @@
 FILES_export = \
 	sun/dc/pr/PathDasher.java \
 	sun/dc/pr/PathFiller.java \
-	sun/dc/pr/PathStroker.java \
-	java/awt/geom/PathIterator.java \
-	sun/java2d/pipe/ShapeSpanIterator.java
+	sun/dc/pr/PathStroker.java
 
 else
 
 copy-closed-src-classes:
-	$(MKDIR) -p $(CLASSDESTDIR)
-	$(ECHO) "Copying classes from $(CLOSED_JAR_FILE)"
-	($(CD) $(CLASSDESTDIR) ; $(JAR) xvf $(CLOSED_JAR_FILE) sun/dc)
+	$(call install-closed-classes,sun/dc)
 
 build:	copy-closed-src-classes
 
@@ -76,6 +73,18 @@
 include $(BUILDDIR)/common/Mapfile-vers.gmk
 include $(BUILDDIR)/common/Library.gmk
 
+SERVICEDIR = $(CLASSBINDIR)/META-INF/services
+
+FILES_copy = \
+	$(SERVICEDIR)/sun.java2d.pipe.RenderingEngine
+
+build: copy-files
+
+copy-files: $(FILES_copy)
+
+$(SERVICEDIR)/%: $(SHARE_SRC)/classes/sun/dc/META-INF/services/%
+	$(install-file)
+
 #
 # Add to the ambient vpath to pick up files in subdirectories
 #
--- a/j2se/make/sun/dcpr/mapfile-vers	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/dcpr/mapfile-vers	Fri Jun 22 00:46:43 2007 +0000
@@ -82,30 +82,12 @@
 		Java_sun_dc_pr_PathStroker_cClassFinalize;
 		Java_sun_dc_pr_PathStroker_cClassInitialize;
 		Java_sun_dc_pr_PathStroker_cInitialize;
+		Java_sun_dc_pr_PathStroker_cInitialize2D;
 
 		Java_sun_dc_pr_PathDasher_getCPathConsumer;
 		Java_sun_dc_pr_PathFiller_getCPathConsumer;
 		Java_sun_dc_pr_PathStroker_getCPathConsumer;
 
-                Java_sun_java2d_pipe_ShapeSpanIterator_addSegment;
-                Java_sun_java2d_pipe_ShapeSpanIterator_appendPoly;
-                Java_sun_java2d_pipe_ShapeSpanIterator_appendCubic;
-                Java_sun_java2d_pipe_ShapeSpanIterator_appendLine;
-                Java_sun_java2d_pipe_ShapeSpanIterator_appendQuadratic;
-                Java_sun_java2d_pipe_ShapeSpanIterator_beginSubpath;
-                Java_sun_java2d_pipe_ShapeSpanIterator_dispose;
-                Java_sun_java2d_pipe_ShapeSpanIterator_endPath;
-                Java_sun_java2d_pipe_ShapeSpanIterator_getCPathConsumer;
-                Java_sun_java2d_pipe_ShapeSpanIterator_getNativeIterator;
-                Java_sun_java2d_pipe_ShapeSpanIterator_getPathBox;
-                Java_sun_java2d_pipe_ShapeSpanIterator_initIDs;
-                Java_sun_java2d_pipe_ShapeSpanIterator_intersectClipBox;
-                Java_sun_java2d_pipe_ShapeSpanIterator_nextSpan;
-                Java_sun_java2d_pipe_ShapeSpanIterator_setNormalize;
-                Java_sun_java2d_pipe_ShapeSpanIterator_setOutputAreaXYXY;
-                Java_sun_java2d_pipe_ShapeSpanIterator_setRule;
-                Java_sun_java2d_pipe_ShapeSpanIterator_skipDownTo;
-
 	local:
 		*;
 };
--- a/j2se/make/sun/font/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/font/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.16 07/05/05
-#
 FILES_c_shared = \
         $(TARGDIR)jbidi.c \
         $(TARGDIR)ubidi.c \
--- a/j2se/make/sun/font/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/font/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.91 07/05/05
-#
 # Makefile for building all of font tools
 #
 
--- a/j2se/make/sun/font/t2k/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/font/t2k/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.5 07/05/05
-#
 FILES_c_shared = \
         $(TARGDIR)autogrid.c \
         $(TARGDIR)ghints.c \
--- a/j2se/make/sun/font/t2k/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/font/t2k/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.5 07/05/05
-#
 # Makefile for building t2k rasteriser.
 #
 
@@ -88,17 +86,11 @@
 
 ifdef OPENJDK
 ifeq ($(PLATFORM),windows)
-$(OBJDIR)/t2k.lib: $(CLOSED_LIB_DIR)/t2k.lib
-	$(ECHO) "Copying closed source import library " $(CLOSED_LIB_DIR)/t2k.lib into $(OBJDIR)
-	@$(install-file)
-
 # Need to copy the import file to link against.
 build: $(OBJDIR)/t2k.lib
 endif
 endif
 
-foo:
-	$(ECHO) "CLD= " $(CLOSED_LIB_DIR)
 #
 # Add to the ambient vpath to pick up files in subdirectories
 #
--- a/j2se/make/sun/hprof/Makefile	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-#
-# Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-#
-
-#
-# Makefile for building hprof support classes
-#
-
-BUILDDIR = ../..
-PACKAGE = sun.tools.hprof
-PRODUCT = sun
-include $(BUILDDIR)/common/Defs.gmk
-
-#
-# Files
-#
-AUTO_FILES_JAVA_DIRS = sun/tools/hprof
-
-#
-# Rules
-#
-include $(BUILDDIR)/common/Classes.gmk
--- a/j2se/make/sun/image/generic/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/image/generic/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.12 07/05/05
-#
 IMAGE_AFFINE_FILES = \
 	mlib_ImageAffine_NN.c \
 	mlib_ImageAffine_NN_Bit.c \
--- a/j2se/make/sun/image/vis/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/image/vis/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.13 07/05/05
-#
-
 REQUIRED_NATIVE_FILES = \
 	mlib_v_ImageLookUp.c \
 
--- a/j2se/make/sun/jar/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/jar/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,7 +34,7 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files.
+# Files
 #
 AUTO_FILES_JAVA_DIRS = sun/tools/jar
 
@@ -43,11 +43,10 @@
 #
 LOCALE_SET_DEFINITION = j2re
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = sun/tools/jar/resources/jar.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
 
 #
-# Rules.
+# Rules
 #
 JAVA_ARGS = "{ \"-J-ms8m\", \"sun.tools.jar.Main\" }"
 include $(BUILDDIR)/common/Program.gmk
+
--- a/j2se/make/sun/javac/apt/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javac/apt/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,22 +34,21 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files to compile.
+# Files
 #
 AUTO_FILES_JAVA_DIRS = com/sun/mirror com/sun/tools/apt 
 
 #
-# Resources (must be made before .recompile).
+# Resources
 #
 LOCALE_SET_DEFINITION = j2sdk
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
         com/sun/tools/apt/resources/apt.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
 
 #
-# Rules.
+# Rules
 #
 JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.apt.Main\" }"
+OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
 include $(BUILDDIR)/common/Program.gmk
-OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
+
--- a/j2se/make/sun/javac/bootck/Check.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javac/bootck/Check.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Check.gmk	1.83 07/05/05
-#
 # Makefile for building javac. Generic rules from *.gmk are not used
 # because of the special bootstrapping requirements.
 #
--- a/j2se/make/sun/javac/javac/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javac/javac/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,37 +34,38 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files to compile.
+# Files
 #
 include FILES_java.gmk
 
 #
-# Resources (must be made before .recompile).
+# Resources
 #
 LOCALE_SET_DEFINITION = j2sdk
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
         com/sun/tools/javac/resources/compiler.properties \
         com/sun/tools/javac/resources/javac.properties
 NEW_RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
-        com/sun/tools/javac/resources/legacy.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
+        com/sun/tools/javac/resources/legacy.properties \
+	com/sun/tools/javac/resources/version.properties
+
+#
+# Rules
+#
+FILES_java += com/sun/tools/javac/resources/version.java
 
-$(GENSRCDIR)/com/sun/tools/javac/resources/version.java: \
-		$(SHARE_SRC)/classes/com/sun/tools/javac/resources/version-template.java
+JAVA_ARGS = "{ \"-J-ms8m\", \"-J-Xss4m\", \"-J-ea:com.sun.tools...\", \"com.sun.tools.javac.Main\" }"
+# Use bootstrap compiler.
+JAVAC_CMD = $(JAVAC_BOOT_CMD) 
+OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
+
+include $(BUILDDIR)/common/Program.gmk
+
+$(GENSRCDIR)/com/sun/tools/javac/resources/version.properties: \
+    $(SHARE_SRC)/classes/com/sun/tools/javac/resources/version-template.properties
 	$(SED) 	-e 's/$$(JDK_VERSION)/$(JDK_VERSION)/'  \
 		-e 's/$$(FULL_VERSION)/$(FULL_VERSION)/' \
 		-e 's/$$(RELEASE)/$(RELEASE)/' \
 		< $< > $@
 
-FILES_java += com/sun/tools/javac/resources/version.java
 
-#
-# Rules.
-#
-JAVA_ARGS = "{ \"-J-ms8m\", \"-J-Xss4m\", \"-J-ea:com.sun.tools...\", \"com.sun.tools.javac.Main\" }"
-include $(BUILDDIR)/common/Program.gmk
-OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
-
-# Use bootstrap compiler.
-JAVAC_CMD = $(JAVAC_BOOT_CMD) 
--- a/j2se/make/sun/javac/javadoc/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javac/javadoc/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -44,12 +44,11 @@
 LOCALE_SET_DEFINITION = j2sdk
 RESOURCE_BUNDLES_COMPILED_PROPERTIES = \
 	com/sun/tools/javadoc/resources/javadoc.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-include $(BUILDDIR)/common/Resources.gmk
 
 #
 # Rules
 #
 JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.javadoc.Main\" }"
+OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
 include $(BUILDDIR)/common/Program.gmk
-OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
+
--- a/j2se/make/sun/javazic/tzdata/VERSION	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/VERSION	Fri Jun 22 00:46:43 2007 +0000
@@ -21,4 +21,4 @@
 # CA 95054 USA or visit www.sun.com if you need additional information or
 # have any questions.
 #
-tzdata2007c
+tzdata2007f
--- a/j2se/make/sun/javazic/tzdata/africa	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/africa	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)africa	8.7
+# @(#)africa	8.8
 # <pre>
 
 # This data is by no means authoritative; if you think you know better,
@@ -440,6 +440,20 @@
 # Namibia
 # The 1994-04-03 transition is from Shanks & Pottenger.
 # Shanks & Pottenger report no DST after 1998-04; go with IATA.
+
+# From Petronella Sibeene (2007-03-30) in
+# <http://allafrica.com/stories/200703300178.html>:
+# While the entire country changes its time, Katima Mulilo and other
+# settlements in Caprivi unofficially will not because the sun there
+# rises and sets earlier compared to other regions.  Chief of
+# Forecasting Riaan van Zyl explained that the far eastern parts of
+# the country are close to 40 minutes earlier in sunrise than the rest
+# of the country.
+# 
+# From Paul Eggert (2007-03-31):
+# Apparently the Caprivi Strip informally observes Botswana time, but
+# we have no details.  In the meantime people there can use Africa/Gaborone.
+
 # RULE	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Namibia	1994	max	-	Sep	Sun>=1	2:00	1:00	S
 Rule	Namibia	1995	max	-	Apr	Sun>=1	2:00	0	-
--- a/j2se/make/sun/javazic/tzdata/asia	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/asia	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)asia	8.8
+# @(#)asia	8.11
 # <pre>
 
 # This data is by no means authoritative; if you think you know better,
@@ -241,7 +241,7 @@
 # BTW, I did some research on-line and found some info regarding these five
 # historic timezones from some Taiwan websites.  And yes, there are official
 # Chinese names for these locales (before 1949).
-# 
+#
 # From Jesper Norgaard Welen (2006-07-14):
 # I have investigated the timezones around 1970 on the
 # http://www.astro.com/atlas site [with provinces and county
@@ -437,6 +437,8 @@
 
 # East Timor
 
+# See Indonesia for the 1945 transition.
+
 # From Joao Carrascalao, brother of the former governor of East Timor, in
 # <a href="http://etan.org/et99c/december/26-31/30ETMAY.htm">
 # East Timor may be late for its millennium
@@ -461,7 +463,7 @@
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Dili	8:22:20 -	LMT	1912
 			8:00	-	TLT	1942 Feb 21 23:00 # E Timor Time
-			9:00	-	JST	1945 Aug
+			9:00	-	JST	1945 Sep 23
 			9:00	-	TLT	1976 May  3
 			8:00	-	CIT	2000 Sep 17 00:00
 			9:00	-	TLT
@@ -487,6 +489,19 @@
 # time zone maps, I think that must refer to Western Borneo (Kalimantan Barat
 # and Kalimantan Tengah) switching from UTC+8 to UTC+7.
 #
+# From Paul Eggert (2007-03-10):
+# Here is another correction to Shanks & Pottenger.
+# JohnTWB writes that Japanese forces did not surrender control in
+# Indonesia until 1945-09-01 00:00 at the earliest (in Jakarta) and
+# other formal surrender ceremonies were September 9, 11, and 13, plus
+# September 12 for the regional surrender to Mountbatten in Singapore.
+# These would be the earliest possible times for a change.
+# Regimes horaires pour le monde entier, by Henri Le Corre, (Editions
+# Traditionnelles, 1987, Paris) says that Java and Madura switched
+# from JST to UTC+07:30 on 1945-09-23, and gives 1944-09-01 for Jayapura
+# (Hollandia).  For now, assume all Indonesian locations other than Jayapura
+# switched on 1945-09-23.
+#
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Asia/Jakarta	7:07:12 -	LMT	1867 Aug 10
 # Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
@@ -494,7 +509,7 @@
 			7:07:12	-	JMT	1923 Dec 31 23:47:12 # Jakarta
 			7:20	-	JAVT	1932 Nov	 # Java Time
 			7:30	-	WIT	1942 Mar 23
-			9:00	-	JST	1945 Aug
+			9:00	-	JST	1945 Sep 23
 			7:30	-	WIT	1948 May
 			8:00	-	WIT	1950 May
 			7:30	-	WIT	1964
@@ -502,7 +517,7 @@
 Zone Asia/Pontianak	7:17:20	-	LMT	1908 May
 			7:17:20	-	PMT	1932 Nov    # Pontianak MT
 			7:30	-	WIT	1942 Jan 29
-			9:00	-	JST	1945 Aug
+			9:00	-	JST	1945 Sep 23
 			7:30	-	WIT	1948 May
 			8:00	-	WIT	1950 May
 			7:30	-	WIT	1964
@@ -511,10 +526,10 @@
 Zone Asia/Makassar	7:57:36 -	LMT	1920
 			7:57:36	-	MMT	1932 Nov    # Macassar MT
 			8:00	-	CIT	1942 Feb  9
-			9:00	-	JST	1945 Aug
+			9:00	-	JST	1945 Sep 23
 			8:00	-	CIT
 Zone Asia/Jayapura	9:22:48 -	LMT	1932 Nov
-			9:00	-	EIT	1944
+			9:00	-	EIT	1944 Sep  1
 			9:30	-	CST	1964
 			9:00	-	EIT
 
@@ -638,7 +653,7 @@
 Rule	Iraq	1986	1990	-	Mar	lastSun	1:00s	1:00	D
 # IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo.
 # Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
-# 
+#
 Rule	Iraq	1991	max	-	Apr	 1	3:00s	1:00	D
 Rule	Iraq	1991	max	-	Oct	 1	3:00s	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1170,6 +1185,14 @@
 
 # Kuwait
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+# From the Arab Times (2007-03-14):
+# The Civil Service Commission (CSC) has approved a proposal forwarded
+# by MP Ahmad Baqer on implementing the daylight saving time (DST) in
+# Kuwait starting from April until the end of Sept this year, reports Al-Anba.
+# <http://www.arabtimesonline.com/arabtimes/kuwait/Viewdet.asp?ID=9950>.
+# From Paul Eggert (2007-03-29):
+# We don't know the details, or whether the approval means it'll happen,
+# so for now we assume no DST.
 Zone	Asia/Kuwait	3:11:56 -	LMT	1950
 			3:00	-	AST
 
@@ -1317,6 +1340,11 @@
 # parliament passed during the tumultuous winter session."
 # For now, let's ignore this information, until we have more confirmation.
 
+# From Ganbold Ts. (2007-02-26):
+# Parliament of Mongolia has just changed the daylight-saving rule in February.
+# They decided not to adopt daylight-saving time....
+# http://www.mongolnews.mn/index.php?module=unuudur&sec=view&id=15742
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Mongol	1983	1984	-	Apr	1	0:00	1:00	S
 Rule	Mongol	1983	only	-	Oct	1	0:00	0	-
@@ -1335,8 +1363,8 @@
 Rule	Mongol	1984	1998	-	Sep	lastSun	0:00	0	-
 # IATA SSIM (1999-09) says Mongolia no longer observes DST.
 Rule	Mongol	2001	only	-	Apr	lastSat	2:00	1:00	S
-Rule	Mongol	2001	max	-	Sep	lastSat	2:00	0	-
-Rule	Mongol	2002	max	-	Mar	lastSat	2:00	1:00	S
+Rule	Mongol	2001	2006	-	Sep	lastSat	2:00	0	-
+Rule	Mongol	2002	2006	-	Mar	lastSat	2:00	1:00	S
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 # Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
@@ -1714,11 +1742,17 @@
 Rule	Syria	1994	1996	-	Apr	 1	0:00	1:00	S
 Rule	Syria	1994	2005	-	Oct	 1	0:00	0	-
 Rule	Syria	1997	1998	-	Mar	lastMon	0:00	1:00	S
-Rule	Syria	1999	max	-	Apr	 1	0:00	1:00	S
+Rule	Syria	1999	2006	-	Apr	 1	0:00	1:00	S
 # From Stephen Colebourne (2006-09-18):
 # According to IATA data, Syria will change DST on 21st September [21:00 UTC]
 # this year [only]....  This is probably related to Ramadan, like Egypt.
 Rule	Syria	2006	only	-	Sep	22	0:00	0	-
+# From Paul Eggert (2007-03-29):
+# Today the AP reported "Syria will switch to summertime at midnight Thursday."
+# http://www.iht.com/articles/ap/2007/03/29/africa/ME-GEN-Syria-Time-Change.php
+# For lack of better info, assume the rule changed to "last Friday in March"
+# this year.
+Rule	Syria	2007	max	-	Mar	lastFri	0:00	1:00	S
 Rule	Syria	2007	max	-	Oct	 1	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Damascus	2:25:12 -	LMT	1920	# Dimashq
--- a/j2se/make/sun/javazic/tzdata/australasia	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/australasia	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)australasia	8.5
+# @(#)australasia	8.7
 # <pre>
 
 # This file also includes Pacific islands.
@@ -372,10 +372,14 @@
 Rule	Chatham	1976	1989	-	Mar	Sun>=1	2:45s	0	S
 Rule	NZ	1989	only	-	Oct	Sun>=8	2:00s	1:00	D
 Rule	Chatham	1989	only	-	Oct	Sun>=8	2:45s	1:00	D
-Rule	NZ	1990	max	-	Oct	Sun>=1	2:00s	1:00	D
-Rule	Chatham	1990	max	-	Oct	Sun>=1	2:45s	1:00	D
-Rule	NZ	1990	max	-	Mar	Sun>=15	2:00s	0	S
-Rule	Chatham	1990	max	-	Mar	Sun>=15	2:45s	0	S
+Rule	NZ	1990	2006	-	Oct	Sun>=1	2:00s	1:00	D
+Rule	Chatham	1990	2006	-	Oct	Sun>=1	2:45s	1:00	D
+Rule	NZ	1990	2007	-	Mar	Sun>=15	2:00s	0	S
+Rule	Chatham	1990	2007	-	Mar	Sun>=15	2:45s	0	S
+Rule	NZ	2007	max	-	Sep	lastSun	2:00s	1:00	D
+Rule	Chatham	2007	max	-	Sep	lastSun	2:45s	1:00	D
+Rule	NZ	2008	max	-	Apr	Sun>=1	2:00s	0	S
+Rule	Chatham	2008	max	-	Apr	Sun>=1	2:45s	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Pacific/Auckland	11:39:04 -	LMT	1868 Nov  2
 			11:30	NZ	NZ%sT	1946 Jan  1
@@ -842,7 +846,7 @@
 
 # From Christopher Hunt (2006-11-21), after an advance warning
 # from Jesper Norgaard Welen (2006-11-01):
-# WA are trialing DST for three years. 
+# WA are trialing DST for three years.
 # <http://www.parliament.wa.gov.au/parliament/bills.nsf/9A1B183144403DA54825721200088DF1/$File/Bill175-1B.pdf>
 
 # From Rives McDow (2002-04-09):
@@ -874,7 +878,7 @@
 # question arose whether this part of the state would follow suit. I
 # just called the border village and confirmed that indeed they have,
 # meaning that they are now observing UTC+09:45.
-# 
+#
 # (2006-12-09):
 # I personally doubt that either experimentation with daylight saving
 # in WA or its introduction in SA had anything to do with the genesis
@@ -1170,6 +1174,12 @@
 # transitions at 2:45 local standard time; this confirms that Chatham
 # is always exactly 45 minutes ahead of Auckland.
 
+# From Colin Sharples (2007-04-30):
+# DST will now start on the last Sunday in September, and end on the
+# first Sunday in April.  The changes take effect this year, meaning
+# that DST will begin on 2007-09-30 2008-04-06.
+# http://www.dia.govt.nz/diawebsite.nsf/wpg_URL/Services-Daylight-Saving-Daylight-saving-to-be-extended
+
 ###############################################################################
 
 
--- a/j2se/make/sun/javazic/tzdata/europe	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/europe	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)europe	8.8
+# @(#)europe	8.10
 # <pre>
 
 # This data is by no means authoritative; if you think you know better,
@@ -283,32 +283,32 @@
 #   -- James Joyce, Ulysses
 
 # From Joseph S. Myers (2005-01-26):
-# Irish laws are available online at www.irishstatutebook.ie.  These include 
+# Irish laws are available online at www.irishstatutebook.ie.  These include
 # various relating to legal time, for example:
-# 
+#
 # ZZA13Y1923.html ZZA12Y1924.html ZZA8Y1925.html ZZSIV20PG1267.html
-# 
+#
 # ZZSI71Y1947.html ZZSI128Y1948.html ZZSI23Y1949.html ZZSI41Y1950.html
 # ZZSI27Y1951.html ZZSI73Y1952.html
-# 
+#
 # ZZSI11Y1961.html ZZSI232Y1961.html ZZSI182Y1962.html
 # ZZSI167Y1963.html ZZSI257Y1964.html ZZSI198Y1967.html
 # ZZA23Y1968.html ZZA17Y1971.html
-# 
+#
 # ZZSI67Y1981.html ZZSI212Y1982.html ZZSI45Y1986.html
 # ZZSI264Y1988.html ZZSI52Y1990.html ZZSI371Y1992.html
 # ZZSI395Y1994.html ZZSI484Y1997.html ZZSI506Y2001.html
 #
 # [These are all relative to the root, e.g., the first is
 # <http://www.irishstatutebook.ie/ZZA13Y1923.html>.]
-# 
-# (These are those I found, but there could be more.  In any case these 
-# should allow various updates to the comments in the europe file to cover 
+#
+# (These are those I found, but there could be more.  In any case these
+# should allow various updates to the comments in the europe file to cover
 # the laws applicable in Ireland.)
-# 
-# (Note that the time in the Republic of Ireland since 1968 has been defined 
-# in terms of standard time being GMT+1 with a period of winter time when it 
-# is GMT, rather than standard time being GMT with a period of summer time 
+#
+# (Note that the time in the Republic of Ireland since 1968 has been defined
+# in terms of standard time being GMT+1 with a period of winter time when it
+# is GMT, rather than standard time being GMT with a period of summer time
 # being GMT+1.)
 
 # From Paul Eggert (1999-03-28):
@@ -2320,6 +2320,16 @@
 # From Paul Eggert (2007-01-03):
 # Prefer the above source to Shanks & Pottenger for time stamps after 1990.
 
+# From Steffen Thorsen (2007-03-09):
+# Starting 2007 though, it seems that they are adopting EU's 1:00 UTC
+# start/end time, according to the following page (2007-03-07):
+# http://www.ntvmsnbc.com/news/402029.asp
+# The official document is located here - it is in Turkish...:
+# http://rega.basbakanlik.gov.tr/eskiler/2007/03/20070307-7.htm
+# I was able to locate the following seemingly official document
+# (on a non-government server though) describing dates between 2002 and 2006:
+# http://www.alomaliye.com/bkk_2002_3769.htm
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Turkey	1916	only	-	May	 1	0:00	1:00	S
 Rule	Turkey	1916	only	-	Oct	 1	0:00	0	-
@@ -2376,15 +2386,16 @@
 Rule	Turkey	1985	only	-	Sep	28	0:00	0	-
 Rule	Turkey	1986	1990	-	Mar	lastSun	2:00s	1:00	S
 Rule	Turkey	1986	1990	-	Sep	lastSun	2:00s	0	-
-Rule	Turkey	1991	max	-	Mar	lastSun	1:00s	1:00	S
+Rule	Turkey	1991	2006	-	Mar	lastSun	1:00s	1:00	S
 Rule	Turkey	1991	1995	-	Sep	lastSun	1:00s	0	-
-Rule	Turkey	1996	max	-	Oct	lastSun	1:00s	0	-
+Rule	Turkey	1996	2006	-	Oct	lastSun	1:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Istanbul	1:55:52 -	LMT	1880
 			1:56:56	-	IMT	1910 Oct # Istanbul Mean Time?
 			2:00	Turkey	EE%sT	1978 Oct 15
 			3:00	Turkey	TR%sT	1985 Apr 20 # Turkey Time
-			2:00	Turkey	EE%sT
+			2:00	Turkey	EE%sT	2007
+			2:00	EU	EE%sT
 Link	Europe/Istanbul	Asia/Istanbul	# Istanbul is in both continents.
 
 # Ukraine
--- a/j2se/make/sun/javazic/tzdata/leapseconds	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/leapseconds	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)leapseconds	8.2
+# @(#)leapseconds	8.3
 
 # Allowance for leapseconds added to each timezone file.
 
@@ -73,24 +73,24 @@
 # Sent: Thursday, February 01, 2007 9:49 AM
 # ...
 # Subject: Bulletin C number 33
-# 
+#
 # 	INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
-# 
+#
 # SERVICE INTERNATIONAL DE LA ROTATION TERRESTRE ET DES SYSTEMES DE REFERENCE
-# 
+#
 # SERVICE DE LA ROTATION TERRESTRE
 # OBSERVATOIRE DE PARIS
 # 61, Av. de l'Observatoire 75014 PARIS (France)
 # ...
-# 
+#
 #                                                Paris, 1 February 2007
 #                                                Bulletin C 33
 #                                                To authorities responsible
 #                                                for the measurement and
 #                                                distribution of time
-# 
+#
 #                           INFORMATION ON UTC - TAI
-# 
+#
 # NO positive leap second will be introduced at the end of June 2007.
 # The difference between Coordinated Universal Time UTC and the
 # International Atomic Time TAI is:
@@ -99,7 +99,7 @@
 # December  or June,  depending on the evolution of UT1-TAI. Bulletin C is
 # mailed every  six months, either to announce a time step in UTC, or to
 # confirm that there  will be no time step at the next possible date.
-# 
+#
 # 				Daniel GAMBIS
 # 				Director
 # 				Earth Orientation Center of IERS
--- a/j2se/make/sun/javazic/tzdata/northamerica	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/northamerica	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)northamerica	8.12
+# @(#)northamerica	8.17
 # <pre>
 
 # also includes Central America and the Caribbean
@@ -331,6 +331,11 @@
 # "bar time" in the state corresponds to 02:00, a number of citations
 # are issued for the "sale of class 'B' alcohol after prohibited
 # hours" within the deviated hour of this change every year....
+#
+# From Douglas R. Bomberg (2007-03-12):
+# Wisconsin has enacted (nearly eleventh-hour) legislation to get WI
+# Statue 175 closer in synch with the US Congress' intent....
+# http://www.legis.state.wi.us/2007/data/acts/07Act3.pdf
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule	Chicago	1920	only	-	Jun	13	2:00	1:00	D
@@ -940,7 +945,8 @@
 # Unless otherwise specified, the data for Canada are all from Shanks
 # & Pottenger.
 
-# From Chris Walton (2006-04-01, 2006-04-25, 2006-06-26, 2007-01-31):
+# From Chris Walton (2006-04-01, 2006-04-25, 2006-06-26, 2007-01-31,
+# 2007-03-01):
 # The British Columbia government announced yesterday that it will
 # adjust daylight savings next year to align with changes in the
 # U.S. and the rest of Canada....
@@ -979,14 +985,9 @@
 # JavaScript.
 # http://www.exec.gov.nt.ca/currentnews/currentPR.asp?mode=archive
 # ...
-# No formal announcement has been made from the Nunavut Government.
-# The premier of Nunavut claimed in August of 2005 that he did not
-# want to touch the issue; nothing more has been heard since.  It is
-# likely Nunavut will eventually follow the rest of the country but
-# there will certainly be confusion on March 11/2007 if no formal
-# announcement is made.  Currently the TZ database and Microsoft make
-# assumptions that Nunavut will follow the rest of the country.
-
+# Nunavut
+# An amendment to the Interpretation Act was registered on February 19/2007....
+# http://action.attavik.ca/home/justice-gn/attach/2007/gaz02part2.pdf
 
 # From Paul Eggert (2006-04-25):
 # H. David Matthews and Mary Vincent's map
@@ -1729,6 +1730,24 @@
 # For lack of better information, assume that Southampton Island observed
 # daylight saving only during wartime.
 
+# From Chris Walton (2007-03-01):
+# ... the community of Resolute (located on Cornwallis Island in
+# Nunavut) moved from Central Time to Eastern Time last November.
+# Basically the community did not change its clocks at the end of
+# daylight saving....
+# http://www.nnsl.com/frames/newspapers/2006-11/nov13_06none.html
+
+# From Chris Walton (2007-03-14):
+# Today I phoned the "hamlet office" to find out what Resolute was doing with
+# its clocks.
+#
+# The individual that answered the phone confirmed that the clocks did not
+# move at the end of daylight saving on October 29/2006.  He also told me that
+# the clocks did not move this past weekend (March 11/2007)....
+#
+# America/Resolute should use the "Canada" Rule up to October 29/2006.
+# After that it should be fixed on Eastern Standard Time until further notice.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	NT_YK	1918	only	-	Apr	14	2:00	1:00	D
 Rule	NT_YK	1918	only	-	Oct	27	2:00	0	S
@@ -1743,33 +1762,39 @@
 Rule	NT_YK	1980	2006	-	Oct	lastSun	2:00	0	S
 Rule	NT_YK	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Pangnirtung -4:22:56 -	LMT	1884
+# aka Panniqtuuq
+Zone America/Pangnirtung 0	-	zzz	1921 # trading post est.
 			-4:00	NT_YK	A%sT	1995 Apr Sun>=1 2:00
 			-5:00	Canada	E%sT	1999 Oct 31 2:00
 			-6:00	Canada	C%sT	2000 Oct 29 2:00
 			-5:00	Canada	E%sT
-Zone America/Iqaluit	-4:33:52 -	LMT	1884 # Frobisher Bay before 1987
+# formerly Frobisher Bay
+Zone America/Iqaluit	0	-	zzz	1942 Aug # Frobisher Bay est.
 			-5:00	NT_YK	E%sT	1999 Oct 31 2:00
 			-6:00	Canada	C%sT	2000 Oct 29 2:00
 			-5:00	Canada	E%sT
-# Now subsumed by America/Atikokan.
-#Zone America/Coral_Harbour -5:32:40 -	LMT	1884
-#			-5:00	NT_YK	E%sT	1946
-#			-5:00	-	EST
-Zone America/Rankin_Inlet -6:08:20 -	LMT	1884
+# aka Qausuittuq
+Zone America/Resolute	0	-	zzz	1947 Aug 31 # Resolute founded
+			-6:00	NT_YK	C%sT	2000 Oct 29 2:00
+			-5:00	-	EST	2001 Apr  1 3:00
+			-6:00	Canada	C%sT	2006 Oct 29 2:00
+			-5:00	-	EST
+# aka Kangiqiniq
+Zone America/Rankin_Inlet 0	-	zzz	1957 # Rankin Inlet founded
 			-6:00	NT_YK	C%sT	2000 Oct 29 2:00
 			-5:00	-	EST	2001 Apr  1 3:00
 			-6:00	Canada	C%sT
-Zone America/Cambridge_Bay -7:00:20 -	LMT	1884
+# aka Iqaluktuuttiaq
+Zone America/Cambridge_Bay 0	-	zzz	1920 # trading post est.?
 			-7:00	NT_YK	M%sT	1999 Oct 31 2:00
 			-6:00	Canada	C%sT	2000 Oct 29 2:00
 			-5:00	-	EST	2000 Nov  5 0:00
 			-6:00	-	CST	2001 Apr  1 3:00
 			-7:00	Canada	M%sT
-Zone America/Yellowknife -7:37:24 -	LMT	1884
+Zone America/Yellowknife 0	-	zzz	1935 # Yellowknife founded?
 			-7:00	NT_YK	M%sT	1980
 			-7:00	Canada	M%sT
-Zone America/Inuvik	-8:54:52 -	LMT	1884
+Zone America/Inuvik	0	-	zzz	1953 # Inuvik founded
 			-8:00	NT_YK	P%sT	1979 Apr lastSun 2:00
 			-7:00	NT_YK	M%sT	1980
 			-7:00	Canada	M%sT
@@ -2048,7 +2073,7 @@
 # Bahamas
 #
 # From Sue Williams (2006-12-07):
-# The Bahamas announced about a month ago that they plan to change their DST 
+# The Bahamas announced about a month ago that they plan to change their DST
 # rules to sync with the U.S. starting in 2007....
 # http://www.jonesbahamas.com/?c=45&a=10412
 
@@ -2159,6 +2184,12 @@
 # watches should be set back one hour -- going back to 00:00 hours -- returning
 # to the normal schedule....
 
+# From Paul Eggert (2007-03-02):
+# http://www.granma.cubaweb.cu/english/news/art89.html, dated yesterday,
+# says Cuban clocks will advance at midnight on March 10.
+# For lack of better information, assume Cuba will use US rules,
+# except that it switches at midnight standard time as usual.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cuba	1928	only	-	Jun	10	0:00	1:00	D
 Rule	Cuba	1928	only	-	Oct	10	0:00	0	S
@@ -2188,8 +2219,10 @@
 Rule	Cuba	1997	only	-	Oct	12	0:00s	0	S
 Rule	Cuba	1998	1999	-	Mar	lastSun	0:00s	1:00	D
 Rule	Cuba	1998	2003	-	Oct	lastSun	0:00s	0	S
-Rule	Cuba	2000	max	-	Apr	Sun>=1	0:00s	1:00	D
-Rule	Cuba	2006	max	-	Oct	lastSun	0:00s	0	S
+Rule	Cuba	2000	2006	-	Apr	Sun>=1	0:00s	1:00	D
+Rule	Cuba	2006	only	-	Oct	lastSun	0:00s	0	S
+Rule	Cuba	2007	max	-	Mar	Sun>=8	0:00s	1:00	D
+Rule	Cuba	2007	max	-	Nov	Sun>=1	0:00s	0	S
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Havana	-5:29:28 -	LMT	1890
@@ -2316,6 +2349,9 @@
 #
 # The reason seems to be an energy crisis.
 
+# From Stephen Colebourne (2007-02-22):
+# Some IATA info: Haiti won't be having DST in 2007.
+
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Haiti	1983	only	-	May	8	0:00	1:00	D
@@ -2325,8 +2361,8 @@
 # Go with IATA.
 Rule	Haiti	1988	1997	-	Apr	Sun>=1	1:00s	1:00	D
 Rule	Haiti	1988	1997	-	Oct	lastSun	1:00s	0	S
-Rule	Haiti	2005	max	-	Apr	Sun>=1	0:00	1:00	D
-Rule	Haiti	2005	max	-	Oct	lastSun	0:00	0	S
+Rule	Haiti	2005	2006	-	Apr	Sun>=1	0:00	1:00	D
+Rule	Haiti	2005	2006	-	Oct	lastSun	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Port-au-Prince -4:49:20 -	LMT	1890
 			-4:49	-	PPMT	1917 Jan 24 12:00 # P-a-P MT
@@ -2357,11 +2393,15 @@
 # published, I have located this authoritative source:
 # http://www.presidencia.gob.hn/noticia.aspx?nId=47
 
+# From Steffen Thorsen (2007-03-30):
+# http://www.laprensahn.com/pais_nota.php?id04962=7386
+# So it seems that Honduras will not enter DST this year....
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Hond	1987	1988	-	May	Sun>=1	0:00	1:00	D
 Rule	Hond	1987	1988	-	Sep	lastSun	0:00	0	S
-Rule	Hond	2006	2009	-	May	Sun>=1	0:00	1:00	D
-Rule	Hond	2006	2009	-	Aug	Mon>=1	0:00	0	S
+Rule	Hond	2006	only	-	May	Sun>=1	0:00	1:00	D
+Rule	Hond	2006	only	-	Aug	Mon>=1	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Tegucigalpa -5:48:52 -	LMT	1921 Apr
 			-6:00	Hond	C%sT
@@ -2505,13 +2545,31 @@
 			-4:00	-	AST
 
 # Turks and Caicos
-# From Paul Eggert (2006-03-22):
+#
+# From Chris Dunn in
+# <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=415007>
+# (2007-03-15): In the Turks & Caicos Islands (America/Grand_Turk) the
+# daylight saving dates for time changes have been adjusted to match
+# the recent U.S. change of dates.
+#
+# From Brian Inglis (2007-04-28):
+# http://www.turksandcaicos.tc/calendar/index.htm [2007-04-26]
+# there is an entry for Nov 4 "Daylight Savings Time Ends 2007" and three
+# rows before that there is an out of date entry for Oct:
+# "Eastern Standard Times Begins 2007
+# Clocks are set back one hour at 2:00 a.m. local Daylight Saving Time"
+# indicating that the normal ET rules are followed.
+#
+# From Paul Eggert (2006-05-01):
 # Shanks & Pottenger say they use US DST rules, but IATA SSIM (1991/1998)
-# says they switch at midnight.  Go with IATA SSIM.
+# says they switch at midnight.  Go with Shanks & Pottenger.
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	TC	1979	1986	-	Apr	lastSun	0:00	1:00	D
-Rule	TC	1979	max	-	Oct	lastSun	0:00	0	S
-Rule	TC	1987	max	-	Apr	Sun>=1	0:00	1:00	D
+Rule	TC	1979	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	TC	1979	2006	-	Oct	lastSun	2:00	0	S
+Rule	TC	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	TC	2007	max	-	Mar	Sun>=8	2:00	1:00	D
+Rule	TC	2007	max	-	Nov	Sun>=1	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Grand_Turk	-4:44:32 -	LMT	1890
 			-5:07:12 -	KMT	1912 Feb    # Kingston Mean Time
--- a/j2se/make/sun/javazic/tzdata/southamerica	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/southamerica	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)southamerica	8.9
+# @(#)southamerica	8.11
 # <pre>
 
 # This data is by no means authoritative; if you think you know better,
@@ -810,26 +810,33 @@
 
 # Curacao
 #
-# From Paul Eggert (2006-03-22): 
+# From Paul Eggert (2006-03-22):
 # Shanks & Pottenger say that The Bottom and Philipsburg have been at
 # -4:00 since standard time was introduced on 1912-03-02; and that
 # Kralendijk and Rincon used Kralendijk Mean Time (-4:33:08) from
 # 1912-02-02 to 1965-01-01.  The former is dubious, since S&P also say
 # Saba Island has been like Curacao.
-# This all predates our 1970 cutoff, though.  
+# This all predates our 1970 cutoff, though.
 #
 # By July 2007 Curacao and St Maarten are planned to become
 # associated states within the Netherlands, much like Aruba;
 # Bonaire, Saba and St Eustatius would become directly part of the
 # Netherlands as Kingdom Islands.  This won't affect their time zones
 # though, as far as we know.
-# 
+#
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Curacao	-4:35:44 -	LMT	1912 Feb 12	# Willemstad
 			-4:30	-	ANT	1965 # Netherlands Antilles Time
 			-4:00	-	AST
 
 # Ecuador
+#
+# From Paul Eggert (2007-03-04):
+# Apparently Ecuador had a failed experiment with DST in 1992.
+# <http://midena.gov.ec/content/view/1261/208/> (2007-02-27) and
+# <http://www.hoy.com.ec/NoticiaNue.asp?row_id=249856> (2006-11-06) both
+# talk about "hora Sixto".  Leave this alone for now, as we have no data.
+#
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Guayaquil	-5:19:20 -	LMT	1890
 			-5:14:00 -	QMT	1931 # Quito Mean Time
--- a/j2se/make/sun/javazic/tzdata/zone.tab	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/javazic/tzdata/zone.tab	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 # have any questions.
 #
 
-# @(#)zone.tab	8.9
+# @(#)zone.tab	8.10
 #
 # TZ zone descriptions
 #
@@ -134,8 +134,9 @@
 CA	+4339-07923	America/Toronto	Eastern Time - Ontario - most locations
 CA	+4901-08816	America/Nipigon	Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
 CA	+4823-08915	America/Thunder_Bay	Eastern Time - Thunder Bay, Ontario
+CA	+6344-06828	America/Iqaluit	Eastern Time - east Nunavut - most locations
 CA	+6608-06544	America/Pangnirtung	Eastern Time - Pangnirtung, Nunavut
-CA	+6344-06828	America/Iqaluit	Eastern Time - east Nunavut
+CA	+744144-0944945	America/Resolute	Eastern Time - Resolute, Nunavut
 CA	+484531-0913718	America/Atikokan	Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut
 CA	+624900-0920459	America/Rankin_Inlet	Central Time - central Nunavut
 CA	+4953-09709	America/Winnipeg	Central Time - Manitoba & west Ontario
--- a/j2se/make/sun/jawt/Depend.mak	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/jawt/Depend.mak	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,3 @@
-#
-# @(#)Depend.mak	1.6 05/03/31
 #
 # This makefile must be executed on a system with makedepend, such as Solaris.
 # In my copious amount of spare time, I hope to write a Java-based makedepend
--- a/j2se/make/sun/jawt/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/jawt/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)Makefile	1.51 07/05/05
-#
-
 BUILDDIR = ../..
 PACKAGE = sun.awt
 LIBRARY = jawt
--- a/j2se/make/sun/jconsole/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/jconsole/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -52,7 +52,7 @@
 endif
 
 #
-# Files to compile.
+# Files
 #
 include FILES.gmk
 
@@ -65,17 +65,16 @@
 build: $(GENSRCDIR)/sun/tools/jconsole/Version.java
 
 #
+# Resources
+#
+LOCALE_SET_DEFINITION = j2sdk
+RESOURCE_BUNDLES_JAVA = $(PKGDIR)/resources/JConsoleResources.java
+
+#
 # Rules.
 #
 include $(BUILDDIR)/common/Program.gmk
 
-#
-# Resources
-#
-LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_JAVA = $(TARGDIR)$(PKGDIR)/resources/JConsoleResources.java
-include $(BUILDDIR)/common/Resources.gmk
-
 build: $(FILES_png) $(FILES_gif) $(TEMPDIR)/manifest $(JARFILE)
 
 $(GENSRCDIR)/sun/tools/jconsole/Version.java: \
--- a/j2se/make/sun/jpeg/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/jpeg/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	1.13 07/05/05
-#
 FILES_c = \
 	$(CTARGDIR)imageioJPEG.c \
 	$(CTARGDIR)jpegdecoder.c \
--- a/j2se/make/sun/jpeg/mapfile-vers-closed	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/jpeg/mapfile-vers-closed	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,3 @@
-#
-#ident	"@(#)mapfile-vers-closed	1.4	07/05/05 SMI"
 #
 # Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
--- a/j2se/make/sun/launcher/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/launcher/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -33,19 +33,14 @@
 #
 AUTO_FILES_JAVA_DIRS = sun/launcher
 
-LOCALE_SUFFIXES = $(J2RE_LOCALES)
-
-LOCALE_SET_DEFINITION = j2re
-NEW_RESOURCE_BUNDLES_PROPERTIES = launcher.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/$(PKGDIR)/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/$(PKGDIR)/resources
-
 #
 # Resources
 #
-include $(BUILDDIR)/common/Resources.gmk
+LOCALE_SET_DEFINITION = j2re
+NEW_RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/launcher.properties
 
 #
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
+
--- a/j2se/make/sun/misc/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/misc/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -29,21 +29,18 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Java source files
+# Files
 #
 AUTO_FILES_JAVA_DIRS = sun/misc
 
-RESOURCE_BUNDLES_JAVA= \
-	$(TARGDIR)sun/misc/resources/Messages.java
-
-LOCALE_SUFFIXES = $(J2RE_LOCALES)
-
 #
 # Resources
 #
-include $(BUILDDIR)/common/Resources.gmk
+LOCALE_SET_DEFINITION = j2re
+RESOURCE_BUNDLES_JAVA= sun/misc/resources/Messages.java
 
 #
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
+
--- a/j2se/make/sun/native2ascii/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/native2ascii/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,7 +34,7 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files.
+# Files
 #
 FILES_java = \
 	sun/tools/native2ascii/Main.java \
@@ -44,12 +44,12 @@
 #
 # Resources
 #
-RESOURCE_BUNDLES_JAVA = $(TARGDIR)sun/tools/native2ascii/resources/MsgNative2ascii.java
 LOCALE_SET_DEFINITION = j2sdk
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_JAVA = sun/tools/native2ascii/resources/MsgNative2ascii.java
 
 #
-# Rules.
+# Rules
 #
 JAVA_ARGS = "{ \"-J-ms8m\", \"sun.tools.native2ascii.Main\" }"
 include $(BUILDDIR)/common/Program.gmk
+
--- a/j2se/make/sun/net/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/net/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.56 07/05/05
-#
 FILES_java = \
 	$(TARGDIR)sun/net/InetAddressCachePolicy.java \
 	$(TARGDIR)sun/net/URLCanonicalizer.java \
--- a/j2se/make/sun/nio/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/nio/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)FILES_java.gmk	1.8 07/05/05
-#
 # Character converters for lib/charsets.jar
 #
 # Core character converters are built from make/java/java.
--- a/j2se/make/sun/nio/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/nio/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.68 07/05/05
-#
 # Makefile for character converters.
 #
 
--- a/j2se/make/sun/rmi/cgi/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/cgi/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.21 07/05/05
 #
 # Makefile for building rmiregistry program
 #
--- a/j2se/make/sun/rmi/corbalogcompile/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/corbalogcompile/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.6 07/05/05
-                                                                                
 BUILDDIR = ../../..
 PACKAGE = com.sun.corba.se.impl.logging
 PRODUCT = sun
--- a/j2se/make/sun/rmi/oldtools/FILES_java.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/oldtools/FILES_java.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_java.gmk	1.21 07/05/05
-#
 FILES_java = \
 	$(TARGDIR)sun/tools/java/RuntimeConstants.java \
 	$(TARGDIR)sun/tools/javac/Main.java \
--- a/j2se/make/sun/rmi/oldtools/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/oldtools/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -38,17 +38,20 @@
 include FILES_java.gmk
 
 #
-# Resources.
+# Resources
 #
 LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_PROPERTIES = javac.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/sun/tools/javac/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/sun/tools/javac/resources
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_PROPERTIES = sun/tools/javac/resources/javac.properties
 
-all:	$(PFILES)
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
 
 clean clobber::
-	$(RM) -r $(CLASSBINDIR)/sun/tools/asm $(CLASSBINDIR)/sun/tools/java \
-		 $(CLASSBINDIR)/sun/tools/javac $(CLASSBINDIR)/sun/tools/tree \
-		 $(CLASSBINDIR)/sun/tools/util
+	$(RM) -r $(CLASSBINDIR)/sun/tools/asm
+	$(RM) -r $(CLASSBINDIR)/sun/tools/java
+	$(RM) -r $(CLASSBINDIR)/sun/tools/javac
+	$(RM) -r $(CLASSBINDIR)/sun/tools/tree
+	$(RM) -r $(CLASSBINDIR)/sun/tools/util
+
--- a/j2se/make/sun/rmi/registry/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/registry/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,22 +34,19 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files to compile.
+# Files
 #
 AUTO_FILES_JAVA_DIRS = sun/rmi/registry
 
 #
-# Rules.
+# Resources
+#
+LOCALE_SET_DEFINITION = j2re
+RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/rmiregistry.properties
+
+#
+# Rules
 #
 JAVA_ARGS = "{ \"-J-ms8m\", \"sun.rmi.registry.RegistryImpl\" }"
 include $(BUILDDIR)/common/Program.gmk
 
-#
-# Resources.
-#
-LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_PROPERTIES = rmiregistry.properties
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes/sun/rmi/registry/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/sun/rmi/registry/resources
-include $(BUILDDIR)/common/Resources.gmk
-
--- a/j2se/make/sun/rmi/rmi/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/rmi/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.39 07/05/05
-#
 # Makefile for building sun.rmi.*
 #
 
--- a/j2se/make/sun/rmi/rmic/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/rmic/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,9 +34,8 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files to compile.
+# Files
 #
-
 include FILES.gmk
 
 ifdef PARTNERS_CORBA
@@ -50,24 +49,21 @@
 	$(IIOP_java)
 endif
 
-#
-# Rules.
-#
 JAVA_ARGS = "{ \"-J-ms8m\", \"sun.rmi.rmic.Main\" }"
 
 ifdef STANDALONE_CORBA_WS
-FILES_c = $(SHARE_SRC)/native/bin/$(PROGRAM).c $(SHARE_SRC)/native/bin/utility.c
+  FILES_c = $(SHARE_SRC)/native/bin/$(PROGRAM).c $(SHARE_SRC)/native/bin/utility.c
 endif
-
-include $(BUILDDIR)/common/Program.gmk
 OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
 
 #
-# Resources.
+# Resources
 #
 LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_PROPERTIES = rmic.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/sun/rmi/rmic/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/sun/rmi/rmic/resources
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/rmic.properties
 
+#
+# Rules
+#
+include $(BUILDDIR)/common/Program.gmk
+
--- a/j2se/make/sun/rmi/rmid/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/rmi/rmid/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -37,21 +37,18 @@
 build: stubs 
 
 #
+# Resources
+#
+LOCALE_SET_DEFINITION = j2re
+RESOURCE_BUNDLES_PROPERTIES = sun/rmi/server/resources/rmid.properties
+
+#
 # Rules to install the wrapper script
 #
 JAVA_ARGS = "{ \"-J-ms8m\", \"sun.rmi.server.Activation\" }"
 include $(BUILDDIR)/common/Program.gmk
 
 #
-# Resources.
-#
-LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_PROPERTIES = rmid.properties
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/sun/rmi/server/resources
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/sun/rmi/rmid/resources
-include $(BUILDDIR)/common/Resources.gmk
-
-#
 # Extra dependencies.
 #
 classes: stubs
--- a/j2se/make/sun/schemagen/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/schemagen/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -35,24 +35,13 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files. (If java sources need to be compiled)
+# Files
 #
 AUTO_FILES_JAVA_DIRS = com/sun/tools/internal/jxc
 
 #
-# Resources (only if you have them)
-#
-include $(BUILDDIR)/common/Resources.gmk
-
+# Rules
 #
-# Rules.
-#
-
 JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.internal.jxc.SchemaGenerator\" }"
-
-
 include $(BUILDDIR)/common/Program.gmk
 
-#######################################################################
-
-
--- a/j2se/make/sun/security/jarsigner/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/jarsigner/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.17 07/05/05
-#
 # Makefile for building jarsigner utility.
 #
 
--- a/j2se/make/sun/security/keytool/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/keytool/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.16 07/05/05
-#
 # Makefile for building keytool utility.
 #
 
--- a/j2se/make/sun/security/kinit/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/kinit/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,12 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.11 07/05/05
-#
-
-#
-# @(#)Makefile	1.11 01/10/09
-#
 # Makefile for building kinit utility.
 #
 
--- a/j2se/make/sun/security/klist/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/klist/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,12 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.11 07/05/05
-#
-
-#
-# @(#)Makefile	1.11 01/10/09
-#
 # Makefile for building klist utility.
 #
 
--- a/j2se/make/sun/security/ktab/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/ktab/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,12 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.11 07/05/05
-#
-
-#
-# @(#)Makefile	1.11 01/10/09
-#
 # Makefile for building keytab utility.
 #
 
--- a/j2se/make/sun/security/policytool/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/policytool/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -24,8 +24,6 @@
 #
 
 #
-# @(#)Makefile	1.22 07/05/05
-#
 # Makefile for building policytool utility.
 #
 
--- a/j2se/make/sun/security/tools/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/tools/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -37,10 +37,10 @@
 # Resources
 #
 LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_JAVA = $(TARGDIR)sun/security/tools/JarSignerResources.java
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_JAVA = sun/security/tools/JarSignerResources.java
 
 #
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
+
--- a/j2se/make/sun/security/util/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/security/util/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -37,10 +37,10 @@
 # Resources
 #
 LOCALE_SET_DEFINITION = j2re
-RESOURCE_BUNDLES_JAVA = $(TARGDIR)sun/security/util/Resources.java
-include $(BUILDDIR)/common/Resources.gmk
+RESOURCE_BUNDLES_JAVA = sun/security/util/Resources.java
 
 #
 # Rules
 #
 include $(BUILDDIR)/common/Classes.gmk
+
--- a/j2se/make/sun/serialver/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/serialver/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -34,23 +34,20 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files to compile.
+# Files
 #
 AUTO_FILES_JAVA_DIRS = sun/tools/serialver
 
 #
-# Rules.
+# Resources
 #
-JAVA_ARGS = "{ \"-J-ms8m\", \"sun.tools.serialver.SerialVer\" }"
-include $(BUILDDIR)/common/Program.gmk
-OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
+LOCALE_SET_DEFINITION = j2sdk
+RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/serialver.properties 
 
 #
-# Resources.
+# Rules
 #
-LOCALE_SET_DEFINITION = j2sdk
-RESOURCE_BUNDLES_PROPERTIES = serialver.properties 
-RESOURCE_SRC_DIR  = $(SHARE_SRC)/classes/sun/tools/serialver
-RESOURCE_DEST_DIR = $(CLASSBINDIR)/sun/tools/serialver/resources
-include $(BUILDDIR)/common/Resources.gmk
+JAVA_ARGS = "{ \"-J-ms8m\", \"sun.tools.serialver.SerialVer\" }"
+OTHER_CPPFLAGS += -DEXPAND_CLASSPATH_WILDCARDS
+include $(BUILDDIR)/common/Program.gmk
 
--- a/j2se/make/sun/splashscreen/FILES_c.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/splashscreen/FILES_c.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)FILES_c.gmk	@(#)FILES_c.gmk	1.6 07/05/05
-#
 FILES_c = \
 	$(CTARGDIR)java_awt_SplashScreen.c \
 	$(CTARGDIR)splashscreen_gfx_impl.c \
--- a/j2se/make/sun/wsgen/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/wsgen/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-#######################################################################
 #
 # Makefile for building wsgen
 #
@@ -35,25 +34,13 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files. (If java sources need to be compiled)
+# Files
 #
 AUTO_FILES_JAVA_DIRS = com/sun/tools/internal/ws
 
 #
-# Resources (only if you have them)
-#
-include $(BUILDDIR)/common/Resources.gmk
-
+# Rules
 #
-# Rules.
-#
-
-
 JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.internal.ws.WsGen\" }"
-
-
 include $(BUILDDIR)/common/Program.gmk
 
-#######################################################################
-
-
--- a/j2se/make/sun/wsimport/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/wsimport/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,6 @@
 # have any questions.
 #
 
-#######################################################################
 #
 # Makefile for building wsimport
 #
@@ -35,25 +34,13 @@
 include $(BUILDDIR)/common/Defs.gmk
 
 #
-# Files. (If java sources need to be compiled)
+# Files
 #
 AUTO_FILES_JAVA_DIRS = com/sun/tools/internal/ws
 
 #
-# Resources (only if you have them)
-#
-include $(BUILDDIR)/common/Resources.gmk
-
+# Rules
 #
-# Rules.
-#
-#   e.g. JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.xjc.Driver\" }"
-
 JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.internal.ws.WsImport\" }"
-
-
 include $(BUILDDIR)/common/Program.gmk
 
-#######################################################################
-
-
--- a/j2se/make/sun/xawt/FILES_c_unix.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/xawt/FILES_c_unix.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,9 +23,6 @@
 # have any questions.
 #
 
-
-# @(#)sun_pr.cmk @(#)sun_dcpr.cmk	1.8 98/01/09
-
 #
 # include rules
 #
@@ -64,6 +61,7 @@
 	$(TARGDIR)OGLRenderer.c \
 	$(TARGDIR)OGLSurfaceData.c \
 	$(TARGDIR)OGLTextRenderer.c \
+	$(TARGDIR)OGLVertexCache.c \
 	$(TARGDIR)GLXGraphicsConfig.c \
 	$(TARGDIR)GLXSurfaceData.c \
 	$(TARGDIR)AccelGlyphCache.c \
--- a/j2se/make/sun/xawt/FILES_export_unix.gmk	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/xawt/FILES_export_unix.gmk	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)FILES_export_unix.gmk 1.33 02/03/98
-
 #
 # include rules
 #
--- a/j2se/make/sun/xawt/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/xawt/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)Makefile	1.59 07/05/05
-#
-
 BUILDDIR = ../..
 PACKAGE = sun.awt.X11
 LIBRARY = mawt
--- a/j2se/make/sun/xjc/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/sun/xjc/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -43,35 +43,26 @@
 FILES_xsd = $(XSD_FILES:%.xsd=$(CLASSBINDIR)/%.xsd)
 FILES_misc = $(MISC_FILES:%.java=$(CLASSBINDIR)/%.java)
 
-##
-# Rules.
+#
+# Resources 
 #
+LOCALE_SET_DEFINITION = j2sdk
+NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
 
+#
+# Rules
+#
 JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.internal.xjc.Driver\" }"
 
 include $(BUILDDIR)/common/Program.gmk
 
-
-#
-# Resources 
-#
-
-LOCALE_SET_DEFINITION = j2sdk
-NEW_RESOURCE_BUNDLES_PROPERTIES = $(PROPERTY_FILES)
-RESOURCE_SRC_DIR = $(SHARE_SRC)/classes
-RESOURCE_DEST_DIR = $(CLASSBINDIR)
-include $(BUILDDIR)/common/Resources.gmk
-
-
 build: $(FILES_xsd) $(FILES_misc)
 
-$(CLASSBINDIR)/$(PKGDIR)/reader/xmlschema/bindinfo/%.xsd: $(SHARE_SRC)/classes/$(PKGDIR)/reader/xmlschema/bindinfo/%.xsd
+$(CLASSBINDIR)/$(PKGDIR)/reader/xmlschema/bindinfo/%.xsd: \
+	     $(SHARE_SRC)/classes/$(PKGDIR)/reader/xmlschema/bindinfo/%.xsd
 	$(install-file)
 
-$(CLASSBINDIR)/$(PKGDIR)/runtime/%.java: $(SHARE_SRC)/classes/$(PKGDIR)/runtime/%.java
+$(CLASSBINDIR)/$(PKGDIR)/runtime/%.java: \
+	     $(SHARE_SRC)/classes/$(PKGDIR)/runtime/%.java
 	$(install-file)
 
-
-#######################################################################
-
-
--- a/j2se/make/tools/AutoMulti/AutoMulti.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/AutoMulti/AutoMulti.java	Fri Jun 22 00:46:43 2007 +0000
@@ -46,7 +46,6 @@
  * NOTE:  This tool depends upon the existence of <plafdir> and on the
  * compiled classes from <plafdir> being somewhere in the class path.
  *
- * @version 1.19 05/05/07 17:08:14
  * @author Willie Walker
  */
 public class AutoMulti {
@@ -98,9 +97,8 @@
     public static StringBuffer createPreamble(String prefixName) {
 	StringBuffer s = new StringBuffer();
 	s.append("/*\n");
-        s.append(" * %W" + "% %" + "E%\n"); // We don't want SCCS expanding this yet
         s.append(" *\n");
-        s.append(" * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.\n");
+        s.append(" * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.\n");
         s.append(" * \n");
         s.append(" * This software is the proprietary information of Sun Microsystems, Inc.  \n");
         s.append(" * Use is subject to license terms.\n");
@@ -169,7 +167,6 @@
         s.append(" * \n");
         s.append(" * <p>This file was automatically generated by AutoMulti.\n");
         s.append(" *\n");
-        s.append(" * @version %" + "I% %" + "G% %" + "U%\n"); 	// Don't let SCCS expand this yet
         s.append(" * @author  Otto Multey\n");			// Get it?  I crack myself up.
         s.append(" */\n");
         s.append("public class Multi" + className + " extends " + className + " {\n");
--- a/j2se/make/tools/AutoMulti/TestALFGenerator.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/AutoMulti/TestALFGenerator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -47,7 +47,6 @@
  * NOTE:  This tool depends upon the existence of <plafdir> and on the
  * compiled classes from <plafdir> being somewhere in the class path.
  *
- * @version 1.10 05/05/07 17:08:14
  * @author Willie Walker
  */
 public class TestALFGenerator {
@@ -101,9 +100,8 @@
     public static StringBuffer createPreamble(String prefixName) {
 	StringBuffer s = new StringBuffer();
 	s.append("/*\n");
-        s.append(" * %W" + "% %" + "E%\n"); // We don't want SCCS expanding this yet
         s.append(" *\n");
-        s.append(" * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.\n");
+        s.append(" * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.\n");
         s.append(" * \n");
         s.append(" * This software is the proprietary information of Sun Microsystems, Inc.  \n");
         s.append(" * Use is subject to license terms.\n");
@@ -174,7 +172,6 @@
         s.append(" * \n");
         s.append(" * <p>This file was automatically generated by TestALFGenerator.\n");
         s.append(" *\n");
-        s.append(" * @version %" + "I% %" + "G% %" + "U%\n"); 	// Don't let SCCS expand this yet
         s.append(" * @author  Otto Multey\n");			// Get it?  I crack myself up.
         s.append(" */\n");
         s.append("public class " + classPrefix + className + " extends " + className + " {\n");
--- a/j2se/make/tools/AutoMulti/TestALFLookAndFeel.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/AutoMulti/TestALFLookAndFeel.java	Fri Jun 22 00:46:43 2007 +0000
@@ -37,7 +37,6 @@
  * @see UIManager#addAuxiliaryLookAndFeel
  * @see javax.swing.plaf.multi
  *
- * @version 1.10 05/05/07
  * @author Kathy Walrath
  * @author Will Walker
  */
Binary file j2se/make/tools/CompileProperties/CompileProperties.class has changed
--- a/j2se/make/tools/CompileProperties/CompileProperties.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/CompileProperties/CompileProperties.java	Fri Jun 22 00:46:43 2007 +0000
@@ -23,11 +23,20 @@
  * have any questions.
  */
 
-// Compile with "javac CompileProperties.java" using JDK 1.4 or higher.
-
-import java.io.*;
-import java.text.*;
-import java.util.*;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
 
 /** Translates a .properties file into a .java file containing the
  *  definition of a java.util.Properties subclass which can then be
@@ -44,119 +53,145 @@
 
 public class CompileProperties {
     private static final String FORMAT =
-              "{0}" +
-              "import java.util.ListResourceBundle;\n\n" +
-              "public final class {1} extends {2} '{'\n" +
-              "    protected final Object[][] getContents() '{'\n" +
-              "        return new Object[][] '{'\n" +
-              "{3}" +
-              "        };\n" +
-              "    }\n" +
-              "}\n";
-
-
+            "{0}" +
+            "import java.util.ListResourceBundle;\n\n" +
+            "public final class {1} extends {2} '{'\n" +
+            "    protected final Object[][] getContents() '{'\n" +
+            "        return new Object[][] '{'\n" +
+            "{3}" +
+            "        };\n" +
+            "    }\n" +
+            "}\n";
+    
+    
     // This comes from Properties
     private static final char[] hexDigit = {
-	'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
+        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
     };
-
+    
     // Note: different from that in Properties
     private static final String specialSaveChars = "\"";
-
+    
     // This comes from Properties
     private static char toHex(int nibble) {
-	return hexDigit[(nibble & 0xF)];
+        return hexDigit[(nibble & 0xF)];
     }
-
+    
+    private static void error(String msg, Exception e) {
+        System.err.println("ERROR: CompileProperties: " + msg);
+        if ( e != null ) {
+            System.err.println("EXCEPTION: " + e.toString());
+            e.printStackTrace();
+        }
+    }
+    
     private static String propfiles[];
     private static String outfiles[] ;
     private static String supers[]   ;
     private static int compileCount = 0;
-
-    private static void parseOptions(String args[])
-    {
+    
+    private static boolean parseOptions(String args[]) {
+        boolean ok = true;
         if ( compileCount > 0 ) {
-	    String new_propfiles[] = new String[compileCount + args.length];
-	    String new_outfiles[]  = new String[compileCount + args.length];
-	    String new_supers[]    = new String[compileCount + args.length];
-	    System.arraycopy(propfiles, 0, new_propfiles, 0, compileCount);
-	    System.arraycopy(outfiles, 0, new_outfiles, 0, compileCount);
-	    System.arraycopy(supers, 0, new_supers, 0, compileCount);
-	    propfiles = new_propfiles;
-	    outfiles  = new_outfiles;
-	    supers    = new_supers;
-	} else {
-	    propfiles = new String[args.length];
-	    outfiles  = new String[args.length];
-	    supers    = new String[args.length];
-	}
-	for ( int i = 0; i < args.length ; i++ ) {
-	    if ( "-compile".equals(args[i]) && i+3 < args.length ) {
-		propfiles[compileCount] = args[++i];
-		outfiles[compileCount]  = args[++i];
-		supers[compileCount]    = args[++i];
-		compileCount++;
-	    } else if ( "-optionsfile".equals(args[i]) && i+1 < args.length ) {
-		String filename = args[++i];
-		FileInputStream finput;
-		byte contents[];
-		try {
-	            finput = new FileInputStream(filename);
-		    int byteCount = finput.available();
-		    if ( byteCount <= 0 ) {
-			break;
-		    }
-		    contents = new byte[byteCount];
-		    int bytesRead = finput.read(contents);
-		    if ( byteCount != bytesRead ) {
-			System.err.println("ERROR: Cannot read all of -optionsfile file");
-			usage();
-		    }
-		} catch ( IOException e ) {
-		    System.err.println("ERROR: CompileProperties cannot open " + filename);
-                    usage();
-		    break;
-		}
-		String tokens[] = (new String(contents)).split("\\s+");
-		if ( tokens.length > 0 ) {
-		    parseOptions(tokens);
-		}
-	    } else {
-		System.err.println("ERROR: CompileProperties argument error");
-                usage();
-	    }
-	}
+            String new_propfiles[] = new String[compileCount + args.length];
+            String new_outfiles[]  = new String[compileCount + args.length];
+            String new_supers[]    = new String[compileCount + args.length];
+            System.arraycopy(propfiles, 0, new_propfiles, 0, compileCount);
+            System.arraycopy(outfiles, 0, new_outfiles, 0, compileCount);
+            System.arraycopy(supers, 0, new_supers, 0, compileCount);
+            propfiles = new_propfiles;
+            outfiles  = new_outfiles;
+            supers    = new_supers;
+        } else {
+            propfiles = new String[args.length];
+            outfiles  = new String[args.length];
+            supers    = new String[args.length];
+        }
+        for ( int i = 0; i < args.length ; i++ ) {
+            if ( "-compile".equals(args[i]) && i+3 < args.length ) {
+                propfiles[compileCount] = args[++i];
+                outfiles[compileCount]  = args[++i];
+                supers[compileCount]    = args[++i];
+                compileCount++;
+            } else if ( "-optionsfile".equals(args[i]) && i+1 < args.length ) {
+                String filename = args[++i];
+                FileInputStream finput = null;
+                byte contents[] = null;
+                try {
+                    finput = new FileInputStream(filename);
+                    int byteCount = finput.available();
+                    if ( byteCount <= 0 ) {
+                        error("The -optionsfile file is empty", null);
+                        ok = false;
+                    } else {
+                        contents = new byte[byteCount];
+                        int bytesRead = finput.read(contents);
+                        if ( byteCount != bytesRead ) {
+                            error("Cannot read all of -optionsfile file", null);
+                            ok = false;
+                        }
+                    }
+                } catch ( IOException e ) {
+                    error("cannot open " + filename, e);
+                    ok = false;
+                }
+                if ( finput != null ) {
+                    try {
+                        finput.close();
+                    } catch ( IOException e ) {
+                        ok = false;
+                        error("cannot close " + filename, e);
+                    }
+                }
+                if ( ok = true && contents != null ) {
+                    String tokens[] = (new String(contents)).split("\\s+");
+                    if ( tokens.length > 0 ) {
+                        ok = parseOptions(tokens);
+                    }
+                }
+                if ( !ok ) {
+                    break;
+                }
+            } else {
+                error("argument error", null);
+                ok = false;
+            }
+        }
+        return ok;
     }
     
-    public static void main(String[] args) throws IOException {
-
-	/* Original usage */
+    public static void main(String[] args) {
+        boolean ok = true;
+        /* Original usage */
         if (args.length == 2 && args[0].charAt(0) != '-' ) {
-            createFile(args[0], args[1], "ListResourceBundle");
-	    return;
-        }
-        if (args.length == 3) {
-            createFile(args[0], args[1], args[2]);
-	    return;
-        }
-        if (args.length == 0) {
+            ok = createFile(args[0], args[1], "ListResourceBundle");
+        } else if (args.length == 3) {
+            ok = createFile(args[0], args[1], args[2]);
+        } else if (args.length == 0) {
             usage();
+            ok = false;
+        } else {
+            /* New batch usage */
+            ok = parseOptions(args);
+            if ( ok && compileCount == 0 ) {
+                error("options parsed but no files to compile", null);
+                ok = false;
+            }
+            /* Need at least one file. */
+            if ( !ok ) {
+                usage();
+            } else {
+                /* Process files */
+                for ( int i = 0; i < compileCount && ok ; i++ ) {
+                    ok = createFile(propfiles[i], outfiles[i], supers[i]);
+                }
+            }
         }
-
-	/* New batch usage */
-	parseOptions(args);
-
-	/* Need at least one file. */
-        if ( compileCount == 0 ) {
-            usage();
+        if ( !ok ) {
+            System.exit(1);
         }
-
-	/* Process files */
-	for ( int i = 0; i < compileCount ; i++ ) {
-            createFile(propfiles[i], outfiles[i], supers[i]);
-	}
     }
-
+    
     private static void usage() {
         System.err.println("usage:");
         System.err.println("    java CompileProperties path_to_properties_file path_to_java_output_file [super_class]");
@@ -167,74 +202,104 @@
         System.err.println("    java CompileProperties -compile test.properties test.java ListResourceBundle");
         System.err.println("    java CompileProperties -optionsfile option_file");
         System.err.println("option_file contains: -compile test.properties test.java ListResourceBundle");
-        System.exit(1);
     }
-
-    private static void createFile(String propertiesPath, String outputPath, String superClass)
-            throws IOException {
+    
+    private static boolean createFile(String propertiesPath, String outputPath,
+            String superClass) {
+        boolean ok = true;
         System.out.println("parsing: " + propertiesPath);
         Properties p = new Properties();
-
-        p.load(new FileInputStream(propertiesPath));
-
-        String packageName = inferPackageName(propertiesPath, outputPath);
-        System.out.println("inferred package name: " + packageName);
-
-        ArrayList sortedKeys = new ArrayList(p.keySet());
-        Collections.sort(sortedKeys);
-        Iterator keys = sortedKeys.iterator();
-
-        StringBuffer data = new StringBuffer();
-
-        while (keys.hasNext()) {
-            Object key = keys.next();
-            data.append("            { \"" + escape((String)key) + "\", \"" +
-                        escape((String)p.get(key)) + "\" },\n");
+        try {
+            p.load(new FileInputStream(propertiesPath));
+        } catch ( FileNotFoundException e ) {
+            ok = false;
+            error("Cannot find file " + propertiesPath, e);
+        } catch ( IOException e ) {
+            ok = false;
+            error("IO error on file " + propertiesPath, e);
         }
-
-        File file = new File(propertiesPath);
-        String name = file.getName();
-        int dotIndex = name.lastIndexOf('.');
-        String className;
-        if (dotIndex == -1) {
-            className = name;
-        } else {
-            className = name.substring(0, dotIndex);
+        if ( ok ) {
+            String packageName = inferPackageName(propertiesPath, outputPath);
+            System.out.println("inferred package name: " + packageName);
+            List<String> sortedKeys = new ArrayList<String>();
+            for ( Object key : p.keySet() ) {
+                sortedKeys.add((String)key);
+            }
+            Collections.sort(sortedKeys);
+            Iterator keys = sortedKeys.iterator();
+            
+            StringBuffer data = new StringBuffer();
+            
+            while (keys.hasNext()) {
+                Object key = keys.next();
+                data.append("            { \"" + escape((String)key) + "\", \"" +
+                        escape((String)p.get(key)) + "\" },\n");
+            }
+           
+	    // Get class name from java filename, not the properties filename.
+	    //   (zh_TW properties might be used to create zh_HK files)
+            File file = new File(outputPath);
+            String name = file.getName();
+            int dotIndex = name.lastIndexOf('.');
+            String className;
+            if (dotIndex == -1) {
+                className = name;
+            } else {
+                className = name.substring(0, dotIndex);
+            }
+            
+            String packageString = "";
+            if (packageName != null && !packageName.equals("")) {
+                packageString = "package " + packageName + ";\n\n";
+            }
+            
+            Writer writer = null;
+            try {
+                writer = new BufferedWriter(
+                        new OutputStreamWriter(new FileOutputStream(outputPath), "8859_1"));
+                MessageFormat format = new MessageFormat(FORMAT);
+                writer.write(format.format(new Object[] { packageString, className, superClass, data }));
+            } catch ( IOException e ) {
+                ok = false;
+                error("IO error writing to file " + outputPath, e);
+            }
+            if ( writer != null ) {
+                try {
+                    writer.flush();
+                } catch ( IOException e ) {
+                    ok = false;
+                    error("IO error flush " + outputPath, e);
+                }
+                try {
+                    writer.close();
+                } catch ( IOException e ) {
+                    ok = false;
+                    error("IO error close " + outputPath, e);
+                }
+            }
+            System.out.println("wrote: " + outputPath);
         }
-        
-        String packageString = "";
-        if (packageName != null && !packageName.equals("")) {
-          packageString = "package " + packageName + ";\n\n";
-        }
-
-        Writer writer = new BufferedWriter(
-            new OutputStreamWriter(new FileOutputStream(outputPath), "8859_1"));
-        MessageFormat format = new MessageFormat(FORMAT);
-        writer.write(format.format(new Object[] { packageString, className, superClass, data }));
-        writer.flush();
-        writer.close();
-        System.out.println("wrote: " + outputPath);
+        return ok;
     }
-
+    
     private static String escape(String theString) {
-        boolean escapeSpace = false;
         // This is taken from Properties.saveConvert with changes for Java strings
         int len = theString.length();
         StringBuffer outBuffer = new StringBuffer(len*2);
-
+        
         for(int x=0; x<len; x++) {
             char aChar = theString.charAt(x);
             switch(aChar) {
                 case '\\':outBuffer.append('\\'); outBuffer.append('\\');
-                          break;
+                break;
                 case '\t':outBuffer.append('\\'); outBuffer.append('t');
-                          break;
+                break;
                 case '\n':outBuffer.append('\\'); outBuffer.append('n');
-                          break;
+                break;
                 case '\r':outBuffer.append('\\'); outBuffer.append('r');
-                          break;
+                break;
                 case '\f':outBuffer.append('\\'); outBuffer.append('f');
-                          break;
+                break;
                 default:
                     if ((aChar < 0x0020) || (aChar > 0x007e)) {
                         outBuffer.append('\\');
@@ -244,15 +309,16 @@
                         outBuffer.append(toHex((aChar >>  4) & 0xF));
                         outBuffer.append(toHex( aChar        & 0xF));
                     } else {
-                        if (specialSaveChars.indexOf(aChar) != -1)
+                        if (specialSaveChars.indexOf(aChar) != -1) {
                             outBuffer.append('\\');
+                        }
                         outBuffer.append(aChar);
                     }
             }
         }
         return outBuffer.toString();
     }
-
+    
     private static String inferPackageName(String inputPath, String outputPath) {
         // Normalize file names
         inputPath  = new File(inputPath).getPath();
@@ -275,7 +341,7 @@
         int j = outEnd;
         while (i >= 0 && j >= 0) {
             if (!inputs[i].equals(outputs[j]) ||
-                (inputs[i].equals("gensrc") && inputs[j].equals("gensrc"))) {
+                    (inputs[i].equals("gensrc") && inputs[j].equals("gensrc"))) {
                 ++i;
                 ++j;
                 break;
@@ -283,21 +349,23 @@
             --i;
             --j;
         }
+        String result;
         if (i < 0 || j < 0 || i >= inEnd || j >= outEnd) {
-            return "";
-        }
-        if (inputs[i].equals("classes") && outputs[j].equals("classes")) {
-            ++i;
-            ++j;
+            result = "";
+        } else {
+            if (inputs[i].equals("classes") && outputs[j].equals("classes")) {
+                ++i;
+            }
+            inStart = i;
+            StringBuffer buf = new StringBuffer();
+            for (i = inStart; i <= inEnd; i++) {
+                buf.append(inputs[i]);
+                if (i < inEnd) {
+                    buf.append('.');
+                }
+            }
+            result = buf.toString();
         }
-        inStart = i;
-        StringBuffer buf = new StringBuffer();
-        for (i = inStart; i <= inEnd; i++) {
-            buf.append(inputs[i]);
-            if (i < inEnd) {
-                buf.append('.');
-            }
-        }
-        return buf.toString();
+        return result;
     }
 }
--- a/j2se/make/tools/GenerateBreakIteratorData/CharacterCategory.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/GenerateBreakIteratorData/CharacterCategory.java	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
  * have any questions.
  */
 
-/*
- *  @(#)CharacterCategory.java	1.8 07/05/05
- */
-
 /**
  * This is a tool to generate categoryNames and categoryMap which are used in
  * CharSet.java.
--- a/j2se/make/tools/GenerateCharacter/GenerateCharacter.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/GenerateCharacter/GenerateCharacter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -24,10 +24,6 @@
  * have any questions.
  */
 
-/*
- * @(#)GenerateCharacter.java	1.16 07/05/05
- */
-
 import java.io.IOException;
 import java.io.FileNotFoundException;
 import java.io.BufferedReader;
@@ -59,7 +55,6 @@
  * alphabetic characters constituting a variable name.  The character "_"
  * is considered alphabetic for these purposes.
  *
- * @version 1.19 05/08/01
  * @author  Guy Steele
  * @author  Alan Liu
  * @author  John O'Conner
--- a/j2se/make/tools/GenerateCharacter/SpecialCaseMap.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/GenerateCharacter/SpecialCaseMap.java	Fri Jun 22 00:46:43 2007 +0000
@@ -23,11 +23,6 @@
  * have any questions.
  */
 
-/*
- * @(#)SpecialCaseMap.java	1.13 07/05/05
- */
-
-
 import java.io.*;
 import java.util.*;
 import java.lang.*;
--- a/j2se/make/tools/GenerateCharacter/UnicodeSpec.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/GenerateCharacter/UnicodeSpec.java	Fri Jun 22 00:46:43 2007 +0000
@@ -23,11 +23,6 @@
  * have any questions.
  */
 
-/*
- * @(#)UnicodeSpec.java	1.13 07/05/05
- */
-
-
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.FileNotFoundException;
@@ -43,7 +38,6 @@
  * holds a decoded version of one line of the data file.  The file may
  * be obtained from www.unicode.org.  The method readSpecFile returns an array
  * of UnicodeSpec objects.
- * @version 07/05/05
  * @author	Guy Steele
  * @author  John O'Conner
  */
--- a/j2se/make/tools/GenerateCharacter/Utility.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/GenerateCharacter/Utility.java	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
  * have any questions.
  */
 
-/*
- * @(#)Utility.java	1.11 07/05/05
- */
-
 import java.text.*;
 import java.util.*;
 
--- a/j2se/make/tools/Hasher/Hasher.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/Hasher/Hasher.java	Fri Jun 22 00:46:43 2007 +0000
@@ -37,7 +37,6 @@
  * @see sun.util.PreHashedMap
  *
  * @author Mark Reinhold
- * @version 1.8 07/05/05
  */
 
 public class Hasher {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/make/tools/StripProperties/StripProperties.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.BufferedInputStream;
+import java.io.BufferedWriter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * Reads a properties file from standard input and writes an equivalent
+ * properties file without comments to standard output.
+ */
+public class StripProperties {
+    
+    private static void error(String msg, Exception e) {
+        System.err.println("ERROR: StripProperties: " + msg);
+        if ( e != null ) {
+            System.err.println("EXCEPTION: " + e.toString());
+            e.printStackTrace();
+        }
+    }
+    
+    private static List<String> parseOptions(String args[]) {
+        List<String> files = new ArrayList<String>();
+        for ( int i = 0; i < args.length ; i++ ) {
+            if ( "-optionsfile".equals(args[i]) && i+1 < args.length ) {
+                String filename = args[++i];
+                FileInputStream finput = null;
+                byte contents[] = null;
+                try {
+                    finput = new FileInputStream(filename);
+                    int byteCount = finput.available();
+                    if ( byteCount <= 0 ) {
+                        error("The -optionsfile file is empty", null);
+                        files = null;
+                    } else {
+                        contents = new byte[byteCount];
+                        int bytesRead = finput.read(contents);
+                        if ( byteCount != bytesRead ) {
+                            error("Cannot read all of -optionsfile file", null);
+                            files = null;
+                        }
+                    }
+                } catch ( IOException e ) {
+                    error("cannot open " + filename, e);
+                    files = null;
+                }
+                if ( finput != null ) {
+                    try {
+                        finput.close();
+                    } catch ( IOException e ) {
+                        files = null;
+                        error("cannot close " + filename, e);
+                    }
+                }
+                if ( files != null && contents != null ) {
+                    String tokens[] = (new String(contents)).split("\\s+");
+                    if ( tokens.length > 0 ) {
+                        List<String> ofiles = parseOptions(tokens);
+                        if ( ofiles != null ) {
+                            files.addAll(ofiles);
+                        } else {
+                            error("No files found in file", null);
+                            files = null;
+                        }
+                    }
+                }
+                if ( files == null ) {
+                    break;
+                }
+            } else {
+                files.add(args[i]);
+            }
+        }
+        return files;
+    }
+    
+    private static boolean stripFiles(List<String> files) {
+        boolean ok = true;
+        for ( String file : files ) {
+            
+            Properties prop = new Properties();
+            InputStream in = null;
+            try {
+                in = new BufferedInputStream(new FileInputStream(file));
+                prop.load(in);
+            } catch ( FileNotFoundException e ) {
+                error("Cannot access file " + file, e);
+                ok = false;
+            } catch ( IOException e ) {
+                error("IO exception processing file " + file, e);
+                ok = false;
+            }
+            if ( in != null ) {
+                try {
+                    in.close();
+                } catch ( IOException e ) {
+                    error("IO exception closing file " + file, e);
+                    ok = false;
+                }
+            }
+            if ( !ok ) {
+                break;
+            }
+            
+            OutputStream out = null;
+            try {
+                out = new FileOutputStream(file);
+                storeProperties(prop, out);
+                out.flush();
+            } catch ( IOException e ) {
+                error("IO exception processing file " + file, e);
+                ok = false;
+            }
+            if ( out != null ) {
+                try {
+                    out.close();
+                } catch ( IOException e ) {
+                    error("IO exception closing file " + file, e);
+                    ok = false;
+                }
+            }
+            if ( !ok ) {
+                break;
+            }
+            
+        }
+        return ok;
+    }
+    
+    /**
+     * Strip the properties filenames supplied, replacing their contents.
+     * @param args Names of properties files to process and replace contents
+     */
+    public static void main(String args[]) {
+        List<String> files = parseOptions(args);
+        if ( files == null || !stripFiles(files) ) {
+            System.exit(1);
+        }
+    }
+    
+    // --- code below here is adapted from java.util.Properties ---
+    
+    private static final String specialSaveChars = "=: \t\r\n\f#!";
+    
+    /*
+     * Converts unicodes to encoded &#92;uxxxx
+     * and writes out any of the characters in specialSaveChars
+     * with a preceding slash
+     */
+    private static String saveConvert(String theString, boolean escapeSpace) {
+        int len = theString.length();
+        StringBuffer outBuffer = new StringBuffer(len*2);
+        
+        for(int x=0; x<len; x++) {
+            char aChar = theString.charAt(x);
+            switch(aChar) {
+                case ' ':
+                    if (x == 0 || escapeSpace) {
+                        outBuffer.append('\\');
+                    }
+                    outBuffer.append(' ');
+                    break;
+                case '\\':
+                    outBuffer.append('\\');
+                    outBuffer.append('\\');
+                    break;
+                case '\t':
+                    outBuffer.append('\\');
+                    outBuffer.append('t');
+                    break;
+                case '\n':
+                    outBuffer.append('\\');
+                    outBuffer.append('n');
+                    break;
+                case '\r':
+                    outBuffer.append('\\');
+                    outBuffer.append('r');
+                    break;
+                case '\f':
+                    outBuffer.append('\\');
+                    outBuffer.append('f');
+                    break;
+                default:
+                    if ((aChar < 0x0020) || (aChar == 0x007e) || (aChar > 0x00ff)) {
+                        outBuffer.append('\\');
+                        outBuffer.append('u');
+                        outBuffer.append(toHex((aChar >> 12) & 0xF));
+                        outBuffer.append(toHex((aChar >>  8) & 0xF));
+                        outBuffer.append(toHex((aChar >>  4) & 0xF));
+                        outBuffer.append(toHex( aChar        & 0xF));
+                    } else {
+                        if (specialSaveChars.indexOf(aChar) != -1) {
+                            outBuffer.append('\\');
+                        }
+                        outBuffer.append(aChar);
+                    }
+            }
+        }
+        return outBuffer.toString();
+    }
+    
+    /**
+     * Writes the content of <code>properties</code> to <code>out</code>.
+     * The format is that of Properties.store with the following modifications:
+     * <ul>
+     * <li>No header or date is written
+     * <li>Latin-1 characters are written as single bytes, not escape sequences
+     * <li>Line breaks are indicated by a single \n independent of platform
+     * <ul>
+     */
+    private static void storeProperties(Properties properties, OutputStream out)
+    throws IOException {
+        BufferedWriter awriter;
+        awriter = new BufferedWriter(new OutputStreamWriter(out, "8859_1"));
+        for (Enumeration e = properties.keys(); e.hasMoreElements();) {
+            String key = (String)e.nextElement();
+            String val = (String)properties.get(key);
+            key = saveConvert(key, true);
+            
+            /* No need to escape embedded and trailing spaces for value, hence
+             * pass false to flag.
+             */
+            val = saveConvert(val, false);
+            writeln(awriter, key + "=" + val);
+        }
+        awriter.flush();
+    }
+    
+    private static void writeln(BufferedWriter bw, String s) throws IOException {
+        bw.write(s);
+        bw.write("\n");
+    }
+    
+    /**
+     * Convert a nibble to a hex character
+     * @param	nibble	the nibble to convert.
+     */
+    private static char toHex(int nibble) {
+        return hexDigit[(nibble & 0xF)];
+    }
+    
+    /** A table of hex digits */
+    private static final char[] hexDigit = {
+        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
+    };
+}
+
--- a/j2se/make/tools/dtdbuilder/DTDBuilder.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/dtdbuilder/DTDBuilder.java	Fri Jun 22 00:46:43 2007 +0000
@@ -55,7 +55,6 @@
  * @see ContentModel
  * @see DTDParser
  * @see Parser
- * @version 1.16 05/05/07
  * @author Arthur van Hoff
  */
 public
--- a/j2se/make/tools/dtdbuilder/DTDInputStream.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/dtdbuilder/DTDInputStream.java	Fri Jun 22 00:46:43 2007 +0000
@@ -42,7 +42,6 @@
  *
  * @see DTD
  * @see DTDParser
- * @version    1.15, 05/05/07
  * @author Arthur van Hoff
  * @author Steven B. Byrne
  */
--- a/j2se/make/tools/dtdbuilder/DTDParser.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/dtdbuilder/DTDParser.java	Fri Jun 22 00:46:43 2007 +0000
@@ -45,7 +45,6 @@
  *
  * @see DTD
  * @see DTDInputStream
- * @version 1.17, 05/05/07
  * @author Arthur van Hoff
  */
 final
--- a/j2se/make/tools/dtdbuilder/PublicMapping.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/dtdbuilder/PublicMapping.java	Fri Jun 22 00:46:43 2007 +0000
@@ -39,7 +39,6 @@
  * Note: I'm not sure if there is a more natural mapping
  * then this. Maybe we should use properties instead?
  *
- * @version 	1.16, 05/05/07
  * @author 	Arthur van Hoff
  */
 final class PublicMapping {
--- a/j2se/make/tools/dtdbuilder/README	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/dtdbuilder/README	Fri Jun 22 00:46:43 2007 +0000
@@ -1,4 +1,4 @@
-   @(#)README	1.3 04/05/13
+README:
 
 This directory contains a program to read a DTD, and produce a compressed
 representation of it.  It's intended that this program be run at build
--- a/j2se/make/tools/reorder/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/reorder/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,10 +23,6 @@
 # have any questions.
 #
 
-#
-# @(#)Makefile	1.39 07/05/05
-#
-
 # This Makefile is intended to produce new reordering files for the
 # reordering of jar files and shared libraries.  This is not part of the
 # standard build.  The objects produced by this Makefile must be copied
--- a/j2se/make/tools/signaturetest/APIChangesTest.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/signaturetest/APIChangesTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -157,7 +157,7 @@
  *      apiMasterFile.jdk1.1.1 <br>
  **/
 
-/* @test
+/* @test ApiChangesTest
    @compile SignatureConstants.java
    @compile DefinitionFormat.java
    @compile MemberEntry.java SignatureClass.java
--- a/j2se/make/tools/signaturetest/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/signaturetest/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -23,8 +23,6 @@
 # have any questions.
 #
 
-# @(#)Makefile	1.11 07/05/05
-
 default:
 	javac -d . *.java
 
--- a/j2se/make/tools/signaturetest/README	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/signaturetest/README	Fri Jun 22 00:46:43 2007 +0000
@@ -1,4 +1,4 @@
-@(#)README	1.2 99/02/16
+README:
 
 These files are from the JCK test suite, and shouldn't be directly modified.
 If a bug needs to be fixed in them, it should be fixed in the JCK source
Binary file j2se/make/tools/strip/StripProperties.class has changed
--- a/j2se/make/tools/strip/StripProperties.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-// Compile with "javac StripProperties.java" using JDK 1.1 or higher.
-
-import java.io.BufferedWriter;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Properties;
-
-/**
- * Reads a properties file from standard input and writes an equivalent
- * properties file without comments to standard output.
- */
-public class StripProperties {
-
-    public static void main(String[] args) throws IOException {
-        InputStream in = System.in;
-        OutputStream out = System.out;
-        Properties prop = new Properties();
-        prop.load(in);
-        storeProperties(prop, out);
-    }
-    
-    // --- code below here is adapted from java.util.Properties ---
-    
-    private static final String specialSaveChars = "=: \t\r\n\f#!";
-
-    /*
-     * Converts unicodes to encoded &#92;uxxxx
-     * and writes out any of the characters in specialSaveChars
-     * with a preceding slash
-     */
-    private static String saveConvert(String theString, boolean escapeSpace) {
-        int len = theString.length();
-        StringBuffer outBuffer = new StringBuffer(len*2);
-
-        for(int x=0; x<len; x++) {
-            char aChar = theString.charAt(x);
-            switch(aChar) {
-		case ' ':
-		    if (x == 0 || escapeSpace) 
-			outBuffer.append('\\');
-
-		    outBuffer.append(' ');
-		    break;
-                case '\\':outBuffer.append('\\'); outBuffer.append('\\');
-                          break;
-                case '\t':outBuffer.append('\\'); outBuffer.append('t');
-                          break;
-                case '\n':outBuffer.append('\\'); outBuffer.append('n');
-                          break;
-                case '\r':outBuffer.append('\\'); outBuffer.append('r');
-                          break;
-                case '\f':outBuffer.append('\\'); outBuffer.append('f');
-                          break;
-                default:
-                    if ((aChar < 0x0020) || (aChar == 0x007e) || (aChar > 0x00ff)) {
-                        outBuffer.append('\\');
-                        outBuffer.append('u');
-                        outBuffer.append(toHex((aChar >> 12) & 0xF));
-                        outBuffer.append(toHex((aChar >>  8) & 0xF));
-                        outBuffer.append(toHex((aChar >>  4) & 0xF));
-                        outBuffer.append(toHex( aChar        & 0xF));
-                    } else {
-                        if (specialSaveChars.indexOf(aChar) != -1)
-                            outBuffer.append('\\');
-                        outBuffer.append(aChar);
-                    }
-            }
-        }
-        return outBuffer.toString();
-    }
-
-    /**
-     * Writes the content of <code>properties</code> to <code>out</code>.
-     * The format is that of Properties.store with the following modifications:
-     * <ul>
-     * <li>No header or date is written
-     * <li>Latin-1 characters are written as single bytes, not escape sequences
-     * <li>Line breaks are indicated by a single \n independent of platform
-     * <ul>
-     */
-    private static void storeProperties(Properties properties, OutputStream out)
-            throws IOException {
-        BufferedWriter awriter;
-        awriter = new BufferedWriter(new OutputStreamWriter(out, "8859_1"));
-        for (Enumeration e = properties.keys(); e.hasMoreElements();) {
-            String key = (String)e.nextElement();
-            String val = (String)properties.get(key);
-            key = saveConvert(key, true);
-
-	    /* No need to escape embedded and trailing spaces for value, hence
-	     * pass false to flag.
-	     */
-            val = saveConvert(val, false);
-            writeln(awriter, key + "=" + val);
-        }
-        awriter.flush();
-    }
-
-    private static void writeln(BufferedWriter bw, String s) throws IOException {
-        bw.write(s);
-        bw.write("\n");
-    }
-
-    /**
-     * Convert a nibble to a hex character
-     * @param	nibble	the nibble to convert.
-     */
-    private static char toHex(int nibble) {
-	return hexDigit[(nibble & 0xF)];
-    }
-
-    /** A table of hex digits */
-    private static final char[] hexDigit = {
-	'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
-    };
-}
-
--- a/j2se/make/tools/swing-beans/GenDocletBeanInfo.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/swing-beans/GenDocletBeanInfo.java	Fri Jun 22 00:46:43 2007 +0000
@@ -53,7 +53,6 @@
  *
  * TODO: getValue and genDocletInfo needs some cleaning.
  *
- * @version 1.27 05/05/07
  * @author Hans Muller
  * @author Rich Schiavi
  * @author Mark Davidson
--- a/j2se/make/tools/swing-beans/GenSwingBeanInfo.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/swing-beans/GenSwingBeanInfo.java	Fri Jun 22 00:46:43 2007 +0000
@@ -46,7 +46,6 @@
  * Code for a bean info class is written to out.  If the class is 
  * swing package, you don't need to fully specify its name.
  * 
- * @version 1.31 05/05/07
  * @author Hans Muller
  * @author Rich Schiavi
  * @author Mark Davidson
--- a/j2se/make/tools/swing-beans/SwingBeanInfo.template	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/swing-beans/SwingBeanInfo.template	Fri Jun 22 00:46:43 2007 +0000
@@ -38,7 +38,6 @@
  * @(BeanClassName) properties are bound, and it provides other
  * information and icons useful to builders.
  * 
- * @version 1.14 05/05/07
  * @author Auto-Generated Source Code
  */
 
--- a/j2se/make/tools/swing-beans/beaninfo/SwingBeanInfoBase.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/make/tools/swing-beans/beaninfo/SwingBeanInfoBase.java	Fri Jun 22 00:46:43 2007 +0000
@@ -38,7 +38,6 @@
  * with <code>GenSwingBeanInfo</code> a BeanInfo class code generator.
  * 
  * @see GenSwingBeanInfo
- * @version 1.27 05/05/07
  * @author Hans Muller
  */
 public class SwingBeanInfoBase extends SimpleBeanInfo
--- a/j2se/src/share/classes/com/sun/corba/se/impl/activation/CommandHandler.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/corba/se/impl/activation/CommandHandler.java	Fri Jun 22 00:46:43 2007 +0000
@@ -29,7 +29,7 @@
 import java.io.PrintStream;
 
 /**
- * @version     1.21, 07/05/24
+ * @version     1.21, 07/06/21
  * @author      Rohit Garg
  * @since       JDK1.2
  */
--- a/j2se/src/share/classes/com/sun/imageio/plugins/common/PaletteBuilder.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/imageio/plugins/common/PaletteBuilder.java	Fri Jun 22 00:46:43 2007 +0000
@@ -190,13 +190,7 @@
         this.transparency =
 	    srcColorModel.getTransparency();
 
-        if (transparency != Transparency.OPAQUE) {
-            this.requiredSize = size - 1;
-            transColor = new ColorNode();
-            transColor.isLeaf = true;
-        } else {
-            this.requiredSize = size;
-        }
+        this.requiredSize = size;
     }
 
     private Color getSrcColor(int x, int y) {
@@ -250,6 +244,12 @@
                 if (transparency != Transparency.OPAQUE &&
 		    aColor.getAlpha() != 0xff)
 		{
+                    if (transColor == null) {
+                        this.requiredSize --; // one slot for transparent color
+                
+                        transColor = new ColorNode();
+                        transColor.isLeaf = true;
+                    }
                     transColor = insertNode(transColor, aColor, 0);
                 } else {
                     root = insertNode(root, aColor, 0);
@@ -297,7 +297,7 @@
 
     protected IndexColorModel getIndexColorModel() {
         int size = currSize;
-        if (transparency == Transparency.BITMASK) {
+        if (transColor != null) {
             size ++; // we need place for transparent color;
         }
 
@@ -307,14 +307,16 @@
 
         int index = 0;
         palette = new ColorNode[size];
-        if (transparency == Transparency.BITMASK) {
+        if (transColor != null) {
             index ++;
         }
 
-        int lastIndex = findPaletteEntry(root, index, red, green, blue);
-
+        if (root != null) {
+            findPaletteEntry(root, index, red, green, blue);
+        }
+        
         IndexColorModel icm = null;
-        if (transparency == Transparency.BITMASK) {
+        if (transColor  != null) {
             icm = new IndexColorModel(8, size, red, green, blue, 0);
         } else {
             icm = new IndexColorModel(8, currSize, red, green, blue);
--- a/j2se/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java	Fri Jun 22 00:46:43 2007 +0000
@@ -310,11 +310,16 @@
                          boolean seekForwardOnly,
                          boolean ignoreMetadata)
     {
-        super.setInput(input, seekForwardOnly, ignoreMetadata);
-        this.ignoreMetadata = ignoreMetadata;
-        resetInternalState();
-        iis = (ImageInputStream) input; // Always works
-        setSource(structPointer, iis);
+        setThreadLock();
+        try {
+            super.setInput(input, seekForwardOnly, ignoreMetadata);
+            this.ignoreMetadata = ignoreMetadata;
+            resetInternalState();
+            iis = (ImageInputStream) input; // Always works
+            setSource(structPointer, iis);
+        } finally {
+            clearThreadLock();
+        }
     }
 
     private native void setSource(long structPointer, 
@@ -368,6 +373,16 @@
     }
 
     public int getNumImages(boolean allowSearch) throws IOException {
+        setThreadLock();
+        try { // locked thread
+            return getNumImagesOnThread(allowSearch);
+        } finally {
+            clearThreadLock();
+        }
+    }
+
+    private int getNumImagesOnThread(boolean allowSearch)
+      throws IOException { 
         if (numImages != 0) {
             return numImages;
         }
@@ -662,17 +677,27 @@
     }
 
     public int getWidth(int imageIndex) throws IOException {
-        if (currentImage != imageIndex) {
-            readHeader(imageIndex, true);
+        setThreadLock();
+        try {
+            if (currentImage != imageIndex) {
+                readHeader(imageIndex, true);
+            }
+            return width;
+        } finally {
+            clearThreadLock();
         }
-        return width;
     }
 
     public int getHeight(int imageIndex) throws IOException {
-        if (currentImage != imageIndex) {
-            readHeader(imageIndex, true);
+        setThreadLock();
+        try {
+            if (currentImage != imageIndex) {
+                readHeader(imageIndex, true);
+            }
+            return height;
+        } finally {
+            clearThreadLock();
         }
-        return height;
     }
 
     /////////// Color Conversion and Image Types
@@ -692,15 +717,31 @@
 
     public ImageTypeSpecifier getRawImageType(int imageIndex)
         throws IOException {
-        if (currentImage != imageIndex) {
-            readHeader(imageIndex, true);
+        setThreadLock();
+        try {
+            if (currentImage != imageIndex) {
+                readHeader(imageIndex, true);
+            }
+
+            // Returns null if it can't be represented
+            return getImageType(colorSpaceCode);
+        } finally { 
+            clearThreadLock();
         }
-        // Returns null if it can't be represented
-        return getImageType(colorSpaceCode);
     }
 
     public Iterator getImageTypes(int imageIndex)
         throws IOException {
+        setThreadLock();
+        try {
+            return getImageTypesOnThread(imageIndex);
+        } finally {
+            clearThreadLock();
+        }
+    }
+
+    private Iterator getImageTypesOnThread(int imageIndex)
+        throws IOException {
         if (currentImage != imageIndex) {
             readHeader(imageIndex, true);
         }
@@ -900,47 +941,61 @@
     }
 
     public IIOMetadata getStreamMetadata() throws IOException {
-        if (!tablesOnlyChecked) {
-            checkTablesOnly();
+        setThreadLock();
+        try {
+            if (!tablesOnlyChecked) {
+                checkTablesOnly();
+            }
+            return streamMetadata;
+        } finally {
+            clearThreadLock();
         }
-        return streamMetadata;
     }
 
     public IIOMetadata getImageMetadata(int imageIndex)
         throws IOException {
-
-        // imageMetadataIndex will always be either a valid index or
-        // -1, in which case imageMetadata will not be null.
-        // So we can leave checking imageIndex for gotoImage.
-        if ((imageMetadataIndex == imageIndex)
-            && (imageMetadata != null)) {
+        setThreadLock();
+        try {
+            // imageMetadataIndex will always be either a valid index or
+            // -1, in which case imageMetadata will not be null.
+            // So we can leave checking imageIndex for gotoImage.
+            if ((imageMetadataIndex == imageIndex)
+                && (imageMetadata != null)) {
+                return imageMetadata;
+            }
+            
+            gotoImage(imageIndex);
+            
+            imageMetadata = new JPEGMetadata(false, false, iis, this);
+            
+            imageMetadataIndex = imageIndex;
+            
             return imageMetadata;
+        } finally {
+            clearThreadLock();
         }
-
-        gotoImage(imageIndex);
-        
-        imageMetadata = new JPEGMetadata(false, false, iis, this);
-        
-        imageMetadataIndex = imageIndex;
-
-        return imageMetadata;
-        
     }
 
     public BufferedImage read(int imageIndex, ImageReadParam param)
         throws IOException {
+        setThreadLock();
         try {
-            readInternal(imageIndex, param, false);
-        } catch (RuntimeException e) {
-            resetLibraryState(structPointer);
-            throw e;
-        } catch (IOException e) {
-            resetLibraryState(structPointer);
-            throw e;
+            try {
+                readInternal(imageIndex, param, false);
+            } catch (RuntimeException e) {
+                resetLibraryState(structPointer);
+                throw e;
+            } catch (IOException e) {
+                resetLibraryState(structPointer);
+                throw e;
+            } 
+            
+            BufferedImage ret = image;
+            image = null;  // don't keep a reference here
+            return ret;
+        } finally {
+            clearThreadLock();
         }
-        BufferedImage ret = image;
-        image = null;  // don't keep a reference here
-        return ret;
     }
 
     private Raster readInternal(int imageIndex, 
@@ -1266,8 +1321,13 @@
                                      boolean wantUpdates);
     
     public void abort() {
-        super.abort();
-        abortRead(structPointer);
+        setThreadLock();
+        try {
+            super.abort();
+            abortRead(structPointer);
+        } finally {
+            clearThreadLock();
+        }
     }
 
     /** Set the C level abort flag. Keep it atomic for thread safety. */
@@ -1282,6 +1342,7 @@
 
     public Raster readRaster(int imageIndex, ImageReadParam param)
         throws IOException {
+        setThreadLock();
         Raster retval = null;
         try {
 	    /*
@@ -1310,6 +1371,8 @@
         } catch (IOException e) {
             resetLibraryState(structPointer);
             throw e;
+        } finally {
+            clearThreadLock();
         }
         return retval;
     }
@@ -1319,57 +1382,77 @@
     }
 
     public int getNumThumbnails(int imageIndex) throws IOException {
-        getImageMetadata(imageIndex);  // checks iis state for us
-        // Now check the jfif segments
-        JFIFMarkerSegment jfif = 
-            (JFIFMarkerSegment) imageMetadata.findMarkerSegment
-            (JFIFMarkerSegment.class, true);
-        int retval = 0;
-        if (jfif != null) {
-            retval = (jfif.thumb == null) ? 0 : 1;
-            retval += jfif.extSegments.size();
+        setThreadLock();
+        try {
+            getImageMetadata(imageIndex);  // checks iis state for us
+            // Now check the jfif segments
+            JFIFMarkerSegment jfif = 
+                (JFIFMarkerSegment) imageMetadata.findMarkerSegment
+                (JFIFMarkerSegment.class, true);
+            int retval = 0;
+            if (jfif != null) {
+                retval = (jfif.thumb == null) ? 0 : 1;
+                retval += jfif.extSegments.size();
+            }
+            return retval;
+        } finally {
+            clearThreadLock();
         }
-        return retval;
     }
 
     public int getThumbnailWidth(int imageIndex, int thumbnailIndex)
         throws IOException {
-        if ((thumbnailIndex < 0) 
-            || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
-            throw new IndexOutOfBoundsException("No such thumbnail");
+        setThreadLock();
+        try {
+            if ((thumbnailIndex < 0) 
+                || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
+                throw new IndexOutOfBoundsException("No such thumbnail");
+            }
+            // Now we know that there is a jfif segment
+            JFIFMarkerSegment jfif = 
+                (JFIFMarkerSegment) imageMetadata.findMarkerSegment
+                (JFIFMarkerSegment.class, true);
+            return  jfif.getThumbnailWidth(thumbnailIndex);
+        } finally {
+            clearThreadLock();
         }
-        // Now we know that there is a jfif segment
-        JFIFMarkerSegment jfif = 
-            (JFIFMarkerSegment) imageMetadata.findMarkerSegment
-            (JFIFMarkerSegment.class, true);
-        return  jfif.getThumbnailWidth(thumbnailIndex);
     }
 
     public int getThumbnailHeight(int imageIndex, int thumbnailIndex)
         throws IOException {
-        if ((thumbnailIndex < 0) 
-            || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
-            throw new IndexOutOfBoundsException("No such thumbnail");
+        setThreadLock();
+        try {
+            if ((thumbnailIndex < 0) 
+                || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
+                throw new IndexOutOfBoundsException("No such thumbnail");
+            }
+            // Now we know that there is a jfif segment
+            JFIFMarkerSegment jfif = 
+                (JFIFMarkerSegment) imageMetadata.findMarkerSegment
+                (JFIFMarkerSegment.class, true);
+            return  jfif.getThumbnailHeight(thumbnailIndex);
+        } finally {
+            clearThreadLock();
         }
-        // Now we know that there is a jfif segment
-        JFIFMarkerSegment jfif = 
-            (JFIFMarkerSegment) imageMetadata.findMarkerSegment
-            (JFIFMarkerSegment.class, true);
-        return  jfif.getThumbnailHeight(thumbnailIndex);
     }
 
     public BufferedImage readThumbnail(int imageIndex,
                                        int thumbnailIndex)
         throws IOException {
-        if ((thumbnailIndex < 0) 
-            || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
-            throw new IndexOutOfBoundsException("No such thumbnail");
+        setThreadLock();
+        try {
+            if ((thumbnailIndex < 0) 
+                || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
+                throw new IndexOutOfBoundsException("No such thumbnail");
+            }
+            // Now we know that there is a jfif segment and that iis is good
+            JFIFMarkerSegment jfif = 
+                (JFIFMarkerSegment) imageMetadata.findMarkerSegment
+                (JFIFMarkerSegment.class, true);
+            return  jfif.getThumbnail(iis, thumbnailIndex, this);
+        } finally {
+            clearThreadLock();
         }
-        // Now we know that there is a jfif segment and that iis is good
-        JFIFMarkerSegment jfif = 
-            (JFIFMarkerSegment) imageMetadata.findMarkerSegment
-            (JFIFMarkerSegment.class, true);
-        return  jfif.getThumbnail(iis, thumbnailIndex, this);
     }
 
     private void resetInternalState() {
@@ -1395,18 +1478,26 @@
         initProgressData();
     }
 
-    /**
-     * Note that there is no need to override reset() here, as the default
-     * implementation will call setInput(null, false, false), which will
-     * invoke resetInternalState().
-     */
+    public void reset() {
+        setThreadLock();
+        try {
+            super.reset();
+        } finally {
+            clearThreadLock();
+        }
+    }
 
     private native void resetReader(long structPointer);
 
     public void dispose() {
-        if (structPointer != 0) {
-            disposerRecord.dispose();
-            structPointer = 0;
+        setThreadLock();
+        try {
+            if (structPointer != 0) {
+                disposerRecord.dispose();
+                structPointer = 0;
+            }
+        } finally {
+            clearThreadLock();
         }
     }
 
@@ -1426,4 +1517,40 @@
             }
         }
     }
+
+    private Thread theThread = null;
+    private int theLockCount = 0;
+
+    private synchronized void setThreadLock() {
+        Thread currThread = Thread.currentThread();
+        if (theThread != null) {
+            if (theThread != currThread) {
+                // it looks like that this reader instance is used
+                // by multiple threads.
+                throw new IllegalStateException("Attempt to use instance of " +
+                                                this + " locked on thread " +
+                                                theThread + " from thread " +
+                                                currThread);
+            } else {
+                theLockCount ++;
+            }
+        } else {
+            theThread = currThread;
+            theLockCount = 1;
+        }
+    }
+
+    private synchronized void clearThreadLock() {
+        Thread currThread = Thread.currentThread();
+        if (theThread == null || theThread != currThread) {
+            throw new IllegalStateException("Attempt to clear thread lock " +
+                                            " form wrong thread." +
+                                            " Locked thread: " + theThread + 
+                                            "; current thread: " + currThread);
+        }
+        theLockCount --;
+        if (theLockCount == 0) {
+            theThread = null;
+        }
+    }
 }
--- a/j2se/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -193,11 +193,16 @@
     }
 
     public void setOutput(Object output) {
-        super.setOutput(output); // validates output
-        resetInternalState();
-        ios = (ImageOutputStream) output; // so this will always work
-        // Set the native destination
-        setDest(structPointer, ios);
+        setThreadLock();
+        try {
+            super.setOutput(output); // validates output
+            resetInternalState();
+            ios = (ImageOutputStream) output; // so this will always work
+            // Set the native destination
+            setDest(structPointer, ios);
+        } finally {
+            clearThreadLock();
+        }
     }
 
     public ImageWriteParam getDefaultWriteParam() {
@@ -205,13 +210,23 @@
     }
 
     public IIOMetadata getDefaultStreamMetadata(ImageWriteParam param) {
-        return new JPEGMetadata(param, this);
+        setThreadLock();
+        try {
+            return new JPEGMetadata(param, this);
+        } finally {
+            clearThreadLock();
+        }
     }
 
     public IIOMetadata
         getDefaultImageMetadata(ImageTypeSpecifier imageType,
                                 ImageWriteParam param) {
-        return new JPEGMetadata(imageType, param, this);
+        setThreadLock();
+        try {
+            return new JPEGMetadata(imageType, param, this);
+        } finally {
+            clearThreadLock();
+        }
     }
 
     public IIOMetadata convertStreamMetadata(IIOMetadata inData,
@@ -233,6 +248,18 @@
         convertImageMetadata(IIOMetadata inData,
                              ImageTypeSpecifier imageType,
                              ImageWriteParam param) {
+        setThreadLock();
+        try {
+            return convertImageMetadataOnThread(inData, imageType, param);
+        } finally {
+            clearThreadLock();
+        }
+    }
+
+    private IIOMetadata
+        convertImageMetadataOnThread(IIOMetadata inData,
+                                     ImageTypeSpecifier imageType,
+                                     ImageWriteParam param) {
         // If it's one of ours, just return it
         if (inData instanceof JPEGMetadata) {
             JPEGMetadata jpegData = (JPEGMetadata) inData;
@@ -265,7 +292,7 @@
                 return jpegData;
             }
         }
-            return null;
+        return null;
     }
 
     public int getNumThumbnailsSupported(ImageTypeSpecifier imageType,
@@ -325,7 +352,18 @@
     public void write(IIOMetadata streamMetadata,
                       IIOImage image,
                       ImageWriteParam param) throws IOException {
+        setThreadLock();
+        try {
+            writeOnThread(streamMetadata, image, param);
+        } finally {
+            clearThreadLock();
+        }
+    }
 
+    private void writeOnThread(IIOMetadata streamMetadata,
+                      IIOImage image,
+                      ImageWriteParam param) throws IOException {
+        
         if (ios == null) {
             throw new IllegalStateException("Output has not been set!");
         }
@@ -1051,6 +1089,16 @@
 
     public void prepareWriteSequence(IIOMetadata streamMetadata) 
         throws IOException {
+        setThreadLock();
+        try {
+            prepareWriteSequenceOnThread(streamMetadata);
+        } finally {
+            clearThreadLock();
+        }
+    }
+
+    private void prepareWriteSequenceOnThread(IIOMetadata streamMetadata) 
+        throws IOException {
         if (ios == null) {
             throw new IllegalStateException("Output has not been set!");
         }
@@ -1120,23 +1168,38 @@
 
     public void writeToSequence(IIOImage image, ImageWriteParam param)
         throws IOException {
-        if (sequencePrepared == false) {
-            throw new IllegalStateException("sequencePrepared not called!");
+        setThreadLock();
+        try {
+            if (sequencePrepared == false) {
+                throw new IllegalStateException("sequencePrepared not called!");
+            }
+            // In the case of JPEG this does nothing different from write
+            write(null, image, param);
+        } finally {
+            clearThreadLock();
         }
-        // In the case of JPEG this does nothing different from write
-        write(null, image, param);
     }
 
     public void endWriteSequence() throws IOException {
-        if (sequencePrepared == false) {
-            throw new IllegalStateException("sequencePrepared not called!");
+        setThreadLock();
+        try {
+            if (sequencePrepared == false) {
+                throw new IllegalStateException("sequencePrepared not called!");
+            }
+            sequencePrepared = false;
+        } finally {
+            clearThreadLock();
         }
-        sequencePrepared = false;
     }
 
     public synchronized void abort() {
-        super.abort();
-        abortWrite(structPointer);
+        setThreadLock();
+        try {
+            super.abort();
+            abortWrite(structPointer);
+        } finally {
+            clearThreadLock();
+        }
     }
 
     private void resetInternalState() {
@@ -1152,16 +1215,24 @@
         metadata = null;
     }
 
-    /**
-     * Note that there is no need to override reset() here, as the default
-     * implementation will call setOutput(null), which will invoke
-     * resetInternalState().
-     */
+    public void reset() {
+        setThreadLock();
+        try {
+            super.reset();
+        } finally {
+            clearThreadLock();
+        }
+    }
 
     public void dispose() {
-        if (structPointer != 0) {
-            disposerRecord.dispose();
-            structPointer = 0;
+        setThreadLock();
+        try {
+            if (structPointer != 0) {
+                disposerRecord.dispose();
+                structPointer = 0;
+            }
+        } finally {
+            clearThreadLock();
         }
     }
 
@@ -1700,4 +1771,39 @@
             }
         }
     }
+    
+    private Thread theThread = null;
+    private int theLockCount = 0;
+
+    private synchronized void setThreadLock() {
+        Thread currThread = Thread.currentThread();
+        if (theThread != null) {
+            if (theThread != currThread) {
+                // it looks like that this reader instance is used
+                // by multiple threads.
+                throw new IllegalStateException("Attempt to use instance of " +
+                                                this + " locked on thread " +
+                                                theThread + " from thread " +
+                                                currThread);
+            } else {
+                theLockCount ++;
+            }
+        } else {
+            theThread = currThread;
+            theLockCount = 1;
+        }
+    }
+    
+    private synchronized void clearThreadLock() {
+        Thread currThread = Thread.currentThread();
+        if (theThread == null || theThread != currThread) {
+            throw new IllegalStateException("Attempt to clear thread lock form wrong thread. " +
+                                            "Locked thread: " + theThread + 
+                                            "; current thread: " + currThread);
+        }
+        theLockCount --;
+        if (theLockCount == 0) {
+            theThread = null;
+        }
+    }
 }
--- a/j2se/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -27,6 +27,7 @@
 
 import java.awt.Rectangle;
 import java.awt.image.ColorModel;
+import java.awt.image.IndexColorModel;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.awt.image.RenderedImage;
@@ -798,6 +799,18 @@
         } else if (metadata.IHDR_bitDepth == 16) {
             bytesPerRow *= 2;
         }
+
+        IndexColorModel icm_gray_alpha = null;
+        if (metadata.IHDR_colorType == PNGImageReader.PNG_COLOR_GRAY_ALPHA &&
+            image.getColorModel() instanceof IndexColorModel)
+        {
+            // reserve space for alpha samples
+            bytesPerRow *= 2;
+            
+            // will be used to calculate alpha value for the pixel
+            icm_gray_alpha = (IndexColorModel)image.getColorModel();
+        }
+
         currRow = new byte[bytesPerRow + bpp];
         prevRow = new byte[bytesPerRow + bpp];
         filteredRows = new byte[5][bytesPerRow + bpp];
@@ -864,6 +877,10 @@
 		if (numBands == 1) {
 		    for (int s = xOffset; s < numSamples; s += xSkip) {
 			currRow[count++] = scale0[samples[s]];
+                        if (icm_gray_alpha != null) { 
+                            currRow[count++] = 
+                                scale0[icm_gray_alpha.getAlpha(0xff & samples[s])];
+                        }
 		    }
 		} else {
 		    for (int s = xOffset; s < numSamples; s += xSkip) {
--- a/j2se/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java	Fri Jun 22 00:46:43 2007 +0000
@@ -332,9 +332,18 @@
                 icm.getAlphas(alpha);
             }
 
-            if (isGray && hasAlpha) {
+            /*
+             * NB: PNG_COLOR_GRAY_ALPHA color type may be not optimal for images
+             * contained more than 1024 pixels (or even than 768 pixels in case of
+             * single transparent pixel in palette).
+             * For such images alpha samples in raster will occupy more space than
+             * it is required to store palette so it could be reasonable to
+             * use PNG_COLOR_PALETTE color type for large images.
+             */ 
+
+            if (isGray && hasAlpha && (bitDepth == 8 || bitDepth == 16)) {
                 IHDR_colorType = PNGImageReader.PNG_COLOR_GRAY_ALPHA;
-            } else if (isGray) {
+            } else if (isGray && !hasAlpha) {
                 IHDR_colorType = PNGImageReader.PNG_COLOR_GRAY;
             } else {
                 IHDR_colorType = PNGImageReader.PNG_COLOR_PALETTE;
--- a/j2se/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -33,6 +33,7 @@
 
 import java.beans.ConstructorProperties;
 import java.io.InvalidObjectException;
+import java.lang.annotation.ElementType;
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
@@ -237,7 +238,7 @@
                     putPermanentConverter(primitiveType,
                                           primitiveConv);
                     if (primitiveType != void.class) {
-                        final Class primitiveArrayType =
+                        final Class<?> primitiveArrayType =
                             Array.newInstance(primitiveType, 0).getClass();
                         final OpenType primitiveArrayOpenType =
                             ArrayType.getPrimitiveArrayType(primitiveArrayType);
@@ -293,9 +294,12 @@
                 ((GenericArrayType) objType).getGenericComponentType();
             return makeArrayOrCollectionConverter(objType, componentType);
         } else if (objType instanceof Class) {
-            Class objClass = (Class<?>) objType;
+            Class<?> objClass = (Class<?>) objType;
             if (objClass.isEnum()) {
-                return makeEnumConverter(objClass);
+                // Huge hack to avoid compiler warnings here.  The ElementType
+                // parameter is ignored but allows us to obtain a type variable
+                // T that matches <T extends Enum<T>>.
+                return makeEnumConverter(objClass, ElementType.class);
             } else if (objClass.isArray()) {
                 Type componentType = objClass.getComponentType();
                 return makeArrayOrCollectionConverter(objClass, componentType);
@@ -311,8 +315,9 @@
     }
 
     private static <T extends Enum<T>> OpenConverter
-	    makeEnumConverter(Class<T> enumClass) {
-	return new EnumConverter<T>(enumClass);
+	    makeEnumConverter(Class<?> enumClass, Class<T> fake) {
+        Class<T> enumClassT = Util.cast(enumClass);
+	return new EnumConverter<T>(enumClassT);
     }
 
     /* Make the converter for an array type, or a collection such as
@@ -325,11 +330,11 @@
 	    throws OpenDataException {
 
         final OpenConverter elementConverter = toConverter(elementType);
-	final OpenType elementOpenType = elementConverter.getOpenType();
-	final ArrayType openType = new ArrayType(1, elementOpenType);
-	final Class elementOpenClass = elementConverter.getOpenClass();
+	final OpenType<?> elementOpenType = elementConverter.getOpenType();
+	final ArrayType<?> openType = ArrayType.getArrayType(elementOpenType);
+	final Class<?> elementOpenClass = elementConverter.getOpenClass();
 
-	final Class openArrayClass;
+	final Class<?> openArrayClass;
         final String openArrayClassName;
         if (elementOpenClass.isArray())
             openArrayClassName = "[" + elementOpenClass.getName();
@@ -397,8 +402,7 @@
         if (rawType instanceof Class) {
             Class c = (Class<?>) rawType;
             if (c == List.class || c == Set.class || c == SortedSet.class) {
-                Type[] actuals =
-                    ((ParameterizedType) objType).getActualTypeArguments();
+                Type[] actuals = objType.getActualTypeArguments();
                 assert(actuals.length == 1);
                 if (c == SortedSet.class)
                     mustBeComparable(c, actuals[0]);
@@ -406,8 +410,7 @@
             } else {
                 boolean sortedMap = (c == SortedMap.class);
                 if (c == Map.class || sortedMap) {
-                    Type[] actuals =
-                            ((ParameterizedType) objType).getActualTypeArguments();
+                    Type[] actuals = objType.getActualTypeArguments();
                     assert(actuals.length == 2);
                     if (sortedMap)
                         mustBeComparable(c, actuals[0]);
@@ -654,7 +657,7 @@
 	    final Object[] openArray = (Object[]) openValue;
 	    final Collection<Object> valueCollection;
 	    try {
-		valueCollection = collectionClass.newInstance();
+		valueCollection = Util.cast(collectionClass.newInstance());
 	    } catch (Exception e) {
                 throw invalidObjectException("Cannot create collection", e);
 	    }
@@ -739,7 +742,7 @@
 
 	final Object toNonNullOpenValue(MXBeanLookup lookup, Object value)
                 throws OpenDataException {
-	    final Map<Object, Object> valueMap = (Map<Object, Object>) value;
+	    final Map<Object, Object> valueMap = Util.cast(value);
             if (valueMap instanceof SortedMap) {
                 Comparator comparator = ((SortedMap) valueMap).comparator();
                 if (comparator != null) {
@@ -770,8 +773,7 @@
 	public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object openValue)
                 throws InvalidObjectException {
 	    final TabularData table = (TabularData) openValue;
-	    final Collection<CompositeData> rows =
-		(Collection<CompositeData>) table.values();
+	    final Collection<CompositeData> rows = Util.cast(table.values());
             final Map<Object, Object> valueMap =
                 sortedMap ? newSortedMap() : newMap();
 	    for (CompositeData row : rows) {
@@ -922,7 +924,7 @@
             this.itemNames = itemNames;
 	}
 
-	Class getTargetClass() {
+	Class<?> getTargetClass() {
 	    return targetClass;
 	}
 
@@ -943,7 +945,7 @@
                                           OpenConverter[] converters)
                 throws InvalidObjectException;
 
-	private final Class targetClass;
+	private final Class<?> targetClass;
         private final String[] itemNames;
     }
 
@@ -959,7 +961,7 @@
 	String applicable(Method[] getters) throws InvalidObjectException {
 	    // See if it has a method "T from(CompositeData)"
 	    // as is conventional for a CompositeDataView
-	    Class targetClass = getTargetClass();
+	    Class<?> targetClass = getTargetClass();
 	    try {
 		Method fromMethod =
 		    targetClass.getMethod("from",
@@ -1051,7 +1053,7 @@
 
         String applicable(Method[] getters) {
             try {
-                Constructor c = getTargetClass().getConstructor((Class[]) null);
+                Constructor<?> c = getTargetClass().getConstructor((Class[]) null);
             } catch (Exception e) {
                 return "does not have a public no-arg constructor";
             }
--- a/j2se/src/share/classes/com/sun/jmx/remote/internal/ArrayNotificationBuffer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/jmx/remote/internal/ArrayNotificationBuffer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,23 +25,20 @@
 
 package com.sun.jmx.remote.internal;
 
-import java.io.IOException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.management.InstanceNotFoundException;
-import javax.management.ListenerNotFoundException;
-import javax.management.MalformedObjectNameException;
 import javax.management.MBeanServer;
 import javax.management.MBeanServerDelegate;
 import javax.management.MBeanServerNotification;
@@ -61,47 +58,130 @@
 import com.sun.jmx.remote.util.ClassLogger;
 
 /** A circular buffer of notifications received from an MBean server. */
+/*
+  There is one instance of ArrayNotificationBuffer for every
+  MBeanServer object that has an attached ConnectorServer.  Then, for
+  every ConnectorServer attached to a given MBeanServer, there is an
+  instance of the inner class ShareBuffer.  So for example with two
+  ConnectorServers it looks like this:
+
+  ConnectorServer1 -> ShareBuffer1 -\
+                                     }-> ArrayNotificationBuffer
+  ConnectorServer2 -> ShareBuffer2 -/              |
+                                                   |
+						   v
+                                              MBeanServer
+
+  The ArrayNotificationBuffer has a circular buffer of
+  NamedNotification objects.  Each ConnectorServer defines a
+  notification buffer size, and this size is recorded by the
+  corresponding ShareBuffer.  The buffer size of the
+  ArrayNotificationBuffer is the maximum of all of its ShareBuffers.
+  When a ShareBuffer is added or removed, the ArrayNotificationBuffer
+  size is adjusted accordingly.
+
+  An ArrayNotificationBuffer also has a BufferListener (which is a
+  NotificationListener) registered on every NotificationBroadcaster
+  MBean in the MBeanServer to which it is attached.  The cost of this
+  potentially large set of listeners is the principal motivation for
+  sharing the ArrayNotificationBuffer between ConnectorServers, and
+  also the reason that we are careful to discard the
+  ArrayNotificationBuffer (and its BufferListeners) when there are no
+  longer any ConnectorServers using it.
+
+  The synchronization of this class is inherently complex.  In an attempt
+  to limit the complexity, we use just two locks:
+
+  - globalLock controls access to the mapping between an MBeanServer
+    and its ArrayNotificationBuffer and to the set of ShareBuffers for
+    each ArrayNotificationBuffer.
+  
+  - the instance lock of each ArrayNotificationBuffer controls access
+    to the array of notifications, including its size, and to the
+    dispose flag of the ArrayNotificationBuffer.  The wait/notify
+    mechanism is used to indicate changes to the array.
+
+  If both locks are held at the same time, the globalLock must be
+  taken first.
+
+  Since adding or removing a BufferListener to an MBean can involve
+  calling user code, we are careful not to hold any locks while it is
+  done.
+ */
 public class ArrayNotificationBuffer implements NotificationBuffer {
-    
     private boolean disposed = false;
-    
+
     // FACTORY STUFF, INCLUDING SHARING
-    
+
+    private static final Object globalLock = new Object();
     private static final
 	HashMap<MBeanServer,ArrayNotificationBuffer> mbsToBuffer =
 	new HashMap<MBeanServer,ArrayNotificationBuffer>(1);
     private final Collection<ShareBuffer> sharers = new HashSet<ShareBuffer>(1);
 
-    public static synchronized NotificationBuffer
-	    getNotificationBuffer(MBeanServer mbs, Map env) {
-	
-	//Find out queue size	
+    public static NotificationBuffer getNotificationBuffer(
+            MBeanServer mbs, Map env) {
+
+        if (env == null)
+            env = Collections.emptyMap();
+
+	//Find out queue size
 	int queueSize = EnvHelp.getNotifBufferSize(env);
-	
-	ArrayNotificationBuffer buf = mbsToBuffer.get(mbs);
-	if (buf == null) {
-	    buf = new ArrayNotificationBuffer(mbs, queueSize);
-	    mbsToBuffer.put(mbs, buf);
-	}
-	return buf.new ShareBuffer(queueSize);
-    }
-    
-    public static synchronized void removeNotificationBuffer(MBeanServer mbs) {
-	mbsToBuffer.remove(mbs);
-    }
-    
-    synchronized void addSharer(ShareBuffer sharer) {
-	if (sharer.getSize() > queueSize)
-	    resize(sharer.getSize());
-	sharers.add(sharer);
+
+        ArrayNotificationBuffer buf;
+        boolean create;
+        NotificationBuffer sharer;
+        synchronized (globalLock) {
+            buf = mbsToBuffer.get(mbs);
+            create = (buf == null);
+            if (create) {
+                buf = new ArrayNotificationBuffer(mbs, queueSize);
+                mbsToBuffer.put(mbs, buf);
+            }
+            sharer = buf.new ShareBuffer(queueSize);
+        }
+        /* We avoid holding any locks while calling createListeners.
+         * This prevents possible deadlocks involving user code, but
+         * does mean that a second ConnectorServer created and started
+         * in this window will return before all the listeners are ready,
+         * which could lead to surprising behaviour.  The alternative
+         * would be to block the second ConnectorServer until the first
+         * one has finished adding all the listeners, but that would then
+         * be subject to deadlock.
+         */
+        if (create)
+            buf.createListeners();
+        return sharer;
     }
 
-    void removeSharer(ShareBuffer sharer) {
+    /* Ensure that this buffer is no longer the one that will be returned by
+     * getNotificationBuffer.  This method is idempotent - calling it more
+     * than once has no effect beyond that of calling it once.
+     */
+    static void removeNotificationBuffer(MBeanServer mbs) {
+        synchronized (globalLock) {
+            mbsToBuffer.remove(mbs);
+        }
+    }
+
+    void addSharer(ShareBuffer sharer) {
+        synchronized (globalLock) {
+            synchronized (this) {
+                if (sharer.getSize() > queueSize)
+                    resize(sharer.getSize());
+            }
+            sharers.add(sharer);
+        }
+    }
+
+    private void removeSharer(ShareBuffer sharer) {
         boolean empty;
-        synchronized (this) {
+        synchronized (globalLock) {
             sharers.remove(sharer);
             empty = sharers.isEmpty();
-            if (!empty) {
+            if (empty)
+                removeNotificationBuffer(mBeanServer);
+            else {
                 int max = 0;
                 for (ShareBuffer buf : sharers) {
                     int bufsize = buf.getSize();
@@ -112,11 +192,17 @@
                     resize(max);
             }
         }
-        if (empty)
-            dispose();
+        if (empty) {
+            synchronized (this) {
+                disposed = true;
+                // Notify potential waiting fetchNotification call
+                notifyAll();
+            }
+            destroyListeners();
+        }
     }
 
-    private void resize(int newSize) {
+    private synchronized void resize(int newSize) {
 	if (newSize == queueSize)
 	    return;
 	while (queue.size() > newSize)
@@ -169,8 +255,6 @@
         this.earliestSequenceNumber = System.currentTimeMillis();
         this.nextSequenceNumber = this.earliestSequenceNumber;
 
-        createListeners();
-
         logger.trace("Constructor", "ends");
     }
 
@@ -178,19 +262,11 @@
 	return disposed;
     }
 
+    // We no longer support calling this method from outside.
+    // The JDK doesn't contain any such calls and users are not
+    // supposed to be accessing this class.
     public void dispose() {
-        logger.trace("dispose", "starts");
-
-	synchronized(this) {
-	    removeNotificationBuffer(mBeanServer);
-	    disposed = true;
-	    //Notify potential waiting fetchNotification call
-	    notifyAll();
-	}
-
-        destroyListeners();
-	
-        logger.trace("dispose", "ends");
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -231,12 +307,12 @@
 
 	if (startSequenceNumber < 0 || isDisposed()) {
 	    synchronized(this) {
-		return new NotificationResult(earliestSequenceNumber(), 
-					      nextSequenceNumber(), 
+		return new NotificationResult(earliestSequenceNumber(),
+					      nextSequenceNumber(),
 					      new TargetedNotification[0]);
 	    }
 	}
-	
+
         // Check arg validity
         if (filter == null
             || startSequenceNumber < 0 || timeout < 0
@@ -290,7 +366,7 @@
             /* Get the next available notification regardless of filters,
                or wait for one to arrive if there is none.  */
             synchronized (this) {
-		
+
                 /* First time through.  The current earliestSequenceNumber
                    is the first one we could have examined.  */
                 if (earliestSeq < 0) {
@@ -301,7 +377,7 @@
                     }
                     if (nextSeq < earliestSeq) {
                         nextSeq = earliestSeq;
-                        logger.debug("fetchNotifications", 
+                        logger.debug("fetchNotifications",
 				     "nextSeq=earliestSeq");
                     }
                 } else
@@ -322,9 +398,9 @@
                 if (nextSeq < nextSequenceNumber()) {
                     candidate = notificationAt(nextSeq);
                     if (logger.debugOn()) {
-                        logger.debug("fetchNotifications", "candidate: " + 
+                        logger.debug("fetchNotifications", "candidate: " +
 				     candidate);
-                        logger.debug("fetchNotifications", "nextSeq now " + 
+                        logger.debug("fetchNotifications", "nextSeq now " +
 				     nextSeq);
                     }
                 } else {
@@ -342,26 +418,26 @@
                         logger.debug("fetchNotifications", "timeout");
                         break;
                     }
-		    
+
 		    /* dispose called */
 		    if (isDisposed()) {
 			if (logger.debugOn())
-			    logger.debug("fetchNotifications", 
+			    logger.debug("fetchNotifications",
 					 "dispose callled, no wait");
 			return new NotificationResult(earliestSequenceNumber(),
-						  nextSequenceNumber(), 
+						  nextSequenceNumber(),
 						  new TargetedNotification[0]);
 		    }
-		    
+
 		    if (logger.debugOn())
-			logger.debug("fetchNotifications", 
+			logger.debug("fetchNotifications",
 				     "wait(" + toWait + ")");
 		    wait(toWait);
-		    
+
                     continue;
                 }
             }
-	    
+
             /* We have a candidate notification.  See if it matches
                our filters.  We do this outside the synchronized block
                so we don't hold up everyone accessing the buffer
@@ -371,7 +447,7 @@
             Notification notif = candidate.getNotification();
             List<TargetedNotification> matchedNotifs =
                 new ArrayList<TargetedNotification>();
-            logger.debug("fetchNotifications", 
+            logger.debug("fetchNotifications",
 			 "applying filter to candidate");
             filter.apply(matchedNotifs, name, notif);
 
@@ -382,13 +458,13 @@
                    interesting notifications when in fact we knew they
                    weren't.  */
                 if (maxNotifications <= 0) {
-                    logger.debug("fetchNotifications", 
+                    logger.debug("fetchNotifications",
 				 "reached maxNotifications");
                     break;
                 }
                 --maxNotifications;
                 if (logger.debugOn())
-                    logger.debug("fetchNotifications", "add: " + 
+                    logger.debug("fetchNotifications", "add: " +
 				 matchedNotifs);
                 notifs.addAll(matchedNotifs);
             }
@@ -509,7 +585,7 @@
      */
     private void createListeners() {
         logger.debug("createListeners", "starts");
-        
+
         synchronized (this) {
             createdDuringQuery = new HashSet<ObjectName>();
         }
@@ -543,6 +619,7 @@
     }
 
     private void addBufferListener(ObjectName name) {
+        checkNoLocks();
         if (logger.debugOn())
             logger.debug("addBufferListener", name.toString());
         try {
@@ -554,8 +631,9 @@
                throw unexpected exception.  */
         }
     }
-    
+
     private void removeBufferListener(ObjectName name) {
+        checkNoLocks();
         if (logger.debugOn())
             logger.debug("removeBufferListener", name.toString());
         try {
@@ -564,7 +642,7 @@
             logger.trace("removeBufferListener", e);
         }
     }
-    
+
     private void addNotificationListener(final ObjectName name,
                                          final NotificationListener listener,
                                          final NotificationFilter filter,
@@ -584,7 +662,7 @@
             throw extractException(e);
         }
     }
-    
+
     private void removeNotificationListener(final ObjectName name,
                                             final NotificationListener listener)
             throws Exception {
@@ -599,7 +677,7 @@
             throw extractException(e);
         }
     }
-    
+
     private Set<ObjectName> queryNames(final ObjectName name,
                                        final QueryExp query) {
         PrivilegedAction<Set<ObjectName>> act =
@@ -616,7 +694,7 @@
             throw e;
         }
     }
-    
+
     private static boolean isInstanceOf(final MBeanServer mbs,
                                         final ObjectName name,
                                         final String className) {
@@ -654,7 +732,7 @@
         ObjectName name = n.getMBeanName();
         if (logger.debugOn())
             logger.debug("createdNotification", "for: " + name);
-        
+
         synchronized (this) {
             if (createdDuringQuery != null) {
                 createdDuringQuery.add(name);
@@ -710,6 +788,7 @@
 	};
 
     private void destroyListeners() {
+        checkNoLocks();
         logger.debug("destroyListeners", "starts");
         try {
             removeNotificationListener(MBeanServerDelegate.DELEGATE_NAME,
@@ -720,12 +799,17 @@
         Set<ObjectName> names = queryNames(null, broadcasterQuery);
         for (final ObjectName name : names) {
             if (logger.debugOn())
-                logger.debug("destroyListeners", 
+                logger.debug("destroyListeners",
 			     "remove listener from " + name);
             removeBufferListener(name);
         }
         logger.debug("destroyListeners", "ends");
     }
+    
+    private void checkNoLocks() {
+        if (Thread.holdsLock(this) || Thread.holdsLock(globalLock))
+            logger.warning("checkNoLocks", "lock protocol violation");
+    }
 
     /**
      * Iterate until we extract the real exception
@@ -733,7 +817,7 @@
      */
     private static Exception extractException(Exception e) {
         while (e instanceof PrivilegedActionException) {
-            e = ((PrivilegedActionException)e).getException(); 
+            e = ((PrivilegedActionException)e).getException();
         }
         return e;
     }
--- a/j2se/src/share/classes/com/sun/jmx/remote/util/Service.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,349 +0,0 @@
-/*
- * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-package com.sun.jmx.remote.util;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.TreeSet;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import com.sun.jmx.mbeanserver.Util;
-
-/**
- * EXTRACTED FROM sun.misc.Service
- * A simple service-provider lookup mechanism.  A <i>service</i> is a
- * well-known set of intjavax.management.remoteerfaces and (usually abstract) classes.  A <i>service
- * provider</i> is a specific implementation of a service.  The classes in a
- * provider typically implement the interfaces and subclass the classes defined
- * in the service itself.  Service providers may be installed in an
- * implementation of the Java platform in the form of extensions, that is, jar
- * files placed into any of the usual extension directories.  Providers may
- * also be made available by adding them to the applet or application class
- * path or by some other platform-specific means.
- *
- * <p> In this lookup mechanism a service is represented by an interface or an
- * abstract class.  (A concrete class may be used, but this is not
- * recommended.)  A provider of a given service contains one or more concrete
- * classes that extend this <i>service class</i> with data and code specific to
- * the provider.  This <i>provider class</i> will typically not be the entire
- * provider itself but rather a proxy that contains enough information to
- * decide whether the provider is able to satisfy a particular request together
- * with code that can create the actual provider on demand.  The details of
- * provider classes tend to be highly service-specific; no single class or
- * interface could possibly unify them, so no such class has been defined.  The
- * only requirement enforced here is that provider classes must have a
- * zero-argument constructor so that they may be instantiated during lookup.
- *
- * <p> A service provider identifies itself by placing a provider-configuration
- * file in the resource directory <tt>META-INF/services</tt>.  The file's name
- * should consist of the fully-qualified name of the abstract service class.
- * The file should contain a list of fully-qualified concrete provider-class
- * names, one per line.  Space and tab characters surrounding each name, as
- * well as blank lines, are ignored.  The comment character is <tt>'#'</tt>
- * (<tt>0x23</tt>); on each line all characters following the first comment
- * character are ignored.  The file must be encoded in UTF-8.
- *
- * <p> If a particular concrete provider class is named in more than one
- * configuration file, or is named in the same configuration file more than
- * once, then the duplicates will be ignored.  The configuration file naming a
- * particular provider need not be in the same jar file or other distribution
- * unit as the provider itself.  The provider must be accessible from the same
- * class loader that was initially queried to locate the configuration file;
- * note that this is not necessarily the class loader that found the file.
- *
- * <p> <b>Example:</b> Suppose we have a service class named
- * <tt>java.io.spi.CharCodec</tt>.  It has two abstract methods:
- *
- * <pre>
- *   public abstract CharEncoder getEncoder(String encodingName);
- *   public abstract CharDecoder getDecoder(String encodingName);
- * </pre>
- *
- * Each method returns an appropriate object or <tt>null</tt> if it cannot
- * translate the given encoding.  Typical <tt>CharCodec</tt> providers will
- * support more than one encoding.
- *
- * <p> If <tt>sun.io.StandardCodec</tt> is a provider of the <tt>CharCodec</tt>
- * service then its jar file would contain the file
- * <tt>META-INF/services/java.io.spi.CharCodec</tt>.  This file would contain
- * the single line:
- *
- * <pre>
- *   sun.io.StandardCodec    # Standard codecs for the platform
- * </pre>
- *
- * To locate an encoder for a given encoding name, the internal I/O code would
- * do something like this:
- *
- * <pre>
- *   CharEncoder getEncoder(String encodingName) {
- *       Iterator ps = Service.providers(CharCodec.class);
- *       while (ps.hasNext()) {
- *           CharCodec cc = (CharCodec)ps.next();
- *           CharEncoder ce = cc.getEncoder(encodingName);
- *           if (ce != null)
- *               return ce;
- *       }
- *       return null;
- *   }
- * </pre>
- *
- * The provider-lookup mechanism always executes in the security context of the
- * caller.  Trusted system code should typically invoke the methods in this
- * class from within a privileged security context.
- *
- */
-
-public final class Service {
-
-    private static final String prefix = "META-INF/services/";
-
-    private Service() { }
-
-    private static void fail(Class service, String msg, Throwable cause)
-	throws IllegalArgumentException
-    {
-	IllegalArgumentException sce
-	    = new IllegalArgumentException(service.getName() + ": " + msg);
-	
-	throw EnvHelp.initCause(sce, cause);
-    }
-
-    private static void fail(Class service, String msg)
-	throws IllegalArgumentException
-    {
-	throw new IllegalArgumentException(service.getName() + ": " + msg);
-    }
-
-    private static void fail(Class service, URL u, int line, String msg)
-	throws IllegalArgumentException
-    {
-	fail(service, u + ":" + line + ": " + msg);
-    }
-
-    /**
-     * Parse a single line from the given configuration file, adding the name
-     * on the line to both the names list and the returned set if and only if the name is
-     * not already a member of the returned set.
-     */
-    private static int parseLine(Class service, URL u, BufferedReader r, int lc,
-				 List<String> names, Set<String> returned)
-	throws IOException, IllegalArgumentException
-    {
-	String ln = r.readLine();
-	if (ln == null) {
-	    return -1;
-	}
-	int ci = ln.indexOf('#');
-	if (ci >= 0) ln = ln.substring(0, ci);
-	ln = ln.trim();
-	int n = ln.length();
-	if (n != 0) {
-	    if ((ln.indexOf(' ') >= 0) || (ln.indexOf('\t') >= 0))
-		fail(service, u, lc, "Illegal configuration-file syntax");
-	    if (!Character.isJavaIdentifierStart(ln.charAt(0)))
-		fail(service, u, lc, "Illegal provider-class name: " + ln);
-	    for (int i = 1; i < n; i++) {
-		char c = ln.charAt(i);
-		if (!Character.isJavaIdentifierPart(c) && (c != '.'))
-		    fail(service, u, lc, "Illegal provider-class name: " + ln);
-	    }
-	    if (!returned.contains(ln)) {
-		names.add(ln);
-		returned.add(ln);
-	    }
-	}
-	return lc + 1;
-    }
-
-    /**
-     * Parse the content of the given URL as a provider-configuration file.
-     *
-     * @param  service
-     *         The service class for which providers are being sought;
-     *         used to construct error detail strings
-     *
-     * @param  url
-     *         The URL naming the configuration file to be parsed
-     *
-     * @param  returned
-     *         A Set containing the names of provider classes that have already
-     *         been returned.  This set will be updated to contain the names
-     *         that will be yielded from the returned <tt>Iterator</tt>.
-     *
-     * @return A (possibly empty) <tt>Iterator</tt> that will yield the
-     *         provider-class names in the given configuration file that are
-     *         not yet members of the returned set
-     *
-     * @throws IllegalArgumentException
-     *         If an I/O error occurs while reading from the given URL, or
-     *         if a configuration-file format error is detected
-     */
-    private static Iterator<String> parse(Class service, URL u, Set<String> returned)
-	throws IllegalArgumentException
-    {
-	InputStream in = null;
-	BufferedReader r = null;
-	List<String> names = new ArrayList<String>();
-	try {
-	    in = u.openStream();
-	    r = new BufferedReader(new InputStreamReader(in, "utf-8"));
-	    int lc = 1;
-	    while ((lc = parseLine(service, u, r, lc, names, returned)) >= 0);
-	} catch (IOException x) {
-	    fail(service, ": " + x);
-	} finally {
-	    try {
-		if (r != null) r.close();
-		if (in != null) in.close();
-	    } catch (IOException y) {
-		fail(service, ": " + y);
-	    }
-	}
-	return names.iterator();
-    }
-
-
-    /**
-     * Private inner class implementing fully-lazy provider lookup
-     */
-    private static class LazyIterator<T> implements Iterator<T> {
-
-	Class<T> service;
-	ClassLoader loader;
-	Enumeration configs = null;
-	Iterator pending = null;
-	Set<String> returned = new TreeSet<String>();
-	String nextName = null;
-
-	private LazyIterator(Class<T> service, ClassLoader loader) {
-	    this.service = service;
-	    this.loader = loader;
-	}
-
-	public boolean hasNext() throws IllegalArgumentException {
-	    if (nextName != null) {
-		return true;
-	    }
-	    if (configs == null) {
-		try {
-		    String fullName = prefix + service.getName();
-		    if (loader == null)
-			configs = ClassLoader.getSystemResources(fullName);
-		    else
-			configs = loader.getResources(fullName);
-		} catch (IOException x) {
-		    fail(service, ": " + x);
-		}
-	    }
-	    while ((pending == null) || !pending.hasNext()) {
-		if (!configs.hasMoreElements()) {
-		    return false;
-		}
-		pending = parse(service, (URL)configs.nextElement(), returned);
-	    }
-	    nextName = (String)pending.next();
-	    return true;
-	}
-
-        public T next() throws IllegalArgumentException {
-	    if (!hasNext()) {
-		throw new NoSuchElementException();
-	    }
-	    String cn = nextName;
-	    nextName = null;
-	    try {
-		return Util.<T>cast(Class.forName(cn, true, loader).newInstance());
-	    } catch (ClassNotFoundException x) {
-		fail(service,
-		     "Provider " + cn + " not found");
-	    } catch (Exception x) {
-		fail(service,
-		     "Provider " + cn + " could not be instantiated: " + x,
-		     x);
-	    }
-	    return null;	/* This cannot happen */
-	}
-
-	public void remove() {
-	    throw new UnsupportedOperationException();
-	}
-
-    }
-
-
-    /**
-     * Locates and incrementally instantiates the available providers of a
-     * given service using the given class loader.
-     *
-     * <p> This method transforms the name of the given service class into a
-     * provider-configuration filename as described above and then uses the
-     * <tt>getResources</tt> method of the given class loader to find all
-     * available files with that name.  These files are then read and parsed to
-     * produce a list of provider-class names.  The iterator that is returned
-     * uses the given class loader to lookup and then instantiate each element
-     * of the list.
-     *
-     * <p> Because it is possible for extensions to be installed into a running
-     * Java virtual machine, this method may return different results each time
-     * it is invoked. <p>
-     *
-     * @param  service
-     *         The service's abstract service class
-     *
-     * @param  loader
-     *         The class loader to be used to load provider-configuration files
-     *         and instantiate provider classes, or <tt>null</tt> if the system
-     *         class loader (or, failing that the bootstrap class loader) is to
-     *         be used
-     * 
-     * @return An <tt>Iterator</tt> that yields provider objects for the given
-     *         service, in some arbitrary order.  The iterator will throw a
-     *         <tt>IllegalArgumentException</tt> if a provider-configuration
-     *         file violates the specified format or if a provider class cannot
-     *         be found and instantiated.
-     *
-     * @throws IllegalArgumentException
-     *         If a provider-configuration file violates the specified format
-     *         or names a provider class that cannot be found and instantiated
-     *
-     */
-    public static <T> Iterator<T> providers(Class<T> service, ClassLoader loader)
-	throws IllegalArgumentException
-    {
-	return new LazyIterator<T>(service, loader);
-    }
-}
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/client/XSLTProcessorApplet.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/client/XSLTProcessorApplet.java	Fri Jun 22 00:46:43 2007 +0000
@@ -246,7 +246,18 @@
    */
   public void start()
   {
-
+      //check if user code's on the stack before invoking the worker thread
+     boolean passed = false;
+     try {
+       java.security.AccessController.checkPermission(new java.security.AllPermission());
+     } catch (SecurityException se) {
+         //expected
+         passed = true;
+     }
+     if (!passed) {
+         throw new SecurityException("The XSLTProcessorApplet class must be extended and its method start() overridden.");
+     } 
+     
     m_trustedAgent = new TrustedAgent();
     Thread currentThread = Thread.currentThread();
     m_trustedWorker = new Thread(currentThread.getThreadGroup(),
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java	Fri Jun 22 00:46:43 2007 +0000
@@ -89,7 +89,7 @@
  * of thing but in a much simpler manner.</p>
  *
  * @author Shane_Curcuru@us.ibm.com
- * @version $Id: EnvironmentCheck.java,v 1.4 2005/08/30 10:06:03 neerajbj Exp $
+ * @version $Id: EnvironmentCheck.java,v 1.7 2006/09/20 06:20:23 jeffsuttor Exp $
  */
 public class EnvironmentCheck
 {
@@ -259,7 +259,7 @@
     boolean errors = false;
 
     logMsg(
-      "#---- BEGIN writeEnvironmentReport($Revision: 1.4 $): Useful stuff found: ----");
+      "#---- BEGIN writeEnvironmentReport($Revision: 1.7 $): Useful stuff found: ----");
 
     // Fake the Properties-like output
     for (Enumeration keys = h.keys(); 
@@ -418,7 +418,7 @@
     try
     {
       Element envCheckNode = factory.createElement("EnvironmentCheck");
-      envCheckNode.setAttribute("version", "$Revision: 1.4 $");
+      envCheckNode.setAttribute("version", "$Revision: 1.7 $");
       container.appendChild(envCheckNode);
 
       if (null == h)
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java	Fri Jun 22 00:46:43 2007 +0000
@@ -76,6 +76,8 @@
                 if (input != null) {
                     docToLoad = input.getSystemId();
                     reader = xsltc.getXMLReader();
+                } else if (parser.errorsFound()) {
+                    return;
                 }
 	    }
 
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java	Fri Jun 22 00:46:43 2007 +0000
@@ -77,6 +77,8 @@
                 if (input != null) {
                     docToLoad = input.getSystemId();
                     reader = xsltc.getXMLReader();
+                } else if (parser.errorsFound()) {
+                    return;
                 }
 	    }
 
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Param.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Param.java	Fri Jun 22 00:46:43 2007 +0000
@@ -126,9 +126,11 @@
 		// Ignore this if previous definition has higher precedence
 		else if (them > us) {
 		    _ignore = true;
+                    copyReferences(param);
 		    return;
 		}
 		else {
+                    param.copyReferences(this);
 		    param.disable();
 		}
 	    }
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Step.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Step.java	Fri Jun 22 00:46:43 2007 +0000
@@ -413,7 +413,7 @@
 	    else if (predicate.isNthDescendant()) {
 		il.append(methodGen.loadDOM());
 		// il.append(new ICONST(NodeTest.ELEMENT));
-		il.append(new ICONST(predicate.getPosType()));
+                il.append(new PUSH(cpg, predicate.getPosType()));
 		predicate.translate(classGen, methodGen);
 		il.append(new ICONST(0));
 		idx = cpg.addInterfaceMethodref(DOM_INTF,
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1000,17 +1000,24 @@
 
 	toplevel.addException("com.sun.org.apache.xalan.internal.xsltc.TransletException");
 
+	final int setFilter = cpg.addInterfaceMethodref(DOM_INTF,
+			       "setFilter",
+			       "(Lcom/sun/org/apache/xalan/internal/xsltc/StripFilter;)V");
+
 	// Define and initialize 'current' variable with the root node
 	final LocalVariableGen current = 
 	    toplevel.addLocalVariable("current",
 				    com.sun.org.apache.bcel.internal.generic.Type.INT,
 				    il.getEnd(), null);
 
-	final int setFilter = cpg.addInterfaceMethodref(DOM_INTF,
-			       "setFilter",
-			       "(Lcom/sun/org/apache/xalan/internal/xsltc/StripFilter;)V");
-
-	il.append(new PUSH(cpg, DTM.ROOT_NODE));
+        // Get root node from main DOM by calling dom.getIterator().next()
+        final int gitr = cpg.addInterfaceMethodref(DOM_INTF,
+                                                   "getIterator", "()"+NODE_ITERATOR_SIG);
+        final int next = cpg.addInterfaceMethodref(NODE_ITERATOR,
+                                                   "next", "()I");
+        il.append(toplevel.loadDOM());
+        il.append(new INVOKEINTERFACE(gitr, 1));
+        il.append(new INVOKEINTERFACE(next, 1));
 	il.append(new ISTORE(current.getIndex()));
 
         // Create a new list containing variables/params + keys
@@ -1263,10 +1270,6 @@
 	//store to _dom variable
 	il.append(new PUTFIELD(domField));
 
-	// continue with globals initialization
-	il.append(new PUSH(cpg, DTM.ROOT_NODE));
-	il.append(new ISTORE(current.getIndex()));
-
 	// Transfer the output settings to the output post-processor
 	il.append(classGen.loadTranslet());
 	il.append(transf.loadHandler());
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Variable.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Variable.java	Fri Jun 22 00:46:43 2007 +0000
@@ -72,9 +72,11 @@
 		// Ignore this if previous definition has higher precedence
 		else if (them > us) {
 		    _ignore = true;
+                    copyReferences(var);
 		    return;
 		}
 		else {
+                    var.copyReferences(this);
 		    var.disable();
 		}
 		// Add this variable if we have higher precedence
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/VariableBase.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/VariableBase.java	Fri Jun 22 00:46:43 2007 +0000
@@ -90,6 +90,19 @@
     public void removeReference(VariableRefBase vref) {
 	_refs.remove(vref);
     }
+    
+    /**
+     * When a variable is overriden by another, e.g. via xsl:import,
+     * its references need to be copied or otherwise it may be 
+     * compiled away as dead code. This method can be used for that
+     * purpose.
+     */
+    public void copyReferences(VariableBase var) {
+        final int size = _refs.size();
+        for (int i = 0; i < size; i++) {
+            var.addReference((VariableRefBase) _refs.get(i));
+        }
+    }
 
     /**
      * Map this variable to a register
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/Type.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/Type.java	Fri Jun 22 00:46:43 2007 +0000
@@ -67,6 +67,9 @@
             return Type.ObjectString;
         } 
         else {
+            //
+            java.security.AccessControlContext acc = java.security.AccessController.getContext();
+            acc.checkPermission(new RuntimePermission("getContextClassLoader"));
             return new ObjectType(javaClassName);
         }
     }
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/dom/AdaptiveResultTreeImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/dom/AdaptiveResultTreeImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -27,7 +27,6 @@
 import com.sun.org.apache.xalan.internal.xsltc.StripFilter;
 import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
 import com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;
-import com.sun.org.apache.xalan.internal.xsltc.runtime.AttributeList;
 
 import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
 import com.sun.org.apache.xml.internal.dtm.DTMAxisTraverser;
@@ -41,6 +40,7 @@
 import org.w3c.dom.NodeList;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
 
 /**
  * AdaptiveResultTreeImpl is a adaptive DOM model for result tree fragments (RTF). It is
@@ -94,7 +94,7 @@
     private boolean _buildIdIndex;
     
     // The AttributeList
-    private final AttributeList  _attributes = new AttributeList();
+    private final AttributesImpl _attributes = new AttributesImpl();
     
     // The element name
     private String _openElementName;
@@ -688,13 +688,14 @@
         addAttribute(qName, value); 
     }
 
-    public void addAttribute(String name, String value)
+    public void addAttribute(String uri, String localName, String qname,
+            String type, String value)
     {    
 	if (_openElementName != null) {
-	    _attributes.add(name, value);
+	    _attributes.addAttribute(uri, localName, qname, type, value);
 	}
 	else {
-	    BasisLibrary.runTimeError(BasisLibrary.STRAY_ATTRIBUTE_ERR, name);
+	    BasisLibrary.runTimeError(BasisLibrary.STRAY_ATTRIBUTE_ERR, qname);
 	}
     }
 
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet.java	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,7 @@
 package com.sun.org.apache.xalan.internal.xsltc.runtime;
 
 import java.io.File;
-import java.io.FileWriter;
+import java.io.FileOutputStream;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
 import java.util.ArrayList;
@@ -555,7 +555,7 @@
 
 	    factory.setEncoding(_encoding);
 	    factory.setOutputMethod(_method);
-	    factory.setWriter(new FileWriter(filename, append));
+	    factory.setOutputStream(new FileOutputStream(filename, append));
 	    factory.setOutputType(TransletOutputHandlerFactory.STREAM);
 
 	    final SerializationHandler handler 
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1427,9 +1427,12 @@
     /**
      * This function is used in the execution of xsl:element
      */
-    private static int prefixIndex = 0;		// not thread safe!!
+    private static int prefixIndex = 0;
+    
     public static String generatePrefix() {
-	return ("ns" + prefixIndex++);
+        synchronized (BasisLibrary.class) {
+            return ("ns" + prefixIndex++);
+        }
     }
 
     public static final String RUN_TIME_INTERNAL_ERR =
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java	Fri Jun 22 00:46:43 2007 +0000
@@ -45,6 +45,7 @@
 import org.xml.sax.ext.LexicalHandler;
 import org.xml.sax.helpers.AttributesImpl;
 import com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;
 
 /**
  * @author G. Todd Miller 
@@ -243,7 +244,7 @@
 	    // Process all other attributes
 	    for (int i = 0; i < length; i++) {
 		final Node attr = map.item(i);
-		final String qnameAttr = attr.getNodeName();
+		String qnameAttr = attr.getNodeName();
 
 		// Ignore NS declarations here
 		if (!qnameAttr.startsWith(XMLNS_PREFIX)) {
@@ -253,7 +254,15 @@
 		    // Uri may be implicitly declared
 		    if (uriAttr != null) {	
 			final int colon = qnameAttr.lastIndexOf(':');
-			prefix = (colon > 0) ? qnameAttr.substring(0, colon) : EMPTYSTRING;
+                        if (colon > 0) {
+                            prefix = qnameAttr.substring(0, colon);
+                        }
+                        else {
+                            // If no prefix for this attr, we need to create 
+                            // one because we cannot use the default ns
+                            prefix = BasisLibrary.generatePrefix();
+                            qnameAttr = prefix + ':' + qnameAttr;
+                        }
 			if (startPrefixMapping(prefix, uriAttr)) {
 			    pushedPrefixes.addElement(prefix);
 			}
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SAX2DOM.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SAX2DOM.java	Fri Jun 22 00:46:43 2007 +0000
@@ -59,11 +59,19 @@
     private Node _lastSibling = null;
     private Locator locator = null;
     private boolean needToSetDocumentInfo = true;
+    
+    /**
+     * JAXP document builder factory. Create a single instance and use
+     * synchronization because the Javadoc is not explicit about 
+     * thread safety.
+     */
+    static final DocumentBuilderFactory _factory =
+            DocumentBuilderFactory.newInstance();
             
     public SAX2DOM() throws ParserConfigurationException {
-	final DocumentBuilderFactory factory =
-		DocumentBuilderFactory.newInstance();
-	_document = factory.newDocumentBuilder().newDocument();
+        synchronized (SAX2DOM.class) {
+          _document = _factory.newDocumentBuilder().newDocument();
+        }
 	_root = _document;
     }
 
@@ -76,9 +84,9 @@
 	  _document = root.getOwnerDocument();
 	}
 	else {
-	  final DocumentBuilderFactory factory = 
-		DocumentBuilderFactory.newInstance();
-	  _document = factory.newDocumentBuilder().newDocument();
+          synchronized (SAX2DOM.class) {
+              _document = _factory.newDocumentBuilder().newDocument();
+          }
 	  _root = _document;
 	}
 	
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SAX2StAXEventWriter.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SAX2StAXEventWriter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -129,9 +129,25 @@
         // is called for first time. So, defer START_DOCUMENT event of StAX till
         // that point of time.
         needToCallStartDocument = true;
-        
+    }        
+
+    private void writeStartDocument() throws SAXException {        
+        try {
+            if (docLocator == null)
+                writer.add(eventFactory.createStartDocument());
+            else {
+                try{
+                    writer.add(eventFactory.createStartDocument(((Locator2)docLocator).getEncoding(),((Locator2)docLocator).getXMLVersion()));
+                } catch(ClassCastException e){
+                    writer.add(eventFactory.createStartDocument());
+                }
+            }
+        } catch (XMLStreamException e) {
+            throw new SAXException(e);
+        }
+        needToCallStartDocument = false;
     }
-
+    
     public void endDocument() throws SAXException {
 
         eventFactory.setLocation(getCurrentLocation());
@@ -153,28 +169,10 @@
 
     }
 
-    public void startElement(String uri, String localName, String qName,
-            Attributes attributes) throws SAXException {
+    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
         
-        if (needToCallStartDocument){
-            try {
-                
-                if (docLocator == null)
-                    writer.add(eventFactory.createStartDocument());
-                else {
-                    try{
-                        writer.add(eventFactory.createStartDocument(((Locator2)docLocator).getEncoding(),((Locator2)docLocator).getXMLVersion()));
-                    }catch(ClassCastException e){
-                        writer.add(eventFactory.createStartDocument());
-                    }
-                }
-                
-            } catch (XMLStreamException e) {
-
-                throw new SAXException(e);
-
-            }
-            needToCallStartDocument = false;
+        if (needToCallStartDocument) {
+            writeStartDocument();
         }
         
         // set document location
@@ -184,7 +182,6 @@
         Collection[] events = {null, null};
         createStartEvents(attributes, events);
 
-
         namespaceStack.add(events[0]);
 
         try {
@@ -236,6 +233,12 @@
     }
 
     public void comment(char[] ch, int start, int length) throws SAXException {
+        if (needToCallStartDocument) {
+            // Drat. We were trying to postpone this until the first element so that we could get
+            // the locator, but we can't output a comment before the start document, so we're just
+            // going to have to do without the locator if it hasn't been set yet.
+            writeStartDocument();
+        }
 
         super.comment(ch, start, length);
 
@@ -287,6 +290,13 @@
     public void processingInstruction(String target, String data)
             throws SAXException {
 
+        if (needToCallStartDocument) {
+            // Drat. We were trying to postpone this until the first element so that we could get
+            // the locator, but we can't output a PI before the start document, so we're just
+            // going to have to do without the locator if it hasn't been set yet.
+            writeStartDocument();
+        }
+        
         super.processingInstruction(target, data);
         try {
 
@@ -325,22 +335,16 @@
 
         // create namespaces
         if (namespaces != null) {
-
             final int nDecls = namespaces.size();
-                for (int i = 0; i < nDecls; i++) {
-                    final String prefix = (String) namespaces.elementAt(i);
-                    String uri = (String) namespaces.elementAt(i++);
+            for (int i = 0; i < nDecls; i++) {
+                final String prefix = (String) namespaces.elementAt(i++);
+                String uri = (String) namespaces.elementAt(i);
                 Namespace ns = createNamespace(prefix, uri);
                 if (nsMap == null) {
-
                     nsMap = new HashMap();
-
                 }
                 nsMap.put(prefix, ns);
-
-                
             }
-
         }
 
         // create attributes
@@ -357,21 +361,16 @@
             String attrURI = attributes.getURI(i);
 
             if ("xmlns".equals(attrQName) || "xmlns".equals(attrPrefix)) {
-
                 // namespace declaration disguised as an attribute. If the
                 // namespace has already been declared, skip it, otherwise
                 // write it as an namespace
-
-                if (!nsMap.containsKey(attrPrefix)) {
-
-                    Namespace ns = createNamespace(attrPrefix, attrValue);
-                    if (nsMap == null) {
+                if (nsMap == null) {
+                    nsMap = new HashMap();
+                }
 
-                        nsMap = new HashMap();
-
-                    }
-                    nsMap.put(attrPrefix, ns);
-
+                if (!nsMap.containsKey(attrLocal)) {
+                    Namespace ns = createNamespace(attrLocal, attrValue);
+                    nsMap.put(attrLocal, ns);
                 }
 
             } else {
@@ -397,7 +396,6 @@
                 attrs.add(attribute);
 
             }
-
         }
 
         events[0] = (nsMap == null ? Collections.EMPTY_LIST : nsMap.values());
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/StAXEvent2SAX.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/StAXEvent2SAX.java	Fri Jun 22 00:46:43 2007 +0000
@@ -142,6 +142,7 @@
         try {
             // remembers the nest level of elements to know when we are done.
             int depth=0;
+            boolean startedAtDocument = false;
 
             XMLEvent event = staxEventReader.peek();
 
@@ -149,19 +150,42 @@
                 throw new IllegalStateException();
             }
 
-            // if the parser is on START_DOCUMENT, skip ahead to the first element
-            while( !event.isStartElement() ) {
-                if (event.getEventType() == XMLStreamConstants.START_DOCUMENT){
-                    version = ((StartDocument)event).getVersion();
-                    if (((StartDocument)event).encodingSet())
-                        encoding = ((StartDocument)event).getCharacterEncodingScheme();
-                }
-                
-                event = staxEventReader.nextEvent();
+            if (event.getEventType() == XMLStreamConstants.START_DOCUMENT){
+                startedAtDocument = true;
+                version = ((StartDocument)event).getVersion();
+                if (((StartDocument)event).encodingSet())
+                    encoding = ((StartDocument)event).getCharacterEncodingScheme();
+                event=staxEventReader.nextEvent(); // that gets the one we peeked at
+                event=staxEventReader.nextEvent(); // that really gets the next one
             }
            
             handleStartDocument(event);
 
+            // Handle the prolog: http://www.w3.org/TR/REC-xml/#NT-prolog
+            while (event.getEventType() != XMLStreamConstants.START_ELEMENT) {
+                switch (event.getEventType()) {
+                    case XMLStreamConstants.CHARACTERS :
+                        handleCharacters(event.asCharacters());
+                        break;
+                    case XMLStreamConstants.PROCESSING_INSTRUCTION :
+                        handlePI((ProcessingInstruction)event);
+                        break;
+                    case XMLStreamConstants.COMMENT :
+                        handleComment();
+                        break;
+                    case XMLStreamConstants.DTD :
+                        handleDTD();
+                        break;
+                    case XMLStreamConstants.SPACE :
+                        handleSpace();
+                        break;
+                    default :
+                        throw new InternalError("processing prolog event: " + event);
+                }
+                event=staxEventReader.nextEvent();
+            }
+
+            // Process the (document) element
             do {
                 // These are all of the events listed in the javadoc for
                 // XMLEvent.
@@ -215,6 +239,29 @@
                 event=staxEventReader.nextEvent();
             } while (depth!=0);
 
+            if (startedAtDocument) {
+                // Handle the Misc (http://www.w3.org/TR/REC-xml/#NT-Misc) that can follow the document element
+                while (event.getEventType() != XMLStreamConstants.END_DOCUMENT) {
+                    switch (event.getEventType()) {
+                        case XMLStreamConstants.CHARACTERS :
+                            handleCharacters(event.asCharacters());
+                            break;
+                        case XMLStreamConstants.PROCESSING_INSTRUCTION :
+                            handlePI((ProcessingInstruction)event);
+                            break;
+                        case XMLStreamConstants.COMMENT :
+                            handleComment();
+                            break;
+                        case XMLStreamConstants.SPACE :
+                            handleSpace();
+                            break;
+                        default :
+                            throw new InternalError("processing misc event after document element: " + event);
+                    }
+                    event=staxEventReader.nextEvent();
+                }
+            }
+            
             handleEndDocument();
         } catch (SAXException e) {
             throw new XMLStreamException(e);
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/StAXStream2SAX.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/StAXStream2SAX.java	Fri Jun 22 00:46:43 2007 +0000
@@ -134,17 +134,22 @@
             // remembers the nest level of elements to know when we are done.
             int depth=0;
 
-            // if the parser is at the start tag, proceed to the first element
+            // skip over START_DOCUMENT
             int event = staxStreamReader.getEventType();
-            if(event == XMLStreamConstants.START_DOCUMENT) {
-                 event =  staxStreamReader.nextTag();
-
+            if (event == XMLStreamConstants.START_DOCUMENT) {
+                event = staxStreamReader.next();
             }
-            
+
+            // If not a START_ELEMENT (e.g., a DTD), skip to next tag
+            if (event != XMLStreamConstants.START_ELEMENT) {
+                event = staxStreamReader.nextTag();
+                // An error if a START_ELEMENT isn't found now
+                if (event != XMLStreamConstants.START_ELEMENT) {
+                    throw new IllegalStateException("The current event is " +
+                            "not START_ELEMENT\n but" + event);
+                }            
+            }
                   
-            if( event!=XMLStreamConstants.START_ELEMENT)
-                throw new IllegalStateException("The current event is not START_ELEMENT\n but" + event);
-            
             handleStartDocument();
 
             do {
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -218,22 +218,37 @@
     /**
      * The TransformerFactory must pass us the translet bytecodes using this
      * method before we can create any translet instances
+     *
+     * Note: This method is private for security reasons. See
+     * CR 6537898. When merging with Apache, we must ensure 
+     * that the privateness of this method is maintained (that
+     * is why it wasn't removed).
      */
-    protected synchronized void setTransletBytecodes(byte[][] bytecodes) {
+    private synchronized void setTransletBytecodes(byte[][] bytecodes) {
 	_bytecodes = bytecodes;
     }
 
     /**
      * Returns the translet bytecodes stored in this template
+     *
+     * Note: This method is private for security reasons. See
+     * CR 6537898. When merging with Apache, we must ensure 
+     * that the privateness of this method is maintained (that
+     * is why it wasn't removed).
      */
-    public synchronized byte[][] getTransletBytecodes() {
+    private synchronized byte[][] getTransletBytecodes() {
 	return _bytecodes;
     }
 
     /**
      * Returns the translet bytecodes stored in this template
+     *
+     * Note: This method is private for security reasons. See
+     * CR 6537898. When merging with Apache, we must ensure 
+     * that the privateness of this method is maintained (that
+     * is why it wasn't removed).
      */
-    public synchronized Class[] getTransletClasses() {
+    private synchronized Class[] getTransletClasses() {
 	try {
 	    if (_class == null) defineTransletClasses();
 	}
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -63,6 +63,7 @@
 import com.sun.org.apache.xml.internal.utils.StylesheetPIHandler;
 import com.sun.org.apache.xml.internal.utils.StopParseException;
 
+import com.sun.org.apache.xalan.internal.xsltc.compiler.Constants;
 import com.sun.org.apache.xalan.internal.xsltc.compiler.SourceLoader;
 import com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC;
 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
@@ -1070,9 +1071,12 @@
 		}
 	    }
 	}
-	catch (TransformerException e) {
-	    // Falls through
+	catch (TransformerException e) {            
+	    // should catch it when the resolver explicitly throws the exception 
+            final ErrorMsg msg = new ErrorMsg(ErrorMsg.INVALID_URI_ERR, href + "\n" + e.getMessage(), this);
+            xsltc.getParser().reportError(Constants.FATAL, msg);
 	}
+ 
 	return null;
     }
 
--- a/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -451,7 +451,7 @@
                         if (host != null) {
                          systemId += "//" + host + path;   
                         } else {
-                         systemId += path;   
+                         systemId += "//" + path;   
                         }
                     }
                     catch(ClassNotFoundException e){
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -93,7 +93,7 @@
  * 
  * @author Elena Litani, IBM
  * @author Neeraj Bajaj, Sun Microsystems, inc.
- * @version $Id: DOMNormalizer.java,v 1.2.6.3 2005/09/12 05:16:40 sunithareddy Exp $
+ * @version $Id: DOMNormalizer.java,v 1.5 2007/01/16 17:03:42 jeffsuttor Exp $
  */
 public class DOMNormalizer implements XMLDocumentHandler {
 
@@ -764,6 +764,12 @@
                 uri = attr.getNamespaceURI();
                 if (uri != null && uri.equals(NamespaceContext.XMLNS_URI)) {
                     // namespace attribute
+                    
+                    // "namespace-declarations" == false; Discard all namespace declaration attributes
+                    if ((fConfiguration.features & DOMConfigurationImpl.NSDECL) == 0) {
+                        continue;
+                    }
+
                     value = attr.getNodeValue();
                     if (value == null) {
                         value=XMLSymbols.EMPTY_STRING;
@@ -826,7 +832,12 @@
 
         uri = element.getNamespaceURI();
         prefix = element.getPrefix();
-        if (uri != null) {  // Element has a namespace
+        
+        // "namespace-declarations" == false? Discard all namespace declaration attributes
+        if ((fConfiguration.features & DOMConfigurationImpl.NSDECL) == 0) {
+            // no namespace declaration == no namespace URI, semantics are to keep prefix
+            uri = null;
+        } else if (uri != null) {  // Element has a namespace
             uri = fSymbolTable.addSymbol(uri);
             prefix = (prefix == null || 
                       prefix.length() == 0) ? XMLSymbols.EMPTY_STRING :fSymbolTable.addSymbol(prefix);
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/dom/EntityImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/dom/EntityImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,6 +22,7 @@
 
 import org.w3c.dom.Entity;
 import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
 
 /**
  * Entity nodes hold the reference data for an XML Entity -- either
@@ -56,7 +57,7 @@
  * @xerces.internal
  * 
  * @author Elena Litani, IBM
- * @version $Id: EntityImpl.java,v 1.2.6.1 2005/08/31 12:20:27 sunithareddy Exp $
+ * @version $Id: EntityImpl.java,v 1.5 2007/05/16 22:45:49 joehw Exp $
  * @since PR-DOM-Level-1-19980818.
  */
 public class EntityImpl 
@@ -132,7 +133,32 @@
         }
         return name;
     }
-
+    /**
+     * Sets the node value.
+     * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR)
+     */
+    public void setNodeValue(String x) 
+        throws DOMException {
+        if (ownerDocument.errorChecking && isReadOnly()) {
+            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
+            throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
+        }
+    }
+    /**
+     * The namespace prefix of this node
+     * @exception DOMException
+     *   <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     */
+    
+    public void setPrefix(String prefix)
+        throws DOMException
+    {
+        if (ownerDocument.errorChecking && isReadOnly()) {
+            throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, 
+                  DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, 
+                    "NO_MODIFICATION_ALLOWED_ERR", null));
+        }
+    }    
     /** Clone node. */
     public Node cloneNode(boolean deep) {
         EntityImpl newentity = (EntityImpl)super.cloneNode(deep);
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -48,7 +48,7 @@
     protected static final String STAX_NOTATIONS = "javax.xml.stream.notations";
     protected static final String STAX_ENTITIES = "javax.xml.stream.entities";
     
-    private static final String STRING_INTERNING = "http://xml.org/sax/features/string-interning".intern() ;
+    private static final String STRING_INTERNING = "http://xml.org/sax/features/string-interning";
     
             
     HashMap supportedProps = new HashMap();
@@ -135,10 +135,7 @@
     }
     
     public Object getProperty(String property){
-        if(property == null) return null;
-        if(supportedProps.containsKey(property))
-            return supportedProps.get(property);
-        return null;
+        return supportedProps.get(property);
     }
     
     public void setProperty(String property, Object value){
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -72,7 +72,7 @@
  * @author Arnaud  Le Hors, IBM
  * @author Eric Ye, IBM
  * @author Sunitha Reddy, SUN Microsystems
- * @version $Id: XMLDocumentFragmentScannerImpl.java,v 1.11 2006/08/01 21:27:27 spericas Exp $
+ * @version $Id: XMLDocumentFragmentScannerImpl.java,v 1.13 2007/05/09 15:23:31 ndw Exp $
  *
  */
 public class XMLDocumentFragmentScannerImpl
@@ -3007,6 +3007,10 @@
                             
                             if(fScannerState == SCANNER_STATE_REFERENCE){
                                 setScannerState(SCANNER_STATE_CONTENT);
+                                if (fReplaceEntityReferences && fEntityStore.isDeclaredEntity(fCurrentEntityName)) {
+                                    // Skip the entity reference, we don't care
+                                    return fDriver.next();
+                                }
                                 return XMLEvent.ENTITY_REFERENCE;
                             }
                         }
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -62,7 +62,7 @@
  * @author Arnaud  Le Hors, IBM
  * @author Eric Ye, IBM
  * @author Sunitha Reddy, Sun Microsystems
- * @version $Id: XMLDocumentScannerImpl.java,v 1.5 2006/05/09 10:56:45 sunithareddy Exp $
+ * @version $Id: XMLDocumentScannerImpl.java,v 1.9 2007/05/09 15:23:31 ndw Exp $
  */
 public class XMLDocumentScannerImpl
         extends XMLDocumentFragmentScannerImpl{
@@ -549,11 +549,13 @@
         
         //register current document scanner as a listener for XMLEntityScanner
         fEntityScanner.registerListener(this);
-
         
         // prepare to look for a TextDecl if external general entity
         if (!name.equals("[xml]") && fEntityScanner.isExternal()) {
-            setScannerState(SCANNER_STATE_TEXT_DECL);
+            // Don't do this if we're skipping the entity!
+            if (augs == null || !((Boolean) augs.getItem(Constants.ENTITY_SKIPPED)).booleanValue()) {
+                setScannerState(SCANNER_STATE_TEXT_DECL);
+            }
         }
         
         // call handler
@@ -643,7 +645,7 @@
     // scanning methods
     
     /** Scans a doctype declaration. */
-    protected boolean scanDoctypeDecl() throws IOException, XNIException {
+    protected boolean scanDoctypeDecl(boolean ignore) throws IOException, XNIException {
         
         // spaces
         if (!fEntityScanner.skipSpaces()) {
@@ -668,7 +670,7 @@
         fHasExternalDTD = fDoctypeSystemId != null;
         
         // Attempt to locate an external subset with an external subset resolver.
-        if (!fHasExternalDTD && fExternalSubsetResolver != null) {
+        if (!ignore && !fHasExternalDTD && fExternalSubsetResolver != null) {
             fDTDDescription.setValues(null, null, fEntityManager.getCurrentResourceIdentifier().getExpandedSystemId(), null);
             fDTDDescription.setRootName(fDoctypeName);
             fExternalSubsetSource = fExternalSubsetResolver.getExternalSubset(fDTDDescription);
@@ -676,7 +678,7 @@
         }
         
         // call handler
-        if (fDocumentHandler != null) {
+        if (!ignore && fDocumentHandler != null) {
             // NOTE: I don't like calling the doctypeDecl callback until
             //       end of the *full* doctype line (including internal
             //       subset) is parsed correctly but SAX2 requires that
@@ -925,10 +927,6 @@
 
                     case SCANNER_STATE_DOCTYPE: {
                         
-                        if (fDisallowDoctype) {
-                            reportFatalError("DoctypeNotAllowed", null);
-                        }
-                        
                         if (fSeenDoctypeDecl) {
                             reportFatalError("AlreadySeenDoctype", null);
                         }
@@ -939,11 +937,13 @@
                         
                         // scanDoctypeDecl() sends XNI doctypeDecl event that
                         // in SAX is converted to startDTD() event.
-                        if (scanDoctypeDecl()) {
+                        if (scanDoctypeDecl(fDisallowDoctype)) {
                             setScannerState(SCANNER_STATE_DTD_INTERNAL_DECLS);
                             fSeenInternalSubset = true;
                             setDriver(fContentDriver);
-                            return fDTDDriver.next();
+                            int dtdEvent = fDTDDriver.next();
+                            // If no DTD support, ignore and continue parsing
+                            return fDisallowDoctype ? next() : dtdEvent;
                         }
                         
                         /** xxx:check this part again
@@ -956,6 +956,11 @@
                         }
                          */
                         
+                        if (fDisallowDoctype) {
+                            setScannerState(SCANNER_STATE_PROLOG);
+                            return next();
+                        }
+                        
                         // handle external subset
                         if (fDoctypeSystemId != null) {
                             if (((fValidation || fLoadExternalDTD) 
@@ -985,7 +990,9 @@
 
                         // in XNI this results in 3 events:  doctypeDecl, startDTD, endDTD
                         // in SAX this results in 2 events: startDTD, endDTD
-                        fDTDScanner.setInputSource(null);
+                        if (fDTDScanner != null) {
+                            fDTDScanner.setInputSource(null);
+                        }
                         setScannerState(SCANNER_STATE_PROLOG);
                         return XMLEvent.DTD;
                     }
@@ -1112,7 +1119,8 @@
                                 fMarkupDepth--;
                                 
                                 // scan external subset next
-                                if (fDoctypeSystemId != null && (fValidation || fLoadExternalDTD)) {
+                                if (!XMLDocumentScannerImpl.this.fDisallowDoctype && 
+                                        fDoctypeSystemId != null && (fValidation || fLoadExternalDTD)) {
                                     setScannerState(SCANNER_STATE_DTD_EXTERNAL);
                                 }
                                 
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -94,7 +94,7 @@
  * @author K.Venugopal SUN Microsystems
  * @author Neeraj Bajaj SUN Microsystems
  * @author Sunitha Reddy SUN Microsystems
- * @version $Id: XMLEntityManager.java,v 1.11 2006/07/21 17:57:04 ndw Exp $
+ * @version $Id: XMLEntityManager.java,v 1.13 2007/03/16 16:13:11 spericas Exp $
  */
 public class XMLEntityManager implements XMLComponent, XMLEntityResolver {
     
@@ -1133,7 +1133,6 @@
             boolean unparsed = entity.isUnparsed();
             boolean parameter = entityName.startsWith("%");
             boolean general = !parameter;
-            fExternalGeneralEntities = external;//ToDo :Venu
             if (unparsed || (general && !fExternalGeneralEntities) ||
                     (parameter && !fExternalParameterEntities)) {
                 
@@ -1431,8 +1430,8 @@
         fEntityStack.removeAllElements();
         fCurrentEntity = null;
         fValidation = false;
-        fExternalGeneralEntities = false;
-        fExternalParameterEntities = false;
+        fExternalGeneralEntities = true;
+        fExternalParameterEntities = true;
         fAllowJavaEncodings = true ;
         
         //test();
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java	Fri Jun 22 00:46:43 2007 +0000
@@ -66,7 +66,7 @@
  * @author Eric Ye, IBM
  * @author K.Venugopal SUN Microsystems
  * @author Sunitha Reddy, SUN Microsystems
- * @version $Id: XMLScanner.java,v 1.6 2006/06/06 06:28:41 sunithareddy Exp $
+ * @version $Id: XMLScanner.java,v 1.8 2007/01/29 22:34:16 spericas Exp $
  */
 public abstract class XMLScanner
         implements XMLComponent {
@@ -1416,7 +1416,8 @@
             return (XMLStringBuffer)stringBufferCache.get(fStringBufferIndex++);
         }else{
             XMLStringBuffer tmpObj = new XMLStringBuffer();
-            stringBufferCache.add(fStringBufferIndex, tmpObj);
+            fStringBufferIndex++;
+            stringBufferCache.add(tmpObj);
             return tmpObj;
         }
     }
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLStreamFilterImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLStreamFilterImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,9 +25,6 @@
 
 package com.sun.org.apache.xerces.internal.impl;
 
-import com.sun.xml.internal.stream.events.AttributeImpl;
-import com.sun.xml.internal.stream.events.NamespaceImpl;
-import java.util.ArrayList;
 import javax.xml.XMLConstants;
 import javax.xml.stream.Location;
 import javax.xml.stream.XMLStreamReader;
@@ -35,64 +32,48 @@
 import javax.xml.stream.XMLStreamException;
 import javax.xml.namespace.QName;
 import javax.xml.stream.events.XMLEvent;
-import com.sun.org.apache.xerces.internal.util.NamespaceContextWrapper;
-import com.sun.org.apache.xerces.internal.util.NamespaceSupport;
-import com.sun.org.apache.xerces.internal.util.XMLAttributesImpl;
-import com.sun.org.apache.xerces.internal.util.XMLChar;
 
 
 /**
  *
- * @author  K.Venugopal@sun.com
+ * @author Joe Wang: 
+ * This is a rewrite of the original class. The focus is on removing caching, and make the filtered 
+ * stream reader more compatible with those in other implementations. Note however, that this version 
+ * will not solve all the issues related to the undefined condition in the spec. The priority is 
+ * to pass the TCK. Issues arising due to the requirement, that is, (1) should it initiate at BEGIN_DOCUMENT 
+ * or an accepted event; (2) should hasNext() advance the underlining stream in order to find an acceptable
+ * event, would have to wait until 1.1 of StAX in which the filtered stream reader would be defined more clearly.
  */
 
 public class XMLStreamFilterImpl implements javax.xml.stream.XMLStreamReader {
     
     private StreamFilter fStreamFilter = null;
     private XMLStreamReader fStreamReader = null;
-    private int fCurrentEventType = -1;
-    private QName fElementName = null;
-    private String fLocalName = null;
-    private boolean fHasName = false;
-    private boolean fReadNext = true;
-    private boolean fHasMoreEvents = true;
+    private int fCurrentEvent;
+    private boolean fEventAccepted = false;
     
-    private boolean fReadFromCache = true;
-    private ArrayList fCachedAttributes = null;
-    private ArrayList fCachedNamespaceAttr = null;
-    private NamespaceContextWrapper fCachedNamespaceContext = null;
-    private String fCachedElementText = null;
-    private int fCachedEventType = -1;
-    private String fCachedVersion = null;
-    private String fCachedEncoding = null;
-    private boolean fCachedStandalone = false;
-    private Location fCachedLocation = null;
-    private String fCachedTextValue = null;
-    private String fCachedPITarget = null;
-    private String fCachedPIData = null;
-    private String fCachedCharEncoding = null;
-    private static boolean DEBUG = false;
+    /**the very issue around a long discussion. but since we must pass the TCK, we have to allow 
+     * hasNext() to advance the underlining stream in order to find the next acceptable event
+     */
+    private boolean fStreamAdvancedByHasNext = false;
     
     /** Creates a new instance of XMLStreamFilterImpl */
     
     public XMLStreamFilterImpl(XMLStreamReader reader,StreamFilter filter){
-        this.fStreamReader = reader;
+        fStreamReader = reader;
         this.fStreamFilter = filter;
-        fCachedAttributes = new ArrayList();
-        fCachedNamespaceAttr = new ArrayList();
-        try{
-            if(!fStreamFilter.accept(fStreamReader)){
-                next();
-                cache();
+        
+        //this is debatable to initiate at an acceptable event, 
+        //but it's neccessary in order to pass the TCK and yet avoid skipping element
+        try {
+            if (fStreamFilter.accept(fStreamReader)) {
+                fEventAccepted = true;
+            } else {
+                findNextEvent();
             }
-            
         }catch(XMLStreamException xs){
             System.err.println("Error while creating a stream Filter"+xs);
         }
-        //fCachedEventType = fStreamReader.getEventType();
-        fCurrentEventType = fStreamReader.getEventType();
-        if(DEBUG)
-            System.out.println("Cached Event"+fCachedEventType);
     }
     
     /**
@@ -105,27 +86,98 @@
     
     /**
      *
+     * @return
+     * @throws XMLStreamException
+     */
+    public int next() throws XMLStreamException {
+        if (fStreamAdvancedByHasNext && fEventAccepted) {
+            fStreamAdvancedByHasNext = false;
+            return fCurrentEvent;
+        }
+        int event = findNextEvent();
+        if (event != -1) {
+            return event;
+        }
+        
+        throw new IllegalStateException("The stream reader has reached the end of the document, or there are no more "+
+                                    " items to return");
+    }
+    /**
+     *
+     * @throws XMLStreamException
+     * @return
+     */
+    public int nextTag() throws XMLStreamException {
+        if (fStreamAdvancedByHasNext && fEventAccepted && 
+                (fCurrentEvent == XMLEvent.START_ELEMENT || fCurrentEvent == XMLEvent.START_ELEMENT)) {
+            fStreamAdvancedByHasNext = false;
+            return fCurrentEvent;
+        }
+        
+        int event = findNextTag();
+        if (event != -1) {
+            return event;
+        }
+        throw new IllegalStateException("The stream reader has reached the end of the document, or there are no more "+
+                                    " items to return");
+    }
+
+    /**
+     *
      * @throws XMLStreamException
      * @return
      */
     public boolean hasNext() throws XMLStreamException {
-        if(fReadNext){
-            fReadNext = false;
-            cache();
-            if(DEBUG)
-                System.out.println("Cached Event in hasNext"+fCachedEventType);
-            return readNext();
-            
+        if (fStreamReader.hasNext()) {
+            if (!fEventAccepted) {
+                if ((fCurrentEvent = findNextEvent()) == -1) {
+                    return false;
+                } else {
+                    fStreamAdvancedByHasNext = true;
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    private int findNextEvent() throws XMLStreamException {
+        fStreamAdvancedByHasNext = false;
+        while(fStreamReader.hasNext()){
+            fCurrentEvent = fStreamReader.next();
+            if(fStreamFilter.accept(fStreamReader)){
+                fEventAccepted = true;
+                return fCurrentEvent;
+            }
         }
-        return fHasMoreEvents;
+        //although it seems that IllegalStateException should be thrown when next() is called
+        //on a stream that has no more items, we have to assume END_DOCUMENT is always accepted 
+        //in order to pass the TCK
+        if (fCurrentEvent == XMLEvent.END_DOCUMENT)
+            return fCurrentEvent;
+        else
+            return -1;
     }
-    
+    private int findNextTag() throws XMLStreamException {
+        fStreamAdvancedByHasNext = false;
+        while(fStreamReader.hasNext()){
+            fCurrentEvent = fStreamReader.nextTag();
+            if(fStreamFilter.accept(fStreamReader)){
+                fEventAccepted = true;
+                return fCurrentEvent;
+            }
+        }
+        if (fCurrentEvent == XMLEvent.END_DOCUMENT)
+            return fCurrentEvent;
+        else
+            return -1;
+    }
     /**
      *
      * @throws XMLStreamException
      */
     public void close() throws XMLStreamException {
-        this.fStreamReader.close();
+        fStreamReader.close();
     }
     
     /**
@@ -133,11 +185,7 @@
      * @return
      */
     public int getAttributeCount() {
-        if(!fReadFromCache){
-            return this.fStreamReader.getAttributeCount();
-        }else{
-            return fCachedAttributes.size();
-        }
+        return fStreamReader.getAttributeCount();
     }
     
     /**
@@ -146,14 +194,7 @@
      * @return
      */
     public QName getAttributeName(int index) {
-        if(!fReadFromCache){
-            return this.fStreamReader.getAttributeName(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr != null)
-                return attr.getName();
-        }
-        return null;
+        return fStreamReader.getAttributeName(index);
     }
     
     /**
@@ -162,14 +203,7 @@
      * @return
      */
     public String getAttributeNamespace(int index) {
-        if(!fReadFromCache){
-            return fStreamReader.getAttributeNamespace(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr != null)
-                return attr.getName().getNamespaceURI();
-        }
-        return null;
+        return fStreamReader.getAttributeNamespace(index);
     }
     
     /**
@@ -178,14 +212,7 @@
      * @return
      */
     public String getAttributePrefix(int index) {
-        if(!fReadFromCache){
-            return fStreamReader.getAttributePrefix(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr != null)
-                return attr.getName().getPrefix();
-        }
-        return null;
+        return fStreamReader.getAttributePrefix(index);
     }
     
     /**
@@ -194,32 +221,16 @@
      * @return
      */
     public String getAttributeType(int index) {
-        if(!fReadFromCache){
-            return fStreamReader.getAttributeType(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr != null)
-                return attr.getDTDType();
-            
-        }
-        return null;
+        return fStreamReader.getAttributeType(index);
     }
     
     /**
      *
+     * @param index
      * @return
-     * @param index
      */
     public String getAttributeValue(int index) {
-        if(!fReadFromCache){
-            return fStreamReader.getAttributeValue(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr != null)
-                return attr.getValue();
-            
-        }
-        return null;
+        return fStreamReader.getAttributeValue(index);
     }
     
     /**
@@ -229,19 +240,7 @@
      * @return
      */
     public String getAttributeValue(String namespaceURI, String localName) {
-        if(!fReadFromCache){
-            return fStreamReader.getAttributeValue(namespaceURI,localName);
-        }else{
-            if( fCachedEventType != XMLEvent.START_ELEMENT || fCachedEventType != XMLEvent.ATTRIBUTE)
-                throw new IllegalStateException("Current event state is " + fCachedEventType );
-            for(int i=0; i< fCachedAttributes.size();i++){
-                AttributeImpl attr = (AttributeImpl)fCachedAttributes.get(i);
-                if(attr != null && (attr.getName().getLocalPart().equals(localName)) &&
-                (namespaceURI.equals(attr.getName().getNamespaceURI())))
-                    return attr.getValue();
-            }
-        }
-        return null;
+        return fStreamReader.getAttributeValue(namespaceURI,localName);
     }
     
     /**
@@ -249,11 +248,7 @@
      * @return
      */
     public String getCharacterEncodingScheme() {
-        if(!fReadFromCache){
-            return fStreamReader.getCharacterEncodingScheme();
-        }else{
-            return fCachedCharEncoding;
-        }
+        return fStreamReader.getCharacterEncodingScheme();
     }
     
     /**
@@ -262,15 +257,7 @@
      * @return
      */
     public String getElementText() throws XMLStreamException {
-        if(!fReadFromCache){
-            return fStreamReader.getElementText();
-        }else{
-            if(fCachedEventType != XMLEvent.START_ELEMENT) {
-                throw new XMLStreamException(
-                "parser must be on START_ELEMENT to read next text", getLocation());
-            }
-            return fCachedElementText;
-        }
+        return fStreamReader.getElementText();
     }
     
     /**
@@ -278,11 +265,7 @@
      * @return
      */
     public String getEncoding() {
-        if(!fReadFromCache){
-            return this.fStreamReader.getEncoding();
-        }else{
-            return fCachedEncoding;
-        }
+        return fStreamReader.getEncoding();
     }
     
     /**
@@ -290,11 +273,7 @@
      * @return
      */
     public int getEventType() {
-        if(!fReadFromCache){
-            return fStreamReader.getEventType();
-        }else {
-            return fCachedEventType;
-        }
+        return fStreamReader.getEventType();
     }
     
     /**
@@ -302,11 +281,7 @@
      * @return
      */
     public String getLocalName() {
-        if(!fReadFromCache){
-            return fStreamReader.getLocalName();
-        }else{
-            return fLocalName;
-        }
+        return fStreamReader.getLocalName();
     }
     
     /**
@@ -314,11 +289,7 @@
      * @return
      */
     public javax.xml.stream.Location getLocation() {
-        if(!fReadFromCache){
-            return fStreamReader.getLocation();
-        }else{
-            return fCachedLocation;
-        }
+        return fStreamReader.getLocation();
     }
     
     /**
@@ -326,17 +297,7 @@
      * @return
      */
     public javax.xml.namespace.QName getName() {
-        if(!fReadFromCache){
-            return fStreamReader.getName();
-        }else{
-            if(fCachedEventType == XMLEvent.START_ELEMENT || fCachedEventType == XMLEvent.END_ELEMENT){
-                return fElementName;
-            }
-            else{
-                throw new java.lang.IllegalArgumentException("Illegal to call getName() "+
-                "when event type is "+fCachedEventType);
-            }
-        }
+        return fStreamReader.getName();
     }
     
     /**
@@ -344,11 +305,7 @@
      * @return
      */
     public javax.xml.namespace.NamespaceContext getNamespaceContext() {
-        if(!fReadFromCache){
-            return fStreamReader.getNamespaceContext();
-        }else{
-            return fCachedNamespaceContext;
-        }
+        return fStreamReader.getNamespaceContext();
     }
     
     /**
@@ -356,15 +313,7 @@
      * @return
      */
     public int getNamespaceCount() {
-        if(!fReadFromCache){
-            return fStreamReader.getNamespaceCount();
-        }else{
-            if(fCachedEventType == XMLEvent.START_ELEMENT || fCachedEventType == XMLEvent.END_ELEMENT || fCachedEventType == XMLEvent.NAMESPACE){
-                return fCachedNamespaceAttr.size();
-            }else{
-                throw new IllegalStateException("Current event state is " + fCachedEventType );
-            }
-        }
+        return fStreamReader.getNamespaceCount();
     }
     
     /**
@@ -373,15 +322,7 @@
      * @return
      */
     public String getNamespacePrefix(int index) {
-        if(!fReadFromCache){
-            return fStreamReader.getNamespacePrefix(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr != null){
-                return attr.getName().getPrefix();
-            }
-        }
-        return null;
+        return fStreamReader.getNamespacePrefix(index);
     }
     
     /**
@@ -389,14 +330,7 @@
      * @return
      */
     public String getNamespaceURI() {
-        if(!fReadFromCache){
-            return fStreamReader.getNamespaceURI();
-        }else{
-            if((fCachedEventType == XMLEvent.START_ELEMENT || fCachedEventType == XMLEvent.END_ELEMENT) && (fElementName != null)) {
-                return fElementName.getNamespaceURI();
-            }
-        }
-        return null;
+        return fStreamReader.getNamespaceURI();
     }
     
     /**
@@ -405,15 +339,7 @@
      * @return
      */
     public String getNamespaceURI(int index) {
-        if(!fReadFromCache){
-            return this.fStreamReader.getNamespaceURI(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr != null){
-                return attr.getName().getNamespaceURI();
-            }
-        }
-        return null;
+        return fStreamReader.getNamespaceURI(index);
     }
     
     /**
@@ -422,11 +348,7 @@
      * @return
      */
     public String getNamespaceURI(String prefix) {
-        if(!fReadFromCache){
-            return this.fStreamReader.getNamespaceURI();
-        }else{
-            return fCachedNamespaceContext.getNamespaceURI(prefix);
-        }
+        return fStreamReader.getNamespaceURI(prefix);
     }
     
     /**
@@ -434,11 +356,7 @@
      * @return
      */
     public String getPIData() {
-        if(!fReadFromCache){
-            return this.fStreamReader.getPIData();
-        }else{
-            return fCachedPIData;
-        }
+        return fStreamReader.getPIData();
     }
     
     /**
@@ -446,11 +364,7 @@
      * @return
      */
     public String getPITarget() {
-        if(!fReadFromCache){
-            return this.fStreamReader.getPITarget();
-        }else{
-            return fCachedPITarget;
-        }
+        return fStreamReader.getPITarget();
     }
     
     /**
@@ -458,14 +372,7 @@
      * @return
      */
     public String getPrefix() {
-        if(!fReadFromCache){
-            return this.fStreamReader.getPrefix();
-        }else{
-            if(fCachedEventType == XMLEvent.START_ELEMENT || fCachedEventType == XMLEvent.END_ELEMENT){
-                return fElementName.getPrefix();
-            }
-        }
-        return null;
+        return fStreamReader.getPrefix();
     }
     
     /**
@@ -475,7 +382,7 @@
      * @return
      */
     public Object getProperty(java.lang.String name) throws java.lang.IllegalArgumentException {
-        return this.fStreamReader.getProperty(name);
+        return fStreamReader.getProperty(name);
     }
     
     /**
@@ -483,11 +390,7 @@
      * @return
      */
     public String getText() {
-        if(!fReadFromCache){
-            return fStreamReader.getText();
-        }else{
-            return fCachedTextValue;
-        }
+        return fStreamReader.getText();
     }
     
     /**
@@ -495,13 +398,7 @@
      * @return
      */
     public char[] getTextCharacters() {
-        if(!fReadFromCache){
-            return fStreamReader.getTextCharacters();
-        }else{
-            if(fCachedTextValue != null)
-                return fCachedTextValue.toCharArray();
-        }
-        return null;
+        return fStreamReader.getTextCharacters();
     }
     
     /**
@@ -514,40 +411,7 @@
      * @return
      */
     public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException {
-        if(!fReadFromCache){
-            return this.fStreamReader.getTextCharacters(sourceStart, target,targetStart,length);
-        }else{
-            if(target == null){
-                throw new NullPointerException("target char array can't be null") ;
-            }
-            
-            if(targetStart < 0 || length < 0 || sourceStart < 0 || targetStart >= target.length ||
-            (targetStart + length ) > target.length) {
-                throw new IndexOutOfBoundsException();
-            }
-            
-            //getTextStart() + sourceStart should not be greater than the lenght of number of characters
-            //present
-            if(fCachedTextValue == null)
-                return 0;
-            int copiedLength = 0;
-            //int presentDataLen = getTextLength() - (getTextStart()+sourceStart);
-            int available = fCachedTextValue.length() - sourceStart;
-            if(available < 0){
-                throw new IndexOutOfBoundsException("sourceStart is greater than" +
-                "number of characters associated with this event");
-            }
-            if(available < length){
-                copiedLength = available;
-            }
-            else{
-                copiedLength = length;
-            }
-            
-            System.arraycopy(fCachedTextValue,  sourceStart , target, targetStart, copiedLength);
-            return copiedLength;
-            
-        }
+        return fStreamReader.getTextCharacters(sourceStart, target,targetStart,length);
     }
     
     /**
@@ -555,13 +419,7 @@
      * @return
      */
     public int getTextLength() {
-        if(!fReadFromCache){
-            return this.fStreamReader.getTextLength();
-        }else{
-            if(fCachedTextValue != null)
-                return fCachedTextValue.length();
-        }
-        return 0;
+        return fStreamReader.getTextLength();
     }
     
     /**
@@ -569,11 +427,7 @@
      * @return
      */
     public int getTextStart() {
-        if(!fReadFromCache){
-            return this.fStreamReader.getTextStart();
-        }else{
-            return 0;
-        }
+        return fStreamReader.getTextStart();
     }
     
     /**
@@ -581,11 +435,7 @@
      * @return
      */
     public String getVersion() {
-        if(!fReadFromCache){
-            return fStreamReader.getVersion();
-        }else{
-            return fCachedVersion;
-        }
+        return fStreamReader.getVersion();
         
     }
     
@@ -594,15 +444,7 @@
      * @return
      */
     public boolean hasName() {
-        if(!fReadFromCache){
-            return this.fStreamReader.hasName();
-        }else{
-            if(fCachedEventType == XMLEvent.START_ELEMENT || fCachedEventType == XMLEvent.END_ELEMENT
-            || fCachedEventType == XMLEvent.ENTITY_REFERENCE || fCachedEventType == XMLEvent.PROCESSING_INSTRUCTION) {
-                return true;
-            }
-        }
-        return false;
+        return fStreamReader.hasName();
     }
     
     /**
@@ -610,13 +452,7 @@
      * @return
      */
     public boolean hasText() {
-        if(!fReadFromCache){
-            return this.fStreamReader.hasText();
-        }else{
-            if(fCachedTextValue != null)
-                return true;
-        }
-        return false;
+        return fStreamReader.hasText();
     }
     
     /**
@@ -625,14 +461,7 @@
      * @param index
      */
     public boolean isAttributeSpecified(int index) {
-        if(!fReadFromCache){
-            return this.fStreamReader.isAttributeSpecified(index);
-        }else{
-            AttributeImpl attr =getCachedAttribute(index);
-            if(attr!=null)
-                return attr.isSpecified();
-        }
-        return false;
+        return fStreamReader.isAttributeSpecified(index);
     }
     
     /**
@@ -640,11 +469,7 @@
      * @return
      */
     public boolean isCharacters() {
-        if(!fReadFromCache){
-            return this.fStreamReader.isCharacters();
-        }else{
-            return fCachedEventType == XMLEvent.CHARACTERS ;
-        }
+        return fStreamReader.isCharacters();
     }
     
     /**
@@ -652,11 +477,7 @@
      * @return
      */
     public boolean isEndElement() {
-        if(!fReadFromCache){
-            return this.fStreamReader.isEndElement();
-        }else{
-            return  fCachedEventType == XMLEvent.END_ELEMENT;
-        }
+        return fStreamReader.isEndElement();
     }
     
     /**
@@ -664,11 +485,7 @@
      * @return
      */
     public boolean isStandalone() {
-        if(!fReadFromCache){
-            return this.fStreamReader.isStandalone();
-        }else{
-            return fCachedStandalone;
-        }
+        return fStreamReader.isStandalone();
     }
     
     /**
@@ -676,11 +493,7 @@
      * @return
      */
     public boolean isStartElement() {
-        if(!fReadFromCache){
-            return this.fStreamReader.isStartElement();
-        }else{
-            return fCachedEventType == XMLEvent.START_ELEMENT;
-        }
+        return fStreamReader.isStartElement();
     }
     
     /**
@@ -688,64 +501,10 @@
      * @return
      */
     public boolean isWhiteSpace() {
-        if(!fReadFromCache){
-            return this.fStreamReader.isWhiteSpace();
-        }else{
-            if(isCharacters() || (fCachedEventType == XMLEvent.CDATA)){
-                if(fCachedTextValue == null)
-                    return false;
-                char [] ch = fCachedTextValue.toCharArray();
-                int start = 0;
-                int length = fCachedTextValue.length();
-                for (int i=start; i< length;i++){
-                    if(!XMLChar.isSpace(ch[i])){
-                        return false;
-                    }
-                }
-                return true;
-            }
-            return false;
-        }
+        return fStreamReader.isWhiteSpace();
     }
     
-    /**
-     *
-     * @return
-     * @throws XMLStreamException
-     */
-    public int next() throws XMLStreamException {
-        if(fReadNext){
-            if(readNext()){
-                fReadFromCache = false;
-            }
-        }else{
-            fReadNext = true;
-            fReadFromCache = false;
-            //  return fCachedEventType;
-        }
-        return fCurrentEventType;
-    }
-    
-    /**
-     *
-     * @throws XMLStreamException
-     * @return
-     */
-    public int nextTag() throws XMLStreamException {
-        if(fReadNext){
-            if(readNextTag()){
-                fReadFromCache = false;
-            }
-        }else{
-            fReadNext = true;
-            if( (fCurrentEventType != XMLEvent.START_ELEMENT) || (fCurrentEventType != XMLEvent.END_ELEMENT) ){
-                fCurrentEventType = fStreamReader.nextTag();
-                fReadFromCache = false;
-            }
-        }
-        return fCurrentEventType;
-    }
-    
+        
     /**
      *
      * @param type
@@ -754,17 +513,7 @@
      * @throws XMLStreamException
      */
     public void require(int type, String namespaceURI, String localName) throws XMLStreamException {
-        if(!fReadFromCache){
-            fStreamReader.require(type,namespaceURI,localName);
-        }else{
-            if( type != fCachedEventType)
-                throw new XMLStreamException("Event type " +XMLStreamReaderImpl.getEventTypeString(type)+" specified did not match with current parser event");
-            if( namespaceURI != null && !namespaceURI.equals(getNamespaceURI()) )
-                throw new XMLStreamException("Namespace URI " +namespaceURI+" specified did not match with current namespace URI");
-            if(localName != null && !localName.equals(getLocalName()))
-                throw new XMLStreamException("LocalName " +localName+" specified did not match with current local name");
-            
-        }
+        fStreamReader.require(type,namespaceURI,localName);
     }
     
     /**
@@ -772,11 +521,7 @@
      * @return
      */
     public boolean standaloneSet() {
-        if(!fReadFromCache){
-            return fStreamReader.standaloneSet();
-        }else{
-            return fCachedStandalone;
-        }
+        return fStreamReader.standaloneSet();
     }
     
     /**
@@ -785,186 +530,7 @@
      * @return
      */
     public String getAttributeLocalName(int index){
-        if(!fReadFromCache){
-            return fStreamReader.getAttributeLocalName(index);
-        }else{
-            AttributeImpl attr = getCachedAttribute(index);
-            if(attr!= null){
-                attr.getName().getLocalPart();
-            }
-        }
-        
-        return null;
-    }
-    
-    private void cache(){
-        fReadFromCache = true;
-        fCachedEventType = fCurrentEventType;
-        clearCache();
-		fCachedLocation = fStreamReader.getLocation();
-        switch(fCurrentEventType){
-            case XMLEvent.CHARACTERS :
-            case XMLEvent.CDATA:
-            case XMLEvent.SPACE:
-            case XMLEvent.COMMENT:{
-                fCachedTextValue = fStreamReader.getText();
-                break;
-            }
-            case XMLEvent.DTD:{
-                fCachedTextValue = fStreamReader.getText();
-                break;
-            }
-            case XMLEvent.END_DOCUMENT:{
-                break;
-            }
-            case XMLEvent.END_ELEMENT:{
-                fElementName = fStreamReader.getName();
-                fHasName = fStreamReader.hasName();
-                fLocalName = fElementName.getLocalPart();
-                cacheNamespaceContext();
-                break;
-            }
-            case XMLEvent.ENTITY_DECLARATION:{
-                break;
-            }
-            case XMLEvent.NOTATION_DECLARATION:{
-                break;
-            }
-            case XMLEvent.ENTITY_REFERENCE:{
-                fLocalName = fStreamReader.getLocalName();
-                fCachedTextValue = fStreamReader.getText();
-                break;
-            }
-            case XMLEvent.PROCESSING_INSTRUCTION:{
-                fCachedPIData = fStreamReader.getPIData();
-                fCachedPITarget = fStreamReader.getPITarget();
-                break;
-            }
-            case XMLEvent.START_DOCUMENT:{
-                fCachedVersion = fStreamReader.getVersion();
-                fCachedEncoding = fStreamReader.getEncoding();
-                fCachedStandalone = fStreamReader.isStandalone();
-                fCachedCharEncoding = fStreamReader.getCharacterEncodingScheme();
-                break;
-            }
-            case XMLEvent.START_ELEMENT:{
-                try{
-                    fElementName = fStreamReader.getName();
-                    fHasName = fStreamReader.hasName();
-                    fLocalName = fElementName.getLocalPart();
-                    if(DEBUG){
-                        System.out.println("Name is "+fLocalName);
-                        System.out.println("Name is "+fElementName);
-                    }
-                    cacheAttributes();
-                    cacheNamespaceAttributes();
-                    cacheNamespaceContext();
-                    if(fStreamReader.hasText())
-                        fCachedElementText = fStreamReader.getElementText();
-                }catch(Exception ex){
-                    System.err.println("Error occurred while trying to cache START_ELEMENT"+ex.getMessage());
-                }
-                break;
-            }
-        }
+        return fStreamReader.getAttributeLocalName(index);
     }
-    
-    private boolean readNext() throws XMLStreamException{
-        while(fStreamReader.hasNext()){
-            this.fStreamReader.next();
-            fHasMoreEvents = fStreamFilter.accept(fStreamReader);
-            if(fHasMoreEvents){
-                fCurrentEventType = this.fStreamReader.getEventType();
-                return true;
-            }
-        }
-
-        fHasMoreEvents = false;
-        return false;
-    }
-    
-    private boolean readNextTag() throws XMLStreamException {
-        while(fStreamReader.hasNext()){
-            this.fStreamReader.nextTag();
-            fHasMoreEvents = fStreamFilter.accept(fStreamReader);
-            if(fHasMoreEvents){
-                fCurrentEventType = this.fStreamReader.getEventType();
-                return true;
-            }
-        }
-
-        fHasMoreEvents = false;
-        return false;
-    }
-    
-    private void cacheAttributes(){
-        int len = fStreamReader.getAttributeCount();
-        QName qname = null;
-        String prefix = null;
-        String localpart = null;
-        AttributeImpl attr = null;
-        fCachedAttributes.clear();
-        for(int i=0; i<len ;i++){
-            qname = fStreamReader.getAttributeName(i);
-            prefix = qname.getPrefix();
-            localpart = qname.getLocalPart();
-            attr = new AttributeImpl();
-            attr.setName(qname);
-            attr.setAttributeType(fStreamReader.getAttributeType(i));
-            attr.setSpecified(fStreamReader.isAttributeSpecified(i));
-            attr.setValue(fStreamReader.getAttributeValue(i));
-            fCachedAttributes.add(attr);
-        }
-    }
-    
-    protected void cacheNamespaceAttributes(){
-        int count = fStreamReader.getNamespaceCount();
-        String uri = null;
-        String prefix = null;
-        NamespaceImpl attr = null;
-        fCachedNamespaceAttr.clear();
-        for(int i=0;i< count;i++){
-            uri = fStreamReader.getNamespaceURI(i);
-            prefix = fStreamReader.getNamespacePrefix(i);
-            if(prefix == null){
-                prefix = XMLConstants.DEFAULT_NS_PREFIX;
-            }
-            attr = new NamespaceImpl(prefix,uri);
-            fCachedNamespaceAttr.add(attr);
-        }
-    }
-    
-    private void cacheNamespaceContext(){
-        NamespaceContextWrapper nc = (NamespaceContextWrapper) fStreamReader.getNamespaceContext();
-        NamespaceSupport ns =  new NamespaceSupport(nc.getNamespaceContext());
-        fCachedNamespaceContext = new NamespaceContextWrapper(ns);
-    }
-    
-    private AttributeImpl getCachedAttribute(int index){
-        if( fCachedEventType == XMLEvent.START_ELEMENT || fCachedEventType == XMLEvent.ATTRIBUTE) {
-            if(index < fCachedAttributes.size()){
-                return (AttributeImpl)fCachedAttributes.get(index);
-            }
-        }else{
-            throw new IllegalStateException("Current event state is " + fCachedEventType );
-        }
-        return null;
-    }
-    
-    private void clearCache(){
-        fCachedAttributes.clear();
-        fCachedNamespaceAttr.clear();
-        fCachedNamespaceContext = null;
-        fCachedElementText = null;
-        fCachedVersion = null;
-        fCachedEncoding = null;
-        fCachedLocation = null;
-        fCachedTextValue = null;
-        fCachedPITarget = null;
-        fCachedPIData = null;
-        fCachedCharEncoding = null;
-        fElementName = null;
-        fHasName = false;
-        fLocalName = null;
-    }
+        
 }
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLStreamReaderImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/XMLStreamReaderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -33,6 +33,7 @@
 import javax.xml.namespace.NamespaceContext;
 import com.sun.org.apache.xerces.internal.xni.XNIException;
 import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;
+import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 import javax.xml.stream.Location;
 import javax.xml.stream.events.XMLEvent;
@@ -316,23 +317,16 @@
         return fEntityScanner.getLineNumber() ;
     }//getLineNumber
     
-    /** For START_ELEMENT or END_ELEMENT returns the (local) name of the current element. For ENTITY_REF it returns entity name. For
-     * PROCESSING_INSTRUCTION it returns the target. The current event must be START_ELEMENT or END_ELEMENT, PROCESSING_INSTRUCTION, or
-     * ENTITY_REF, otherwise null is returned.
-     * @return
-     */
     public String getLocalName() {
         if(fEventType == XMLEvent.START_ELEMENT || fEventType == XMLEvent.END_ELEMENT){
             //xxx check whats the value of fCurrentElement
             return fScanner.getElementQName().localpart ;
         }
-        else if(fEventType == XMLEvent.PROCESSING_INSTRUCTION){
-            return fScanner.getPITarget();
-        }
         else if(fEventType == XMLEvent.ENTITY_REFERENCE){
             return fScanner.getEntityName();
         }
-        return null;
+        throw new IllegalStateException("Method getLocalName() cannot be called for " +
+            getEventTypeString(fEventType) + " event.");
     }//getLocalName()
     
     /**
@@ -373,12 +367,14 @@
     
     
     /**
-     * @return
-     */
+    * @return the prefix of the current event, or null if the event does 
+    * not have a prefix. For START_ELEMENT and END_ELEMENT, return 
+    * XMLConstants.DEFAULT_NS_PREFIX when no prefix is available.
+    */
     public String getPrefix() {
-        //doesn't take care of Attribute as separte event
         if(fEventType == XMLEvent.START_ELEMENT || fEventType == XMLEvent.END_ELEMENT){
-            return fScanner.getElementQName().prefix ;
+            String prefix = fScanner.getElementQName().prefix;
+            return prefix == null ? XMLConstants.DEFAULT_NS_PREFIX : prefix;
         }
         return null ;
     }//getPrefix()
@@ -461,7 +457,7 @@
     /** this Funtion returns true if the current event has name */
     public boolean hasName() {
         if(fEventType == XMLEvent.START_ELEMENT || fEventType == XMLEvent.END_ELEMENT
-        || fEventType == XMLEvent.ENTITY_REFERENCE || fEventType == XMLEvent.PROCESSING_INSTRUCTION) {
+        || fEventType == XMLEvent.ENTITY_REFERENCE) {
             return true;
         }  else {
             return false;
@@ -541,7 +537,9 @@
      * @return
      */
     public int next() throws XMLStreamException {
-
+        if( !hasNext() ) {
+            throw new java.util.NoSuchElementException( "END_DOCUMENT reached: no more elements on the stream." );
+        }
         try {
             fEventType = fScanner.next();
 
@@ -1250,6 +1248,7 @@
      * @return
      */
     public javax.xml.namespace.QName convertXNIQNametoJavaxQName(com.sun.org.apache.xerces.internal.xni.QName qname){
+        if (qname == null) return null;
         //xxx: prefix definition ?
         if(qname.prefix == null){
             return new javax.xml.namespace.QName(qname.uri, qname.localpart) ;
@@ -1269,8 +1268,11 @@
      * <a href="http://www.w3.org/2000/xmlns/">http://www.w3.org/2000/xmlns/</a>
      * @return the uri bound to the given prefix or null if it is not bound
      * @param prefix The prefix to lookup, may not be null
+     * @throws IllegalStateException - if the prefix is null
      */
     public String getNamespaceURI(String prefix) {
+        if(prefix == null) throw new java.lang.IllegalArgumentException("prefix cannot be null.") ;
+        
         //first add the string to symbol table.. since internally identity comparisons are done.
         return fScanner.getNamespaceContext().getURI(fSymbolTable.addSymbol(prefix)) ;
     }
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/ASCIIReader.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/ASCIIReader.java	Fri Jun 22 00:46:43 2007 +0000
@@ -27,6 +27,9 @@
 import com.sun.org.apache.xerces.internal.util.MessageFormatter;
 import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter;
 
+import com.sun.xml.internal.stream.util.BufferAllocator;
+import com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator;
+
 /**
  * A simple ASCII byte reader. This is an optimized reader for reading
  * byte streams that only contain 7-bit ASCII characters.
@@ -35,7 +38,7 @@
  *
  * @author Andy Clark, IBM
  *
- * @version $Id: ASCIIReader.java,v 1.2.6.1 2005/09/09 07:22:53 neerajbj Exp $
+ * @version $Id: ASCIIReader.java,v 1.4 2006/11/30 16:22:30 spericas Exp $
  */
 public class ASCIIReader
     extends Reader {
@@ -93,7 +96,11 @@
     public ASCIIReader(InputStream inputStream, int size,
             MessageFormatter messageFormatter, Locale locale) {
         fInputStream = inputStream;
-        fBuffer = new byte[size];
+        BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+        fBuffer = ba.getByteBuffer(size);
+        if (fBuffer == null) {
+            fBuffer = new byte[size];
+        }
         fFormatter = messageFormatter;
         fLocale = locale;
     } // <init>(InputStream,int, MessageFormatter, Locale)
@@ -232,6 +239,9 @@
      * @exception  IOException  If an I/O error occurs
      */
      public void close() throws IOException {
+         BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+         ba.returnByteBuffer(fBuffer);
+         fBuffer = null;
          fInputStream.close();
      } // close()
 
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/UCSReader.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/UCSReader.java	Fri Jun 22 00:46:43 2007 +0000
@@ -24,6 +24,9 @@
 import java.io.IOException;
 import java.io.Reader;
 
+import com.sun.xml.internal.stream.util.BufferAllocator;
+import com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator;
+
 /** 
  * Reader for UCS-2 and UCS-4 encodings.
  * (i.e., encodings from ISO-10646-UCS-(2|4)).
@@ -32,7 +35,7 @@
  *
  * @author Neil Graham, IBM
  *
- * @version $Id: UCSReader.java,v 1.2.6.1 2005/09/09 07:22:54 neerajbj Exp $
+ * @version $Id: UCSReader.java,v 1.4 2006/11/30 16:22:30 spericas Exp $
  */
 public class UCSReader extends Reader {
 
@@ -91,7 +94,11 @@
      */
     public UCSReader(InputStream inputStream, int size, short encoding) {
         fInputStream = inputStream;
-        fBuffer = new byte[size];
+        BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+        fBuffer = ba.getByteBuffer(size);
+        if (fBuffer == null) {
+            fBuffer = new byte[size];
+        }
         fEncoding = encoding;
     } // <init>(InputStream,int,short)
 
@@ -296,6 +303,9 @@
      * @exception  IOException  If an I/O error occurs
      */
      public void close() throws IOException {
+         BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+         ba.returnByteBuffer(fBuffer);
+         fBuffer = null;
          fInputStream.close();
      } // close()
 
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/UTF8Reader.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/io/UTF8Reader.java	Fri Jun 22 00:46:43 2007 +0000
@@ -28,6 +28,9 @@
 import com.sun.org.apache.xerces.internal.util.MessageFormatter;
 import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter;
 
+import com.sun.xml.internal.stream.util.BufferAllocator;
+import com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator;
+
 /**
  * <p>A UTF-8 reader.</p>
  * 
@@ -35,7 +38,7 @@
  * 
  * @author Andy Clark, IBM
  *
- * @version $Id: UTF8Reader.java,v 1.3 2005/09/26 13:02:28 sunithareddy Exp $
+ * @version $Id: UTF8Reader.java,v 1.5 2006/11/30 16:22:30 spericas Exp $
  */
 public class UTF8Reader
     extends Reader {
@@ -114,7 +117,11 @@
     public UTF8Reader(InputStream inputStream, int size,
             MessageFormatter messageFormatter, Locale locale) {
         fInputStream = inputStream;
-        fBuffer = new byte[size];
+        BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+        fBuffer = ba.getByteBuffer(size);
+        if (fBuffer == null) {
+            fBuffer = new byte[size];
+        }
         fFormatter = messageFormatter;
         fLocale = locale;
     } // <init>(InputStream, int, MessageFormatter, Locale)
@@ -652,6 +659,9 @@
      * @exception  IOException  If an I/O error occurs
      */
     public void close() throws IOException {
+        BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+        ba.returnByteBuffer(fBuffer);
+        fBuffer = null;
         fInputStream.close();
     } // close()
 
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages.properties	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -34,3 +34,4 @@
 # Messages from erroneous set-up
 IncompatibleNamespaceContext = The type of the NamespaceContext is incompatible with using XInclude; it must be an instance of XIncludeNamespaceSupport
 ExpandedSystemId = Could not expand system id of included resource
+null
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java	Fri Jun 22 00:46:43 2007 +0000
@@ -36,7 +36,7 @@
  * @author Elena Litani, IBM
  * @author Sandy Gao, IBM
  *
- * @version $Id: CMBuilder.java,v 1.4 2006/07/19 22:39:36 spericas Exp $
+ * @version $Id: CMBuilder.java,v 1.6 2007/04/16 15:34:54 spericas Exp $
  */
 public class CMBuilder {
 
@@ -129,7 +129,7 @@
         fLeafCount = 0;
         fParticleCount = 0;
         // convert particle tree to CM tree
-        CMNode node = buildSyntaxTree(particle);
+        CMNode node = buildSyntaxTree(particle, true);
         if (node == null)
             return null;
         // build DFA content model from the CM tree
@@ -142,7 +142,7 @@
     // 3. convert model groups (a, b, c, ...) or (a | b | c | ...) to
     //    binary tree: (((a,b),c),...) or (((a|b)|c)|...)
     // 4. make sure each leaf node (XSCMLeaf) has a distinct position
-    private CMNode buildSyntaxTree(XSParticleDecl particle) {
+    private CMNode buildSyntaxTree(XSParticleDecl particle, boolean optimize) {
 
         int maxOccurs = particle.fMaxOccurs;
         int minOccurs = particle.fMinOccurs;
@@ -159,7 +159,7 @@
             // This is useful for checking UPA.
             nodeRet = fNodeFactory.getCMLeafNode(particle.fType, particle.fValue, fParticleCount++, fLeafCount++);
             // (task 2) expand occurrence values
-            nodeRet = expandContentModel(nodeRet, minOccurs, maxOccurs);
+            nodeRet = expandContentModel(nodeRet, minOccurs, maxOccurs, optimize);
         }
         else if (type == XSParticleDecl.PARTICLE_MODELGROUP) {
             // (task 1,3) convert model groups to binary trees
@@ -178,7 +178,8 @@
             boolean twoChildren = false;
             for (int i = 0; i < group.fParticleCount; i++) {
                 // first convert each child to a CM tree
-                temp = buildSyntaxTree(group.fParticles[i]);
+                temp = buildSyntaxTree(group.fParticles[i], 
+                        optimize && (group.fParticleCount == 1));
                 // then combine them using binary operation
                 if (temp != null) {
                     if (nodeRet == null) {
@@ -201,7 +202,7 @@
                     !twoChildren && group.fParticleCount > 1) {
                     nodeRet = fNodeFactory.getCMUniOpNode(XSParticleDecl.PARTICLE_ZERO_OR_ONE, nodeRet);
                 }
-                nodeRet = expandContentModel(nodeRet, minOccurs, maxOccurs);
+                nodeRet = expandContentModel(nodeRet, minOccurs, maxOccurs, false);
             }
         }
 
@@ -212,7 +213,7 @@
     //                                  a{n, m} -> a, a, ..., a?, a?, ...
     // 4. make sure each leaf node (XSCMLeaf) has a distinct position
     private CMNode expandContentModel(CMNode node,
-                                      int minOccurs, int maxOccurs) {
+                                      int minOccurs, int maxOccurs, boolean optimize) {
 
         CMNode nodeRet = null;
 
@@ -231,7 +232,7 @@
             //one or more
             nodeRet = fNodeFactory.getCMUniOpNode(XSParticleDecl.PARTICLE_ONE_OR_MORE, node);
         }
-        else if (node.type() == XSParticleDecl.PARTICLE_ELEMENT ||        
+        else if (optimize && node.type() == XSParticleDecl.PARTICLE_ELEMENT ||        
                  node.type() == XSParticleDecl.PARTICLE_WILDCARD) {
             // Only for elements and wildcards, subsume e{n,m} and e{n,unbounded} to e*
             // or e+ and, once the DFA reaches a final state, check if the actual number 
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -182,7 +182,7 @@
  * @author <a href="mailto:Kohsuke.Kawaguchi@Sun.com">Kohsuke Kawaguchi</a>
  * @author <a href="mailto:Joseph.Fialli@Sun.com">Joseph Fialli</a>
  * @author <a href="mailto:Sunitha.Reddy@Sun.com">Sunitha Reddy</a>
- * @version $Revision: 1.7 $, $Date: 2005/11/03 17:54:07 $
+ * @version $Revision: 1.9 $, $Date: 2006/11/16 19:46:29 $
  * @see javax.xml.datatype.Duration
  * @since 1.5
  */
@@ -2942,7 +2942,29 @@
             case 's':
                 bufPtr = print2Number(buf,bufPtr,getSecond());
                 if (getFractionalSecond() != null) {
+                    // Note: toPlainString() isn't available before Java 1.5
                     String frac = getFractionalSecond().toString();
+                    
+                    int pos = frac.indexOf("E-");
+                    if (pos >= 0) {
+                        String zeros = frac.substring(pos+2);
+                        frac = frac.substring(0,pos);
+                        pos = frac.indexOf(".");
+                        if (pos >= 0) {
+                            frac = frac.substring(0,pos) + frac.substring(pos+1);
+                        }
+                        int count = Integer.parseInt(zeros);
+                        if (count < 40) {
+                            frac = "00000000000000000000000000000000000000000".substring(0,count-1) + frac;
+                        } else {
+                            // do it the hard way
+                            while (count > 1) {
+                                frac = "0" + frac;
+                                count--;
+                            }
+                        }
+                        frac = "0." + frac;
+                    }
 
                     // reallocate the buffer now so that it has enough space
                     char[] n = new char[buf.length+frac.length()];
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/DOMValidatorHelper.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/DOMValidatorHelper.java	Fri Jun 22 00:46:43 2007 +0000
@@ -63,7 +63,7 @@
  * <p>A validator helper for <code>DOMSource</code>s.</p>
  * 
  * @author Michael Glavassevich, IBM
- * @version $Id: DOMValidatorHelper.java,v 1.1.4.1 2005/09/05 11:38:25 sunithareddy Exp $
+ * @version $Id: DOMValidatorHelper.java,v 1.4 2007/03/06 18:46:47 spericas Exp $
  */
 final class DOMValidatorHelper implements ValidatorHelper, EntityState {
     
@@ -401,10 +401,26 @@
         final String localName = node.getLocalName();
         final String rawName = node.getNodeName();
         final String namespace = node.getNamespaceURI();
-        toFill.prefix = (prefix != null) ? fSymbolTable.addSymbol(prefix) : XMLSymbols.EMPTY_STRING;
-        toFill.localpart = (localName != null) ? fSymbolTable.addSymbol(localName) : XMLSymbols.EMPTY_STRING;
-        toFill.rawname = (rawName != null) ? fSymbolTable.addSymbol(rawName) : XMLSymbols.EMPTY_STRING; 
+        
         toFill.uri = (namespace != null && namespace.length() > 0) ? fSymbolTable.addSymbol(namespace) : null;
+        toFill.rawname = (rawName != null) ? fSymbolTable.addSymbol(rawName) : XMLSymbols.EMPTY_STRING;  
+        
+        // Is this a DOM level1 document?
+        if (localName == null) {
+            int k = rawName.indexOf(':');
+            if (k > 0) {
+                toFill.prefix = fSymbolTable.addSymbol(rawName.substring(0, k));
+                toFill.localpart = fSymbolTable.addSymbol(rawName.substring(k + 1));                
+            }
+            else {
+                toFill.prefix = XMLSymbols.EMPTY_STRING;
+                toFill.localpart = toFill.rawname;
+            }            
+        }
+        else {
+            toFill.prefix = (prefix != null) ? fSymbolTable.addSymbol(prefix) : XMLSymbols.EMPTY_STRING;
+            toFill.localpart = (localName != null) ? fSymbolTable.addSymbol(localName) : XMLSymbols.EMPTY_STRING;
+        }
     }
     
     private void processAttributes(NamedNodeMap attrMap) {
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -90,7 +90,7 @@
  * @author Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
  * @author Michael Glavassevich, IBM
  * 
- * @version $Id: ValidatorHandlerImpl.java,v 1.2.6.1 2005/09/05 09:17:30 sunithareddy Exp $
+ * @version $Id: ValidatorHandlerImpl.java,v 1.4 2007/01/04 19:29:31 ndw Exp $
  */
 final class ValidatorHandlerImpl extends ValidatorHandler implements
     DTDHandler, EntityState, PSVIProvider, ValidatorHelper, XMLDocumentHandler {
@@ -806,6 +806,9 @@
         /** In start element. **/
         private boolean fInStartElement = false;
         
+        /** In end element. **/
+        private boolean fInEndElement = false;
+        
         /** Initializes the TypeInfoProvider with type information for the current element. **/
         void beginStartElement(Augmentations elementAugs, XMLAttributes attributes) {
             fInStartElement = true;
@@ -822,11 +825,13 @@
         
         /** Initializes the TypeInfoProvider with type information for the current element. **/
         void beginEndElement(Augmentations elementAugs) {
+            fInEndElement = true;
             fElementAugs = elementAugs;
         }
         
         /** Cleanup at the end of end element. **/
         void finishEndElement() {
+            fInEndElement = false;
             fElementAugs = null;
         }
         
@@ -835,20 +840,20 @@
          * the startElement callback. the JAXP API requires this
          * for most of the public methods.
          */
-        private void checkState() {
-            if( !fInStartElement ) {
+        private void checkState(boolean forElementInfo) {
+            if (! (fInStartElement || (fInEndElement && forElementInfo))) {
                 throw new IllegalStateException(JAXPValidationMessageFormatter.formatMessage(Locale.getDefault(), 
                         "TypeInfoProviderIllegalState", null));
             }
         }
         
         public TypeInfo getAttributeTypeInfo(int index) {
-            checkState();
+            checkState(false);
             return getAttributeType(index);
         }
         
         private TypeInfo getAttributeType( int index ) {
-            checkState();
+            checkState(false);
             if( index<0 || fAttributes.getLength()<=index )
                 throw new IndexOutOfBoundsException(Integer.toString(index));
             Augmentations augs = fAttributes.getAugmentations(index);
@@ -858,17 +863,17 @@
         }
         
         public TypeInfo getAttributeTypeInfo(String attributeUri, String attributeLocalName) {
-            checkState();
+            checkState(false);
             return getAttributeTypeInfo(fAttributes.getIndex(attributeUri,attributeLocalName));
         }
         
         public TypeInfo getAttributeTypeInfo(String attributeQName) {
-            checkState();
+            checkState(false);
             return getAttributeTypeInfo(fAttributes.getIndex(attributeQName));
         }
         
         public TypeInfo getElementTypeInfo() {
-            checkState();
+            checkState(true);
             if (fElementAugs == null) return null;
             ElementPSVI psvi = (ElementPSVI)fElementAugs.getItem(Constants.ELEMENT_PSVI);
             return getTypeInfoFromPSVI(psvi);
@@ -897,14 +902,14 @@
         }
         
         public boolean isIdAttribute(int index) {
-            checkState();
+            checkState(false);
             XSSimpleType type = (XSSimpleType)getAttributeType(index);
             if(type==null)  return false;
             return type.isIDType();
         }
         
         public boolean isSpecified(int index) {
-            checkState();
+            checkState(false);
             return fAttributes.isSpecified(index);
         }
         
--- a/j2se/src/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java	Fri Jun 22 00:46:43 2007 +0000
@@ -111,7 +111,7 @@
  * @author Peter McCracken, IBM
  * @author Michael Glavassevich, IBM
  *
- * @version $Id: XIncludeHandler.java,v 1.2.6.1 2005/09/05 13:46:07 sunithareddy Exp $
+ * @version $Id: XIncludeHandler.java,v 1.4 2006/10/03 14:15:07 spericas Exp $
  *
  * @see XIncludeNamespaceSupport
  */
@@ -944,7 +944,8 @@
                 setState(STATE_IGNORE);
             }
             else {
-                reportFatalError("NoFallback");
+                reportFatalError("NoFallback", 
+                    new Object[] { attributes.getValue(null, "href") });
             }
         }
         else if (isFallbackElement(element)) {
@@ -1002,7 +1003,8 @@
             // we check to see if the children of this include element contained a fallback
             if (getState() == STATE_EXPECT_FALLBACK
                 && !getSawFallback(fDepth + 1)) {
-                reportFatalError("NoFallback");
+                reportFatalError("NoFallback",
+                    new Object[] { "unknown" });
             }
         }
         if (isFallbackElement(element)) {
--- a/j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/IncrementalSAXSource_Filter.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/IncrementalSAXSource_Filter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -65,8 +65,12 @@
  * and the only requirement is that deliverMoreNodes(false) be called if you want to
  * discard the rest of the stream and the previous deliverMoreNodes() didn't return
  * false.
+ *
+ * This class is final and package private for security reasons. Please
+ * see CR 6537912 for further details. 
+ *
  * */
-public class IncrementalSAXSource_Filter
+final class IncrementalSAXSource_Filter
 implements IncrementalSAXSource, ContentHandler, DTDHandler, LexicalHandler, ErrorHandler, Runnable
 {
   boolean DEBUG=false; //Internal status report
--- a/j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java	Fri Jun 22 00:46:43 2007 +0000
@@ -401,11 +401,15 @@
    * "this" if the DTM object has a built-in SAX ContentHandler,
    * the IncrementalSAXSource if we're bound to one and should receive
    * the SAX stream via it for incremental build purposes...
+   *
+   * Note that IncrementalSAXSource_Filter is package private, hence
+   * it can be statically referenced using instanceof (CR 6537912).
    */
   public ContentHandler getContentHandler()
   {
 
-    if (m_incrementalSAXSource instanceof IncrementalSAXSource_Filter)
+    if (m_incrementalSAXSource.getClass()
+        .getName().equals("com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Filter"))
       return (ContentHandler) m_incrementalSAXSource;
     else
       return this;
@@ -420,11 +424,15 @@
    * "this" if the DTM object has a built-in SAX ContentHandler,
    * the IncrementalSAXSource if we're bound to one and should receive
    * the SAX stream via it for incremental build purposes...
+   *
+   * Note that IncrementalSAXSource_Filter is package private, hence
+   * it can be statically referenced using instanceof (CR 6537912).
    */
   public LexicalHandler getLexicalHandler()
   {
 
-    if (m_incrementalSAXSource instanceof IncrementalSAXSource_Filter)
+    if (m_incrementalSAXSource.getClass()
+        .getName().equals("com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Filter"))
       return (LexicalHandler) m_incrementalSAXSource;
     else
       return this;
--- a/j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java	Fri Jun 22 00:46:43 2007 +0000
@@ -3379,7 +3379,7 @@
         String nodeName = (prefix != null) ? qname : localName;
         String nodeValue = (String)m_values.elementAt(valueIndex);
 
-        handler.addAttribute(nodeName, nodeValue);
+        handler.addAttribute(uri, localName, nodeName, "CDATA", nodeValue);
     }
 
 }
--- a/j2se/src/share/classes/com/sun/org/apache/xml/internal/serializer/ToStream.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xml/internal/serializer/ToStream.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1971,12 +1971,13 @@
         string.getChars(0,len, m_attrBuff, 0);   
         final char[] stringChars = m_attrBuff;
 
-        for (int i = 0; i < len; i++)
+        for (int i = 0; i < len; )
         {
             char ch = stringChars[i];
             if (escapingNotNeeded(ch) && (!m_charInfo.isSpecialAttrChar(ch)))
             {
                 writer.write(ch);
+                i++;
             }
             else
             { // I guess the parser doesn't normalize cr/lf in attributes. -sb
@@ -1988,7 +1989,7 @@
 //                    ch = CharInfo.S_LINEFEED;
 //                }
 
-                accumDefaultEscape(writer, ch, i, stringChars, len, false, true);
+                i = accumDefaultEscape(writer, ch, i, stringChars, len, false, true);
             }
         }
 
@@ -2285,6 +2286,12 @@
     {
         try
         {
+            // Don't output doctype declaration until startDocumentInternal
+            // has been called. Otherwise, it can appear before XML decl.
+            if (m_needToCallStartDocument) {
+                return;
+            }
+            
             if (m_needToOutputDocTypeDecl)
             {
                 outputDocTypeDecl(m_elemContext.m_elementName, false);
--- a/j2se/src/share/classes/com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java	Fri Jun 22 00:46:43 2007 +0000
@@ -270,6 +270,27 @@
         String localName,
         String rawName,
         String type,
+        String value)
+        throws SAXException
+    {
+        addAttribute(uri, localName, rawName, type, value, false);
+    }
+
+    /**
+     * Adds an attribute to the currenly open tag
+     * @param uri the URI of a namespace
+     * @param localName the attribute name, without prefix
+     * @param rawName the attribute name, with prefix (if any)
+     * @param type the type of the attribute, typically "CDATA"
+     * @param value the value of the parameter
+     * @param XSLAttribute true if this attribute is coming from an xsl:attribute element
+     * @see ExtendedContentHandler#addAttribute(String, String, String, String, String)
+     */
+    public void addAttribute(
+        String uri,
+        String localName,
+        String rawName,
+        String type,
         String value,
         boolean XSLAttribute)
         throws SAXException
--- a/j2se/src/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -94,10 +94,13 @@
         }
 
         // If the cached reader for this thread is in use, construct a new
-        // one; otherwise, return the cached reader.
+        // one; otherwise, return the cached reader unless it isn't an 
+        // instance of the class set in the 'org.xml.sax.driver' property
         reader = (XMLReader) m_readers.get();
         boolean threadHasReader = (reader != null);
-        if (!threadHasReader || m_inUse.get(reader) == Boolean.TRUE) {
+        String factory = SecuritySupport.getInstance().getSystemProperty("org.xml.sax.driver");
+        if (!threadHasReader || m_inUse.get(reader) == Boolean.TRUE ||
+                !reader.getClass().getName().equals(factory)) {
             try {
                 try {
                     // According to JAXP 1.2 specification, if a SAXSource
--- a/j2se/src/share/classes/com/sun/org/apache/xpath/internal/axes/NodeSequence.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/org/apache/xpath/internal/axes/NodeSequence.java	Fri Jun 22 00:46:43 2007 +0000
@@ -210,6 +210,13 @@
    */
   public void setRoot(int nodeHandle, Object environment)
   {
+        // If root is DTM.NULL, then something's wrong with the context
+        if (nodeHandle == DTM.NULL) 
+        {
+            throw new RuntimeException("Unable to evaluate expression using " +
+                    "this context");
+        }
+        
   	if(null != m_iter)
   	{
   		XPathContext xctxt = (XPathContext)environment;
--- a/j2se/src/share/classes/com/sun/tools/corba/se/idl/first.set	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/corba/se/idl/first.set	Fri Jun 22 00:46:43 2007 +0000
@@ -6,7 +6,7 @@
  *    THIS PRODUCT CONTAINS RESTRICTED MATERIALS OF IBM                        
  *    5639-D57, (C) COPYRIGHT International Business Machines Corp., 1997, 1998
  *                                        
- *    @(#) 1.3 @(#)first.set	1.3 04/30/07 19:05:31 [05/24/07 00:42:10]
+ *    @(#) 1.3 @(#)first.set	1.3 04/30/07 19:05:31 [06/21/07 00:46:12]
  */
 
 CORBA IDL
--- a/j2se/src/share/classes/com/sun/tools/corba/se/idl/follow.set	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/corba/se/idl/follow.set	Fri Jun 22 00:46:43 2007 +0000
@@ -6,7 +6,7 @@
  *    THIS PRODUCT CONTAINS RESTRICTED MATERIALS OF IBM                        
  *    5639-D57, (C) COPYRIGHT International Business Machines Corp., 1997, 1998
  *                                        
- *    @(#) 1.3 @(#)follow.set	1.3 04/30/07 19:05:31 [05/24/07 00:42:10]
+ *    @(#) 1.3 @(#)follow.set	1.3 04/30/07 19:05:31 [06/21/07 00:46:12]
  */
 
 CORBA IDL
--- a/j2se/src/share/classes/com/sun/tools/example/debug/tty/MessageOutput.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/debug/tty/MessageOutput.java	Fri Jun 22 00:46:43 2007 +0000
@@ -33,7 +33,7 @@
  * the only class that should be printing directly or otherwise
  * accessing System.[out,err].
  *
- * @version     @(#) MessageOutput.java 1.14 07/05/05 00:42:13
+ * @version     @(#) MessageOutput.java 1.14 07/05/05 00:46:15
  * @bug 4348376
  * @author Tim Bell
  */
--- a/j2se/src/share/classes/com/sun/tools/example/debug/tty/TTY.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/debug/tty/TTY.java	Fri Jun 22 00:46:43 2007 +0000
@@ -728,7 +728,7 @@
                 String ln = in.readLine();
                 if (ln == null) {
                     MessageOutput.println("Input stream closed.");
-                    return;
+                    ln = "quit";
                 }
     
                 if (ln.startsWith("!!") && lastLine != null) {
--- a/j2se/src/share/classes/com/sun/tools/example/doc/index.html	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/doc/index.html	Fri Jun 22 00:46:43 2007 +0000
@@ -79,7 +79,7 @@
     <address><a href="mailto:java-debugger@java.sun.com">java-debugger@java.sun.com</a></address>
     </P>
 <P>
-<FONT SIZE=-1>@(#) index.html 1.2 01/06/04 00:42:13</FONT>
+<FONT SIZE=-1>@(#) index.html 1.2 01/06/04 00:46:15</FONT>
 </P>
 <!-- Created: Mon Feb  7 18:56:28 PST 2000 -->
 </body>
--- a/j2se/src/share/classes/com/sun/tools/example/doc/javadt.html	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/doc/javadt.html	Fri Jun 22 00:46:43 2007 +0000
@@ -169,7 +169,7 @@
     <address><a href="mailto:java-debugger@java.sun.com">java-debugger@java.sun.com</a></address>
     </P>
 <P>
-<FONT SIZE=-1>@(#) javadt.html 1.3 07/04/04 00:42:13</FONT>
+<FONT SIZE=-1>@(#) javadt.html 1.3 07/04/04 00:46:15</FONT>
 </P>
 </BODY>
 </HTML>
--- a/j2se/src/share/classes/com/sun/tools/example/doc/jdb.html	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/doc/jdb.html	Fri Jun 22 00:46:43 2007 +0000
@@ -99,7 +99,7 @@
     <address><a href="mailto:java-debugger@java.sun.com">java-debugger@java.sun.com</a></address>
     </P>
 <P>
-<FONT SIZE=-1>@(#) jdb.html 1.3 07/04/04 00:42:13</FONT>
+<FONT SIZE=-1>@(#) jdb.html 1.3 07/04/04 00:46:15</FONT>
 </P>
   </BODY>
 </HTML>
--- a/j2se/src/share/classes/com/sun/tools/example/doc/trace.html	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/doc/trace.html	Fri Jun 22 00:46:43 2007 +0000
@@ -66,7 +66,7 @@
     <address><a href="mailto:java-debugger@java.sun.com">java-debugger@java.sun.com</a></address>
     </P>
 <P>
-<FONT SIZE=-1>@(#) trace.html 1.4 07/04/04 00:42:13</FONT>
+<FONT SIZE=-1>@(#) trace.html 1.4 07/04/04 00:46:15</FONT>
 </P>
 </BODY>
 </HTML>
--- a/j2se/src/share/classes/com/sun/tools/example/trace/EventThread.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/trace/EventThread.java	Fri Jun 22 00:46:43 2007 +0000
@@ -35,7 +35,7 @@
 /**
  * This class processes incoming JDI events and displays them
  *
- * @version     @(#) EventThread.java 1.12 07/05/05 00:42:13
+ * @version     @(#) EventThread.java 1.12 07/05/05 00:46:15
  * @author Robert Field
  */
 public class EventThread extends Thread {
--- a/j2se/src/share/classes/com/sun/tools/example/trace/StreamRedirectThread.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/trace/StreamRedirectThread.java	Fri Jun 22 00:46:43 2007 +0000
@@ -31,7 +31,7 @@
  * StreamRedirectThread is a thread which copies it's input to
  * it's output and terminates when it completes.
  *
- * @version     @(#) StreamRedirectThread.java 1.12 07/05/05 00:42:13
+ * @version     @(#) StreamRedirectThread.java 1.12 07/05/05 00:46:15
  * @author Robert Field
  */
 class StreamRedirectThread extends Thread {
--- a/j2se/src/share/classes/com/sun/tools/example/trace/Trace.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/example/trace/Trace.java	Fri Jun 22 00:46:43 2007 +0000
@@ -42,7 +42,7 @@
  * See "java Trace -help".
  * It is a simple example of the use of the Java Debug Interface.
  *
- * @version     @(#) Trace.java 1.12 07/05/05 00:42:13
+ * @version     @(#) Trace.java 1.12 07/05/05 00:46:15
  * @author Robert Field
  */
 public class Trace {
--- a/j2se/src/share/classes/com/sun/tools/javac/resources/version-template.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javac.resources;
-
-import java.util.ListResourceBundle;
-
-public final class version extends ListResourceBundle {
-    private static final Object[][] contents = {
-	{ "jdk", "$(JDK_VERSION)" },
-	{ "full", "$(FULL_VERSION)" },
-	{ "release", "$(RELEASE)" },
-    };
-
-    protected final Object[][] getContents() {
-         return contents;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/com/sun/tools/javac/resources/version-template.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+#
+# Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun in the LICENSE file that accompanied this code.
+#
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+jdk=$(JDK_VERSION)
+full=$(FULL_VERSION)
+release=$(RELEASE)
--- a/j2se/src/share/classes/com/sun/tools/javah/Main.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/tools/javah/Main.java	Fri Jun 22 00:46:43 2007 +0000
@@ -41,18 +41,6 @@
      */
     public static void main(String[] args){
 
-	// by default use the new implementation, unless we see -Xold
-	for (int i=0; i<args.length; i++) {
-	    if (args[i].equals("-Xold")) {
-		// get rid of -Xold
-		String[] newjhargs = new String[args.length-1];
-		for (int k=0, l=0; k < args.length; k++)
-		    if (k != i) newjhargs[l++] = args[k];
-		com.sun.tools.javah.oldjavah.Main.main(newjhargs);
-		return;
-	    }
-	}
-
 	if (args.length == 0) {
 	    Util.usage(1);
 	}
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/Gen.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,337 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import java.io.FileOutputStream;
-import java.io.FileInputStream;
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import sun.tools.java.Constants;
-import sun.tools.java.Type;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.ClassNotFound;
-import sun.tools.tree.Expression;
-
-/**
- * An abstraction for generating support files required by native methods.
- * Subclasses are for specific native interfaces. At the time of its
- * original writing, this interface is rich enough to support JNI and the
- * old 1.0-style native method interface.
- *
- * @version 1.5, 12/03/01
- */
-public abstract class Gen implements Constants {
-
-    /**
-     * Override this abstract method, generating content for the named
-     * class into the outputstream.
-     */
-    protected abstract void write(OutputStream o, String clazz)
-	throws ClassNotFoundException;
-
-    /**
-     * Override this method to provide a list of #include statements
-     * required by the native interface.
-     */
-    protected abstract String getIncludes();
-
-    /*
-     * Gateway to type information.
-     */
-    protected JavahEnvironment env;
-    
-    public JavahEnvironment getEnvironment() {
-	return env;
-    }
-
-
-    /*
-     * Output location.
-     */
-    protected String outDir;
-
-    public void setOutDir(String outDir) {
-	/* Check important, otherwise concatenation of two null strings
-	 * produces the "nullnull" String. */
-	if (outDir != null) {
-	    this.outDir = outDir + System.getProperty("file.separator");
-	    File d = new File(outDir);
-	    if (!d.exists())
-		if (!d.mkdirs())
-		    Util.error("cant.create.dir", d.toString());
-	}
-    }
-
-    protected String outFile;
-
-    public void setOutFile(String outFile) {
-	this.outFile = outFile;
-    }
-
-
-    /*
-     * List of classes for which we must generate output.
-     */
-    protected String[] classes;
-
-    public void setClasses(String[] classes) {
-	this.classes = classes;
-    }
-
-
-    /*
-     * Where do we look for .class files?
-     */
-    protected String classpath;
-
-    public void setClasspath(String classpath) {
-	this.env = new JavahEnvironment(classpath);
-    }
-
-
-    /*
-     * Smartness with generated files.
-     */
-    protected boolean force = false;
-    
-    public void setForce(boolean state) {
-	force = state;
-    }
-
-    /**
-     * We explicitly need to write ASCII files because that is what C
-     * compilers understand.
-     */
-    protected PrintWriter wrapWriter(OutputStream o) {
-	try {
-	    return new
-		PrintWriter(new OutputStreamWriter(o, "ISO8859_1"), true);
-	} catch (UnsupportedEncodingException use) {
-	    Util.bug("encoding.iso8859_1.not.found");
-	    return null; /* dead code */
-	}
-    }
-
-
-    /**
-     * After initializing state of an instance, use this method to start
-     * processing.
-     *
-     * Buffer size chosen as an approximation from a single sampling of:
-     *         expr `du -sk` / `ls *.h | wc -l`
-     */
-    public void run() throws IOException, ClassNotFoundException {
-	int i = 0;
-	if (outFile != null) {
-	    /* Everything goes to one big file... */
-	    ByteArrayOutputStream bout = new ByteArrayOutputStream(8192);
-	    writeFileTop(bout); /* only once */
-	    for (i = 0; i < classes.length; i++) {
-		write(bout, classes[i]);
-	    }
-	    writeIfChanged(bout.toByteArray(), outFile);
-	} else {
-	    /* Each class goes to its own file... */
-	    for (i = 0; i < classes.length; i++) {
-		ByteArrayOutputStream bout = new ByteArrayOutputStream(8192);
-		writeFileTop(bout);
-		String clazz = classes[i];
-		write(bout, clazz);
-		writeIfChanged(bout.toByteArray(), getFileName(clazz));
-	    }
-	}
-    }
-    
-
-   /*
-    * Write the contents of byte[] b to a file named file.  Writing
-    * is done if either the file doesn't exist or if the contents are
-    * different.
-    */
-    private void writeIfChanged(byte[] b, String file) throws IOException {
-	File f = new File(file);
-	boolean mustWrite = false;
-	String event = "[No need to update file ";
-	
-	if (force) {
-	    mustWrite = true;
-	    event = "[Forcefully writing file ";
-	} else {
-	    if (!f.exists()) {
-		mustWrite = true;
-		event = "[Creating file ";
-	    } else {
-		int l = (int)f.length();
-		if (b.length != l) {
-		    mustWrite = true;
-		    event = "[Overwriting file ";
-		} else {
-		    /* Lengths are equal, so read it. */
-		    byte[] a = new byte[l];
-		    FileInputStream in = new FileInputStream(f);
-		    if (in.read(a) != l) {
-		    in.close();
-		    /* This can't happen, we already checked the length. */
-		    Util.error("not.enough.bytes", Integer.toString(l),
-			       f.toString());
-		    }
-		    in.close();
-		    while (--l >= 0) {
-		    if (a[l] != b[l]) {
-			mustWrite = true;
-			event = "[Overwriting file ";
-		    }
-		    }
-		}
-	    }
-	}
-	if (Util.verbose)
-	    Util.log(event + file + "]");
-	if (mustWrite) {
-	    OutputStream out = new FileOutputStream(file);
-	    out.write(b); /* No buffering, just one big write! */
-	    out.close();
-	}
-    }
-    
-    static private final boolean isWindows = 
-	System.getProperty("os.name").startsWith("Windows");
-
-    protected String defineForStatic(String c, MemberDefinition f) {
-	String cname = Mangle.mangle(c, Mangle.Type.CLASS);
-	String fname = Mangle.mangle(f.getName().toString(),
-				   Mangle.Type.FIELDSTUB);
-
-	if (!f.isStatic())
-	    Util.bug("tried.to.define.non.static");
-	
-	if (f.isFinal()) {
-	    Object value = null;
-	    try {
-		Expression constExpression = 
-		    (Expression)f.getValue(getEnvironment());
-		if (constExpression != null) {
-		    value = constExpression.getValue();
-		}
-	    } catch (ClassNotFound cnf) {
-		/* REMIND: why is this generated, and how do we
-		 * gracefully bail when it happens? */
-	    }
-	    if (value != null) { /* so it is a ConstantExpression */
-		String constString = null;
-		if (value instanceof Integer) {
-		    /* covers byte, boolean, char, short, int */
-		    constString = value.toString() + "L";
-		} else if (value instanceof Long) {
-		    // Visual C++ supports the i64 suffix, not LL.
-		    if (isWindows)
-			constString = value.toString() + "i64";
-		    else
-			constString = value.toString() + "LL";
-		} else if (value instanceof Float) {
-		    /* bug for bug */
-		    float fv = ((Float)value).floatValue();
-		    if (Float.isInfinite(fv))
-			constString = ((fv < 0) ? "-" : "") + "Inff";
-		    else
-			constString = value.toString() + "f";
-		} else if (value instanceof Double) {
-		    /* bug for bug */
-		    double d = ((Double)value).doubleValue();
-		    if (Double.isInfinite(d))
-			constString = ((d < 0) ? "-" : "") + "InfD";
-		    else
-			constString = value.toString();
-		}
-		if (constString != null) {
-		    StringBuffer s = new StringBuffer("#undef ");
-		    s.append(cname); s.append("_"); s.append(fname);
-		    s.append("\n#define "); s.append(cname); s.append("_");
-		    s.append(fname); s.append(" "); s.append(constString);
-		    return s.toString();
-		}
-	    }
-	}
-	/* bug for bug. */
-	if (f.getType() != Type.tString ||
-	    (f.getType() == Type.tString && !f.isFinal()))
-	    return "/* Inaccessible static: " + fname + " */";
-	return null;
-    }
-
-    /*
-     * Deal with the C pre-processor.
-     */
-    protected String cppGuardBegin() {
-	return "#ifdef __cplusplus\nextern \"C\" {\n#endif";
-    }
-
-    protected String cppGuardEnd() {
-	return "#ifdef __cplusplus\n}\n#endif";
-    }
-
-    protected String guardBegin(String cname) {
-	return "/* Header for class " + cname + " */\n\n" + 
-	    "#ifndef _Included_" + cname + "\n" + 
-	    "#define _Included_" + cname;
-    }
-
-    protected String guardEnd(String cname) {
-	return "#endif";
-    }
-
-    /*
-     * File name and file preamble related operations.
-     */
-    protected void writeFileTop(OutputStream o) {
-	PrintWriter pw = wrapWriter(o);
-	pw.println("/* DO NOT EDIT THIS FILE - it is machine generated */\n" +
-		   getIncludes());
-    }
-    
-    protected String baseFileName(String clazz) {
-	StringBuffer f = 
-	    new StringBuffer(Mangle.mangle(clazz,
-					   Mangle.Type.CLASS));
-	if (outDir != null) {
-	    f.insert(0, outDir);
-	}
-	return f.toString();
-    }
-
-    protected String getFileName(String clazz) {
-	return baseFileName(clazz) + getFileSuffix();
-    }
-
-    protected String getFileSuffix() {
-	return ".h";
-    }
-}
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/JNI.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.Vector;
-import java.util.Enumeration;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.Type;
-import sun.tools.java.ArrayType;
-import sun.tools.java.MethodType;
-
-/**
- * Header file generator for JNI.
- *
- * @version 1.4, 12/03/01
- */
-public class JNI extends Gen {
-
-    public String getIncludes() {
-	return "#include <jni.h>";
-    }
-    
-    public void write(OutputStream o, String clazz)
-	throws ClassNotFoundException {
-	String cname = Mangle.mangle(clazz, Mangle.Type.CLASS);
-	PrintWriter pw = wrapWriter(o);
-	pw.println(guardBegin(cname));
-	pw.println(cppGuardBegin());
-
-	/* Write statics. */
-	MemberDefinition[] fields = env.getAllFields(clazz);
-	for (int i = 0; i < fields.length; i++) {
-	    if (!fields[i].isStatic())
-		continue;
-	    String s = null;
-	    s = defineForStatic(clazz, fields[i]);
-	    if (s != null) {
-		pw.println(s);
-	    }
-	}
-	
-	/* Write methods. */
-	MemberDefinition[] methods = env.getNativeMethods(clazz);
-	for (int i = 0; i < methods.length; i++) {
-	    MemberDefinition md = methods[i];
-	    MethodType mt = (MethodType)md.getType();
-	    String methodName = md.getName().toString();
-
-	    boolean longName = false;
-	    for (int j = 0; j < methods.length; j++) {
-		if (methods[j] != md &&
-		    methodName.equals(methods[j].getName().toString()))
-		    longName = true;
-	    }
-
-	    pw.println("/*");
-	    pw.println(" * Class:     " + cname);
-	    pw.println(" * Method:    " + 
-		       Mangle.mangle(methodName, Mangle.Type.FIELDSTUB));
-	    pw.println(" * Signature: " + mt.getTypeSignature());
-	    pw.println(" */");
-	    pw.println("JNIEXPORT " + jniType(mt.getReturnType()) +
-		       " JNICALL " + 
-		       Mangle.mangleMethod(md, clazz,
-					 (longName) ? 
-					 Mangle.Type.METHOD_JNI_LONG :
-					 Mangle.Type.METHOD_JNI_SHORT));
-	    pw.print("  (JNIEnv *, ");
-	    Type[] args = mt.getArgumentTypes();
-	    if (md.isStatic())
-		pw.print("jclass");
-	    else
-		pw.print("jobject");
-	    if (args.length > 0)
-		pw.print(", ");
-	    for (int j = 0; j < args.length; j++) {
-		pw.print(jniType(args[j]));
-		if (j != (args.length - 1)) {
-		    pw.print(", ");
-		}
-	    }
-	    pw.println(");\n");
-	}
-	
-	pw.println(cppGuardEnd());
-	pw.println(guardEnd(cname));
-    }
-
-    protected final String jniType(Type t) {
-	if (t instanceof ArrayType) {
-	    Type elmT = t.getElementType();
-	    switch (elmT.getTypeCode()) {
-	    case TC_BOOLEAN: return "jbooleanArray";
-	    case TC_BYTE:    return "jbyteArray";
-	    case TC_CHAR:    return "jcharArray";
-	    case TC_SHORT:   return "jshortArray";
-	    case TC_INT:     return "jintArray";
-	    case TC_LONG:    return "jlongArray";
-	    case TC_FLOAT:   return "jfloatArray";
-	    case TC_DOUBLE:  return "jdoubleArray";
-	    case TC_ARRAY:
-	    case TC_CLASS:   return "jobjectArray";
-	    }
-	} else {
-	    switch (t.getTypeCode()) {
-	    case TC_VOID:    return "void";
-	    case TC_BOOLEAN: return "jboolean";
-	    case TC_BYTE:    return "jbyte";
-	    case TC_CHAR:    return "jchar";
-	    case TC_SHORT:   return "jshort";
-	    case TC_INT:     return "jint";
-	    case TC_LONG:    return "jlong";
-	    case TC_FLOAT:   return "jfloat";
-	    case TC_DOUBLE:  return "jdouble";
-	    case TC_CLASS:   
-		{
-		    if (t == Type.tString)
-			return "jstring";
-		    else if (t == Type.tClassDesc)
-			return "jclass";
-		    else if (env.isThrowable(t))
-			return "jthrowable";
-		    else 
-			return "jobject";
-		}
-	    }
-	}
-	Util.bug("jni.unknown.type");
-	return null; /* dead code. */
-    }
-}
-    
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/JavahEnvironment.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,237 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import sun.tools.java.Environment;
-import sun.tools.java.ClassPath;
-import sun.tools.java.Type;
-import sun.tools.java.Identifier;
-import sun.tools.java.BinaryClass;
-import sun.tools.java.ClassDefinition;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.ClassFile;
-import java.util.Hashtable;
-import java.util.Vector;
-import java.util.Stack;
-import java.io.File;
-import java.io.InputStream;
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.IOException;
-
-/**
- * <code>JavahEnvironment</code> provides classfile structure related
- * services to <code>javah</code>. In particular, it provides lists of
- * native methods and fields of a given class.<p>
- *
- * This class extends <code>sun.tools.java.Environment</code> because
- * <code>BinaryClass.load()</code> requires an environment. An environment,
- * in general, is used by <code>sun.tools.java.*</code> to remember loaded
- * classes, and process error messages. Note that
- * <code>JavahEnvironment</code> is not intended to be a general purpose
- * environment, and implements minimal functionality sufficient to read
- * classfiles (which is why it is package private).<p>
- *
- * <code>javah</code> can not use reflection. If it did, it will not be
- * able to generate header files for newer versions of system classes.
- * 
- * @version 1.5, 12/03/01
- * @see     sun.tools.java.Environment
- * @see     sun.tools.java.BinaryClass
- * @see     sun.tools.java.MemberDefinition
- * @see     sun.tools.java.ClassPath 
- */
-class JavahEnvironment extends Environment {
-
-    /**
-      * A datastructure to remember loaded <code>ClassDeclaration</code>s.
-      * @see sun.tools.java.ClassDeclaration
-      */
-    Hashtable classDecls = new Hashtable();
-    ClassPath classPath = null;
-    
-    JavahEnvironment(String classPathStr) {
-	this.classPath = new ClassPath(classPathStr);
-    }
-
-    MemberDefinition[] getNativeMethods(String classname) 
-		throws ClassNotFoundException {
-	Vector natives = new Vector();
-	BinaryClass bc = this.getClass(classname);
-	for (MemberDefinition md = bc.getFirstMember();  
-	     md != null ; md = md.getNextMember()) {
-	    if (md.isNative()) {
-		natives.add(md);
-	    }
-	}
-	MemberDefinition[] ret = new MemberDefinition[natives.size()];
-	for (int i = 0; i < ret.length; i++) {
-	    ret[i] = (MemberDefinition)natives.elementAt(i);
-	}
-	return ret;
-    }
-
-    /**
-     * Including super classes' fields.
-     */
-    MemberDefinition[] getAllFields(String classname) 
-		throws ClassNotFoundException {
-	Vector fields = new Vector();
-	ClassDefinition cd = null;
-	Stack s = new Stack();
-	
-	cd = this.getClass(classname);
-	while (true) {
-	    s.push(cd);
-	    ClassDeclaration c = cd.getSuperClass();
-	    if (c == null) break;
-	    String superClazz = c.getName().toString();
-	    cd = this.getClass(superClazz);
-	}
-	
-	while (!s.empty()) {
-	    cd = (ClassDefinition)s.pop();
-	    for (MemberDefinition md = cd.getFirstMember();  
-		 md != null ; md = md.getNextMember()) {
-		if (!md.isMethod()) {
-		    fields.add(md);
-		}
-	    }
-	}
-	MemberDefinition[] ret = new MemberDefinition[fields.size()];
-	for (int i = 0; i < ret.length; i++) {
-	    ret[i] = (MemberDefinition)fields.elementAt(i);
-	}
-	return ret;
-    }
-
-    /**
-     * Excluding super classes' fields.
-     */
-    MemberDefinition[] getLocalFieldsAndMethods(String classname) 
-		throws ClassNotFoundException {
-	Vector fields = new Vector();
-	ClassDefinition cd = null;
-	
-	cd = this.getClass(classname);
-	for (MemberDefinition md = cd.getFirstMember();  
-	     md != null ; md = md.getNextMember()) {
-	    fields.add(md);
-	}
-	MemberDefinition[] ret = new MemberDefinition[fields.size()];
-	for (int i = 0; i < ret.length; i++) {
-	    ret[i] = (MemberDefinition)fields.elementAt(i);
-	}
-	return ret;
-    }
-
-
-    /**
-     * Get the superclass name.
-     */
-    String getSuperClassName(String classname) 
-		throws ClassNotFoundException {
-	ClassDefinition cd = null;
-	
-	cd = this.getClass(classname);
-	ClassDeclaration c = cd.getSuperClass();
-	if (c == null) return null;
-	else return c.getName().toString();
-    }
-	
-    /* 
-     * Should use weak refs. Hard cache, remembering everthing ever
-     * loaded, means that when given a large set of classes, the VM
-     * heapsize must be large. But in realistic situations too many
-     * classes are not fed to javah, so for now this is okay.
-     */
-    private Hashtable binClassCache = new Hashtable();
-
-    public BinaryClass getClass(String className) 
-        	throws ClassNotFoundException {
-        try {
-	    BinaryClass b = null;
-	    if ((b = (BinaryClass)binClassCache.get(className)) != null) {
-		return b;
-	    }
-	    String fileName = 
-		className.replace('.', File.separatorChar).concat(".class");
-	    ClassFile cf = classPath.getFile(fileName);
-	    if (cf == null) {
-		throw new ClassNotFoundException(className);
-	    }
-	    if (Util.verbose)
-		Util.log("[Loaded " + cf.getPath() + "]");
-	    InputStream in = cf.getInputStream();
-	    b = BinaryClass.load(this, new DataInputStream
-				 (new BufferedInputStream(in)));
-	    in.close();
-	    binClassCache.put(className, b);
-	    return b;
-	} catch (IOException ioe) {
-	    throw new ClassNotFoundException(className);
-	}
-    }
-
-    public ClassDeclaration getClassDeclaration(Identifier nm) {
-	return getClassDeclaration(Type.tClass(nm));
-    }
-    
-    public ClassDeclaration getClassDeclaration(Type t) {
-	//System.out.println("@@getClassDeclaration: got ... " + t.toString());
-	ClassDeclaration c = (ClassDeclaration)classDecls.get(t);
-	if (c == null) {
-	    classDecls.put(t, c = new ClassDeclaration(t.getClassName()));
-	}
-	return c;
-    }
-
-    public final boolean isThrowable(Type t) {
-	try {
-	    ClassDefinition cd = this.getClass(t.toString());
-	    while (true) {
-		if (cd.getName().toString().equals("java.lang.Throwable")) {
-		    return true;
-		}
-		ClassDeclaration c = cd.getSuperClass();
-		if (c == null) break;
-		String superClazz = c.getName().toString();
-		cd = this.getClass(superClazz);
-	    }
-	    return false;
-	} catch (ClassNotFoundException cnfe) {
-	    Util.error("super.class.not.found", cnfe.getMessage());
-	}
-	return false; /* dead code */
-    }
-
-    private boolean verbose = false;
-    public void setVerbose(boolean state) {
-	this.verbose = state;
-    }
-}
-
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/LLNI.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,570 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import java.io.File;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.Hashtable;
-import sun.tools.java.ArrayType;
-import sun.tools.java.ClassNotFound;
-import sun.tools.java.Identifier;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.MethodType;
-import sun.tools.java.Type;
-import sun.tools.tree.Expression;
-import sun.tools.tree.DoubleExpression;
-import sun.tools.tree.FloatExpression;
-import sun.tools.tree.IntExpression;
-import sun.tools.tree.LongExpression;
-
-public class LLNI extends Gen {
-
-    protected final char  pathChar = File.separatorChar; 
-    protected final char  innerDelim = '$';	/* For inner classes */
-    protected Hashtable   doneHandleTypes;
-    MemberDefinition[]	  fields;
-    private boolean       doubleAlign;
-    private int           padFieldNum = 0;
-
-    LLNI(boolean doubleAlign) { this.doubleAlign = doubleAlign; }
-
-    protected String getIncludes() {
-	return "";
-    }
-
-    protected void write(OutputStream o, String clazz)
-    throws ClassNotFoundException {
-	String cname     = mangleClassName(clazz);
-	PrintWriter pw   = wrapWriter(o);
-	fields = env.getLocalFieldsAndMethods(clazz);
-	generateDeclsForClass(pw, clazz, cname);
-    }
-
-    protected void generateDeclsForClass(PrintWriter pw,
-					 String clazz, String cname)
-    throws ClassNotFoundException {
-	doneHandleTypes  = new Hashtable();
-	/* The following handle types are predefined in "typedefs.h". Suppress
-	   inclusion in the output by generating them "into the blue" here. */
-	genHandleType(null, "java.lang.Class");
-	genHandleType(null, "java.lang.ClassLoader");
-	genHandleType(null, "java.lang.Object");
-	genHandleType(null, "java.lang.String");
-	genHandleType(null, "java.lang.Thread");
-	genHandleType(null, "java.lang.ThreadGroup");
-	genHandleType(null, "java.lang.Throwable");
-
-	pw.println("/* LLNI Header for class " + clazz + " */\n");
-	pw.println("#ifndef _Included_" + cname);
-	pw.println("#define _Included_" + cname);
-	pw.println("#include \"typedefs.h\"");
-	pw.println("#include \"llni.h\"");
-	pw.println("#include \"jni.h\"\n");
-	forwardDecls(pw, clazz);
-	structSectionForClass(pw, clazz, cname);
-	methodSectionForClass(pw, clazz, cname);
-	pw.println("#endif");
-    }
-
-    protected void genHandleType(PrintWriter pw, String clazz) {
-	String cname = mangleClassName(clazz);
-	if (!doneHandleTypes.containsKey(cname)) {
-	    doneHandleTypes.put(cname, cname);
-	    if (pw != null) {
-		pw.println("#ifndef DEFINED_" + cname);
-		pw.println("    #define DEFINED_" + cname);
-		pw.println("    GEN_HANDLE_TYPES(" + cname + ");");
-		pw.println("#endif\n");
-	    }
-	}
-    }
-
-    protected String mangleClassName(String s) { 
-	return s.replace('.', '_')
-	        .replace(pathChar, '_')
-	        .replace(innerDelim, '_'); 
-    }
-
-    protected void forwardDecls(PrintWriter pw, String clazz)
-    throws ClassNotFoundException {
-
-	if (clazz.equals("java.lang.Object"))
-	    return;
-	genHandleType(pw, clazz);
-	String superClassName = env.getSuperClassName(clazz);
-	    forwardDecls(pw, superClassName);
-
-	for (int i = 0; i < fields.length; i++) {
-	    MemberDefinition field = fields[i];
-	    if ((!field.isStatic() && field.isVariable()) || field.isNative()) {
-		String sig = field.getType().getTypeSignature();
-		if (sig.charAt(0) != '[')
-		    forwardDeclsFromSig(pw, sig);
-	    }
-	}
-    }
-
-    protected void forwardDeclsFromSig(PrintWriter pw, String sig) {
-	int    len = sig.length();
-	int    i   = sig.charAt(0) == '(' ? 1 : 0;
-	/* Skip the initial "(". */
-	while (i < len) {
-	    if (sig.charAt(i) == 'L') {
-		int j = i + 1;
-		while (sig.charAt(j) != ';') j++;
-		genHandleType(pw, sig.substring(i + 1, j));
-		i = j + 1;
-	    } else {
-		i++;
-	    }
-	}
-    }
-
-    protected void structSectionForClass(PrintWriter pw,
-					 String jname, String cname) 
-    throws ClassNotFoundException {
-	if (cname.equals("java_lang_Object")) {
-	  pw.println("/* struct java_lang_Object is defined in typedefs.h. */");
-	  pw.println();
-	  return;
-	}
-	pw.println("#if !defined(__i386)");
-	pw.println("#pragma pack(4)");
-	pw.println("#endif");
-	pw.println();
-	pw.println("struct " + cname + " {");
-	pw.println("    ObjHeader h;");
-	pw.print(fieldDefs(jname, cname));
-	if (jname.equals("java.lang.Class"))
-	    pw.println("    Class *LLNI_mask(cClass);" +
-		       "  /* Fake field; don't access (see oobj.h) */");
-	pw.println("};\n\n#pragma pack()");
-	pw.println();
-	return;
-    }
-
-    private static class FieldDefsRes {
-      public String className;	/* Name of the current class. */
-      public FieldDefsRes parent;
-      public String s;
-      public int byteSize;
-      public boolean bottomMost;
-      public boolean printedOne = false;
-
-      FieldDefsRes(String className, FieldDefsRes parent, boolean bottomMost) {
-	this.className = className; this.parent = parent;
-	this.bottomMost = bottomMost;
-	int byteSize = 0;
-	if (parent == null) this.s = "";
-	else this.s = parent.s;
-      }
-    }
-
-    /* Returns "true" iff added a field. */
-    private boolean doField(FieldDefsRes res, MemberDefinition field,
-			    String cname, boolean padWord)
-      throws ClassNotFoundException {
-	if (field.isVariable()) {
-	  String fieldDef = addStructMember(field, cname, padWord);
-	  if (fieldDef != null) {
-	    if (!res.printedOne) { /* add separator */
-	      if (res.bottomMost) {
-		if (res.s.length() != 0)
-		  res.s = res.s + "    /* local members: */\n";
-	      } else {
-		res.s = res.s + "    /* inherited members from " + 
-		  res.className + ": */\n";
-	      }
-	      res.printedOne = true;
-	    }
-	    res.s = res.s + fieldDef;
-	    return true;
-	  }
-	}
-	// Otherwise.
-	return false;
-    }
-
-    private int doTwoWordFields(FieldDefsRes res, String clazz,
-				int offset, String cname, boolean padWord)
-      throws ClassNotFoundException {
-	boolean first = true;
-	MemberDefinition[] members = env.getLocalFieldsAndMethods(clazz);
-	for (int i = 0; i < members.length; i++) {
-	  MemberDefinition field = members[i];
-	  if (!field.isVariable()) continue;
-	  int tc = field.getType().getTypeCode();
-	  boolean twoWords = (tc == TC_LONG || tc == TC_DOUBLE);
-	  if (twoWords && doField(res, field, cname, first && padWord)) {
-	    offset += 8; first = false;
-	  }
-	}
-	return offset;
-    }
-
-    protected String fieldDefs(String clazz, String cname)
-      throws ClassNotFoundException {
-	FieldDefsRes res = fieldDefs(clazz, cname, true);
-	return res.s;
-    }
-
-    protected FieldDefsRes fieldDefs(String clazz, String cname,
-				     boolean bottomMost)
-      throws ClassNotFoundException {
-	FieldDefsRes res;
-	int offset;
-	boolean didTwoWordFields = false;
-	String supername = env.getSuperClassName(clazz);
-	if (supername != null) {
-	  res = new FieldDefsRes(clazz,
-				 fieldDefs(supername, cname, false),
-				 bottomMost);
-	  offset = res.parent.byteSize;
-	} else {
-	  res = new FieldDefsRes(clazz, null, bottomMost);
-	  offset = 0;
-	}
-	
-	MemberDefinition[] members = env.getLocalFieldsAndMethods(clazz);
-	for (int i = 0; i < members.length; i++) {
-	  MemberDefinition field = members[i];
-	  if (!field.isVariable()) continue;
-	  
-	  if (doubleAlign && !didTwoWordFields && (offset % 8) == 0) {
-	    offset = doTwoWordFields(res, clazz, offset, cname, false);
-	    didTwoWordFields = true;
-	  }
-	  int tc = field.getType().getTypeCode();
-	  boolean twoWords = (tc == TC_LONG || tc == TC_DOUBLE);
-	  if (!doubleAlign || !twoWords) {
-	    if (doField(res, field, cname, false)) offset += 4;
-	  }
-	}
-	if (doubleAlign && !didTwoWordFields) {
-	  if ((offset % 8) != 0) offset += 4;
-	  offset = doTwoWordFields(res, clazz, offset, cname, true);
-	}
-	res.byteSize = offset;
-	return res;
-    }
-
-    /* OVERRIDE: This method handles instance fields */
-    protected String addStructMember(MemberDefinition field, String cname,
-				     boolean padWord)
-    throws ClassNotFoundException {
-      String res = null;
-      if (field.isStatic()) {
-	  res = addStaticStructMember(field, cname);
-	  if (res == null) /* JNI didn't handle it, print comment. */
-	    res = "    /* Inaccessible static: " + field + " */\n";
-      } else {
-	if (padWord) res = "    java_int padWord" + padFieldNum++ + ";\n";
-	res = "    " + llniType(field.getType(), false, false) + " " 
-	    + llniFieldName(field);
-	if (isLongOrDouble(field.getType())) res = res + "[2]";
-	res = res + ";\n";
-      }
-      return res;
-    }
-
-    static private final boolean isWindows = 
-	System.getProperty("os.name").startsWith("Windows");
-
-    /*
-     * This method only handles static final fields.
-     */
-    protected String addStaticStructMember(MemberDefinition field, String cname)
-    throws ClassNotFoundException {
-	String res = null;
-	Expression exp;
-
-	if (!field.isStatic())
-	    return res;
-	if (!field.isFinal())
-	    return res;
-
-	try {
-	    exp = (Expression)field.getValue(env);
-	} catch (ClassNotFound e) {
-	    throw new ClassNotFoundException(e.getMessage());
-	}
-	if (exp != null) {
-	    /* Constant. */
-	    String     cn     = cname + "_" + field.getName().toString();
-	    String     suffix = null;
-	    long	   val = 0;
-	    /* Can only handle int, long, float, and double fields. */
-	    if (exp instanceof IntExpression) {
-		suffix = "L";
-		val = ((Integer) exp.getValue()).intValue();
-	    }
-	    if (exp instanceof LongExpression) {
-		// Visual C++ supports the i64 suffix, not LL
-		suffix = isWindows ? "i64" : "LL";
-		val = ((Long) exp.getValue()).longValue();
-	    }
-	    if (exp instanceof FloatExpression)  suffix = "f";
-	    if (exp instanceof DoubleExpression) suffix = "";
-	    if (suffix != null) {
-		// Some compilers will generate a spurious warning
-		// for the integer constants for Integer.MIN_VALUE
-		// and Long.MIN_VALUE so we handle them specially.
-		if ((suffix.equals("L") && (val == Integer.MIN_VALUE)) ||
-		    (suffix.equals("LL") && (val == Long.MIN_VALUE))) {
-		    res = "    #undef  " + cn + "\n"
-			+ "    #define " + cn
-			+ " (" + (val + 1) + suffix + "-1)\n";
-		} else {
-		    res = "    #undef  " + cn + "\n"
-			+ "    #define " + cn + " "
-			+ exp.getValue().toString()
-			+ suffix + "\n";
-		}
-	    }
-	}
-	return res;
-    }
-
-    protected void methodSectionForClass(PrintWriter pw,
-					 String clazz, String cname) 
-    throws ClassNotFoundException {
-	String methods = methodDecls(clazz, cname);
-
-	if (methods.length() != 0) {
-	    pw.println("/* Native method declarations: */\n");
-	    pw.println("#ifdef __cplusplus");
-	    pw.println("extern \"C\" {");
-	    pw.println("#endif\n");
-	    pw.println(methods);
-	    pw.println("#ifdef __cplusplus");
-	    pw.println("}");
-	    pw.println("#endif");
-	}
-    }
-
-    protected String methodDecls(String clazz, String cname)
-    throws ClassNotFoundException {
-
-	String res = "";
-	for (int i = 0; i < fields.length; i++) {
-	    MemberDefinition field = fields[i];
-	    if (field.isNative())
-		res = res + methodDecl(field, clazz, cname);
-	}
-	return res;
-    }
-
-    protected String methodDecl(MemberDefinition field,
-				String clazz, String cname)
-    throws ClassNotFoundException {
-	String res;
-	String sig = field.getType().getTypeSignature();
-	boolean longName = needLongName(field, clazz);
-
-	if (sig.charAt(0) != '(')
-	    Util.error("invalid.method.signature", sig);
-	MethodType mtype = (MethodType)field.getType();
-	Type retType = mtype.getReturnType();
-	res = "JNIEXPORT " + jniType(retType) + " JNICALL\n"
-	    + jniMethodName(field, cname, longName) 
-            + "(JNIEnv *, " + cRcvrDecl(field, cname);
-	Type argTypes[] = mtype.getArgumentTypes();
-	/* It would have been nice to include the argument names in the
-	   declaration, but there seems to be a bug in the "BinaryField"
-	   class, causing the getArguments() method to return "null" for 
-	   most (non-constructor) methods. */
-	for (int i = 0; i < argTypes.length; i++)
-	    res = res + ", " + jniType(argTypes[i]);
-	res = res + ");\n";
-	return res;
-    }
-
-    protected final boolean needLongName(MemberDefinition method,
-					 String clazz)
-    throws ClassNotFoundException {
-	Identifier mIdent = method.getName();
-	for (int i = 0; i < fields.length; i++) {
-	    MemberDefinition field = fields[i];
-	    if ((field != method) &&
-		field.isNative() && (mIdent == field.getName()))
-		return true;
-	}
-	return false;
-    }
-
-    protected final String jniMethodName(MemberDefinition method, String cname, 
-					 boolean longName) { 
-	String res = "Java_" + cname + "_" + method.getName().toString();
-
-	if (longName) {
-	    MethodType mTypes = (MethodType)method.getType();
-	    Type argTypes[] = mTypes.getArgumentTypes();
-	    res = res + "__";
-	    for (int i = 0; i < argTypes.length; i++)
-		res = res + nameToIdentifier(argTypes[i].getTypeSignature());
-	}
-	return res;
-    }
-
-    protected final String jniType(Type t) {
-	if (t instanceof ArrayType) {
-	    Type elmT = t.getElementType();
-	    switch (elmT.getTypeCode()) {
-	    case TC_BOOLEAN: return "jbooleanArray";
-	    case TC_BYTE:    return "jbyteArray";
-	    case TC_CHAR:    return "jcharArray";
-	    case TC_SHORT:   return "jshortArray";
-	    case TC_INT:     return "jintArray";
-	    case TC_LONG:    return "jlongArray";
-	    case TC_FLOAT:   return "jfloatArray";
-	    case TC_DOUBLE:  return "jdoubleArray";
-	    case TC_ARRAY:
-	    case TC_CLASS:   return "jobjectArray";
-	    }
-	} else {
-	    switch (t.getTypeCode()) {
-	    case TC_VOID:    return "void";
-	    case TC_BOOLEAN: return "jboolean";
-	    case TC_BYTE:    return "jbyte";
-	    case TC_CHAR:    return "jchar";
-	    case TC_SHORT:   return "jshort";
-	    case TC_INT:     return "jint";
-	    case TC_LONG:    return "jlong";
-	    case TC_FLOAT:   return "jfloat";
-	    case TC_DOUBLE:  return "jdouble";
-	    case TC_CLASS:   
-		{
-		    if (t == Type.tString)
-			return "jstring";
-		    else if (t == Type.tClassDesc)
-			return "jclass";
-		    /*
-		    else if (env.isThrowable(t))
-			return "jthrowable";
-		     */
-		    else 
-			return "jobject";
-		}
-	    }
-	}
-	Util.bug("jni.unknown.type");
-	return null; /* dead code. */
-    }
-
-    protected String llniType(Type t, boolean handleize, boolean longDoubleOK) {
-	String res = null;
-	if (t instanceof ArrayType) {
-	    Type elmT = t.getElementType();
-	    switch (elmT.getTypeCode()) {
-	    case TC_BOOLEAN: res = "IArrayOfBoolean"; break;
-	    case TC_BYTE:    res = "IArrayOfByte";    break;
-	    case TC_CHAR:    res = "IArrayOfChar";    break;
-	    case TC_SHORT:   res = "IArrayOfShort";   break;
-	    case TC_INT:     res = "IArrayOfInt";     break;
-	    case TC_LONG:    res = "IArrayOfLong";    break;
-	    case TC_FLOAT:   res = "IArrayOfFloat";   break;
-	    case TC_DOUBLE:  res = "IArrayOfDouble";  break;
-	    case TC_ARRAY:
-	    case TC_CLASS:   res = "IArrayOfRef";     break;
-	    }
-	    if (!handleize) res = "DEREFERENCED_" + res;
-	} else {
-	    switch (t.getTypeCode()) {
-	    case TC_VOID:    res = "void"; break;
-	    case TC_BOOLEAN:
-	    case TC_BYTE:
-	    case TC_CHAR:
-	    case TC_SHORT:
-	    case TC_INT:     res = "java_int"; break;
-	    case TC_LONG:    res = longDoubleOK ? "java_long"
-				 : "val32 /* java_long */";
-	    break;
-	    case TC_FLOAT:   res = "java_float"; break;
-	    case TC_DOUBLE:  res = longDoubleOK ? "java_double"
-				 : "val32 /* java_double */";
-	    break;
-	    case TC_CLASS:   res = "I" + 
-				 mangleClassName(t.getClassName().toString());
-	    if (!handleize) res = "DEREFERENCED_" + res;
-	    break;
-	    }
-	}
-	return res;
-    }
-
-    protected final String cRcvrDecl(MemberDefinition field, String cname) {
-	return (field.isStatic() ? "jclass" : "jobject");
-    }
-
-    protected String maskName(String s) { 
-	return "LLNI_mask(" + s + ")";
-    }
-
-    protected String llniFieldName(MemberDefinition field) {
-	return maskName(field.getName().toString());
-    }
-
-    protected final boolean isLongOrDouble(Type t) {
-	int tc = t.getTypeCode();
-	return tc == TC_LONG || tc == TC_DOUBLE;
-    }
-
-    /* Do unicode to ansi C identifier conversion.
-       %%% This may not be right, but should be called more often. */
-    protected final String nameToIdentifier(String name) {
-	int len = name.length();
-	StringBuffer buf = new StringBuffer(len);
-	for (int i = 0; i < len; i++) {
-	    char c = name.charAt(i);
-      
-	    if (isASCIILetterOrDigit(c))
-		buf.append(c);
-	    else if (c == '/')
-		buf.append('_');
-	    else if (c == '.')
-		buf.append('_');
-	    else if (c == '_')
-		buf.append("_1");
-	    else if (c == ';')
-		buf.append("_2");
-	    else if (c == '[')
-		buf.append("_3");
-	    else
-		buf.append("_0" + ((int)c));
-	}
-	return new String(buf);
-    }
-
-    protected final boolean isASCIILetterOrDigit(char c) {
-	if (((c >= 'A') && (c <= 'Z')) ||
-	    ((c >= 'a') && (c <= 'z')) ||
-	    ((c >= '0') && (c <= '9')))
-	    return true;
-	else
-	    return false;
-    }
-}
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/Main.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import sun.tools.util.CommandLine;
-import java.io.IOException;
-import java.io.FileNotFoundException;
-
-import java.io.File;
-
-/**
- * Javah generates support files for native methods.
- *
- * @version 1.10, 12/03/01
- */
-public class Main {
-
-    /**
-     * Generator used by javah.  Default is JNI.
-     */
-    Gen g = new JNI();
-
-    /**
-     * Entry point.
-     */
-    public static void main(String[] args) {
-	/* Preprocess @file arguments */
-	try {
-	    args = CommandLine.parse(args);
-	} catch (FileNotFoundException e) {
-	    Util.error("at.args.cant.read", e.getMessage());
-	} catch (IOException e) {
-	    Util.error("at.args.io.exception", e.getMessage());
-	}
-	
-	new Main(args).run();
-	System.exit(0);
-    }
-
-    /**
-     * Parse options.
-     */
-    public Main(String[] args) {
-	if (args.length == 0) {
-	    Util.usage(1);
-	}
-	
-	/* Default values for options, overridden by user options. */
-	String  bootcp      = System.getProperty("sun.boot.class.path");
-	String  usercp      = System.getProperty("env.class.path");
-	String  odir        = null;
-	String  ofile       = null;
-	boolean stubs       = false;
-	boolean jni         = false;
-	boolean old         = false;
-	boolean llni        = false;
-	boolean doubleAlign = false;
-	boolean force       = false;
-	String  genclass    = null;
-	
-	int i = 0;
-	for (; i < args.length; i++) {
-	    if (args[i].equals("-o")) {
-		ofile = args[++i];
-	    } else if (args[i].equals("-d")) {
-		odir = args[++i];
-	    } else if (args[i].equals("-td")) {
-		/* Ignored.  Generate tmp files to memory. */
-		i++;
-		if (i == args.length)
-		    Util.usage(1);
-	    } else if (args[i].equals("-stubs")) {
-		stubs = true;
-	    } else if (args[i].equals("-v") || args[i].equals("-verbose")) {
-		Util.verbose = true;
-	    } else if (args[i].equals("-help") || args[i].equals("--help") ||
-		       args[i].equals("-?") || args[i].equals("-h")) {
-		Util.usage(0);
-	    } else if (args[i].equals("-trace")) {
-		System.err.println(Util.getText("tracing.not.supported"));
-	    } else if (args[i].equals("-version")) {
-		Util.version();
-	    } else if (args[i].equals("-jni")) {
-		jni = true;
-	    } else if (args[i].equals("-force")) {
-		force = true;
-	    } else if (args[i].equals("-old")) {
-		old = true;
-	    } else if (args[i].equals("-Xllni")) {
-		llni = true;
-	    } else if (args[i].equals("-llni")) {
-		llni = true;
-	    } else if (args[i].equals("-llniDouble")) {
-		llni = true; doubleAlign = true;
-	    } else if (args[i].equals("-classpath")) {
-		usercp = args[++i];
-	    } else if (args[i].equals("-bootclasspath")) {
-		bootcp = args[++i];
-	    } else if (args[i].charAt(0) == '-') {
-		Util.error("unknown.option", args[i], null, true);
-	    } else {
-		break; /* The rest must be classes. */
-	    }
-	}
-
-	/*
-	 * Select native interface.
-	 */
-
-	if (old && jni)   Util.error("old.jni.mixed");
-	if (old && llni)  Util.error("old.llni.mixed");
-	if (jni && llni)  Util.error("jni.llni.mixed");
-	if (old && stubs)
-	    g = new OldStubs();
-	else if (old)
-	    g = new OldHeaders();
-	if (llni)
-	    g = new LLNI(doubleAlign);
-	if (g instanceof JNI && stubs)  Util.error("jni.no.stubs");
-
-	/*
-	 * Choose classpath.
-	 */
-	StringBuffer cp = new StringBuffer();
-	if (bootcp == null)
-	    cp.append(System.getProperty("java.class.path")); /* oldjava */
-	else {
-	    if (usercp == null)
-		usercp = ".";
-	    cp.append(bootcp);
-	    cp.append(java.io.File.pathSeparator);
-	    cp.append(usercp);
-	}
-	if (Util.verbose)
-	    Util.log("[Search path = " + cp + "]");
-	g.setClasspath(cp.toString());
-
-	/*
-	 * Arrange for output destination.
-	 */
-	if (odir != null && ofile != null)
-	    Util.error("dir.file.mixed");
-	if (odir != null)
-	    g.setOutDir(odir);
-	if (ofile != null)
-	    g.setOutFile(ofile);
-
-	/*
-	 * Force set to false will turn off smarts about checking file
-	 * content before writing.
-	 */
-	g.setForce(force);
-	
-	/* 
-	 * Grab the rest of argv[] ... this must be the classes.
-	 */
-	String[] classes = new String[args.length - i];
-	System.arraycopy(args, i, classes, 0, args.length - i);
-	
-	if (classes.length == 0) {
-	    Util.error("no.classes.specified");
-	}
-
-	g.setClasses(classes);
-    }
-    
-    public void run() {
-	try {
-	  g.run();
-	} catch (ClassNotFoundException cnfe) {
-	    Util.error("class.not.found", cnfe.getMessage());
-	} catch (IOException ioe) {
-	    Util.error("io.exception", ioe.getMessage());
-	}
-    }
-}
-
-
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/Mangle.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import sun.tools.java.MemberDefinition;
-
-/**
- * A utility for mangling java identifiers into C names.  Should make
- * this more fine grained and distribute the functionality to the
- * generators.
- *
- * @version 1.5, 12/03/01
- */
-class Mangle {
-    
-    public static class Type {
-	public static final int CLASS            = 1;
-	public static final int FIELDSTUB        = 2;
-	public static final int FIELD		 = 3;
-	public static final int JNI              = 4;
-	public static final int SIGNATURE        = 5;
-	public static final int METHOD_JDK_1     = 6;
-	public static final int METHOD_JNI_SHORT = 7;
-	public static final int METHOD_JNI_LONG  = 8;
-    };
-
-    public static final String mangle(String name, int mtype) { 
-	StringBuffer result = new StringBuffer(100);
-	int length = name.length();
-
-	for (int i = 0; i < length; i++) {
-	    char ch = name.charAt(i);
-	    if (isalnum(ch)) {
-		result.append(ch);
-	    } else if ((ch == '.' || ch == '$') &&
-		       mtype == Mangle.Type.CLASS) {
-		result.append('_');
-	    } else if (ch == '_' && mtype == Mangle.Type.FIELDSTUB) { 
-		result.append('_');
-	    } else if (mtype == Mangle.Type.JNI) {
-		String esc = null;
-		if (ch == '_')
-		    esc = "_1";
-		else if (ch == '.')
-		    esc = "_";
-		else if (ch == ';')
-		    esc = "_2";
-		else if (ch == '[')
-		    esc = "_3";
-		if (esc != null) {
-		    result.append(esc);
-		} else {
-		    result.append(mangleChar(ch));
-		}
-	    } else if (mtype == Mangle.Type.SIGNATURE) {
-		if (isprint(ch)) {
-		    result.append(ch);
-		} else {
-		    result.append(mangleChar(ch));
-		}
-	    } else {
-		result.append(mangleChar(ch));
-	    }
-	}
-	return result.toString();
-    }
-
-    public static String mangleMethod(MemberDefinition method, String clazz, 
-				      int mtype) {
-	StringBuffer result = new StringBuffer(100);
-	result.append("Java_");
-
-	if (mtype == Mangle.Type.METHOD_JDK_1) {
-	    result.append(mangle(clazz, Mangle.Type.CLASS));
-	    result.append('_');
-	    result.append(mangle(method.getName().toString(), 
-				       Mangle.Type.FIELD));
-	    result.append("_stub");
-	    return result.toString();
-	}
-
-	/* JNI */
-	result.append(mangle(clazz, Mangle.Type.JNI));
-	result.append('_');
-	result.append(mangle(method.getName().toString(),
-				   Mangle.Type.JNI));
-	if (mtype == Mangle.Type.METHOD_JNI_LONG) {
-	    result.append("__");
-	    String sig = method.getType().getTypeSignature().toString();
-	    sig = sig.substring(1);
-	    sig = sig.substring(0, sig.lastIndexOf(')'));
-	    sig = sig.replace('/', '.');
-	    result.append(mangle(sig, Mangle.Type.JNI));
-	}
-	return result.toString();
-    }
-    
-    public static final String mangleChar(char ch) {
-	String s = Integer.toHexString(ch);
-	int nzeros = 5 - s.length();
-	char[] result = new char[6];
-	result[0] = '_';
-	for (int i = 1; i <= nzeros; i++)
-	    result[i] = '0';
-	for (int i = nzeros+1, j = 0; i < 6; i++, j++)
-	    result[i] = s.charAt(j);
-	return new String(result);
-    }
-
-    /* Warning: Intentional ASCII operation. */
-    private static final boolean isalnum(char ch) {
-	return ch <= 0x7f && /* quick test */
-	    ((ch >= 'A' && ch <= 'Z') ||
-	     (ch >= 'a' && ch <= 'z') ||
-	     (ch >= '0' && ch <= '9'));
-    }
-    
-    /* Warning: Intentional ASCII operation. */
-    private static final boolean isprint(char ch) {
-	return ch >= 32 && ch <= 126;
-    }
-
-}
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/OldHeaders.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,365 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.Vector;
-import java.util.Enumeration;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.ClassDefinition;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.Type;
-import sun.tools.java.ArrayType;
-import sun.tools.java.ClassType;
-import sun.tools.java.MethodType;
-
-/**
- * Generate prototypes for JDK 1.0 style native method interface.  See
- * also OldStubs.
- *
- * @version 1.4, 12/03/01
- */
-public class OldHeaders extends Gen {
-
-    private static final String cindent = "    ";
-    private static final String cpad    = 
-      "char PAD;\t/* ANSI C requires structures to have a least one member */";
-
-    protected String getIncludes() {
-	return "#include <native.h>";
-    }
-
-    /**
-     * Do two things: (1) write the C "struct" for the class, and (2) write
-     * "prototypes" for each of the native methods.
-     */
-    protected void write(OutputStream o, String clazz) 
-					throws ClassNotFoundException {
-	PrintWriter pw = wrapWriter(o);
-	String cname     = Mangle.mangle(clazz, Mangle.Type.CLASS);
-	
-	MemberDefinition[] jFields  = env.getAllFields(clazz);
-	MemberDefinition[] jMethods = env.getNativeMethods(clazz);
-	Vector cMethods  = new Vector();
-	Vector cFields   = new Vector();
-	Vector sfwd      = new Vector();
-	
-	/*
-	 * Recursively translate _jFields_ into _cFields_, going up to the
-	 * most super class. Put any required fwd-declarations into _sfwd_, so
-	 * these can be written before writing out _cFields_. Return value is
-	 * important because we need to pad for empty structs.
-	 */
-	int    nfields   = getCStruct(clazz, jFields, sfwd, cFields);
-	
-	/*
-	 * Though we use sfwd as a file-global store for fwd decls, at the top
-	 * of the file, we must print fwd decls only for the C struct. So
-	 * remember this number because sfwd will grow in the next operation.
-	 */
-	int    nfwds     = sfwd.size();
-	
-	/*
-	 * Translate _jMethods_ to _cMethods_. Avoid duplicate fwd decls by
-	 * knowing that _sfwd_ already contains decls for certain types.
-	 */
-	cMethods         = getCPrototypes(clazz, jMethods, sfwd);
-	
-	pw.println(guardBegin(cname));
-
-	/*
-	 * Now print the C struct.
-	 */
-	if (!clazz.equals("java.lang.Object") 
-	    	&& !clazz.equals("java.lang.Class")) {
-	    /* fwd decls from the struct. */
-	    int i = 0;
-	    for (Enumeration e = sfwd.elements(); 
-		 (i++ < nfwds) && e.hasMoreElements();)
-		pw.println("struct H" +
-			   (String)e.nextElement() + ";");
-	    pw.println();
-	    
-	    String s = Util.getPlatformString("pack.pragma.start");
-	    if (s != null) pw.println(s);
-	    
-	    /* the C struct. */
-	    pw.println("typedef struct Class" + cname + " {");
-	    for (Enumeration e = cFields.elements(); e.hasMoreElements();)
-		pw.println((String)e.nextElement());
-	    if (nfields == 0)
-		pw.println(cindent + cpad);
-	    pw.println("} Class"+cname+";\n"+"HandleTo("+cname+");\n");
-
-	    s  = Util.getPlatformString("pack.pragma.end");
-	    if (s != null) pw.println(s);
-	}
-
-	/*
-	 * Now print the C prototypes.
-	 */
-	pw.println(cppGuardBegin());
-	for (Enumeration e = cMethods.elements(); e.hasMoreElements();) {
-	    pw.println((String)e.nextElement());
-	}
-	pw.println(cppGuardEnd());
-	
-	pw.println(guardEnd(cname));
-    }
-    
-    /*
-     * See comment at call site.
-     */
-    private int getCStruct(String clazz, MemberDefinition[] jFields,
-			   Vector sfwd, Vector cFields) {
-	int fcnt = 0;
-
-	if (jFields.length == 0) {
-	    return fcnt;
-	} 
-	
-	for (int i = 0; i < jFields.length; i++) {
-	    MemberDefinition f = jFields[i];
-	    Type t = f.getType();
-	    String fname = Mangle.mangle(f.getName().toString(),
-				       Mangle.Type.FIELDSTUB);
-	    
-	    if (f.isStatic()) {
-		String s = defineForStatic(clazz, f);
-		if (s != null) { 
-		    cFields.add(s);
-		}
-		continue;
-	    }
-
-	    /* So this is a really an instance field... */
-	    if (t instanceof ClassType || t instanceof ArrayType)
-		cFields.add(cindent + getCType(t, FOR_FIELD) + fname + ";");
-	    else
-		cFields.add(cindent + getCType(t, FOR_FIELD)
-			   + " " + fname + ";");
-	    fcnt++;
-	    addFwddeclIfRequired(sfwd, t, clazz);
-	}
-	return fcnt;
-    }
-
-    /*
-     * See comment at call site.
-     */
-    private Vector getCPrototypes(String clazz, MemberDefinition[] jMethods, 
-				  Vector sfwd) {
-	Vector entries = new Vector();
-
-	/* fwd decls for types that have first been seen in this prototype. */
-	Vector nfwd = new Vector();
-
-	for (int i = 0; i < jMethods.length; i++) {
-	    MemberDefinition md = jMethods[i];
-	    MethodType mt = (MethodType)md.getType();
-	    Type retType = mt.getReturnType();
-	    String retCType = getCType(retType, FOR_METHOD);
-	    StringBuffer result = new StringBuffer(80);
-	    
-	    String mangledClazz = Mangle.mangle(clazz, Mangle.Type.CLASS);
-	    String mangledMethod = Mangle.mangle(md.getName().toString(),
-					       Mangle.Type.FIELDSTUB);
-
-	    result.append("extern ");
-	    
-	    nfwd.setSize(0);
-	    
-	    result.append(retCType);                 /* return type */
-	    if (!(retType instanceof ArrayType || 
-		  retType instanceof ClassType)) {
-		result.append(" ");
-	    }
-	    /* Methods name */
-	    result.append(mangledClazz);
-	    result.append("_");
-	    result.append(mangledMethod);
-
-	    result.append("(");                      /* begin arguments */
-	    Type[] args = mt.getArgumentTypes();
-
-	    result.append("struct H");		     /* this pointer */
-	    result.append(mangledClazz);
-	    if (args.length == 0) {
-		result.append(" *");
-	    } else {
-		result.append(" *,");
-	    }
-
-	    for (int j = 0; j < args.length; j++) {  /* other arguments */
-		result.append(getCType(args[j], FOR_METHOD));
-		if (j != (args.length - 1)) 	     /* no ',' for last arg */
-		    result.append(',');
-		addFwddeclIfRequired(sfwd, nfwd, args[j], clazz);
-	    }
-	    addFwddeclIfRequired(sfwd, nfwd, retType, clazz);
-	    result.append(");");                     /* end arguments */
-
-	    /* 
-	     * Do fwd-declarations for any new types that might have been seen
-	     * first only in this prototype. Also make sure that such types
-	     * now propogate to the global fwd-declarations set.
-	     */
-	    for (Enumeration ef = nfwd.elements();ef.hasMoreElements();) {
-		String s = (String)ef.nextElement();
-		entries.add("struct H" + s + ";");
-		sfwd.add(s);
-	    }
-	    entries.add(result.toString());
-	}
-	return entries;
-    }
-
-
-    /* 
-     * Treat _decls_ as a "set" of types. If the C type of _m_ is not in this
-     * set _decls_, then add it. However do not do the addition if the Java
-     * name of the type matched _omit_.
-     */
-    private boolean addFwddeclIfRequired(Vector decls, Type t, String omit) {
-	if (t instanceof ClassType) {
-	    String cname = 
-		Mangle.mangle(((ClassType)t).getClassName().toString(),
-			    Mangle.Type.CLASS);
-	    if (!decls.contains(cname) && !omit.equals(cname)) {
-		decls.add(cname);
-		return true;
-	    } 
-	} else if (t instanceof ArrayType &&
-		   ((ArrayType)t).getElementType() instanceof ClassType) {
-	    ClassType eType = (ClassType)((ArrayType)t).getElementType();
-	    String cname = 
-		Mangle.mangle(((ClassType)eType).getClassName().toString(),
-			    Mangle.Type.CLASS);
-	    if (!decls.contains(cname) && !omit.equals(cname)) {
-		decls.add(cname);
-		return true;
-	    }
-	}
-	return false;
-    }
-
-    /*
-     * Same as above, except here we make sure the type is neither in d1 nor
-     * in d2, and we add it to d2.
-     */
-    private boolean addFwddeclIfRequired(Vector d1, Vector d2, 
-				      Type t, String omit) {
-	if (t instanceof ClassType) {
-	    String cname = 
-		Mangle.mangle(((ClassType)t).getClassName().toString(),
-			    Mangle.Type.CLASS);
-	    if (!d1.contains(cname) && !omit.equals(cname)
-			&& !d2.contains(cname)) {
-		d2.add(cname);
-		return true;
-	    }
-	} else if (t instanceof ArrayType &&
-		   ((ArrayType)t).getElementType() instanceof ClassType) {
-	    ClassType eType = (ClassType)((ArrayType)t).getElementType();
-	    String cname = 
-		Mangle.mangle(((ClassType)eType).getClassName().toString(),
-			    Mangle.Type.CLASS);
-	    if (!d1.contains(cname) && !omit.equals(cname)
-		&& !d2.contains(cname)) {
-		d2.add(cname);
-		return true;
-	    }
-	}
-	return false;
-    }
-    
-    /*
-     * Translate a Java type into a C type for declaration
-     * purposes. There are subtle differences in how the translation
-     * is done depending on whether the type is being generated for a
-     * method declartion (prototypes) or object declaration (C
-     * struct). 
-     */
-    private static final int FOR_FIELD  = 0;
-    private static final int FOR_METHOD = 1;
-
-    private String getCType(Type t, int ForM) {
-	int tc = t.getTypeCode();
-	switch (tc) {
-	case TC_VOID:    return "void";
-	case TC_INT:     return "int32_t";
-	case TC_BOOLEAN: return "/*boolean*/ int32_t";
-	case TC_LONG:	 return "int64_t";
-	case TC_FLOAT:	 return "float";
-	case TC_DOUBLE:	 return "double";
-	case TC_BYTE:	 return (ForM == FOR_FIELD) ? "int32_t" : "int8_t";
-	case TC_SHORT:	 return (ForM == FOR_FIELD) ? "int32_t" : "short";
-	case TC_CHAR:	 return (ForM == FOR_FIELD) ? "int32_t" : "unicode";
-	case TC_CLASS:
-	    {
-		String cname = 
-		    Mangle.mangle(((ClassType)t).getClassName().toString(),
-				  Mangle.Type.CLASS);
-		return "struct H" + cname + " *"; 
-	    }
-	case TC_ARRAY: 
-	    {
-		String result = null;
-		Type elt = ((ArrayType)t).getElementType();
-		int eltTC = elt.getTypeCode();
-		switch (eltTC) {
-		case TC_BOOLEAN: result = "HArrayOfInt *"; break;
-		case TC_BYTE:    result = "HArrayOfByte *"; break;
-		case TC_CHAR:    result = "HArrayOfChar *"; break;
-		case TC_SHORT:   result = "HArrayOfShort *"; break;
-		case TC_INT:     result = "HArrayOfInt *"; break;
-		case TC_LONG:    result = "HArrayOfLong *"; break;
-		case TC_FLOAT:   result = "HArrayOfFloat *"; break;
-		case TC_DOUBLE:  result = "HArrayOfDouble *"; break;
-		case TC_ARRAY:   result = "HArrayOfArray *"; break;
-		case TC_CLASS:   
-		    {
-			result = "HArrayOfObject *";
-			if (ForM == FOR_METHOD && elt == Type.tString)
-			    result = "HArrayOfString *";
-			break;
-		    }
-		default:
-		    Util.bug("unknown.array.type");
-		}
-		if (ForM == FOR_METHOD)
-		    return result;
-		if (ForM == FOR_FIELD)
-		    return "struct " + result;
-	    }
-	default: 
-	    /* can't happen */ 
-	    Util.bug("unknown.type.for.field");
-	}
-	return null; /* dead code */
-    }
-}
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/OldStubs.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,275 +0,0 @@
-/*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javah.oldjavah;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.Vector;
-import java.util.Enumeration;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.ClassDefinition;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.Type;
-import sun.tools.java.ArrayType;
-import sun.tools.java.ClassType;
-import sun.tools.java.MethodType;
-
-/**
- * Generate stubs for JDK 1.0 style native method interface.
- *
- * Note that we go great lengths to generate code that looks as much as
- * possible like what the C version of javah generated.  Though this goal
- * has made this code awkward at certain places, it has the advantage that
- * we can stress test this implementation against the reference C
- * implementation manually.
- *
- * @version 1.4, 12/03/01
- */
-public class OldStubs extends Gen {
-
-    protected String getIncludes() {
-	return "#include <StubPreamble.h>\n";
-    }
-
-    protected void write(OutputStream o, String clazz)
-	throws ClassNotFoundException {
-	PrintWriter pw = wrapWriter(o);
-
-	MemberDefinition[] methods = env.getNativeMethods(clazz);
-
-	String mangledClazz = Mangle.mangle(clazz, Mangle.Type.CLASS);
-	
-	pw.println("/* Stubs for class " + mangledClazz + " */");
-
-	for (int i = 0; i < methods.length; i++) {
-	    StringBuffer     sb         = new StringBuffer(200);
-	    MemberDefinition method     = methods[i];
-	    String methodName = method.getName().toString();
-	    String mangledMethod = Mangle.mangle(methodName, 
-					       Mangle.Type.FIELDSTUB);
-	    String methodSig = method.getType().getTypeSignature();
-	    String implName = mangledClazz + '_' + mangledMethod;
-
-	    String stubName = Mangle.mangleMethod(method, clazz,
-						Mangle.Type.METHOD_JDK_1);
-	    
-	    /*
-	     * Comment string.
-	     */
-	    sb.append("/* SYMBOL: \"");
-	    sb.append(mangledClazz);
-	    sb.append('/');
-	    sb.append(mangledMethod);
-	    sb.append(methodSig);
-	    sb.append("\", ");
-	    sb.append(stubName);
-	    sb.append(" */\n");
-
-	    /*
-	     * Stub method call.
-	     */
-	    String exp = Util.getPlatformString("dll.export");
-	    if (exp != null)
-		sb.append(exp);
-	    sb.append("stack_item *");
-	    sb.append(stubName);
-	    sb.append("(stack_item *_P_,struct execenv *_EE_) {\n");
-	    
-	    /* 
-	     * Prototype and call to real method. 
-	     */
-	    StringBuffer proto   = new StringBuffer(100);
-	    StringBuffer call    = new StringBuffer(100);
-	    StringBuffer fwds    = new StringBuffer(100);
-	    
-	    Type    retType      = method.getType().getReturnType();
-	    int     rtc          = retType.getTypeCode();
-	    boolean returnIs64   = (rtc == TC_LONG || rtc == TC_DOUBLE);
-	    boolean returnIsVoid = (rtc == TC_VOID);
-
-	    /* return value */
-	    proto.append("\textern ");
-	    proto.append(getStubCType(retType, true));
-	    proto.append(' ');
-
-	    call.append('\t');
-	    if (rtc == TC_VOID) {
-		call.append("(void) ");
-	    } else if (rtc == TC_DOUBLE) {
-		call.append("SET_DOUBLE(_tval, _P_, ");
-	    } else if (rtc == TC_LONG) {
-		call.append("SET_INT64(_tval, _P_, ");
-	    } else {
-		call.append("_P_[0].");
-		call.append(getStackItemName32(rtc));
-		call.append(" = ");
-	    }
-	    if (rtc == TC_BOOLEAN)
-		call.append('(');
-	    if (returnIs64) 
-		fwds.append("\tjvalue _tval;\n");
-
-	    /* method name */
-	    proto.append(implName);
-	    proto.append('(');
-
-	    call.append(implName);
-	    call.append('(');
-	    
-	    proto.append("void *");
-	    if (method.isStatic()) {
-		call.append("NULL");
-	    } else {
-		call.append("_P_[0].p");
-	    }
-	    /* arguments */
-	    Type[] argTypes = method.getType().getArgumentTypes();
-	    int    nargs    = argTypes.length;
-	    
-	    for (int j = 0, nthWord = 0; j < nargs; j++) {
-		if (j == 0) {
-		    proto.append(',');
-		    call.append(',');
-		    if (!method.isStatic()) {
-			nthWord++;
-		    }
-		}
-
-		proto.append(getStubCType(argTypes[j], false));
-		
-		int atc = argTypes[j].getTypeCode();
-		if (atc == TC_LONG) {
-		    call.append("GET_INT64(_t");
-		    call.append(nthWord);
-		    call.append(", _P_+");
-		    call.append(nthWord);
-		    call.append(')');
-		} else if (atc == TC_DOUBLE) {
-		    call.append("GET_DOUBLE(_t");
-		    call.append(nthWord);
-		    call.append(", _P_+");
-		    call.append(nthWord);
-		    call.append(')');
-		} else {
-		    call.append("((_P_[");
-		    call.append(nthWord);
-		    call.append("].");
-		    call.append(getStackItemName32(atc));
-		    call.append("))");
-		}
-		if (atc == TC_LONG || atc == TC_DOUBLE) {
-		    fwds.append("\tjvalue _t");
-		    fwds.append(nthWord);
-		    fwds.append(";\n");
-		    nthWord += 2;
-		} else {
-		    nthWord += 1;
-		}
-		
-		if (j < (nargs - 1)) {
-		    proto.append(',');
-		    call.append(',');
-		}
-	    }
-
-	    if (rtc == TC_BOOLEAN)
-		call.append(") ? TRUE : FALSE");
-	    
-	    /* finished arguments */
-	    proto.append(");\n");
-	    if (returnIs64)
-		call.append(')');
-	    call.append(");\n");
-	    
-	    /* now really print prototype and call */
-	    sb.append(fwds);
-	    sb.append(proto);
-	    sb.append(call);
-
-	    /*
-	     * Return statement.
-	     */
-	    sb.append("\treturn _P_");
-	    if (returnIs64)
-		sb.append(" + 2");
-	    else if (!returnIsVoid)
-		sb.append(" + 1");
-	    
-	    sb.append(";\n}");
-	    
-	    pw.println(sb);
-	}
-    }
-
-    private String getStackItemName32(int typecode) {
-	if (typecode == TC_INT ||
-	    typecode == TC_BOOLEAN || 
-	    typecode == TC_CHAR ||
-	    typecode == TC_SHORT ||
-	    typecode == TC_BYTE)
-	    return "i";
-	
-	if (typecode == TC_FLOAT)
-	    return "f";
-	
-	return "p";
-    }
-    
-
-    private String getStubCType(Type p, boolean isReturn) {
-	int tc = p.getTypeCode();
-	switch (tc) {
-	case TC_VOID:
-	    return "void";
-	case TC_BOOLEAN:
-	case TC_BYTE:
-	case TC_SHORT:
-	case TC_CHAR:
-	case TC_INT:
-	    return "int32_t";
-	case TC_FLOAT:
-	    return "float";
-	case TC_DOUBLE:
-	    return "double";
-	case TC_LONG:
-	    return "int64_t";
-	case TC_ARRAY:
-	case TC_CLASS:
-	    if (isReturn) 
-		return "void*";
-	    else 
-		return "void *";
-	default:
-	    Util.bug("unknown.type.in.method.signature");
-	}
-	return null; /* dead code */
-    }
-
-    protected String getFileSuffix() {
-	return ".c";
-    }
-
-}
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/Util.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-/*
- * Copyright 1998-2004 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-package com.sun.tools.javah.oldjavah;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ResourceBundle;
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-
-/**
- * Messages, verbose and error handling support.
- *
- * For errors, the failure modes are:
- *      error -- User did something wrong
- *      bug   -- Bug has occurred in javah
- *      fatal -- We can't even find resources, so bail fast, don't localize
- *
- * @version 1.9, 04/19/02
- */
-public class Util {
-
-    /*
-     * Help for verbosity.
-     */
-    public static boolean verbose = false;
-
-    public static void log(String s) {
-	System.out.println(s);
-    }
-
-
-    /* 
-     * Help for loading localized messages.
-     */
-    private static ResourceBundle m;
-
-    private static void initMessages() {
-	try {
-	    m=ResourceBundle.getBundle("com.sun.tools.javah.resources.l10n");
-	} catch (MissingResourceException mre) {
-	    fatal("Error loading resources.  Please file a bug report.", mre);
-	}
-    }
-
-    public static String getText(String key) {
-	return getText(key, null, null);
-    }
-
-    private static String getText(String key, String a1, String a2){
-	if (m == null)
-	    initMessages();
-	try {
-	    return MessageFormat.format(m.getString(key), a1, a2);
-	} catch (MissingResourceException e) {
-	    fatal("Key " + key + " not found in resources.", e);
-	}
-	return null; /* dead code */
-    }
-
-    /*
-     * Usage message.
-     */
-    public static void usage(int exitValue) {
-	if (exitValue == 0) {
-	    System.out.println(getText("usage"));
-	} else {
-	    System.err.println(getText("usage"));
-	}
-	System.exit(exitValue);
-    }
-
-    public static void version() {
-	System.out.println(getText("javah.version",
-				   System.getProperty("java.version"), null));
-	System.exit(0);
-    }
-
-    /*
-     * Failure modes.
-     */
-    public static void bug(String key) {
-	bug(key, null);
-    }
-    
-    public static void bug(String key, Exception e) {
-	if (e != null)
-	    e.printStackTrace();
-	System.err.println(getText(key));
-	System.err.println(getText("bug.report"));
-	System.exit(11);
-    }
-
-    public static void error(String key) {
-	error(key, null);
-    }
-
-    public static void error(String key, String a1) {
-	error(key, a1, null);
-    }
-
-    public static void error(String key, String a1, String a2) {
-	error(key, a1, a2, false);
-    }
-    
-    public static void error(String key, String a1, String a2, 
-			     boolean showUsage) {
-	System.err.println("Error: " + getText(key, a1, a2));
-	if (showUsage)
-	    usage(15);
-	System.exit(15);
-    }
-
-
-    private static void fatal(String msg) {
-	fatal(msg, null);
-    }
-    
-    private static void fatal(String msg, Exception e) {
-	if (e != null) {
-	    e.printStackTrace();
-	}
-	System.err.println(msg);
-	System.exit(10);
-    }
-
-    /*
-     * Support for platform specific things in javah, such as pragma
-     * directives, exported symbols etc.
-     */
-    static private ResourceBundle platform = null;
-
-    /*
-     * Set when platform has been initialized.
-     */
-    static private boolean platformInit = false;
-
-    static String getPlatformString(String key) {
-	if (!platformInit) {
-	    initPlatform();
-	    platformInit = true;
-	}
-	if (platform == null)
-	    return null;
-	try {
-	    return platform.getString(key);
-	} catch (MissingResourceException mre) {
-	    return null;
-	}
-    }
-    
-    private static void initPlatform() {
-	String os = System.getProperty("os.name");
-	if (os.startsWith("Windows")) {
-	    os = "win32";
-	} else if (os.indexOf("Linux") >= 0) {
-	    os = "Linux";
-	}
-	String arch = System.getProperty("os.arch");
-	String resname = "com.sun.tools.javah.resources." + os + "_" + arch;
-	try {
-	    platform=ResourceBundle.getBundle(resname);
-	} catch (MissingResourceException mre) {
-	    // fatal("Error loading resources.  Please file a bug report.", mre);
-	}
-    }
-}
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/Linux_ppc.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#
-# Copyright 2000 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-#  Linux specific properties
-
-pack.pragma.start=\#pragma pack(4)\n
-pack.pragma.end=\#pragma pack()\n
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/Linux_sparc.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#
-# Copyright 2000 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-# Linux specific properties
-
-pack.pragma.start=\#pragma pack(4)\n
-pack.pragma.end=\#pragma pack()\n
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/SunOS_sparc.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#
-# Copyright 1998 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-pack.pragma.start=\#pragma pack(4)\n
-pack.pragma.end=\#pragma pack()\n
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/SunOS_sparcv9.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#
-# Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-pack.pragma.start=\#pragma pack(4)\n
-pack.pragma.end=\#pragma pack()\n
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/l10n.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-#
-# Copyright 1998-2002 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-#
-# User errors, command line errors.
-#
-cant.create.dir=\
-	The directory {0} could not be create for output.
-at.args.cant.read=\
-	Can''t read command line arguments from file {1}.
-at.args.io.exception=\
-	The following I/O problem was encountered when processing an @ \
-        argument on the command line: {0}.
-old.jni.mixed=\
-	Can''t mix options -jni and -old.  Try -help.
-old.llni.mixed=\
-	Can''t mix options -old and -llni.  Try -help.
-old.not.supported=\
-	Option -old not supported by this version of javah.
-invalid.method.signature=\
-	Invalid method signature: {0}
-jni.llni.mixed=\
-	Can''t mix options -jni and -llni.  Try -help.
-jni.no.stubs=\
-	JNI does not require stubs, please refer to the JNI documentation.
-dir.file.mixed=\
-	Can''t mix options -d and -o.  Try -help.
-no.classes.specified=\
-	No classes were specified on the command line.  Try -help.
-unknown.option=\
-	{0} is an illegal argument\n
-tracing.not.supported=\
-	Warning: Tracing is no longer supported.  Instead, use\
-	-verbose:jni option of the virtual machine.
-
-#
-# Usage message.
-#
-usage=\
-Usage: javah [options] <classes>\n\
-\n\
-where [options] include:\n\
-\n\t\
--help                 Print this help message\n\t\
--classpath <path>     Path from which to load classes\n\t\
--bootclasspath <path> Path from which to load bootstrap classes\n\t\
--d <dir>              Output directory\n\t\
--o <file>             Output file (only one of -d or -o may be used)\n\t\
--jni                  Generate JNI-style header file (default)\n\t\
--old                  Generate old JDK1.0-style header file\n\t\
--stubs                Generate a stubs file\n\t\
--version              Print version information\n\t\
--verbose              Enable verbose output\n\t\
--force		      Always write output files\n\
-\n\
-<classes> are specified with their fully qualified names (for\n\
-instance, java.lang.Object).\n
-
-#
-# Version string.
-#
-javah.version=javah version "{0}"
-
-#
-# These should have better diagnostics.
-#
-super.class.not.found=\
-	A required super class {0} could not be found.
-class.not.found=\
-	Class {0} could not be found.
-io.exception=\
-	Can''t recover from an I/O error with the following message: \
-	{0}.
-
-#
-# Problems in the guts of javah.
-#
-encoding.iso8859_1.not.found=\
-	ISO8859_1 converter was not found for output.  This is \
-        probably due to an error in the installation installation.
-tried.to.define.non.static=\
-	Tried to generate #define for non-static field.
-jni.unknown.type=\
-	An unknown type encountered (JNI).
-unknown.array.type=\
-	An unknown array type encountered when generating old style headers.
-unknown.type.for.field=\
-	An unknown type encountered when generating old style headers.
-unknown.type.in.method.signature=\
-	An unknown type eccountered when generating old style stubs.
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/l10n_ja.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-#
-# Copyright 1998-2000 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-# User errors, command line errors.
-#
-cant.create.dir=\
-    \u51fa\u529b\u7528\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea {0} \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
-#   The directory {0} could not be create for output.
-at.args.cant.read=\
-    \u30d5\u30a1\u30a4\u30eb {1} \u304b\u3089\u30b3\u30de\u30f3\u30c9\u884c\u5f15\u6570\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3002
-#   Can''t read command line arguments from file {1}.
-at.args.io.exception=\
-    \u30b3\u30de\u30f3\u30c9\u884c\u306e @ \u5f15\u6570\u306e\u51e6\u7406\u4e2d\u306b\u5165\u51fa\u529b\u4f8b\u5916 {0} \u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-#   The following I/O problem was encountered when processing an @ \
-#       argument on the command line: {0}.
-old.jni.mixed=\
-    \u30aa\u30d7\u30b7\u30e7\u30f3 -jni \u3068 -old \u3092\u540c\u6642\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002-help \u3067\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-#   Can''t mix options -jni and -old.  Try -help.
-old.llni.mixed=\
-    \u30aa\u30d7\u30b7\u30e7\u30f3 -old \u3068 -llni \u3092\u540c\u6642\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002-help \u3067\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-#   Can''t mix options -old and -llni.  Try -help.
-old.not.supported=\
-    \u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306e javah \u3067\u306f\u30aa\u30d7\u30b7\u30e7\u30f3 -old \u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
-#   Option -old not supported by this version of javah.
-invalid.method.signature=\
-    \u7121\u52b9\u306a\u30e1\u30bd\u30c3\u30c9\u7f72\u540d: {0}
-#   Invalid method signature: {0}
-jni.llni.mixed=\
-    \u30aa\u30d7\u30b7\u30e7\u30f3 -jni \u3068 -llni \u3092\u540c\u6642\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002-help \u3067\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-#   Can''t mix options -jni and -llni.  Try -help.
-jni.no.stubs=\
-    JNI \u306f\u30b9\u30bf\u30d6\u3092\u5fc5\u8981\u3068\u3057\u307e\u305b\u3093\u3002JNI \u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-#   JNI does not require stubs, please refer to the JNI documentation.
-dir.file.mixed=\
-    \u30aa\u30d7\u30b7\u30e7\u30f3 -d \u3068 -o \u3092\u540c\u6642\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002-help \u3067\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-#   Can''t mix options -d and -o.  Try -help.
-no.classes.specified=\
-    \u30b3\u30de\u30f3\u30c9\u884c\u3067\u30af\u30e9\u30b9\u304c\u6307\u5b9a\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002-help \u3067\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-#   No classes were specified on the command line.  Try -help.
-unknown.option=\
-    {0} \u306f\u4e0d\u6b63\u306a\u5f15\u6570\u3067\u3059\n
-#   {0} is an illegal argument\n
-tracing.not.supported=\
-    \u8b66\u544a: \u30c8\u30ec\u30fc\u30b9\u306f\u73fe\u5728\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4ee3\u308f\u308a\u306b\u3001Virtual Machine\
-    \u306e -verbose:jni \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u3063\u3066\u304f\u3060\u3055\u3044\u3002
-#   Warning: Tracing is no longer supported.  Instead, use\
-#   -verbose:jni option of the virtual machine.
-
-#
-# Usage message.
-#
-usage=\
-\u4f7f\u3044\u65b9: javah [options] <classes>\n\
-\n\
-[options] \u306b\u306f\u6b21\u306e\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u3002\n\
-\n\t\
--help                 \u30d8\u30eb\u30d7\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8868\u793a\u3059\u308b\n\t\
--classpath <path>     \u30af\u30e9\u30b9\u3092\u30ed\u30fc\u30c9\u3059\u308b\u30d0\u30b9\n\t\
--bootclasspath <path> \u30d6\u30fc\u30c8\u30b9\u30c8\u30e9\u30c3\u30d7\u30af\u30e9\u30b9\u3092\u30ed\u30fc\u30c9\u3059\u308b\u30d1\u30b9\n\t\
--d <dir>              \u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\n\t\
--o <file>             \u51fa\u529b\u30d5\u30a1\u30a4\u30eb (-d \u304b -o \u306e\u3069\u3061\u3089\u304b\u4e00\u65b9\u3092\u4f7f\u7528\u3059\u308b)\n\t\
--jni                  JNI \u5f62\u5f0f\u306e\u30d8\u30c3\u30c0\u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3059\u308b (\u30c7\u30d5\u30a9\u30eb\u30c8)\n\t\
--old                  JDK1.0 \u5f62\u5f0f\u306e\u30d8\u30c3\u30c0\u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3059\u308b\n\t\
--stubs                \u30b9\u30bf\u30d6\u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3059\u308b\n\t\
--version              \u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831\u3092\u8868\u793a\u3059\u308b\n\t\
--verbose              \u8a73\u7d30\u306a\u51fa\u529b\u3092\u884c\u3046\n\t\
--force                \u5e38\u306b\u51fa\u529b\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u8fbc\u3080\n\
-\n\
-<classes> \u306f\u5b8c\u5168\u6307\u5b9a\u306e\u540d\u524d\u3067\u6307\u5b9a\u3057\u307e\u3059 (java.lang.Object \u306a\u3069)\u3002\n
-
-#usage=\
-#Usage: javah [options] <classes>\n\
-#\n\
-#where [options] include:\n\
-#\n\t\
-#-help                 Print this help message\n\t\
-#-classpath <path>     Path from which to load classes\n\t\
-#-bootclasspath <path> Path from which to load bootstrap classes\n\t\
-#-d <dir>              Output directory\n\t\
-#-o <file>             Output file (only one of -d or -o may be used)\n\t\
-#-jni                  Generate JNI-style header file (default)\n\t\
-#-old                  Generate old JDK1.0-style header file\n\t\
-#-stubs                Generate a stubs file\n\t\
-#-version              Print version information\n\t\
-#-verbose              Enable verbose output\n\t\
-#-force           Always write output files\n\
-#\n\
-#<classes> are specified with their fully qualified names (for\n\
-#instance, java.lang.Object).\n
-
-#
-# Version string.
-#
-javah.version=javah \u30d0\u30fc\u30b8\u30e7\u30f3 "{0}"
-#javah.version=javah version "{0}"
-
-#
-# These should have better diagnostics.
-#
-super.class.not.found=\
-    \u8981\u6c42\u3055\u308c\u305f\u30b9\u30fc\u30d1\u30fc\u30af\u30e9\u30b9 {0} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-#   A required super class {0} could not be found.
-class.not.found=\
-    \u30af\u30e9\u30b9 {0} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-#   Class {0} could not be found.
-io.exception=\
-    \u30e1\u30c3\u30bb\u30fc\u30b8 {0} \u306e\u5165\u51fa\u529b\u30a8\u30e9\u30fc\u304b\u3089\u56de\u5fa9\u3067\u304d\u307e\u305b\u3093\u3002
-#   Can''t recover from an I/O error with the following message: \
-#   {0}.
-
-#
-# Problems in the guts of javah.
-#
-encoding.iso8859_1.not.found=\
-    \u51fa\u529b\u7528\u306e ISO8859_1 \u30b3\u30f3\u30d0\u30fc\u30bf\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\
-        \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306b\u30a8\u30e9\u30fc\u304c\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
-#   ISO8859_1 converter was not found for output.  This is \
-#       probably due to an error in the installation installation.
-tried.to.define.non.static=\
-    static \u3067\u306a\u3044\u30d5\u30a3\u30fc\u30eb\u30c9\u306b #define \u3092\u751f\u6210\u3057\u3088\u3046\u3068\u3057\u307e\u3057\u305f\u3002
-#   Tried to generate #define for non-static field.
-jni.unknown.type=\
-    \u672a\u77e5\u306e\u578b\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f (JNI).
-#   An unknown type encountered (JNI).
-unknown.array.type=\
-    \u53e4\u3044\u5f62\u5f0f\u306e\u30d8\u30c3\u30c0\u3092\u751f\u6210\u3057\u3066\u3044\u308b\u3068\u304d\u306b\u672a\u77e5\u306e\u914d\u5217\u306e\u578b\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002
-#   An unknown array type encountered when generating old style headers.
-unknown.type.for.field=\
-    \u53e4\u3044\u5f62\u5f0f\u306e\u30d8\u30c3\u30c0\u3092\u751f\u6210\u3057\u3066\u3044\u308b\u3068\u304d\u306b\u672a\u77e5\u306e\u578b\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002
-#   An unknown type encountered when generating old style headers.
-unknown.type.in.method.signature=\
-    \u53e4\u3044\u5f62\u5f0f\u306e\u30b9\u30bf\u30d6\u3092\u751f\u6210\u3057\u3066\u3044\u308b\u3068\u304d\u306b\u672a\u77e5\u306e\u578b\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002
-#   An unknown type eccountered when generating old style stubs.
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/l10n_zh_CN.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,118 +0,0 @@
-#
-# Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-#
-# User errors, command line errors.
-#
-cant.create.dir=\
-	\u65e0\u6cd5\u4e3a\u8f93\u51fa\u521b\u5efa\u76ee\u5f55 {0}\u3002
-at.args.cant.read=\
-	\u65e0\u6cd5\u4ece\u6587\u4ef6 {1} \u4e2d\u8bfb\u53d6\u547d\u4ee4\u884c\u53c2\u6570\u3002
-at.args.io.exception=\
-	\u5904\u7406\u547d\u4ee4\u884c\u4e2d\u7684 @\
-	\u53c2\u6570\u65f6\uff0c\u9047\u5230\u4ee5\u4e0b I/O \u95ee\u9898\uff1a{0}\u3002
-old.jni.mixed=\
-	\u4e0d\u80fd\u6df7\u7528\u9009\u9879 -jni \u548c -old\u3002\u8bf7\u5c1d\u8bd5\u4f7f\u7528 -help\u3002
-old.llni.mixed=\
-	\u4e0d\u80fd\u6df7\u7528\u9009\u9879 -old \u548c -llni\u3002\u8bf7\u5c1d\u8bd5\u4f7f\u7528 -help\u3002
-old.not.supported=\
-	\u6b64\u7248\u672c\u7684 javah \u4e0d\u652f\u6301\u9009\u9879 -old\u3002
-invalid.method.signature=\
-	\u65e0\u6548\u7684\u65b9\u6cd5\u7b7e\u540d\uff1a {0}
-jni.llni.mixed=\
-	\u4e0d\u80fd\u6df7\u7528\u9009\u9879 -jni \u548c -llni\u3002\u8bf7\u5c1d\u8bd5\u4f7f\u7528 -help\u3002
-jni.no.stubs=\
-	JNI \u4e0d\u9700\u8981\u5b58\u6839\uff0c\u8bf7\u53c2\u9605 JNI \u6587\u6863\u3002
-dir.file.mixed=\
-	\u4e0d\u80fd\u6df7\u7528\u9009\u9879 -d \u548c -o\u3002\u8bf7\u5c1d\u8bd5\u4f7f\u7528 -help\u3002
-no.classes.specified=\
-	\u672a\u5728\u547d\u4ee4\u884c\u4e2d\u6307\u5b9a\u4efb\u4f55\u7c7b\u3002\u8bf7\u5c1d\u8bd5\u4f7f\u7528 -help\u3002
-unknown.option=\
-	{0} \u662f\u975e\u6cd5\u53c2\u6570\n
-tracing.not.supported=\
-	\u8b66\u544a\uff1a\u4e0d\u518d\u652f\u6301\u8ddf\u8e2a\u3002\u8bf7\u4f7f\u7528\
-	\u865a\u62df\u673a\u7684 -verbose:jni \u9009\u9879\u3002
-
-#
-# Usage message.
-#
-usage=\
-\u7528\u6cd5\uff1ajavah [\u9009\u9879] <\u7c7b>\n\
-\n\
-\u5176\u4e2d [\u9009\u9879] \u5305\u62ec\uff1a\n\
-\n\t\
--help                 \u8f93\u51fa\u6b64\u5e2e\u52a9\u6d88\u606f\n\t\
--classpath <\u8def\u5f84>     \u7528\u4e8e\u88c5\u5165\u7c7b\u7684\u8def\u5f84\n\t\
--bootclasspath <\u8def\u5f84> \u7528\u4e8e\u88c5\u5165\u5f15\u5bfc\u7c7b\u7684\u8def\u5f84\n\t\
--d <\u76ee\u5f55>              \u8f93\u51fa\u76ee\u5f55\n\t\
--o <\u6587\u4ef6>             \u8f93\u51fa\u6587\u4ef6\uff08\u53ea\u80fd\u4f7f\u7528 -d \u6216 -o \u4e2d\u7684\u4e00\u4e2a\uff09\n\t\
--jni                  \u751f\u6210 JNI \u6837\u5f0f\u7684\u5934\u6587\u4ef6\uff08\u9ed8\u8ba4\uff09\n\t\
--old                  \u751f\u6210\u65e7 JDK1.0 \u6837\u5f0f\u7684\u5934\u6587\u4ef6\n\t\
--stubs                \u751f\u6210\u5b58\u6839\u6587\u4ef6\n\t\
--version              \u8f93\u51fa\u7248\u672c\u4fe1\u606f\n\t\
--verbose              \u542f\u7528\u8be6\u7ec6\u8f93\u51fa\n\t\
--force		      \u59cb\u7ec8\u5199\u5165\u8f93\u51fa\u6587\u4ef6\n\
-\n\
-\u4f7f\u7528\u5168\u9650\u5b9a\u540d\u79f0\u6307\u5b9a <\u7c7b>\uff08\u4f8b\n\
-\u5982\uff0cjava.lang.Object\uff09\u3002\n
-
-#
-# Version string.
-#
-javah.version=javah \u7248\u672c "{0}"
-
-#
-# These should have better diagnostics.
-#
-super.class.not.found=\
-	\u627e\u4e0d\u5230\u6240\u9700\u7684\u8d85\u7c7b {0}\u3002
-class.not.found=\
-	\u627e\u4e0d\u5230\u7c7b {0}\u3002
-io.exception=\
-	\u65e0\u6cd5\u4ece I/O \u9519\u8bef\u4e2d\u6062\u590d\uff0c\u6d88\u606f\u4e3a\uff1a \
-	{0}\u3002
-
-#
-# Problems in the guts of javah.
-#
-encoding.iso8859_1.not.found=\
-	\u627e\u4e0d\u5230\u7528\u4e8e\u8f93\u51fa\u7684 ISO8859_1 \u8f6c\u6362\u5668\u3002\u8fd9\u53ef\u80fd\u662f\
-\u56e0\u4e3a\u5b89\u88c5\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u4e86\u9519\u8bef\u3002
-tried.to.define.non.static=\
-	\u5c1d\u8bd5\u4e3a\u975e\u9759\u6001\u5b57\u6bb5\u751f\u6210 #define\u3002
-jni.unknown.type=\
-	\u9047\u5230\u672a\u77e5\u7c7b\u578b (JNI)\u3002
-unknown.array.type=\
-	\u751f\u6210\u65e7\u6837\u5f0f\u7684\u6807\u5934\u65f6\u9047\u5230\u672a\u77e5\u7684\u6570\u7ec4\u7c7b\u578b\u3002
-unknown.type.for.field=\
-	\u751f\u6210\u65e7\u6837\u5f0f\u7684\u6807\u5934\u65f6\u9047\u5230\u672a\u77e5\u7684\u7c7b\u578b\u3002
-unknown.type.in.method.signature=\
-	\u751f\u6210\u65e7\u6837\u5f0f\u7684\u5b58\u6839\u65f6\u9047\u5230\u672a\u77e5\u7684\u7c7b\u578b\u3002
-
-
-
-
-
-
--- a/j2se/src/share/classes/com/sun/tools/javah/oldjavah/resources/win32_x86.properties	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-#
-# Copyright 1998 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-# 
-
-dll.export=__declspec(dllexport)
-pack.pragma.start=\#pragma pack(4)\n
-pack.pragma.end=\#pragma pack()\n
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/Entity.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/Entity.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,10 +22,12 @@
 
 import java.io.InputStream;
 import java.io.Reader;
+import java.io.IOException;
 
+import com.sun.xml.internal.stream.util.BufferAllocator;
+import com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator;
 import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier;
 
-
 /**
  * Entity information.
  *
@@ -398,9 +400,24 @@
             this.literal = literal;
             this.mayReadChunks = mayReadChunks;
             this.isExternal = isExternal;
-            this.ch = new char[isExternal ? fBufferSize : DEFAULT_INTERNAL_BUFFER_SIZE];
+            final int size = isExternal ? fBufferSize : DEFAULT_INTERNAL_BUFFER_SIZE;
+            BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+            ch = ba.getCharBuffer(size);
+            if (ch == null) {
+                this.ch = new char[size];
+            }
         } // <init>(StringXMLResourceIdentifier,InputStream,Reader,String,boolean, boolean)
         
+        /**
+         * Release any resources associated with this entity.
+         */
+        public void close() throws IOException {
+            BufferAllocator ba = ThreadLocalBufferAllocator.getBufferAllocator();
+            ba.returnCharBuffer(ch);
+            ch = null;
+            reader.close();                       
+        }
+        
         //
         // Entity methods
         //
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/XMLEventReaderImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/XMLEventReaderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -52,6 +52,7 @@
         if(fXMLEventAllocator == null){
             fXMLEventAllocator = new XMLEventAllocatorImpl();
         }
+        fPeekedEvent = fXMLEventAllocator.allocate(fXMLReader);        
     }
     
     
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/XMLInputFactoryImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/XMLInputFactoryImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -58,16 +58,12 @@
     //default value is true
     boolean fReuseInstance = true;
     
-    //set this flag to true if EventReader instance is being created
-    boolean fEventReaderInstance = false;
-    
     /** Creates a new instance of ZephryParserFactory */
     public XMLInputFactoryImpl() {
         
     }
     
     void initEventReader(){
-        fEventReaderInstance = true;
         fPropertyChanged = true;
     }
     
@@ -144,7 +140,8 @@
     }
     
     public XMLStreamReader createXMLStreamReader(Source source) throws XMLStreamException {
-        return new XMLStreamReaderImpl(jaxpSourcetoXMLInputSource(source) , getNewPropertyManager());
+        return new XMLStreamReaderImpl(jaxpSourcetoXMLInputSource(source), 
+                new PropertyManager(fPropertyManager));
     }
     
     public XMLStreamReader createXMLStreamReader(String systemId, InputStream inputstream) throws XMLStreamException {
@@ -262,7 +259,8 @@
         //1. if the temp reader is null -- create the instance and return
         if(fTempReader == null){
             fPropertyChanged = false;
-            return fTempReader = new XMLStreamReaderImpl(inputSource, getNewPropertyManager());
+            return fTempReader = new XMLStreamReaderImpl(inputSource, 
+                    new PropertyManager(fPropertyManager));
         }
         //if factory is configured to reuse the instance & this instance can be reused 
         //& the setProperty() hasn't been called
@@ -276,24 +274,11 @@
         }else{
             fPropertyChanged = false;
             //just return the new instance.. note that we are not setting  fTempReader to the newly created instance
-            return fTempReader = new XMLStreamReaderImpl(inputSource, getNewPropertyManager());
+            return fTempReader = new XMLStreamReaderImpl(inputSource, 
+                    new PropertyManager(fPropertyManager));
         }
     }
     
-    PropertyManager getNewPropertyManager(){
-        PropertyManager pm = new PropertyManager(fPropertyManager);
-        if(fEventReaderInstance){
-            //this  is really ugly.. event reader has to be in undefined state.
-            //set this property for this new PropertyManager instance
-            pm.setProperty(Constants.READER_IN_DEFINED_STATE, Boolean.FALSE);
-            fEventReaderInstance = false;
-            //xxx: if instance is reused, this instance will be in undefined state
-            //set this flag to true so that this instance is not reused
-            fPropertyChanged = true;
-        }
-        return pm;        
-    }
-    
     XMLInputSource jaxpSourcetoXMLInputSource(Source source){
         
         if(source instanceof StreamSource){
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/XMLOutputFactoryImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/XMLOutputFactoryImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -58,8 +58,6 @@
     //cache the instance of XMLStreamWriterImpl
     private XMLStreamWriterImpl fStreamWriter = null;
     
-    private StreamResult fStreamResult = new StreamResult();
-    
     /**
      * TODO: at the current time, XMLStreamWriters are not Thread safe.
      */
@@ -107,7 +105,7 @@
     }
     
     public javax.xml.stream.XMLStreamWriter createXMLStreamWriter(java.io.Writer writer) throws javax.xml.stream.XMLStreamException {
-        return createXMLStreamWriter(getStreamResult(null, writer, null) , null);
+        return createXMLStreamWriter(toStreamResult(null, writer, null) , null);
     }
     
     public javax.xml.stream.XMLStreamWriter createXMLStreamWriter(java.io.OutputStream outputStream) throws javax.xml.stream.XMLStreamException {
@@ -115,7 +113,7 @@
     }
     
     public javax.xml.stream.XMLStreamWriter createXMLStreamWriter(java.io.OutputStream outputStream, String encoding) throws javax.xml.stream.XMLStreamException {
-        return createXMLStreamWriter(getStreamResult(outputStream, null, null) , encoding);
+        return createXMLStreamWriter(toStreamResult(outputStream, null, null) , encoding);
     }
     
     public Object getProperty(String name) throws java.lang.IllegalArgumentException {
@@ -159,24 +157,14 @@
         fPropertyManager.setProperty(name,value);
     }
 
-    /**
-     * If property has changed or value of the property has been set, 
-     * <code>PropertyManager</code> is returned else <code>'null'</code>
-     * is returned.
-     * 
-     * @return PropertyManager returns PropertyManager.
-     */
-    PropertyManager getPropertyManager(){
-        return fPropertyChanged ? fPropertyManager : null ;
-    }
-
     /** StreamResult object is re-used and the values are set appropriately.
      */
-    StreamResult getStreamResult(OutputStream os, Writer writer, String systemId){
-        fStreamResult.setOutputStream(os);
-        fStreamResult.setWriter(writer);
-        fStreamResult.setSystemId(systemId);
-        return fStreamResult;
+    StreamResult toStreamResult(OutputStream os, Writer writer, String systemId){
+        StreamResult sr = new StreamResult();
+        sr.setOutputStream(os);
+        sr.setWriter(writer);
+        sr.setSystemId(systemId);
+        return sr;
     }
 
     javax.xml.stream.XMLStreamWriter createXMLStreamWriter(javax.xml.transform.stream.StreamResult sr, String encoding) throws javax.xml.stream.XMLStreamException {
@@ -189,7 +177,7 @@
                 if(DEBUG)System.out.println("reusing instance, object id : " + fStreamWriter);
                 return fStreamWriter;
             }
-            return fStreamWriter = new XMLStreamWriterImpl(sr, encoding, getPropertyManager());
+            return fStreamWriter = new XMLStreamWriterImpl(sr, encoding, new PropertyManager(fPropertyManager));
         }catch(java.io.IOException io){
             throw new XMLStreamException(io);
         }
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/events/DummyEvent.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/events/DummyEvent.java	Fri Jun 22 00:46:43 2007 +0000
@@ -43,13 +43,15 @@
  */
 
 public abstract class DummyEvent implements XMLEvent {
+    // Make sure that getLocation() never returns null. Instead, return this dummy location
+    // that indicates "nowhere" as effectively as possible.
+    private static DummyLocation nowhere = new DummyLocation();
     
     /* Event type this event corresponds to */
     private int fEventType;
-    protected Location fLocation = null;
+    protected Location fLocation = (Location) nowhere;
     
     public DummyEvent() {
-        
     }
     
     public DummyEvent(int i) {
@@ -98,7 +100,11 @@
     }
     
     void setLocation(Location loc){
-        fLocation = loc;
+        if (loc == null) {
+            fLocation = nowhere;
+        } else {
+            fLocation = loc;
+        }
     }
     
     /** Returns this event as Characters, may result in
@@ -171,4 +177,28 @@
     public void writeAsEncodedUnicode(Writer writer) throws javax.xml.stream.XMLStreamException {
     }
     
+    static class DummyLocation implements Location {
+        public DummyLocation() {
+        }
+        
+        public int getCharacterOffset() {
+            return -1;
+        }
+
+        public int getColumnNumber() {
+            return -1;
+        }
+        
+        public int getLineNumber() {
+            return -1;
+        }
+        
+        public String getPublicId() {
+            return null;
+        }
+        
+        public String getSystemId() {
+            return null;
+        }
+    }
 }
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/events/StartDocumentEvent.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/events/StartDocumentEvent.java	Fri Jun 22 00:46:43 2007 +0000
@@ -69,7 +69,9 @@
         this.fStandalone = standalone;
         this.fEncodingSchemeSet = false;
         this.fStandaloneSet = false;
-        this.fLocation = loc;
+        if (loc != null) {
+            this.fLocation = loc;
+        }
     }
     protected void init() {
         setEventType(XMLStreamConstants.START_DOCUMENT);
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/events/XMLEventAllocatorImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/events/XMLEventAllocatorImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -241,17 +241,9 @@
         NamespaceSupport ns = new NamespaceSupport(contextWrapper.getNamespaceContext());
         event.setNamespaceContext(new NamespaceContextWrapper(ns));
     }
-    private QName getQName(XMLStreamReader xmlr){
-        String prefix = xmlr.getPrefix();
-        String uri = xmlr.getNamespaceURI();
-        String localpart = xmlr.getLocalName();
-        QName qn = null;
-        if(prefix != null && uri != null)
-            qn = new QName(uri, localpart, prefix);
-        else if(prefix == null && uri != null)
-            qn = new QName(uri, localpart);
-        else if(prefix == null && uri == null)
-            qn = new QName(localpart);
-        return qn;
+    
+    private QName getQName(XMLStreamReader xmlr) {
+        return new QName(xmlr.getNamespaceURI(), xmlr.getLocalName(), 
+                xmlr.getPrefix());
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/util/BufferAllocator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.xml.internal.stream.util;
+
+import java.lang.ref.*;
+
+/**
+ * Buffer allocator for buffers of sizes 128 B, 2 KB and 8 KB. Includes
+ * methods for allocating and freeing buffers.
+ *
+ * @author Binu.John@sun.com
+ * @author Santiago.PericasGeertsen@sun.com
+ */
+public class BufferAllocator {
+    public static int SMALL_SIZE_LIMIT = 128;
+    public static int MEDIUM_SIZE_LIMIT = 2048;
+    public static int LARGE_SIZE_LIMIT = 8192;
+    
+    char[] smallCharBuffer;
+    char[] mediumCharBuffer;
+    char[] largeCharBuffer;
+    
+    byte[] smallByteBuffer;
+    byte[] mediumByteBuffer;
+    byte[] largeByteBuffer;
+    
+    public BufferAllocator() {
+    }
+    
+    public char[] getCharBuffer(int size) {
+        if (size <= SMALL_SIZE_LIMIT) {
+            char[] buffer = smallCharBuffer;
+            smallCharBuffer = null;
+            return buffer;
+        } 
+        else if (size <= MEDIUM_SIZE_LIMIT) {
+            char[] buffer = mediumCharBuffer;
+            mediumCharBuffer = null;
+            return buffer;
+        } 
+        else if (size <= LARGE_SIZE_LIMIT) {
+            char[] buffer = largeCharBuffer;
+            largeCharBuffer = null;
+            return buffer;
+        }
+        return null;
+    }
+    
+    public void returnCharBuffer(char[] c) {
+        if (c == null) {
+            return;
+        }
+        if (c.length <= SMALL_SIZE_LIMIT) {
+            smallCharBuffer = c;
+        }
+        else if (c.length <= MEDIUM_SIZE_LIMIT) {
+            mediumCharBuffer = c;
+        }
+        else if (c.length <= LARGE_SIZE_LIMIT) {
+            largeCharBuffer = c;
+        }
+    }
+    
+    public byte[] getByteBuffer(int size) {
+        if (size <= SMALL_SIZE_LIMIT) {
+            byte[] buffer = smallByteBuffer;
+            smallByteBuffer = null;
+            return buffer;
+        } 
+        else if (size <= MEDIUM_SIZE_LIMIT) {
+            byte[] buffer = mediumByteBuffer;
+            mediumByteBuffer = null;
+            return buffer;
+        } 
+        else if (size <= LARGE_SIZE_LIMIT) {
+            byte[] buffer = largeByteBuffer;
+            largeByteBuffer = null;
+            return buffer;
+        }        
+        return null;
+    }
+    
+    public void returnByteBuffer(byte[] b) {
+        if (b == null) {
+            return;
+        }
+        if (b.length <= SMALL_SIZE_LIMIT) {
+            smallByteBuffer = b;
+        }
+        else if (b.length <= MEDIUM_SIZE_LIMIT) {
+            mediumByteBuffer = b;
+        }
+        else if (b.length <= LARGE_SIZE_LIMIT) {
+            largeByteBuffer = b;
+        }
+    }
+    
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.xml.internal.stream.util;
+
+import java.lang.ref.*;
+
+/**
+ * This is a Singleton class that allows you to allocate buffer that 
+ * are stored in ThreadLocal. This class stores 3 types of char 
+ * buffers - small (< 128 bytes), medium (<2K) and large (> 2K) as 
+ * well as three byte buffers - small, medium and large.
+ * The local storage is activated on the return of the buffer. 
+ * The buffer returns null if it is already allocated.
+ *
+ * @author Binu.John@sun.com
+ * @author Santiago.PericasGeertsen@sun.com
+ */
+public class ThreadLocalBufferAllocator {
+   private static ThreadLocal tlba = new ThreadLocal();
+
+   public static BufferAllocator getBufferAllocator() {
+	SoftReference bAllocatorRef = (SoftReference) tlba.get();
+	if (bAllocatorRef == null || bAllocatorRef.get() == null) { 
+	    bAllocatorRef = new SoftReference(new BufferAllocator());
+	    tlba.set(bAllocatorRef);
+        }
+
+	return (BufferAllocator) bAllocatorRef.get();
+   }
+}
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/writers/XMLDOMWriterImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/writers/XMLDOMWriterImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -78,6 +78,7 @@
         node = result.getNode();
         if( node.getNodeType() == Node.DOCUMENT_NODE){
             ownerDoc = (Document)node;
+            currentNode = ownerDoc;
         }else{
             ownerDoc = node.getOwnerDocument();
             currentNode = node;
@@ -496,12 +497,10 @@
     }
     
     /**
-     * Creates a namespace attribute and will associate it with the current element in
+     * creates a namespace attribute and will associate it with the current element in
      * the DOM tree.
-     *
      * @param prefix {@inheritDoc}
      * @param namespaceURI {@inheritDoc}
-     *
      * @throws javax.xml.stream.XMLStreamException {@inheritDoc}
      */
     public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException {
--- a/j2se/src/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -228,12 +228,10 @@
         fNamespaceContext.internalContext = fInternalNamespaceContext;
 
         // Set internal state based on property values
-        if (fPropertyManager != null) {
-            Boolean ob = (Boolean) fPropertyManager.getProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES);
-            fIsRepairingNamespace = ob.booleanValue();
-            ob = (Boolean) fPropertyManager.getProperty(Constants.ESCAPE_CHARACTERS);
-            setEscapeCharacters(ob.booleanValue());
-        }
+        Boolean ob = (Boolean) fPropertyManager.getProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES);
+        fIsRepairingNamespace = ob.booleanValue();
+        ob = (Boolean) fPropertyManager.getProperty(Constants.ESCAPE_CHARACTERS);
+        setEscapeCharacters(ob.booleanValue());
     }
 
     /**
@@ -333,7 +331,6 @@
             }
         } else {
             encoding = System.getProperty("file.encoding");
-           
             if (encoding != null && encoding.equalsIgnoreCase("utf-8")) {
                 fWriter = new UTF8OutputStreamWriter(os);
             } else {
@@ -362,14 +359,16 @@
      * Close this XMLStreamWriter by closing underlying writer.
      */
     public void close() throws XMLStreamException {
-
-        try {
-            //fWriter.close();
-            fWriter.flush();
-        } catch (IOException e) {
-            throw new XMLStreamException(e);
+        if (fWriter != null) {
+            try {
+                //fWriter.close();
+                fWriter.flush();
+            } catch (IOException e) {
+                throw new XMLStreamException(e);
+            }
         }
-
+        fWriter = null;
+        fOutputStream = null;
         fNamespaceDecls.clear();
         fAttributeCache.clear();
         fElementStack.clear();
@@ -744,7 +743,7 @@
         // normalize namespaceURI
         String namespaceURINormalized = null;
         if (namespaceURI == null) {
-            namespaceURINormalized = XMLConstants.NULL_NS_URI;
+            namespaceURINormalized = ""; // XMLConstants.NULL_NS_URI
         } else {
             namespaceURINormalized = namespaceURI;
         }
@@ -851,7 +850,7 @@
                 return;
             }
 
-            if (prefix != XMLConstants.DEFAULT_NS_PREFIX) {
+            if ((prefix != null) && (prefix != XMLConstants.DEFAULT_NS_PREFIX)) {
                 fWriter.write(prefix);
                 fWriter.write(":");
             }
@@ -967,7 +966,7 @@
         // normalize namespaceURI
         String namespaceURINormalized = null;
         if (namespaceURI == null) {
-            namespaceURINormalized = XMLConstants.NULL_NS_URI;
+            namespaceURINormalized = ""; // XMLConstants.NULL_NS_URI
         } else {
             namespaceURINormalized = namespaceURI;
         }
@@ -1140,7 +1139,6 @@
      */
     public void writeStartDocument(String encoding, String version)
         throws XMLStreamException {
-        
         //Revisit : What about standalone ?
         try {
             if ((encoding == null) && (version == null)) {
@@ -1156,13 +1154,13 @@
             }
             
             String streamEncoding = null;
-            if (fWriter instanceof OutputStreamWriter){
-                streamEncoding = ((OutputStreamWriter) fWriter).getEncoding();
-            
-            } else if (fWriter instanceof UTF8OutputStreamWriter){
-                streamEncoding = ((UTF8OutputStreamWriter) fWriter).getEncoding();
-            
-            } else if (fWriter instanceof XMLWriter ){
+            if (fWriter instanceof OutputStreamWriter) {
+                streamEncoding = ((OutputStreamWriter) fWriter).getEncoding();            
+            } 
+            else if (fWriter instanceof UTF8OutputStreamWriter) {
+                streamEncoding = ((UTF8OutputStreamWriter) fWriter).getEncoding();            
+            } 
+            else if (fWriter instanceof XMLWriter) {
                 streamEncoding = ((OutputStreamWriter) ((XMLWriter)fWriter).getWriter()).getEncoding();
             }
 
@@ -1182,7 +1180,8 @@
                             + "' and input paramter for writeStartDocument() method '"
                             + encoding + "' do not match.");
                 }
-            }
+            } 
+            
             
             fWriter.write("<?xml version=\"");
 
@@ -1191,11 +1190,10 @@
             } else {
                 fWriter.write(version);
             }
-            
+
             if (!encoding.equals("")) {
                 fWriter.write("\" encoding=\"");
                 fWriter.write(encoding);
-              
             }
 
             fWriter.write("\"?>");
@@ -1537,6 +1535,7 @@
 
             if (currentElement.isEmpty) {
                 fElementStack.pop();
+                fInternalNamespaceContext.popContext();
                 fWriter.write(CLOSE_EMPTY_ELEMENT);
             } else {
                 fWriter.write(CLOSE_START_TAG);
@@ -2104,18 +2103,11 @@
 
     /**
      * Returns the value associated to an implementation-specific
-     * property. Ensures that underlying <code>OutputStream</code>
-     * is flushed before returning.
+     * property. 
      */
     public Object get(Object key) {
-        try {
-            if (key.equals(OUTPUTSTREAM_PROPERTY)) {
-                flush();
-                return fOutputStream;
-            }
-        }
-        catch (XMLStreamException e) {
-            throw new RuntimeException(e);
+        if (key.equals(OUTPUTSTREAM_PROPERTY)) {
+            return fOutputStream;
         }
         return null;
     }
--- a/j2se/src/share/classes/java/awt/BasicStroke.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/BasicStroke.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,15 +25,6 @@
 
 package java.awt;
 
-import java.awt.geom.Path2D;
-import java.awt.geom.PathIterator;
-import sun.dc.path.FastPathProducer;
-import sun.dc.path.PathConsumer;
-import sun.dc.path.PathException;
-import sun.dc.pr.PathStroker;
-import sun.dc.pr.PathDasher;
-import sun.dc.pr.Rasterizer;
-
 /**
  * The <code>BasicStroke</code> class defines a basic set of rendering
  * attributes for the outlines of graphics primitives, which are rendered
@@ -114,7 +105,7 @@
  * For more information on the user space coordinate system and the 
  * rendering process, see the <code>Graphics2D</code> class comments.
  * @see Graphics2D
- * @version 1.49, 05/05/07
+ * @version 1.50, 06/08/07
  * @author Jim Graham
  */
 public class BasicStroke implements Stroke {
@@ -301,87 +292,10 @@
      * @return the <code>Shape</code> of the stroked outline.
      */
     public Shape createStrokedShape(Shape s) {
-	FillAdapter filler = new FillAdapter();
-	PathStroker stroker = new PathStroker(filler);
-	PathDasher dasher = null;
-
-	try {
-	    PathConsumer consumer;
-
-	    stroker.setPenDiameter(width);
-	    stroker.setPenT4(null);
-	    stroker.setCaps(RasterizerCaps[cap]);
-	    stroker.setCorners(RasterizerCorners[join], miterlimit);
-	    if (dash != null) {
-		dasher = new PathDasher(stroker);
-		dasher.setDash(dash, dash_phase);
-		dasher.setDashT4(null);
-		consumer = dasher;
-	    } else {
-		consumer = stroker;
-	    }
-
-	    feedConsumer(consumer, s.getPathIterator(null));
-	} finally {
-	    stroker.dispose();
-	    if (dasher != null) {
-		dasher.dispose();
-	    }
-	}
-
-	return filler.getShape();
-    }
-
-    private void feedConsumer(PathConsumer consumer, PathIterator pi) {
-	try {
-	    consumer.beginPath();
-	    boolean pathClosed = false;
-	    float mx = 0.0f;
-	    float my = 0.0f;
-	    float point[]  = new float[6];
-
-	    while (!pi.isDone()) {
-		int type = pi.currentSegment(point);
-		if (pathClosed == true) {
-		    pathClosed = false;
-		    if (type != PathIterator.SEG_MOVETO) {
-			// Force current point back to last moveto point
-			consumer.beginSubpath(mx, my);
-		    }
-		}
-		switch (type) {
-		case PathIterator.SEG_MOVETO:
-		    mx = point[0];
-		    my = point[1];
-		    consumer.beginSubpath(point[0], point[1]);
-		    break;
-		case PathIterator.SEG_LINETO:
-		    consumer.appendLine(point[0], point[1]);
-		    break;
-		case PathIterator.SEG_QUADTO:
-		    // Quadratic curves take two points
-		    consumer.appendQuadratic(point[0], point[1],
-					     point[2], point[3]);
-		    break;
-		case PathIterator.SEG_CUBICTO:
-		    // Cubic curves take three points
-		    consumer.appendCubic(point[0], point[1],
-					 point[2], point[3],
-					 point[4], point[5]);
-		    break;
-		case PathIterator.SEG_CLOSE:
-		    consumer.closedSubpath();
-		    pathClosed = true;
-		    break;
-		}
-		pi.next();
-	    }
-
-	    consumer.endPath();
-	} catch (PathException e) {
-	    throw new InternalError("Unable to Stroke shape ("+
-				    e.getMessage()+")");
-	}
+        sun.java2d.pipe.RenderingEngine re =
+            sun.java2d.pipe.RenderingEngine.getInstance();
+        return re.createStrokedShape(s, width, cap, join, miterlimit,
+                                     dash, dash_phase);
     }
 
     /**
@@ -526,79 +440,4 @@
 
         return true;
     }
-
-    private static final int RasterizerCaps[] = {
-	Rasterizer.BUTT, Rasterizer.ROUND, Rasterizer.SQUARE
-    };
-
-    private static final int RasterizerCorners[] = {
-	Rasterizer.MITER, Rasterizer.ROUND, Rasterizer.BEVEL
-    };
-
-    private class FillAdapter implements PathConsumer {
-	boolean closed;
-	Path2D.Float path;
-
-	public FillAdapter() {
-            // Ductus only supplies float coordinates so
-            // Path2D.Double is not necessary here.
-	    path = new Path2D.Float(Path2D.WIND_NON_ZERO);
-	}
-
-	public Shape getShape() {
-	    return path;
-	}
-
-	public void dispose() {
-	}
-
-	public PathConsumer getConsumer() {
-	    return null;
-	}
-
-	public void beginPath() {}
-
-	public void beginSubpath(float x0, float y0) {
-	    if (closed) {
-		path.closePath();
-		closed = false;
-	    }
-	    path.moveTo(x0, y0);
-	}
-
-	public void appendLine(float x1, float y1) {
-	    path.lineTo(x1, y1);
-	}
-
-	public void appendQuadratic(float xm, float ym, float x1, float y1) {
-	    path.quadTo(xm, ym, x1, y1);
-	}
-
-	public void appendCubic(float xm, float ym,
-				float xn, float yn,
-				float x1, float y1) {
-	    path.curveTo(xm, ym, xn, yn, x1, y1);
-	}
-
-	public void closedSubpath() {
-	    closed = true;
-	}
-
-	public void endPath() {
-	    if (closed) {
-		path.closePath();
-		closed = false;
-	    }
-	}
-
-	public void useProxy(FastPathProducer proxy)
-	    throws PathException
-	{
-	    proxy.sendTo(this);
-	}
-
-	public long getCPathConsumer() {
-	    return 0;
-	}
-    }
 }
--- a/j2se/src/share/classes/java/awt/Color.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/Color.java	Fri Jun 22 00:46:43 2007 +0000
@@ -26,7 +26,6 @@
 package java.awt;
 
 import java.beans.ConstructorProperties;
-import java.lang.*;
 import java.awt.image.ColorModel;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
@@ -204,11 +203,6 @@
     public final static Color BLUE = blue;
 
     /**
-     * Private data.
-     */
-    transient private long pData;
-
-    /**
      * The color value.
      * @serial
      * @see #getRGB
@@ -712,14 +706,14 @@
     /**
      * Converts a <code>String</code> to an integer and returns the 
      * specified opaque <code>Color</code>. This method handles string
-     * formats that are used to represent octal and hexidecimal numbers.
+     * formats that are used to represent octal and hexadecimal numbers.
      * @param      nm a <code>String</code> that represents 
      *                            an opaque color as a 24-bit integer
      * @return     the new <code>Color</code> object.
      * @see        java.lang.Integer#decode
      * @exception  NumberFormatException  if the specified string cannot
      *                      be interpreted as a decimal, 
-     *                      octal, or hexidecimal integer.
+     *                      octal, or hexadecimal integer.
      * @since      JDK1.1
      */
     public static Color decode(String nm) throws NumberFormatException {
@@ -1182,13 +1176,6 @@
         return cs;
     }
 
-    // REMIND: this should really be a Ref!
-    /**
-     * The paint context used to generate a solid color pattern.
-     * @see createContext()
-     */
-    transient private ColorPaintContext theContext;
-
     /**
      * Creates and returns a {@link PaintContext} used to generate a solid
      * color pattern.  This enables a <code>Color</code> object to be used
@@ -1212,13 +1199,7 @@
 						   Rectangle2D r2d,
 						   AffineTransform xform,
                                                    RenderingHints hints) {
-        ColorPaintContext pc = theContext;
-        int rgb = getRGB();
-        if (pc == null || pc.getRGB() != rgb) {
-            pc = new ColorPaintContext(rgb, cm);
-	    theContext = pc;
-	}
-	return pc;
+        return new ColorPaintContext(getRGB(), cm);
     }
 
     /**
--- a/j2se/src/share/classes/java/awt/DefaultKeyboardFocusManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/DefaultKeyboardFocusManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -29,14 +29,14 @@
 import java.awt.event.WindowEvent;
 import java.awt.peer.ComponentPeer;
 import java.awt.peer.LightweightPeer;
-import java.beans.PropertyChangeListener;
 import java.lang.ref.WeakReference;
 import java.util.LinkedList;
 import java.util.Iterator;
 import java.util.ListIterator;
 import java.util.Set;
 
-import java.util.logging.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import sun.awt.AppContext;
 import sun.awt.SunToolkit;
@@ -55,7 +55,7 @@
  * for more information.
  *
  * @author David Mendenhall
- * @version 1.49, 05/05/07
+ * @version 1.50, 05/08/07
  *
  * @see FocusTraversalPolicy
  * @see Component#setFocusTraversalKeys
@@ -324,7 +324,6 @@
                     break;
                 }
 
-                setNativeFocusedWindow(newFocusedWindow);
                 // Restore focus to the Component which last held it. We do
                 // this here so that client code can override our choice in
                 // a WINDOW_GAINED_FOCUS handler.
@@ -657,7 +656,6 @@
                     restoreFocus(currentFocusedWindow, null, true);
                     break;
                 }
-                setNativeFocusedWindow(null);
 
                 we.setSource(currentFocusedWindow);
                 realOppositeWindowWR = (oppositeWindow != null)
--- a/j2se/src/share/classes/java/awt/Dialog.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/Dialog.java	Fri Jun 22 00:46:43 2007 +0000
@@ -26,20 +26,19 @@
 
 import java.awt.peer.DialogPeer;
 import java.awt.event.*;
-import java.io.ObjectOutputStream;
 import java.io.ObjectInputStream;
 import java.io.IOException;
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicLong;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import javax.accessibility.*;
-import java.util.Vector;
-import java.util.Iterator;
 import sun.awt.AppContext;
 import sun.awt.SunToolkit;
 import sun.awt.PeerEvent;
-import java.lang.ref.WeakReference;
+import sun.awt.util.IdentityArrayList;
+import sun.awt.util.IdentityLinkedList;
 import sun.security.util.SecurityConstants;
-import java.util.concurrent.atomic.AtomicLong;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 
 /**
  * A Dialog is a top-level window with a title and a border
@@ -90,7 +89,7 @@
  * @see WindowEvent
  * @see Window#addWindowListener
  *
- * @version	1.135, 05/05/07
+ * @version	1.136, 05/08/07
  * @author	Sami Shaio
  * @author	Arthur van Hoff
  * @since       JDK1.0
@@ -270,9 +269,10 @@
     private final static ModalExclusionType DEFAULT_MODAL_EXCLUSION_TYPE =
         ModalExclusionType.APPLICATION_EXCLUDE;
 
-    transient static Vector<Dialog> modalDialogs = new Vector<Dialog>();
+    /* operations with this list should be synchronized on tree lock*/
+    transient static IdentityArrayList<Dialog> modalDialogs = new IdentityArrayList<Dialog>();
 
-    transient Vector<Window> blockedWindows = new Vector<Window>();
+    transient IdentityArrayList<Window> blockedWindows = new IdentityArrayList<Window>();
 
     /**
      * Specifies the title of the Dialog.
@@ -1399,7 +1399,7 @@
      */
     void modalShow() {
         // find all the dialogs that block this one
-        Vector<Dialog> blockers = new Vector<Dialog>();
+        IdentityArrayList<Dialog> blockers = new IdentityArrayList<Dialog>();
         for (Dialog d : modalDialogs) {
             if (d.shouldBlock(this)) {
                 Window w = d;
@@ -1428,7 +1428,7 @@
         }
 
         // find all windows from blockers' hierarchies
-        Vector<Window> blockersHierarchies = new Vector<Window>(blockers);
+        IdentityArrayList<Window> blockersHierarchies = new IdentityArrayList<Window>(blockers);
         int k = 0;
         while (k < blockersHierarchies.size()) {
             Window w = blockersHierarchies.get(k);
@@ -1439,8 +1439,9 @@
             k++;
         }
 
+        java.util.List<Window> toBlock = new IdentityLinkedList<Window>();
         // block all windows from scope of blocking except from blockers' hierarchies
-        Vector<Window> unblockedWindows = Window.getAllUnblockedWindows();
+        IdentityArrayList<Window> unblockedWindows = Window.getAllUnblockedWindows();
         for (Window w : unblockedWindows) {
             if (shouldBlock(w) && !blockersHierarchies.contains(w)) {
                 if ((w instanceof Dialog) && ((Dialog)w).isModal()) {
@@ -1449,9 +1450,10 @@
                         continue;
                     }
                 }
-                blockWindow(w);
+                toBlock.add(w);
             }
         }
+        blockWindows(toBlock);
 
         if (!isModalBlocked()) {
             updateChildrenBlocking();
@@ -1467,7 +1469,7 @@
      */
     void modalHide() {
         // we should unblock all the windows first...
-        Vector<Window> save = new Vector<Window>();
+        IdentityArrayList<Window> save = new IdentityArrayList<Window>();
         int blockedWindowsCount = blockedWindows.size();
         for (int i = 0; i < blockedWindowsCount; i++) {
             Window w = blockedWindows.get(0);
@@ -1555,11 +1557,29 @@
      */
     void blockWindow(Window w) {
         if (!w.isModalBlocked()) {
-            w.setModalBlocked(this, true);
+            w.setModalBlocked(this, true, true);
             blockedWindows.add(w);
         }
     }
 
+    void blockWindows(java.util.List<Window> toBlock) {
+        DialogPeer dpeer = (DialogPeer)peer;
+        if (dpeer == null) {
+            return;
+        }
+        Iterator<Window> it = toBlock.iterator();
+        while (it.hasNext()) {
+            Window w = it.next();
+            if (!w.isModalBlocked()) {
+                w.setModalBlocked(this, true, false);
+            } else {
+                it.remove();
+            }
+        }
+        dpeer.blockWindows(toBlock);
+        blockedWindows.addAll(toBlock);
+    }
+
     /*
      * Removes the given top-level window from the list of blocked
      * windows for this dialog and marks it as unblocked. If the
@@ -1568,7 +1588,7 @@
     void unblockWindow(Window w) {
         if (w.isModalBlocked() && blockedWindows.contains(w)) {
             blockedWindows.remove(w);
-            w.setModalBlocked(this, false);
+            w.setModalBlocked(this, false, true);
         }
     }
 
@@ -1599,7 +1619,7 @@
             setModal(modal);
         }
 
-        blockedWindows = new Vector();
+        blockedWindows = new IdentityArrayList();
     }
 
     /*
--- a/j2se/src/share/classes/java/awt/KeyboardFocusManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/KeyboardFocusManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -31,12 +31,20 @@
 
 import java.awt.peer.KeyboardFocusManagerPeer;
 import java.awt.peer.LightweightPeer;
-import java.awt.peer.WindowPeer;
-import java.beans.*;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyVetoException;
+import java.beans.VetoableChangeListener;
+import java.beans.VetoableChangeSupport;
+
 import java.lang.ref.WeakReference;
-import java.lang.reflect.*;
+
+import java.lang.reflect.Field;
+
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -44,7 +52,10 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.WeakHashMap;
-import java.util.logging.*;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 import sun.awt.AppContext;
 import sun.awt.DebugHelper;
 import sun.awt.HeadlessToolkit;
@@ -85,7 +96,7 @@
  * for more information.
  *
  * @author David Mendenhall
- * @version 1.81, 05/05/07 
+ * @version 1.82, 05/08/07 
  *
  * @see Window
  * @see Frame
@@ -583,10 +594,6 @@
         return peer.getCurrentFocusedWindow();
     }
 
-    void setNativeFocusedWindow(Window win) {
-        peer.setCurrentFocusedWindow(win);
-    }
-
     /**
      * Returns the permanent focus owner, if the permanent focus owner is in
      * the same context as the calling thread. The permanent focus owner is
@@ -2497,6 +2504,11 @@
      * focus owner to the focus proxy of the active Window.
      */
     static Window markClearGlobalFocusOwner() {
+        // need to call this out of synchronized block to avoid possible deadlock
+        // see 6454631.
+        final Component nativeFocusedWindow =
+                getCurrentKeyboardFocusManager().getNativeFocusedWindow();
+
         synchronized (heavyweightRequests) {
             HeavyweightFocusRequest hwFocusRequest = getLastHWRequest();
             if (hwFocusRequest ==
@@ -2506,21 +2518,20 @@
                 return null;
             }
 
-            KeyboardFocusManager manager = getCurrentKeyboardFocusManager();
             heavyweightRequests.add
                 (HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER);
 
             Component activeWindow = ((hwFocusRequest != null)
                 ? Component.getContainingWindow(hwFocusRequest.heavyweight)
-                : manager.getNativeFocusedWindow());
+                : nativeFocusedWindow);
             while (activeWindow != null &&
                    !((activeWindow instanceof Frame) ||
                      (activeWindow instanceof Dialog)))
             {
-                activeWindow = activeWindow.getParent();
+                activeWindow = activeWindow.getParent_NoClientCode();
             }
 
-            return (Window)activeWindow;
+            return (Window) activeWindow;
         }
     }
     Component getCurrentWaitingRequest(Component parent) {
--- a/j2se/src/share/classes/java/awt/List.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/List.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -99,7 +99,7 @@
  * For multiple-selection scrolling lists, it is considered a better
  * user interface to use an external gesture (such as clicking on a
  * button) to trigger the action.
- * @version 	1.117, 05/05/07
+ * @version 	1.118, 05/15/07
  * @author 	Sami Shaio
  * @see         java.awt.event.ItemEvent
  * @see         java.awt.event.ItemListener
@@ -616,7 +616,9 @@
     public synchronized void deselect(int index) {
 	ListPeer peer = (ListPeer)this.peer;
 	if (peer != null) {
-	    peer.deselect(index);
+            if (isMultipleMode() || (getSelectedIndex() == index)) {
+                peer.deselect(index);
+            }
 	}
 
 	for (int i = 0 ; i < selected.length ; i++) {
--- a/j2se/src/share/classes/java/awt/SystemColor.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/SystemColor.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -47,7 +47,7 @@
  *
  * @see Toolkit#getDesktopProperty
  *
- * @version 	1.33, 05/05/07
+ * @version 	1.35, 05/28/07
  * @author 	Carl Quinn
  * @author      Amy Fowler
  */
@@ -508,7 +508,7 @@
      * serialized form of the object to replace the serialized
      * object with the equivalent static object constant field
      * of {@code SystemColor}.
-     * See the {@link writeReplace} method for more information
+     * See the {@link #writeReplace} method for more information
      * on the serialized form of these objects.
      * @return one of the {@code SystemColor} static object
      *         fields that refers to the same system color.
@@ -529,7 +529,7 @@
      * The value field of a serialized {@code SystemColor} object
      * contains the array index of the system color instead of the
      * rgb data for the system color.
-     * This index is used by the {@link readResolve} method to
+     * This index is used by the {@link #readResolve} method to
      * resolve the deserialized objects back to the original
      * static constant versions to ensure unique instances of
      * each {@code SystemColor} object.
--- a/j2se/src/share/classes/java/awt/Toolkit.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/Toolkit.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,19 +25,18 @@
 
 package java.awt;
 
+import java.beans.PropertyChangeEvent;
 import java.util.MissingResourceException;
 import java.util.Properties;
 import java.util.ResourceBundle;
 import java.util.StringTokenizer;
 import java.awt.event.*;
 import java.awt.peer.*;
-import java.awt.*;
 import java.awt.im.InputMethodHighlight;
 import java.awt.image.ImageObserver;
 import java.awt.image.ImageProducer;
 import java.awt.image.ColorModel;
 import java.awt.datatransfer.Clipboard;
-import java.awt.dnd.DnDConstants;
 import java.awt.dnd.DragSource;
 import java.awt.dnd.DragGestureRecognizer;
 import java.awt.dnd.DragGestureEvent;
@@ -45,25 +44,24 @@
 import java.awt.dnd.InvalidDnDOperationException;
 import java.awt.dnd.peer.DragSourceContextPeer;
 import java.net.URL;
-import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 
 import java.util.EventListener;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.WeakHashMap;
-import java.util.List;
 import java.util.ArrayList;
 
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
+import sun.awt.AppContext;
 
 import sun.awt.DebugHelper;
 import sun.awt.HeadlessToolkit;
 import sun.awt.NullComponentPeer;
+import sun.awt.PeerEvent;
+import sun.awt.SunToolkit;
 import sun.security.util.SecurityConstants;
 
 import sun.util.CoreResourceBundleControl;
@@ -119,7 +117,7 @@
  * @author	Fred Ecks
  * @since       JDK1.0
  */
-public abstract class  Toolkit {
+public abstract class Toolkit {
 
     /**
      * Creates this toolkit's implementation of the <code>Desktop</code>
@@ -1840,10 +1838,7 @@
      * @param	pcl The property change listener
      * @since	1.2
      */
-    public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) {
-	if (pcl == null) {
-	    return;
-	}
+    public void addPropertyChangeListener(String name, PropertyChangeListener pcl) {
 	desktopPropsSupport.addPropertyChangeListener(name, pcl);
     }
 
@@ -1856,10 +1851,7 @@
      * @param	pcl The property change listener
      * @since	1.2
      */
-    public synchronized void removePropertyChangeListener(String name, PropertyChangeListener pcl) {
-	if (pcl == null) {
-	    return;
-	}
+    public void removePropertyChangeListener(String name, PropertyChangeListener pcl) {
 	desktopPropsSupport.removePropertyChangeListener(name, pcl);
     }
 
@@ -1887,13 +1879,14 @@
      *         been added
      * @since 1.4
      */
-    public synchronized PropertyChangeListener[] getPropertyChangeListeners(String propertyName) {
+    public PropertyChangeListener[] getPropertyChangeListeners(String propertyName) {
         return desktopPropsSupport.getPropertyChangeListeners(propertyName);
     }
 
-    protected final Map<String,Object> desktopProperties
-	= new HashMap<String,Object>();
-    protected final PropertyChangeSupport desktopPropsSupport = new PropertyChangeSupport(this);
+    protected final Map<String,Object> desktopProperties =
+            new HashMap<String,Object>();
+    protected final PropertyChangeSupport desktopPropsSupport =
+            Toolkit.createPropertyChangeSupport(this);
 
     /**
      * Returns whether the always-on-top mode is supported by this toolkit.
@@ -2413,5 +2406,127 @@
 	mapInputMethodHighlight(InputMethodHighlight highlight)
 	throws HeadlessException;
 
+    private static PropertyChangeSupport createPropertyChangeSupport(Toolkit toolkit) {
+        if (toolkit instanceof SunToolkit || toolkit instanceof HeadlessToolkit) {
+            return new DesktopPropertyChangeSupport(toolkit);
+        } else {
+            return new PropertyChangeSupport(toolkit);
+        }
+    }
+
+    private static class DesktopPropertyChangeSupport extends PropertyChangeSupport {
+        private static final StringBuilder PROP_CHANGE_SUPPORT_KEY =
+                new StringBuilder("desktop property change support key");
+        private final Object source;
+
+        public DesktopPropertyChangeSupport(Object sourceBean) {
+            super(sourceBean);
+            source = sourceBean;
+        }
+
+        @Override
+        public synchronized void addPropertyChangeListener(
+                String propertyName,
+                PropertyChangeListener listener)
+        {
+            PropertyChangeSupport pcs = (PropertyChangeSupport)
+                    AppContext.getAppContext().get(PROP_CHANGE_SUPPORT_KEY);
+            if (null == pcs) {
+                pcs = new PropertyChangeSupport(source);
+                AppContext.getAppContext().put(PROP_CHANGE_SUPPORT_KEY, pcs);
+            }
+            pcs.addPropertyChangeListener(propertyName, listener);
+        }
+
+        @Override
+        public synchronized void removePropertyChangeListener(
+                String propertyName,
+                PropertyChangeListener listener)
+        {
+            PropertyChangeSupport pcs = (PropertyChangeSupport)
+                    AppContext.getAppContext().get(PROP_CHANGE_SUPPORT_KEY);
+            if (null != pcs) {
+                pcs.removePropertyChangeListener(propertyName, listener);
+            }
+        }
+
+        @Override
+        public synchronized PropertyChangeListener[] getPropertyChangeListeners()
+        {
+            PropertyChangeSupport pcs = (PropertyChangeSupport)
+                    AppContext.getAppContext().get(PROP_CHANGE_SUPPORT_KEY);
+            if (null != pcs) {
+                return pcs.getPropertyChangeListeners();
+            } else {
+                return new PropertyChangeListener[0];
+            }
+        }
+
+        @Override
+        public synchronized PropertyChangeListener[] getPropertyChangeListeners(String propertyName)
+        {
+            PropertyChangeSupport pcs = (PropertyChangeSupport)
+                    AppContext.getAppContext().get(PROP_CHANGE_SUPPORT_KEY);
+            if (null != pcs) {
+                return pcs.getPropertyChangeListeners(propertyName);
+            } else {
+                return new PropertyChangeListener[0];
+            }
+        }
+
+        @Override
+        public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
+            PropertyChangeSupport pcs = (PropertyChangeSupport)
+                    AppContext.getAppContext().get(PROP_CHANGE_SUPPORT_KEY);
+            if (null == pcs) {
+                pcs = new PropertyChangeSupport(source);
+                AppContext.getAppContext().put(PROP_CHANGE_SUPPORT_KEY, pcs);
+            }
+            pcs.addPropertyChangeListener(listener);
+        }
+
+        @Override
+        public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
+            PropertyChangeSupport pcs = (PropertyChangeSupport)
+                    AppContext.getAppContext().get(PROP_CHANGE_SUPPORT_KEY);
+            if (null != pcs) {
+                pcs.removePropertyChangeListener(listener);
+            }
+        }
+
+        /*
+         * we do expect that all other fireXXX() methods of java.beans.PropertyChangeSupport
+         * use this method.  If this will be changed we will need to change this class.
+         */
+        @Override
+        public void firePropertyChange(final PropertyChangeEvent evt) {
+            Object oldValue = evt.getOldValue();
+            Object newValue = evt.getNewValue();
+            String propertyName = evt.getPropertyName();
+            if (oldValue != null && newValue != null && oldValue.equals(newValue)) {
+                return;
+            }
+            Runnable updater = new Runnable() {
+                public void run() {
+                    PropertyChangeSupport pcs = (PropertyChangeSupport)
+                            AppContext.getAppContext().get(PROP_CHANGE_SUPPORT_KEY);
+                    if (null != pcs) {
+                        pcs.firePropertyChange(evt);
+                    }
+                }
+            };
+            final AppContext currentAppContext = AppContext.getAppContext();
+            for (AppContext appContext : AppContext.getAppContexts()) {
+                if (null == appContext || appContext.isDisposed()) {
+                    continue;
+                }
+                if (currentAppContext == appContext) {
+                    updater.run();
+                } else {
+                    final PeerEvent e = new PeerEvent(source, updater, PeerEvent.ULTIMATE_PRIORITY_EVENT);
+                    SunToolkit.postEvent(appContext, e);
+                }
+            }
+        }
+    }
 }
-
--- a/j2se/src/share/classes/java/awt/Window.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/Window.java	Fri Jun 22 00:46:43 2007 +0000
@@ -39,7 +39,6 @@
 import java.lang.ref.WeakReference;
 import java.lang.reflect.InvocationTargetException;
 import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.EventListener;
@@ -47,14 +46,16 @@
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.concurrent.atomic.AtomicBoolean;
 import javax.accessibility.*;
-import sun.awt.DebugHelper;
+import sun.awt.AppContext;
+import sun.awt.CausedFocusEvent;
+import sun.awt.SunToolkit;
+import sun.awt.util.IdentityArrayList;
 import sun.security.action.GetPropertyAction;
 import sun.security.util.SecurityConstants;
-import sun.awt.CausedFocusEvent;
-import sun.awt.SunToolkit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import sun.awt.AppContext;
 
 /**
  * A <code>Window</code> object is a top-level window with no borders and no
@@ -133,7 +134,7 @@
  * Windows are capable of generating the following WindowEvents:
  * WindowOpened, WindowClosed, WindowGainedFocus, WindowLostFocus.
  *
- * @version 	@(#)Window.java	1.264 07/05/05
+ * @version 	@(#)Window.java	1.265 07/05/08
  * @author 	Sami Shaio
  * @author 	Arthur van Hoff
  * @see WindowEvent
@@ -205,7 +206,7 @@
      *
      * @since 1.6
      */
-    static Vector<Window> allWindows = new Vector<Window>();
+    private static final IdentityArrayList<Window> allWindows = new IdentityArrayList<Window>();
 
     /**
      * A vector containing all the windows this
@@ -269,6 +270,18 @@
      */
     private boolean focusableWindowState = true;
 
+    /**
+     * Indicates whether this window should receive focus on
+     * subsequently being shown (with a call to {@code setVisible(true)}), or
+     * being moved to the front (with a call to {@code toFront()}). 
+     *
+     * @serial
+     * @see #setAutoRequestFocus
+     * @see #isAutoRequestFocus
+     * @since 1.7
+     */
+    private volatile boolean autoRequestFocus = true;
+
     /*
      * Indicates that this window is being shown. This flag is set to true at
      * the beginning of show() and to false at the end of show().
@@ -286,7 +299,7 @@
      */
     private static final long serialVersionUID = 4497834738069338734L;
 
-    private static final DebugHelper dbg = DebugHelper.create(Window.class);
+    private static final Logger log = Logger.getLogger("java.awt.Window");
 
     private static final boolean locationByPlatformProp;
 
@@ -649,7 +662,9 @@
             if (peer == null) {
                 peer = getToolkit().createWindow(this);
             }
-            allWindows.add(this);
+            synchronized (allWindows) {
+                allWindows.add(this);
+            }
             super.addNotify();
         }
     }
@@ -659,7 +674,9 @@
      */
     public void removeNotify() {
         synchronized (getTreeLock()) {
-            allWindows.remove(this);
+            synchronized (allWindows) {
+                allWindows.remove(this);
+            }
             super.removeNotify();
         }        
     }
@@ -816,6 +833,21 @@
     /**
      * Shows or hides this {@code Window} depending on the value of parameter
      * {@code b}.
+     * <p>
+     * If the method shows the window then the window is also made
+     * focused under the following conditions:
+     * <ul>
+     * <li> The {@code Window} meets the requirements outlined in the
+     *      {@link #isFocusableWindow} method.
+     * <li> The {@code Window}'s {@code autoRequestFocus} property is of the {@code true} value.
+     * <li> Native windowing system allows the {@code Window} to get focused.
+     * </ul>
+     * There is an exception for the second condition (the value of the
+     * {@code autoRequestFocus} property). The property is not taken into account if the
+     * window is a modal dialog, which blocks the currently focused window.
+     * <p>
+     * Developers must never assume that the window is the focused or active window
+     * until it receives a WINDOW_GAINED_FOCUS or WINDOW_ACTIVATED event.
      * @param b  if {@code true}, makes the {@code Window} visible, 
      * otherwise hides the {@code Window}.
      * If the {@code Window} and/or its owner
@@ -831,6 +863,8 @@
      * @see java.awt.Component#setVisible
      * @see java.awt.Window#toFront
      * @see java.awt.Window#dispose
+     * @see java.awt.Window#setAutoRequestFocus
+     * @see java.awt.Window#isFocusableWindow
      */
     public void setVisible(boolean b) {
         super.setVisible(b);
@@ -872,6 +906,10 @@
             }   // endfor
             if (!isModalBlocked()) {
                 updateChildrenBlocking();
+            } else {
+                // fix for 6532736: after this window is shown, its blocker
+                // should be raised to front
+                modalBlocker.toFront_NoClientCode();
             }
             if (this instanceof Frame || this instanceof Dialog) {
                 updateChildFocusableWindowState(this);
@@ -1065,13 +1103,19 @@
      * however, developers should not assume that this method will move this
      * Window above all other windows in every situation.
      * <p>
-     * Because of variations in native windowing systems, no guarantees about
-     * changes to the focused and active Windows can be made. Developers must
-     * never assume that this Window is the focused or active Window until this
-     * Window receives a WINDOW_GAINED_FOCUS or WINDOW_ACTIVATED event. On
-     * platforms where the top-most window is the focused window, this method
-     * will <b>probably</b> focus this Window, if it is not already focused. On
-     * platforms where the stacking order does not typically affect the focused
+     * Developers must never assume that this Window is the focused or active
+     * Window until this Window receives a WINDOW_GAINED_FOCUS or WINDOW_ACTIVATED
+     * event. On platforms where the top-most window is the focused window, this
+     * method will <b>probably</b> focus this Window (if it is not already focused)
+     * under the following conditions:
+     * <ul>
+     * <li> The window meets the requirements outlined in the
+     *      {@link #isFocusableWindow} method.
+     * <li> The window's property {@code autoRequestFocus} is of the
+     *      {@code true} value.
+     * <li> Native windowing system allows the window to get focused.
+     * </ul>
+     * On platforms where the stacking order does not typically affect the focused
      * window, this method will <b>probably</b> leave the focused and active
      * Windows unchanged.
      * <p>
@@ -1084,6 +1128,8 @@
      * is brought to the front and remains above the blocked window.
      *
      * @see       #toBack
+     * @see       #setAutoRequestFocus
+     * @see       #isFocusableWindow
      */
     public void toFront() {
         toFront_NoClientCode();
@@ -1296,11 +1342,13 @@
         return modalBlocker != null;
     }
 
-    void setModalBlocked(Dialog blocker, boolean blocked) {
+    void setModalBlocked(Dialog blocker, boolean blocked, boolean peerCall) {
         this.modalBlocker = blocked ? blocker : null;
-        WindowPeer peer = (WindowPeer)this.peer;
-        if (peer != null) {
-            peer.setModalBlocked(blocker, blocked);
+        if (peerCall) {
+            WindowPeer peer = (WindowPeer)this.peer;
+            if (peer != null) {
+                peer.setModalBlocked(blocker, blocked);
+            }
         }
     }
 
@@ -1315,17 +1363,17 @@
      * @see #addNotify
      * @see #removeNotify
      */
-    static Vector<Window> getAllWindows() {
+    static IdentityArrayList<Window> getAllWindows() {
         synchronized (allWindows) {
-            Vector<Window> v = new Vector<Window>();
+            IdentityArrayList<Window> v = new IdentityArrayList<Window>();
             v.addAll(allWindows);
             return v;
         }
     }
 
-    static Vector<Window> getAllUnblockedWindows() {
+    static IdentityArrayList<Window> getAllUnblockedWindows() {
         synchronized (allWindows) {
-            Vector<Window> unblocked = new Vector<Window>();
+            IdentityArrayList<Window> unblocked = new IdentityArrayList<Window>();
             for (int i = 0; i < allWindows.size(); i++) {
                 Window w = allWindows.get(i);
                 if (!w.isModalBlocked()) {
@@ -2369,6 +2417,46 @@
     }
 
     /**
+     * Sets whether this window should receive focus on
+     * subsequently being shown (with a call to {@link #setVisible setVisible(true)}),
+     * or being moved to the front (with a call to {@link #toFront}). 
+     * <p>
+     * Note that {@link #setVisible setVisible(true)} may be called indirectly
+     * (e.g. when showing an owner of the window makes the window to be shown).
+     * {@link #toFront} may also be called indirectly (e.g. when
+     * {@link #setVisible setVisible(true)} is called on already visible window).
+     * In all such cases this property takes effect as well.
+     * <p>
+     * The value of the property is not inherited by owned windows.
+     *
+     * @param autoRequestFocus whether this window should be focused on
+     *        subsequently being shown or being moved to the front
+     * @see #isAutoRequestFocus
+     * @see #isFocusableWindow
+     * @see #setVisible
+     * @see #toFront
+     * @since 1.7
+     */
+    public void setAutoRequestFocus(boolean autoRequestFocus) {
+        this.autoRequestFocus = autoRequestFocus;
+    }
+
+    /**
+     * Returns whether this window should receive focus on subsequently being shown
+     * (with a call to {@link #setVisible setVisible(true)}), or being moved to the front
+     * (with a call to {@link #toFront}).
+     * <p>
+     * By default, the window has {@code autoRequestFocus} value of {@code true}.
+     *
+     * @return {@code autoRequestFocus} value
+     * @see #setAutoRequestFocus
+     * @since 1.7
+     */
+    public boolean isAutoRequestFocus() {
+        return autoRequestFocus;
+    }
+
+    /**
      * Adds a PropertyChangeListener to the listener list. The listener is
      * registered for all bound properties of this class, including the
      * following:
@@ -2847,8 +2935,8 @@
                     getDefaultScreenDevice().
                     getDefaultConfiguration();
             }
-            if (dbg.on) {
-                dbg.println("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this);
+            if (log.isLoggable(Level.FINER)) {
+                log.finer("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this);
             }
         }
     }
--- a/j2se/src/share/classes/java/awt/peer/DialogPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/peer/DialogPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-1998 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
 public interface DialogPeer extends WindowPeer {
     void setTitle(String title);
     void setResizable(boolean resizeable);
+    void blockWindows(java.util.List<Window> windows);
 }
 
 
--- a/j2se/src/share/classes/java/awt/peer/KeyboardFocusManagerPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/awt/peer/KeyboardFocusManagerPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,7 +29,6 @@
 import java.awt.Window;
 
 public interface KeyboardFocusManagerPeer {
-    void setCurrentFocusedWindow(Window win);
     Window getCurrentFocusedWindow();
     
     void setCurrentFocusOwner(Component comp);
--- a/j2se/src/share/classes/java/net/URL.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/net/URL.java	Fri Jun 22 00:46:43 2007 +0000
@@ -128,7 +128,7 @@
  * as the encoding scheme defined in RFC2396.
  *
  * @author  James Gosling
- * @version 1.142, 05/05/07
+ * @version 1.143, 05/11/07
  * @since JDK1.0 
  */
 public final class URL implements java.io.Serializable {
@@ -615,7 +615,9 @@
 	} catch(MalformedURLException e) {
 	    throw e;
 	} catch(Exception e) {
-	    throw new MalformedURLException(e.getMessage());
+	    MalformedURLException exception = new MalformedURLException(e.getMessage());
+	    exception.initCause(e);
+	    throw exception;
 	}
     }
 
--- a/j2se/src/share/classes/java/text/Bidi.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/text/Bidi.java	Fri Jun 22 00:46:43 2007 +0000
@@ -69,10 +69,15 @@
     int[] cws;
 
     static {
-	java.security.AccessController.doPrivileged(
-	    new sun.security.action.LoadLibraryAction("awt"));
-	java.security.AccessController.doPrivileged(
-	    new sun.security.action.LoadLibraryAction("fontmanager"));
+         java.security.AccessController.doPrivileged(
+                                    new java.security.PrivilegedAction() {
+             public Object run() {
+                 System.loadLibrary("awt");
+                 System.loadLibrary("t2k");
+                 System.loadLibrary("fontmanager");
+                 return null;
+             }
+         });
     }
 
     /** Constant indicating base direction is left-to-right. */
--- a/j2se/src/share/classes/java/util/CurrencyData.properties	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/util/CurrencyData.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -247,6 +247,8 @@
 GU=USD
 # GUATEMALA
 GT=GTQ
+# GUERNSEY
+GG=GBP
 # GUINEA
 GN=GNF
 # GUINEA-BISSAU
@@ -277,6 +279,8 @@
 IQ=IQD
 # IRELAND
 IE=EUR
+# ISLE OF MAN
+IM=GBP
 # ISRAEL
 IL=ILS
 # ITALY
@@ -285,6 +289,8 @@
 JM=JMD
 # JAPAN
 JP=JPY
+# JERSEY
+JE=GBP
 # JORDAN
 JO=JOD
 # KAZAKSTAN
--- a/j2se/src/share/classes/java/util/LocaleISOData.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/util/LocaleISOData.java	Fri Jun 22 00:46:43 2007 +0000
@@ -303,6 +303,7 @@
 	+ "GD" + "GRD"	// Grenada
 	+ "GE" + "GEO"	// Georgia
 	+ "GF" + "GUF"	// French Guiana
+	+ "GG" + "GGY"	// Guernsey
 	+ "GH" + "GHA"	// Ghana, Republic of
 	+ "GI" + "GIB"	// Gibraltar
 	+ "GL" + "GRL"	// Greenland
@@ -325,12 +326,14 @@
 	+ "ID" + "IDN"	// Indonesia, Republic of
 	+ "IE" + "IRL"	// Ireland
 	+ "IL" + "ISR"	// Israel, State of
+	+ "IM" + "IMN"	// Isle of Man
 	+ "IN" + "IND"	// India, Republic of
 	+ "IO" + "IOT"	// British Indian Ocean Territory (Chagos Archipelago)
 	+ "IQ" + "IRQ"	// Iraq, Republic of
 	+ "IR" + "IRN"	// Iran, Islamic Republic of
 	+ "IS" + "ISL"	// Iceland, Republic of
 	+ "IT" + "ITA"	// Italy, Italian Republic
+	+ "JE" + "JEY"	// Jersey
 	+ "JM" + "JAM"	// Jamaica
 	+ "JO" + "JOR"	// Jordan, Hashemite Kingdom of
 	+ "JP" + "JPN"	// Japan
--- a/j2se/src/share/classes/java/util/ResourceBundle.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/util/ResourceBundle.java	Fri Jun 22 00:46:43 2007 +0000
@@ -40,10 +40,8 @@
 
 package java.util;
 
-import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.ref.Reference;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.SoftReference;
 import java.lang.ref.WeakReference;
@@ -1354,47 +1352,55 @@
 	if (bundle != NONEXISTENT_BUNDLE) {
 	    CacheKey constKey = (CacheKey) cacheKey.clone();
 
-	    // Try declaring loading. If beginLoading() returns true,
-	    // then we can proceed. Otherwise, we need to take a look
-	    // at the cache again to see if someone else has loaded
-	    // the bundle and put it in the cache while we've been
-	    // waiting for other loading work to complete.
-	    while (!beginLoading(constKey)) {
-		bundle = findBundleInCache(cacheKey, control);
-		if (bundle == null) {
-		    continue;
+	    try {
+		// Try declaring loading. If beginLoading() returns true,
+		// then we can proceed. Otherwise, we need to take a look
+		// at the cache again to see if someone else has loaded
+		// the bundle and put it in the cache while we've been
+		// waiting for other loading work to complete.
+		while (!beginLoading(constKey)) {
+		    bundle = findBundleInCache(cacheKey, control);
+		    if (bundle == null) {
+			continue;
+		    }
+		    if (bundle == NONEXISTENT_BUNDLE) {
+			// If the bundle is NONEXISTENT_BUNDLE, the bundle doesn't exist.
+			return parent;
+		    }
+		    expiredBundle = bundle.expired;
+		    if (!expiredBundle) {
+			if (bundle.parent == parent) {
+			    return bundle;
+			}
+			BundleReference bundleRef = cacheList.get(cacheKey);
+			if (bundleRef != null && bundleRef.get() == bundle) {
+			    cacheList.remove(cacheKey, bundleRef);
+			}
+		    }
 		}
-		if (bundle == NONEXISTENT_BUNDLE) {
-		    // If the bundle is NONEXISTENT_BUNDLE, the bundle doesn't exist.
-		    return parent;
-		}
-		expiredBundle = bundle.expired;
-		if (!expiredBundle) {
-		    if (bundle.parent == parent) {
+
+		try {
+		    bundle = loadBundle(cacheKey, formats, control, expiredBundle);
+		    if (bundle != null) {
+			if (bundle.parent == null) {
+			    bundle.setParent(parent);
+			}
+			bundle.locale = targetLocale;
+			bundle = putBundleInCache(cacheKey, bundle, control);
 			return bundle;
 		    }
-		    BundleReference bundleRef = cacheList.get(cacheKey);
-		    if (bundleRef != null && bundleRef.get() == bundle) {
-			cacheList.remove(cacheKey, bundleRef);
-		    }
+
+		    // Put NONEXISTENT_BUNDLE in the cache as a mark that there's no bundle
+		    // instance for the locale.
+		    putBundleInCache(cacheKey, NONEXISTENT_BUNDLE, control);
+		} finally {
+		    endLoading(constKey);
+		}
+	    } finally {
+		if (constKey.getCause() instanceof InterruptedException) {
+		    Thread.currentThread().interrupt();
 		}
 	    }
-		    
-	    bundle = loadBundle(cacheKey, formats, control, expiredBundle);
-	    if (bundle != null) {
-		if (bundle.parent == null) {
-		    bundle.setParent(parent);
-		}
-		bundle.locale = targetLocale;	
-		bundle = putBundleInCache(cacheKey, bundle, control);
-		endLoading(constKey);
-		return bundle;
-	    }
-
-	    // Put NONEXISTENT_BUNDLE in the cache as a mark that there's no bundle
-	    // instance for the locale.
-	    putBundleInCache(cacheKey, NONEXISTENT_BUNDLE, control);
-	    endLoading(constKey);
 	}
 	assert underConstruction.get(cacheKey) != Thread.currentThread();
 	return parent;
@@ -1417,7 +1423,7 @@
 	    try {
 		bundle = control.newBundle(cacheKey.getName(), targetLocale, format,
 					   cacheKey.getLoader(), reload);
-	    } catch (Throwable cause) {
+	    } catch (Exception cause) {
 		cacheKey.setCause(cause);
 	    }
 	    if (bundle != null) {
@@ -1490,6 +1496,8 @@
 		try {
 		    worker.wait();
 		} catch (InterruptedException e) {
+		    // record the interruption
+		    constKey.setCause(e);
 		}
 	    }
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/java/util/concurrent/atomic/package-info.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,200 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+/**
+ * A small toolkit of classes that support lock-free thread-safe
+ * programming on single variables.  In essence, the classes in this
+ * package extend the notion of {@code volatile} values, fields, and
+ * array elements to those that also provide an atomic conditional update
+ * operation of the form:
+ *
+ * <pre>
+ *   boolean compareAndSet(expectedValue, updateValue);
+ * </pre>
+ *
+ * <p>This method (which varies in argument types across different
+ * classes) atomically sets a variable to the {@code updateValue} if it
+ * currently holds the {@code expectedValue}, reporting {@code true} on
+ * success.  The classes in this package also contain methods to get and
+ * unconditionally set values, as well as a weaker conditional atomic
+ * update operation {@code weakCompareAndSet} described below.
+ *
+ * <p>The specifications of these methods enable implementations to
+ * employ efficient machine-level atomic instructions that are available
+ * on contemporary processors.  However on some platforms, support may
+ * entail some form of internal locking.  Thus the methods are not
+ * strictly guaranteed to be non-blocking --
+ * a thread may block transiently before performing the operation.
+ *
+ * <p>Instances of classes
+ * {@link java.util.concurrent.atomic.AtomicBoolean},
+ * {@link java.util.concurrent.atomic.AtomicInteger},
+ * {@link java.util.concurrent.atomic.AtomicLong}, and
+ * {@link java.util.concurrent.atomic.AtomicReference}
+ * each provide access and updates to a single variable of the
+ * corresponding type.  Each class also provides appropriate utility
+ * methods for that type.  For example, classes {@code AtomicLong} and
+ * {@code AtomicInteger} provide atomic increment methods.  One
+ * application is to generate sequence numbers, as in:
+ *
+ * <pre>
+ * class Sequencer {
+ *   private final AtomicLong sequenceNumber
+ *     = new AtomicLong(0);
+ *   public long next() {
+ *     return sequenceNumber.getAndIncrement();
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>The memory effects for accesses and updates of atomics generally
+ * follow the rules for volatiles, as stated in
+ * <a href="http://java.sun.com/docs/books/jls/"> The Java Language
+ * Specification, Third Edition (17.4 Memory Model)</a>:
+ *
+ * <ul>
+ *
+ *   <li> {@code get} has the memory effects of reading a
+ * {@code volatile} variable.
+ *
+ *   <li> {@code set} has the memory effects of writing (assigning) a
+ * {@code volatile} variable.
+ *
+ *   <li> {@code lazySet} has the memory effects of writing (assigning)
+ *   a {@code volatile} variable except that it permits reorderings with
+ *   subsequent (but not previous) memory actions that do not themselves
+ *   impose reordering constraints with ordinary non-{@code volatile}
+ *   writes.  Among other usage contexts, {@code lazySet} may apply when
+ *   nulling out, for the sake of garbage collection, a reference that is
+ *   never accessed again.
+ *
+ *   <li>{@code weakCompareAndSet} atomically reads and conditionally
+ *   writes a variable but does <em>not</em>
+ *   create any happens-before orderings, so provides no guarantees
+ *   with respect to previous or subsequent reads and writes of any
+ *   variables other than the target of the {@code weakCompareAndSet}.
+ *
+ *   <li> {@code compareAndSet}
+ *   and all other read-and-update operations such as {@code getAndIncrement}
+ *   have the memory effects of both reading and
+ *   writing {@code volatile} variables.
+ * </ul>
+ *
+ * <p>In addition to classes representing single values, this package
+ * contains <em>Updater</em> classes that can be used to obtain
+ * {@code compareAndSet} operations on any selected {@code volatile}
+ * field of any selected class.
+ *
+ * {@link java.util.concurrent.atomic.AtomicReferenceFieldUpdater},
+ * {@link java.util.concurrent.atomic.AtomicIntegerFieldUpdater}, and
+ * {@link java.util.concurrent.atomic.AtomicLongFieldUpdater} are
+ * reflection-based utilities that provide access to the associated
+ * field types.  These are mainly of use in atomic data structures in
+ * which several {@code volatile} fields of the same node (for
+ * example, the links of a tree node) are independently subject to
+ * atomic updates.  These classes enable greater flexibility in how
+ * and when to use atomic updates, at the expense of more awkward
+ * reflection-based setup, less convenient usage, and weaker
+ * guarantees.
+ *
+ * <p>The
+ * {@link java.util.concurrent.atomic.AtomicIntegerArray},
+ * {@link java.util.concurrent.atomic.AtomicLongArray}, and
+ * {@link java.util.concurrent.atomic.AtomicReferenceArray} classes
+ * further extend atomic operation support to arrays of these types.
+ * These classes are also notable in providing {@code volatile} access
+ * semantics for their array elements, which is not supported for
+ * ordinary arrays.
+ *
+ * <a name="Spurious">
+ * <p>The atomic classes also support method {@code weakCompareAndSet},
+ * which has limited applicability.  On some platforms, the weak version
+ * may be more efficient than {@code compareAndSet} in the normal case,
+ * but differs in that any given invocation of the
+ * {@code weakCompareAndSet} method may return {@code false}
+ * <em>spuriously</em> (that is, for no apparent reason)</a>.  A
+ * {@code false} return means only that the operation may be retried if
+ * desired, relying on the guarantee that repeated invocation when the
+ * variable holds {@code expectedValue} and no other thread is also
+ * attempting to set the variable will eventually succeed.  (Such
+ * spurious failures may for example be due to memory contention effects
+ * that are unrelated to whether the expected and current values are
+ * equal.)  Additionally {@code weakCompareAndSet} does not provide
+ * ordering guarantees that are usually needed for synchronization
+ * control.  However, the method may be useful for updating counters and
+ * statistics when such updates are unrelated to the other
+ * happens-before orderings of a program.  When a thread sees an update
+ * to an atomic variable caused by a {@code weakCompareAndSet}, it does
+ * not necessarily see updates to any <em>other</em> variables that
+ * occurred before the {@code weakCompareAndSet}.  This may be
+ * acceptable when, for example, updating performance statistics, but
+ * rarely otherwise.
+ *
+ * <p>The {@link java.util.concurrent.atomic.AtomicMarkableReference}
+ * class associates a single boolean with a reference.  For example, this
+ * bit might be used inside a data structure to mean that the object
+ * being referenced has logically been deleted.
+ *
+ * The {@link java.util.concurrent.atomic.AtomicStampedReference}
+ * class associates an integer value with a reference.  This may be
+ * used for example, to represent version numbers corresponding to
+ * series of updates.
+ *
+ * <p>Atomic classes are designed primarily as building blocks for
+ * implementing non-blocking data structures and related infrastructure
+ * classes.  The {@code compareAndSet} method is not a general
+ * replacement for locking.  It applies only when critical updates for an
+ * object are confined to a <em>single</em> variable.
+ *
+ * <p>Atomic classes are not general purpose replacements for
+ * {@code java.lang.Integer} and related classes.  They do <em>not</em>
+ * define methods such as {@code hashCode} and
+ * {@code compareTo}.  (Because atomic variables are expected to be
+ * mutated, they are poor choices for hash table keys.)  Additionally,
+ * classes are provided only for those types that are commonly useful in
+ * intended applications.  For example, there is no atomic class for
+ * representing {@code byte}.  In those infrequent cases where you would
+ * like to do so, you can use an {@code AtomicInteger} to hold
+ * {@code byte} values, and cast appropriately.
+ *
+ * You can also hold floats using
+ * {@link java.lang.Float#floatToIntBits} and
+ * {@link java.lang.Float#intBitsToFloat} conversions, and doubles using
+ * {@link java.lang.Double#doubleToLongBits} and
+ * {@link java.lang.Double#longBitsToDouble} conversions.
+ *
+ * @since 1.5
+ */
+package java.util.concurrent.atomic;
--- a/j2se/src/share/classes/java/util/concurrent/atomic/package.html	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html> <head>
-<title>Atomics</title>
-<!--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-
-This code is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License version 2 only, as
-published by the Free Software Foundation.  Sun designates this
-particular file as subject to the "Classpath" exception as provided
-by Sun in the LICENSE file that accompanied this code.
-
-This code 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
-version 2 for more details (a copy is included in the LICENSE file that
-accompanied this code).
-
-You should have received a copy of the GNU General Public License version
-2 along with this work; if not, write to the Free Software Foundation,
-Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-CA 95054 USA or visit www.sun.com if you need additional information or
-have any questions. 
-
---><!--
-
-This file is available under and governed by the GNU General Public
-License version 2 only, as published by the Free Software Foundation.
-However, the following notice accompanied the original version of this
-file:
-
-Written by Doug Lea with assistance from members of JCP JSR-166
-Expert Group and released to the public domain, as explained at
-http://creativecommons.org/licenses/publicdomain
--->
-</head>
-
-<body>
-
-A small toolkit of classes that support lock-free thread-safe
-programming on single variables. In essence, the classes in this
-package extend the notion of <tt>volatile</tt> values, fields, and
-array elements to those that also provide an atomic conditional update
-operation of the form:
-
-<pre>
-  boolean compareAndSet(expectedValue, updateValue);
-</pre>
-
-<p> This method (which varies in argument types across different
-classes) atomically sets a variable to the <tt>updateValue</tt> if it
-currently holds the <tt>expectedValue</tt>, reporting <tt>true</tt> on
-success.  The classes in this package also contain methods to get and
-unconditionally set values, as well as a weaker conditional atomic
-update operation <tt>weakCompareAndSet</tt> described below.
-
-<p> The specifications of these methods enable implementations to
-employ efficient machine-level atomic instructions that are available
-on contemporary processors. However on some platforms, support may
-entail some form of internal locking. Thus the methods are not
-strictly guaranteed to be non-blocking --
-a thread may block transiently before performing the operation.
-
-<p> Instances of classes {@link
-java.util.concurrent.atomic.AtomicBoolean}, {@link
-java.util.concurrent.atomic.AtomicInteger}, {@link
-java.util.concurrent.atomic.AtomicLong}, and {@link
-java.util.concurrent.atomic.AtomicReference} each provide access and
-updates to a single variable of the corresponding type.  Each class
-also provides appropriate utility methods for that type.  For example,
-classes <tt>AtomicLong</tt> and <tt>AtomicInteger</tt> provide atomic
-increment methods.  One application is to generate sequence numbers,
-as in:
-
-<pre>
-class Sequencer {
-  private final AtomicLong sequenceNumber
-    = new AtomicLong(0);
-  public long next() {
-    return sequenceNumber.getAndIncrement();
-  }
-}
-</pre>
-
-<p>The memory effects for accesses and updates of atomics generally
-follow the rules for volatiles, as stated in <a
-href="http://java.sun.com/docs/books/jls/"> The Java Language
-Specification, Third Edition (17.4 Memory Model)</a>:
-
-<ul>
-
-  <li> <tt>get</tt> has the memory effects of reading a
-<tt>volatile</tt> variable.
-
-  <li> <tt>set</tt> has the memory effects of writing (assigning) a
-<tt>volatile</tt> variable.
-
-  <li> <tt>lazySet</tt> has the memory effects of writing (assigning)
-  a <tt>volatile</tt> variable except that it permits reorderings with
-  subsequent (but not previous) memory actions that do not themselves
-  impose reordering constraints with ordinary non-<tt>volatile</tt>
-  writes.  Among other usage contexts, <tt>lazySet</tt> may apply when
-  nulling out, for the sake of garbage collection, a reference that is
-  never accessed again.
-
-  <li><tt>weakCompareAndSet</tt> atomically reads and conditionally
-  writes a variable but does <em>not</em>
-  create any happens-before orderings, so provides no guarantees
-  with respect to previous or subsequent reads and writes of any
-  variables other than the target of the <tt>weakCompareAndSet</tt>.
-
-  <li> <tt>compareAndSet</tt>
-  and all other read-and-update operations such as <tt>getAndIncrement</tt>
-  have the memory effects of both reading and
-  writing <tt>volatile</tt> variables.
-</ul>
-
-<p>In addition to classes representing single values, this package
-contains <em>Updater</em> classes that can be used to obtain
-<tt>compareAndSet</tt> operations on any selected <tt>volatile</tt>
-field of any selected class.  {@link
-java.util.concurrent.atomic.AtomicReferenceFieldUpdater}, {@link
-java.util.concurrent.atomic.AtomicIntegerFieldUpdater}, and {@link
-java.util.concurrent.atomic.AtomicLongFieldUpdater} are
-reflection-based utilities that provide access to the associated field
-types. These are mainly of use in atomic data structures in which
-several <tt>volatile</tt> fields of the same node (for example, the
-links of a tree node) are independently subject to atomic
-updates. These classes enable greater flexibility in how and when to
-use atomic updates, at the expense of more awkward reflection-based
-setup, less convenient usage, and weaker guarantees.
-
-<p>The {@link java.util.concurrent.atomic.AtomicIntegerArray}, {@link
-java.util.concurrent.atomic.AtomicLongArray}, and {@link
-java.util.concurrent.atomic.AtomicReferenceArray} classes further
-extend atomic operation support to arrays of these types. These
-classes are also notable in providing <tt>volatile</tt> access
-semantics for their array elements, which is not supported for
-ordinary arrays.
-
-<a name="Spurious">
-<p>The atomic classes also support method <tt>weakCompareAndSet</tt>,
-which has limited applicability. On some platforms, the weak version
-may be more efficient than <tt>compareAndSet</tt> in the normal case,
-but differs in that any given invocation of the
-<tt>weakCompareAndSet</tt> method may return <tt>false</tt>
-<em>spuriously</em> (that is, for no apparent reason)</a>.  A
-<tt>false</tt> return means only that the operation may be retried if
-desired, relying on the guarantee that repeated invocation when the
-variable holds <tt>expectedValue</tt> and no other thread is also
-attempting to set the variable will eventually succeed.  (Such
-spurious failures may for example be due to memory contention effects
-that are unrelated to whether the expected and current values are
-equal.)  Additionally <tt>weakCompareAndSet</tt> does not provide
-ordering guarantees that are usually needed for synchronization
-control.  However, the method may be useful for updating counters and
-statistics when such updates are unrelated to the other
-happens-before orderings of a program. When a thread sees an update
-to an atomic variable caused by a <tt>weakCompareAndSet</tt>, it does
-not necessarily see updates to any <em>other</em> variables that
-occurred before the <tt>weakCompareAndSet</tt>.  This may be
-acceptable when, for example, updating performance statistics, but
-rarely otherwise.
-
-<p> The {@link java.util.concurrent.atomic.AtomicMarkableReference}
-class associates a single boolean with a reference. For example, this
-bit might be used inside a data structure to mean that the object
-being referenced has logically been deleted. The {@link
-java.util.concurrent.atomic.AtomicStampedReference} class associates
-an integer value with a reference. This may be used for example, to
-represent version numbers corresponding to series of updates.
-
-<p> Atomic classes are designed primarily as building blocks for
-implementing non-blocking data structures and related infrastructure
-classes.  The <tt>compareAndSet</tt> method is not a general
-replacement for locking. It applies only when critical updates for an
-object are confined to a <em>single</em> variable.
-
-<p> Atomic classes are not general purpose replacements for
-<tt>java.lang.Integer</tt> and related classes. They do <em>not</em>
-define methods such as <tt>hashCode</tt> and
-<tt>compareTo</tt>. (Because atomic variables are expected to be
-mutated, they are poor choices for hash table keys.)  Additionally,
-classes are provided only for those types that are commonly useful in
-intended applications. For example, there is no atomic class for
-representing <tt>byte</tt>. In those infrequent cases where you would
-like to do so, you can use an <tt>AtomicInteger</tt> to hold
-<tt>byte</tt> values, and cast appropriately. You can also hold floats
-using <tt>Float.floatToIntBits</tt> and <tt>Float.intBitstoFloat</tt>
-conversions, and doubles using <tt>Double.doubleToLongBits</tt> and
-<tt>Double.longBitsToDouble</tt> conversions.
-
-
-@since 1.5
-
-</body> </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/java/util/concurrent/locks/package-info.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,79 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+/**
+ * Interfaces and classes providing a framework for locking and waiting
+ * for conditions that is distinct from built-in synchronization and
+ * monitors.  The framework permits much greater flexibility in the use of
+ * locks and conditions, at the expense of more awkward syntax.
+ *
+ * <p>The {@link java.util.concurrent.locks.Lock} interface supports
+ * locking disciplines that differ in semantics (reentrant, fair, etc),
+ * and that can be used in non-block-structured contexts including
+ * hand-over-hand and lock reordering algorithms.  The main implementation
+ * is {@link java.util.concurrent.locks.ReentrantLock}.
+ *
+ * <p>The {@link java.util.concurrent.locks.ReadWriteLock} interface
+ * similarly defines locks that may be shared among readers but are
+ * exclusive to writers.  Only a single implementation, {@link
+ * java.util.concurrent.locks.ReentrantReadWriteLock}, is provided, since
+ * it covers most standard usage contexts.  But programmers may create
+ * their own implementations to cover nonstandard requirements.
+ *
+ * <p>The {@link java.util.concurrent.locks.Condition} interface
+ * describes condition variables that may be associated with Locks.
+ * These are similar in usage to the implicit monitors accessed using
+ * {@code Object.wait}, but offer extended capabilities.
+ * In particular, multiple {@code Condition} objects may be associated
+ * with a single {@code Lock}.  To avoid compatibility issues, the
+ * names of {@code Condition} methods are different from the
+ * corresponding {@code Object} versions.
+ *
+ * <p>The {@link java.util.concurrent.locks.AbstractQueuedSynchronizer}
+ * class serves as a useful superclass for defining locks and other
+ * synchronizers that rely on queuing blocked threads.  The {@link
+ * java.util.concurrent.locks.AbstractQueuedLongSynchronizer} class
+ * provides the same functionality but extends support to 64 bits of
+ * synchronization state.  Both extend class {@link
+ * java.util.concurrent.locks.AbstractOwnableSynchronizer}, a simple
+ * class that helps record the thread currently holding exclusive
+ * synchronization.  The {@link java.util.concurrent.locks.LockSupport}
+ * class provides lower-level blocking and unblocking support that is
+ * useful for those developers implementing their own customized lock
+ * classes.
+ *
+ * @since 1.5
+ */
+package java.util.concurrent.locks;
--- a/j2se/src/share/classes/java/util/concurrent/locks/package.html	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html> <head>
-<title>Locks</title>
-<!--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-
-This code is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License version 2 only, as
-published by the Free Software Foundation.  Sun designates this
-particular file as subject to the "Classpath" exception as provided
-by Sun in the LICENSE file that accompanied this code.
-
-This code 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
-version 2 for more details (a copy is included in the LICENSE file that
-accompanied this code).
-
-You should have received a copy of the GNU General Public License version
-2 along with this work; if not, write to the Free Software Foundation,
-Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-CA 95054 USA or visit www.sun.com if you need additional information or
-have any questions. 
-
---><!--
-
-This file is available under and governed by the GNU General Public
-License version 2 only, as published by the Free Software Foundation.
-However, the following notice accompanied the original version of this
-file:
-
-Written by Doug Lea with assistance from members of JCP JSR-166
-Expert Group and released to the public domain, as explained at
-http://creativecommons.org/licenses/publicdomain
--->
-</head>
-
-<body>
-
-Interfaces and classes providing a framework for locking and waiting
-for conditions that is distinct from built-in synchronization and
-monitors. The framework permits much greater flexibility in the use of
-locks and conditions, at the expense of more awkward syntax.
-
-<p> The {@link java.util.concurrent.locks.Lock} interface supports
-locking disciplines that differ in semantics (reentrant, fair, etc),
-and that can be used in non-block-structured contexts including
-hand-over-hand and lock reordering algorithms. The main implementation
-is {@link java.util.concurrent.locks.ReentrantLock}.
-
-<p> The {@link java.util.concurrent.locks.ReadWriteLock} interface
-similarly defines locks that may be shared among readers but are
-exclusive to writers.  Only a single implementation, {@link
-java.util.concurrent.locks.ReentrantReadWriteLock}, is provided, since
-it covers most standard usage contexts. But programmers may create
-their own implementations to cover nonstandard requirements.
-
-<p> The {@link java.util.concurrent.locks.Condition} interface
-describes condition variables that may be associated with Locks.
-These are similar in usage to the implicit monitors accessed using
-<tt>Object.wait</tt>, but offer extended capabilities.  In particular,
-multiple <tt>Condition</tt> objects may be associated with a single
-<tt>Lock</tt>.  To avoid compatibility issues, the names of
-<tt>Condition</tt> methods are different than the corresponding
-<tt>Object</tt> versions.
-
-<p> The {@link java.util.concurrent.locks.AbstractQueuedSynchronizer}
-class serves as a useful superclass for defining locks and other
-synchronizers that rely on queuing blocked threads.  The {@link
-java.util.concurrent.locks.AbstractQueuedLongSynchronizer} class
-provides the same functionality but extends support to 64 bits of
-synchronization state. Both extend class {@link
-java.util.concurrent.locks.AbstractOwnableSynchronizer}, a simple
-class that helps record the thread currently holding exclusive
-synchronization.  The {@link java.util.concurrent.locks.LockSupport}
-class provides lower-level blocking and unblocking support that is
-useful for those developers implementing their own customized lock
-classes.
-
-@since 1.5
-
-</body> </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/java/util/concurrent/package-info.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,272 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+/**
+ * Utility classes commonly useful in concurrent programming.  This
+ * package includes a few small standardized extensible frameworks, as
+ * well as some classes that provide useful functionality and are
+ * otherwise tedious or difficult to implement.  Here are brief
+ * descriptions of the main components.  See also the
+ * {@link java.util.concurrent.locks} and
+ * {@link java.util.concurrent.atomic} packages.
+ *
+ * <h2>Executors</h2>
+ *
+ * <b>Interfaces.</b>
+ *
+ * {@link java.util.concurrent.Executor} is a simple standardized
+ * interface for defining custom thread-like subsystems, including
+ * thread pools, asynchronous IO, and lightweight task frameworks.
+ * Depending on which concrete Executor class is being used, tasks may
+ * execute in a newly created thread, an existing task-execution thread,
+ * or the thread calling {@link java.util.concurrent.Executor#execute
+ * execute}, and may execute sequentially or concurrently.
+ *
+ * {@link java.util.concurrent.ExecutorService} provides a more
+ * complete asynchronous task execution framework.  An
+ * ExecutorService manages queuing and scheduling of tasks,
+ * and allows controlled shutdown.
+ *
+ * The {@link java.util.concurrent.ScheduledExecutorService}
+ * subinterface and associated interfaces add support for
+ * delayed and periodic task execution.  ExecutorServices
+ * provide methods arranging asynchronous execution of any
+ * function expressed as {@link java.util.concurrent.Callable},
+ * the result-bearing analog of {@link java.lang.Runnable}.
+ *
+ * A {@link java.util.concurrent.Future} returns the results of
+ * a function, allows determination of whether execution has
+ * completed, and provides a means to cancel execution.
+ *
+ * A {@link java.util.concurrent.RunnableFuture} is a {@code Future}
+ * that possesses a {@code run} method that upon execution,
+ * sets its results.
+ *
+ * <p>
+ *
+ * <b>Implementations.</b>
+ *
+ * Classes {@link java.util.concurrent.ThreadPoolExecutor} and
+ * {@link java.util.concurrent.ScheduledThreadPoolExecutor}
+ * provide tunable, flexible thread pools.
+ *
+ * The {@link java.util.concurrent.Executors} class provides
+ * factory methods for the most common kinds and configurations
+ * of Executors, as well as a few utility methods for using
+ * them.  Other utilities based on {@code Executors} include the
+ * concrete class {@link java.util.concurrent.FutureTask}
+ * providing a common extensible implementation of Futures, and
+ * {@link java.util.concurrent.ExecutorCompletionService}, that
+ * assists in coordinating the processing of groups of
+ * asynchronous tasks.
+ *
+ * <h2>Queues</h2>
+ *
+ * The {@link java.util.concurrent.ConcurrentLinkedQueue} class
+ * supplies an efficient scalable thread-safe non-blocking FIFO
+ * queue.
+ *
+ * <p>Five implementations in {@code java.util.concurrent} support
+ * the extended {@link java.util.concurrent.BlockingQueue}
+ * interface, that defines blocking versions of put and take:
+ * {@link java.util.concurrent.LinkedBlockingQueue},
+ * {@link java.util.concurrent.ArrayBlockingQueue},
+ * {@link java.util.concurrent.SynchronousQueue},
+ * {@link java.util.concurrent.PriorityBlockingQueue}, and
+ * {@link java.util.concurrent.DelayQueue}.
+ * The different classes cover the most common usage contexts
+ * for producer-consumer, messaging, parallel tasking, and
+ * related concurrent designs.
+ *
+ * <p>The {@link java.util.concurrent.BlockingDeque} interface
+ * extends {@code BlockingQueue} to support both FIFO and LIFO
+ * (stack-based) operations.
+ * Class {@link java.util.concurrent.LinkedBlockingDeque}
+ * provides an implementation.
+ *
+ * <h2>Timing</h2>
+ *
+ * The {@link java.util.concurrent.TimeUnit} class provides
+ * multiple granularities (including nanoseconds) for
+ * specifying and controlling time-out based operations.  Most
+ * classes in the package contain operations based on time-outs
+ * in addition to indefinite waits.  In all cases that
+ * time-outs are used, the time-out specifies the minimum time
+ * that the method should wait before indicating that it
+ * timed-out.  Implementations make a &quot;best effort&quot;
+ * to detect time-outs as soon as possible after they occur.
+ * However, an indefinite amount of time may elapse between a
+ * time-out being detected and a thread actually executing
+ * again after that time-out.  All methods that accept timeout
+ * parameters treat values less than or equal to zero to mean
+ * not to wait at all.  To wait "forever", you can use a value
+ * of {@code Long.MAX_VALUE}.
+ *
+ * <h2>Synchronizers</h2>
+ *
+ * Four classes aid common special-purpose synchronization idioms.
+ * {@link java.util.concurrent.Semaphore} is a classic concurrency tool.
+ * {@link java.util.concurrent.CountDownLatch} is a very simple yet very
+ * common utility for blocking until a given number of signals, events,
+ * or conditions hold.  A {@link java.util.concurrent.CyclicBarrier} is a
+ * resettable multiway synchronization point useful in some styles of
+ * parallel programming.  An {@link java.util.concurrent.Exchanger} allows
+ * two threads to exchange objects at a rendezvous point, and is useful
+ * in several pipeline designs.
+ *
+ * <h2>Concurrent Collections</h2>
+ *
+ * Besides Queues, this package supplies Collection implementations
+ * designed for use in multithreaded contexts:
+ * {@link java.util.concurrent.ConcurrentHashMap},
+ * {@link java.util.concurrent.ConcurrentSkipListMap},
+ * {@link java.util.concurrent.ConcurrentSkipListSet},
+ * {@link java.util.concurrent.CopyOnWriteArrayList}, and
+ * {@link java.util.concurrent.CopyOnWriteArraySet}.
+ * When many threads are expected to access a given collection, a
+ * {@code ConcurrentHashMap} is normally preferable to a synchronized
+ * {@code HashMap}, and a {@code ConcurrentSkipListMap} is normally
+ * preferable to a synchronized {@code TreeMap}.
+ * A {@code CopyOnWriteArrayList} is preferable to a synchronized
+ * {@code ArrayList} when the expected number of reads and traversals
+ * greatly outnumber the number of updates to a list.
+
+ * <p>The "Concurrent" prefix used with some classes in this package
+ * is a shorthand indicating several differences from similar
+ * "synchronized" classes.  For example {@code java.util.Hashtable} and
+ * {@code Collections.synchronizedMap(new HashMap())} are
+ * synchronized.  But {@link
+ * java.util.concurrent.ConcurrentHashMap} is "concurrent".  A
+ * concurrent collection is thread-safe, but not governed by a
+ * single exclusion lock.  In the particular case of
+ * ConcurrentHashMap, it safely permits any number of
+ * concurrent reads as well as a tunable number of concurrent
+ * writes.  "Synchronized" classes can be useful when you need
+ * to prevent all access to a collection via a single lock, at
+ * the expense of poorer scalability.  In other cases in which
+ * multiple threads are expected to access a common collection,
+ * "concurrent" versions are normally preferable.  And
+ * unsynchronized collections are preferable when either
+ * collections are unshared, or are accessible only when
+ * holding other locks.
+ *
+ * <p>Most concurrent Collection implementations (including most
+ * Queues) also differ from the usual java.util conventions in that
+ * their Iterators provide <em>weakly consistent</em> rather than
+ * fast-fail traversal.  A weakly consistent iterator is thread-safe,
+ * but does not necessarily freeze the collection while iterating, so
+ * it may (or may not) reflect any updates since the iterator was
+ * created.
+ *
+ * <h2><a name="MemoryVisibility">Memory Consistency Properties</a></h2>
+ *
+ * <a href="http://java.sun.com/docs/books/jls/third_edition/html/memory.html">
+ * Chapter 17 of the Java Language Specification</a> defines the
+ * <i>happens-before</i> relation on memory operations such as reads and
+ * writes of shared variables.  The results of a write by one thread are
+ * guaranteed to be visible to a read by another thread only if the write
+ * operation <i>happens-before</i> the read operation.  The
+ * {@code synchronized} and {@code volatile} constructs, as well as the
+ * {@code Thread.start()} and {@code Thread.join()} methods, can form
+ * <i>happens-before</i> relationships.  In particular:
+ *
+ * <ul>
+ *   <li>Each action in a thread <i>happens-before</i> every action in that
+ *   thread that comes later in the program's order.
+ *
+ *   <li>An unlock ({@code synchronized} block or method exit) of a
+ *   monitor <i>happens-before</i> every subsequent lock ({@code synchronized}
+ *   block or method entry) of that same monitor.  And because
+ *   the <i>happens-before</i> relation is transitive, all actions
+ *   of a thread prior to unlocking <i>happen-before</i> all actions
+ *   subsequent to any thread locking that monitor.
+ *
+ *   <li>A write to a {@code volatile} field <i>happens-before</i> every
+ *   subsequent read of that same field.  Writes and reads of
+ *   {@code volatile} fields have similar memory consistency effects
+ *   as entering and exiting monitors, but do <em>not</em> entail
+ *   mutual exclusion locking.
+ *
+ *   <li>A call to {@code start} on a thread <i>happens-before</i> any
+ *   action in the started thread.
+ *
+ *   <li>All actions in a thread <i>happen-before</i> any other thread
+ *   successfully returns from a {@code join} on that thread.
+ *
+ * </ul>
+ *
+ *
+ * The methods of all classes in {@code java.util.concurrent} and its
+ * subpackages extend these guarantees to higher-level
+ * synchronization.  In particular:
+ *
+ * <ul>
+ *
+ *   <li>Actions in a thread prior to placing an object into any concurrent
+ *   collection <i>happen-before</i> actions subsequent to the access or
+ *   removal of that element from the collection in another thread.
+ *
+ *   <li>Actions in a thread prior to the submission of a {@code Runnable}
+ *   to an {@code Executor} <i>happen-before</i> its execution begins.
+ *   Similarly for {@code Callables} submitted to an {@code ExecutorService}.
+ *
+ *   <li>Actions taken by the asynchronous computation represented by a
+ *   {@code Future} <i>happen-before</i> actions subsequent to the
+ *   retrieval of the result via {@code Future.get()} in another thread.
+ *
+ *   <li>Actions prior to "releasing" synchronizer methods such as
+ *   {@code Lock.unlock}, {@code Semaphore.release}, and
+ *   {@code CountDownLatch.countDown} <i>happen-before</i> actions
+ *   subsequent to a successful "acquiring" method such as
+ *   {@code Lock.lock}, {@code Semaphore.acquire},
+ *   {@code Condition.await}, and {@code CountDownLatch.await} on the
+ *   same synchronizer object in another thread.
+ *
+ *   <li>For each pair of threads that successfully exchange objects via
+ *   an {@code Exchanger}, actions prior to the {@code exchange()}
+ *   in each thread <i>happen-before</i> those subsequent to the
+ *   corresponding {@code exchange()} in another thread.
+ *
+ *   <li>Actions prior to calling {@code CyclicBarrier.await}
+ *   <i>happen-before</i> actions performed by the barrier action, and
+ *   actions performed by the barrier action <i>happen-before</i> actions
+ *   subsequent to a successful return from the corresponding {@code await}
+ *   in other threads.
+ *
+ * </ul>
+ *
+ * @since 1.5
+ */
+package java.util.concurrent;
--- a/j2se/src/share/classes/java/util/concurrent/package.html	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,256 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html> <head>
-<title>Concurrency Utilities</title>
-<!--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-
-This code is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License version 2 only, as
-published by the Free Software Foundation.  Sun designates this
-particular file as subject to the "Classpath" exception as provided
-by Sun in the LICENSE file that accompanied this code.
-
-This code 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
-version 2 for more details (a copy is included in the LICENSE file that
-accompanied this code).
-
-You should have received a copy of the GNU General Public License version
-2 along with this work; if not, write to the Free Software Foundation,
-Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-CA 95054 USA or visit www.sun.com if you need additional information or
-have any questions. 
-
---><!--
-
-This file is available under and governed by the GNU General Public
-License version 2 only, as published by the Free Software Foundation.
-However, the following notice accompanied the original version of this
-file:
-
-Written by Doug Lea with assistance from members of JCP JSR-166
-Expert Group and released to the public domain, as explained at
-http://creativecommons.org/licenses/publicdomain
--->
-</head>
-
-<body>
-
-<p> Utility classes commonly useful in concurrent programming.  This
-package includes a few small standardized extensible frameworks, as
-well as some classes that provide useful functionality and are
-otherwise tedious or difficult to implement.  Here are brief
-descriptions of the main components. See also the <tt>locks</tt> and
-<tt>atomic</tt> packages.
-
-<h2>Executors</h2>
-
-<b>Interfaces.</b> {@link java.util.concurrent.Executor} is a simple
-standardized interface for defining custom thread-like subsystems,
-including thread pools, asynchronous IO, and lightweight task
-frameworks.  Depending on which concrete Executor class is being used,
-tasks may execute in a newly created thread, an existing
-task-execution thread, or the thread calling <tt>execute()</tt>, and
-may execute sequentially or concurrently.  {@link
-java.util.concurrent.ExecutorService} provides a more complete
-asynchronous task execution framework.  An ExecutorService manages
-queuing and scheduling of tasks, and allows controlled shutdown.  The
-{@link java.util.concurrent.ScheduledExecutorService} subinterface
-and associated interfaces add support for delayed and periodic task execution.
-ExecutorServices provide methods arranging asynchronous execution of
-any function expressed as {@link java.util.concurrent.Callable}, the
-result-bearing analog of {@link java.lang.Runnable}.  A {@link
-java.util.concurrent.Future} returns the results of a function, allows
-determination of whether execution has completed, and provides a means to
-cancel execution.  A {@link java.util.concurrent.RunnableFuture} is
-a Future that possesses a <tt>run</tt> method that upon execution,
-sets its results.
-
-<p>
-
-<b>Implementations.</b> Classes {@link
-java.util.concurrent.ThreadPoolExecutor} and {@link
-java.util.concurrent.ScheduledThreadPoolExecutor} provide tunable,
-flexible thread pools. The {@link java.util.concurrent.Executors}
-class provides factory methods for the most common kinds and
-configurations of Executors, as well as a few utility methods for
-using them. Other utilities based on Executors include the concrete
-class {@link java.util.concurrent.FutureTask} providing a common
-extensible implementation of Futures, and {@link
-java.util.concurrent.ExecutorCompletionService}, that assists in
-coordinating the processing of groups of asynchronous tasks.
-
-<h2>Queues</h2>
-
-The java.util.concurrent {@link
-java.util.concurrent.ConcurrentLinkedQueue} class supplies an
-efficient scalable thread-safe non-blocking FIFO queue.  Five
-implementations in java.util.concurrent support the extended {@link
-java.util.concurrent.BlockingQueue} interface, that defines blocking
-versions of put and take: {@link
-java.util.concurrent.LinkedBlockingQueue}, {@link
-java.util.concurrent.ArrayBlockingQueue}, {@link
-java.util.concurrent.SynchronousQueue}, {@link
-java.util.concurrent.PriorityBlockingQueue}, and {@link
-java.util.concurrent.DelayQueue}. The different classes cover the most
-common usage contexts for producer-consumer, messaging, parallel
-tasking, and related concurrent designs. The {@link
-java.util.concurrent.BlockingDeque} interface extends
-<tt>BlockingQueue</tt> to support both FIFO and LIFO (stack-based)
-operations. Class {@link java.util.concurrent.LinkedBlockingDeque}
-provides an implementation.
-
-
-<h2>Timing</h2>
-
-The {@link java.util.concurrent.TimeUnit} class provides multiple
-granularities (including nanoseconds) for specifying and controlling
-time-out based operations.  Most classes in the package contain
-operations based on time-outs in addition to indefinite waits.  In all
-cases that time-outs are used, the time-out specifies the minimum time
-that the method should wait before indicating that it
-timed-out.  Implementations make a &quot;best effort&quot; to detect
-time-outs as soon as possible after they occur.  However, an indefinite
-amount of time may elapse between a time-out being detected and a
-thread actually executing again after that time-out.  All methods
-that accept timeout parameters treat values less than or equal to
-zero to mean not to wait at all.  To wait "forever", you can use
-a value of <tt>Long.MAX_VALUE</tt>.
-
-<h2>Synchronizers</h2>
-
-Four classes aid common special-purpose synchronization idioms.
-{@link java.util.concurrent.Semaphore} is a classic concurrency tool.
-{@link java.util.concurrent.CountDownLatch} is a very simple yet very
-common utility for blocking until a given number of signals, events,
-or conditions hold.  A {@link java.util.concurrent.CyclicBarrier} is a
-resettable multiway synchronization point useful in some styles of
-parallel programming. An {@link java.util.concurrent.Exchanger} allows
-two threads to exchange objects at a rendezvous point, and is useful
-in several pipeline designs.
-
-<h2>Concurrent Collections</h2>
-
-Besides Queues, this package supplies Collection implementations
-designed for use in multithreaded contexts:
-{@link java.util.concurrent.ConcurrentHashMap},
-{@link java.util.concurrent.ConcurrentSkipListMap},
-{@link java.util.concurrent.ConcurrentSkipListSet},
-{@link java.util.concurrent.CopyOnWriteArrayList}, and
-{@link java.util.concurrent.CopyOnWriteArraySet}.
-When many threads are expected to access a given collection,
-a <tt>ConcurrentHashMap</tt> is normally preferable to
-a synchronized <tt>HashMap</tt>, and a
-<tt>ConcurrentSkipListMap</tt> is normally preferable
-to a synchronized <tt>TreeMap</tt>. A
-<tt>CopyOnWriteArrayList</tt> is preferable to
-a synchronized <tt>ArrayList</tt> when the expected number of reads
-and traversals greatly outnumber the number of updates to a list.
-
-<p>The "Concurrent" prefix used with some classes in this package is a
-shorthand indicating several differences from similar "synchronized"
-classes. For example <tt>java.util.Hashtable</tt> and
-<tt>Collections.synchronizedMap(new HashMap())</tt> are
-synchronized. But {@link java.util.concurrent.ConcurrentHashMap} is
-"concurrent".  A concurrent collection is thread-safe, but not
-governed by a single exclusion lock. In the particular case of
-ConcurrentHashMap, it safely permits any number of concurrent reads as
-well as a tunable number of concurrent writes.  "Synchronized" classes
-can be useful when you need to prevent all access to a collection via
-a single lock, at the expense of poorer scalability. In other cases in
-which multiple threads are expected to access a common collection,
-"concurrent" versions are normally preferable. And unsynchronized
-collections are preferable when either collections are unshared, or
-are accessible only when holding other locks.
-
-<p> Most concurrent Collection implementations (including most Queues)
-also differ from the usual java.util conventions in that their Iterators
-provide <em>weakly consistent</em> rather than fast-fail traversal. A
-weakly consistent iterator is thread-safe, but does not necessarily
-freeze the collection while iterating, so it may (or may not) reflect
-any updates since the iterator was created.
-
-<a name="MemoryVisibility">
-<h2> Memory Consistency Properties </h2>
-
-<a href="http://java.sun.com/docs/books/jls/third_edition/html/memory.html">
-Chapter 17 of the Java Language Specification</a> defines the
-<i>happens-before</i> relation on memory operations such as reads and
-writes of shared variables.  The results of a write by one thread are
-guaranteed to be visible to a read by another thread only if the write
-operation <i>happens-before</i> the read operation.  The
-{@code synchronized} and {@code volatile} constructs, as well as the
-{@code Thread.start()} and {@code Thread.join()} methods, can form
-<i>happens-before</i> relationships. In particular:
-
-<ul>
-  <li>Each action in a thread <i>happens-before</i> every action in that
-  thread that comes later in the program's order.
-
-  <li>An unlock ({@code synchronized} block or method exit) of a
-  monitor <i>happens-before</i> every subsequent lock ({@code synchronized}
-  block or method entry) of that same monitor. And because
-  the <i>happens-before</i> relation is transitive, all actions
-  of a thread prior to unlocking <i>happen-before</i> all actions
-  subsequent to any thread locking that monitor.
-
-  <li>A write to a {@code volatile} field <i>happens-before</i> every
-  subsequent read of that same field. Writes and reads of
-  {@code volatile} fields have similar memory consistency effects
-  as entering and exiting monitors, but do <em>not</em> entail
-  mutual exclusion locking.
-
-  <li>A call to {@code start} on a thread <i>happens-before</i> any action in the
-  started thread.
-
-  <li>All actions in a thread <i>happen-before</i> any other thread
-  successfully returns from a {@code join} on that thread.
-
-</ul>
-
-
-The methods of all classes in {@code java.util.concurrent} and its
-subpackages extend these guarantees to higher-level
-synchronization. In particular:
-
-<ul>
-
-  <li>Actions in a thread prior to placing an object into any concurrent
-  collection <i>happen-before</i> actions subsequent to the access or
-  removal of that element from the collection in another thread.
-
-  <li>Actions in a thread prior to the submission of a {@code Runnable}
-  to an {@code Executor} <i>happen-before</i> its execution begins.
-  Similarly for {@code Callables} submitted to an {@code ExecutorService}.
-
-  <li>Actions taken by the asynchronous computation represented by a
-  {@code Future} <i>happen-before</i> actions subsequent to the
-  retrieval of the result via {@code Future.get()} in another thread.
-
-  <li>Actions prior to "releasing" synchronizer methods such as
-  {@code Lock.unlock}, {@code Semaphore.release}, and
-  {@code CountDownLatch.countDown} <i>happen-before</i> actions
-  subsequent to a successful "acquiring" method such as
-  {@code Lock.lock}, {@code Semaphore.acquire},
-  {@code Condition.await}, and {@code CountDownLatch.await} on the
-  same synchronizer object in another thread.
-
-  <li>For each pair of threads that successfully exchange objects via
-  an {@code Exchanger}, actions prior to the {@code exchange()}
-  in each thread <i>happen-before</i> those subsequent to the
-  corresponding {@code exchange()} in another thread.
-
-  <li>Actions prior to calling {@code CyclicBarrier.await}
-  <i>happen-before</i> actions performed by the barrier action, and
-  actions performed by the barrier action <i>happen-before</i> actions
-  subsequent to a successful return from the corresponding {@code await}
-  in other threads.
-
-</ul>
-
-@since 1.5
-
-</body> </html>
--- a/j2se/src/share/classes/java/util/logging/LogManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/util/logging/LogManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -141,7 +141,7 @@
  * <p> 
  * All methods on the LogManager object are multi-thread safe.
  *
- * @version 1.59, 05/05/07
+ * @version 1.60, 05/18/07
  * @since 1.4
 */
 
@@ -326,6 +326,21 @@
 	changes.removePropertyChangeListener(l);
     }
 
+    // Package-level method.
+    // Find or create a specified logger instance. If a logger has
+    // already been created with the given name it is returned.
+    // Otherwise a new logger instance is created and registered
+    // in the LogManager global namespace.
+    synchronized Logger demandLogger(String name) {
+	Logger result = getLogger(name);
+	if (result == null) {
+	    result = new Logger(name, null);
+	    addLogger(result);
+	    result = getLogger(name);
+	}
+	return result;
+    }
+
     // If logger.getUseParentHandlers() returns 'true' and any of the logger's
     // parents have levels or handlers defined, make sure they are instantiated.
     private void processParentHandlers(Logger logger, String name) {
@@ -341,7 +356,7 @@
                 getProperty(pname+".handlers") != null) {
                 // This pname has a level/handlers definition.
                 // Make sure it exists.
-                Logger.getLogger(pname);
+                demandLogger(pname);
             }
 	    ix = ix2+1;
 	}
--- a/j2se/src/share/classes/java/util/logging/Logger.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/java/util/logging/Logger.java	Fri Jun 22 00:46:43 2007 +0000
@@ -156,7 +156,7 @@
  * All the other logging methods are implemented as calls on this
  * log(LogRecord) method.
  *
- * @version 1.57, 05/09/07
+ * @version 1.58, 05/18/07
  * @since 1.4
  */
 
@@ -297,13 +297,7 @@
      */
     public static synchronized Logger getLogger(String name) {
 	LogManager manager = LogManager.getLogManager();
-	Logger result = manager.getLogger(name);
-	if (result == null) {
-	    result = new Logger(name, null);
-	    manager.addLogger(result);
-	    result = manager.getLogger(name);
-	}
-	return result;
+	return manager.demandLogger(name);
     }
 
     /**
@@ -338,14 +332,7 @@
      */
     public static synchronized Logger getLogger(String name, String resourceBundleName) {
 	LogManager manager = LogManager.getLogManager();
-	Logger result = manager.getLogger(name);
-	if (result == null) {
-	    // Create a new logger.
-	    // Note: we may get a MissingResourceException here.
-	    result = new Logger(name, resourceBundleName);
-	    manager.addLogger(result);
-	    result = manager.getLogger(name);
-	}
+	Logger result = manager.demandLogger(name);
 	if (result.resourceBundleName == null) {
 	    // Note: we may get a MissingResourceException here.
 	    result.setupResourceInfo(resourceBundleName);
--- a/j2se/src/share/classes/javax/imageio/plugins/jpeg/JPEGQTable.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/imageio/plugins/jpeg/JPEGQTable.java	Fri Jun 22 00:46:43 2007 +0000
@@ -198,12 +198,12 @@
     public String toString() {
         String ls = System.getProperty("line.separator", "\n");
         StringBuilder sb = new StringBuilder("JPEGQTable:"+ls);
-        for (int i=0; i<sb.length(); i++) {
+        for (int i=0; i < qTable.length; i++) {
             if (i % 8 == 0) {
                 sb.append('\t');
             }
-            sb.append(i);
-            sb.append(((i % 8) == 0) ? ls : ' ');
+            sb.append(qTable[i]);
+            sb.append(((i % 8) == 7) ? ls : ' ');
         }
         return sb.toString();
     }
--- a/j2se/src/share/classes/javax/management/remote/JMXConnectorFactory.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/management/remote/JMXConnectorFactory.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,19 +25,21 @@
 
 package javax.management.remote;
 
+import com.sun.jmx.mbeanserver.Util;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Iterator;
+import java.util.ServiceLoader;
 import java.util.StringTokenizer;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
 import com.sun.jmx.remote.util.ClassLogger;
 import com.sun.jmx.remote.util.EnvHelp;
-import com.sun.jmx.remote.util.Service;
+
 
 /**
  * <p>Factory to create JMX API connector clients.  There
@@ -298,23 +300,22 @@
     public static JMXConnector newJMXConnector(JMXServiceURL serviceURL,
                                                Map<String,?> environment)
             throws IOException {
+        Map<String, Object> envcopy;
         if (environment == null)
-            environment = new HashMap();
+            envcopy = new HashMap<String, Object>();
         else {
             EnvHelp.checkAttributes(environment);
-            environment = new HashMap(environment);
+            envcopy = new HashMap<String, Object>(environment);
         }
-        
-        final ClassLoader loader = resolveClassLoader(environment);
-        final Class targetInterface = JMXConnectorProvider.class;
+
+        final ClassLoader loader = resolveClassLoader(envcopy);
+        final Class<JMXConnectorProvider> targetInterface = JMXConnectorProvider.class;
         final String protocol = serviceURL.getProtocol();
         final String providerClassName = "ClientProvider";
-        
+
         JMXConnectorProvider provider =
-            (JMXConnectorProvider) getProvider(serviceURL, environment,
-                                               providerClassName,
-                                               targetInterface,
-                                               loader);
+            getProvider(serviceURL, envcopy, providerClassName,
+                        targetInterface, loader);
 
         IOException exception = null;
         if (provider == null) {
@@ -325,7 +326,7 @@
             if (loader != null) {
                 try {
                     JMXConnector connection =
-                        getConnectorAsService(loader, serviceURL, environment);
+                        getConnectorAsService(loader, serviceURL, envcopy);
                     if (connection != null)
                         return connection;
                 } catch (JMXProviderException e) {
@@ -334,7 +335,7 @@
                     exception = e;
                 }
             }
-            provider = (JMXConnectorProvider)
+            provider =
                 getProvider(protocol, PROTOCOL_PROVIDER_DEFAULT_PACKAGE,
                             JMXConnectorFactory.class.getClassLoader(),
                             providerClassName, targetInterface);
@@ -350,9 +351,9 @@
             }
         }
 
-        environment = Collections.unmodifiableMap(environment);
+        envcopy = Collections.unmodifiableMap(envcopy);
 
-        return provider.newJMXConnector(serviceURL, environment);
+        return provider.newJMXConnector(serviceURL, envcopy);
     }
 
     private static String resolvePkgs(Map env) throws JMXProviderException {
@@ -364,7 +365,7 @@
 
         if (pkgsObject == null)
             pkgsObject =
-                AccessController.doPrivileged(new PrivilegedAction() {
+                AccessController.doPrivileged(new PrivilegedAction<Object>() {
                     public Object run() {
                         return System.getProperty(PROTOCOL_PROVIDER_PACKAGES);
                     }
@@ -395,21 +396,22 @@
         return pkgs;
     }
 
-    static Object getProvider(JMXServiceURL serviceURL,
-                              Map environment, String providerClassName,
-                              Class targetInterface,
-                              ClassLoader loader)
+    static <T> T getProvider(JMXServiceURL serviceURL,
+                             Map<String, Object> environment,
+                             String providerClassName,
+                             Class<T> targetInterface,
+                             ClassLoader loader)
             throws IOException {
 
         final String protocol = serviceURL.getProtocol();
-        
+
         final String pkgs = resolvePkgs(environment);
 
-        Object instance = null;
-        
+        T instance = null;
+
         if (pkgs != null) {
             environment.put(PROTOCOL_PROVIDER_CLASS_LOADER, loader);
-            
+
             instance =
                 getProvider(protocol, pkgs, loader, providerClassName,
                             targetInterface);
@@ -417,31 +419,27 @@
 
         return instance;
     }
+
+    static <T> Iterator<T> getProviderIterator(final Class<T> providerClass,
+                                               final ClassLoader loader) {
+       ServiceLoader<T> serviceLoader =
+                ServiceLoader.load(providerClass,
+                loader);
+       return serviceLoader.iterator();
+    }
     
-    static Iterator getProviderIterator(final Class providerClass,
-                                        final ClassLoader loader) {
-        PrivilegedAction action = new PrivilegedAction() {
-                public Object run() {
-                    return Service.providers(providerClass, loader);
-                }
-            };
-        return (Iterator) AccessController.doPrivileged(action);
-    }
-
     private static JMXConnector getConnectorAsService(ClassLoader loader,
                                                       JMXServiceURL url,
-                                                      Map map)
+                                                      Map<String, ?> map)
         throws IOException {
-
-        Iterator providers = getProviderIterator(JMXConnectorProvider.class,
-                                                 loader);
-        JMXConnectorProvider provider = null;
+        
+        Iterator<JMXConnectorProvider> providers = 
+                getProviderIterator(JMXConnectorProvider.class, loader);
         JMXConnector connection = null;
         IOException exception = null;
-        while (providers.hasNext()) {
-            provider = (JMXConnectorProvider) providers.next();
+        while(providers.hasNext()) {
             try {
-                connection = provider.newJMXConnector(url, map);
+                connection = providers.next().newJMXConnector(url, map);
                 return connection;
             } catch (JMXProviderException e) {
                 throw e;
@@ -469,11 +467,11 @@
             throw exception;
     }
 
-    static Object getProvider(String protocol,
-                              String pkgs, 
+    static <T> T getProvider(String protocol,
+                              String pkgs,
                               ClassLoader loader,
                               String providerClassName,
-                              Class targetInterface)
+                              Class<T> targetInterface)
             throws IOException {
 
         StringTokenizer tokenizer = new StringTokenizer(pkgs, "|");
@@ -482,7 +480,7 @@
             String pkg = tokenizer.nextToken();
             String className = (pkg + "." + protocol2package(protocol) +
                                 "." + providerClassName);
-            Class providerClass;
+            Class<?> providerClass;
             try {
                 providerClass = Class.forName(className, true, loader);
             } catch (ClassNotFoundException e) {
@@ -498,8 +496,10 @@
                 throw new JMXProviderException(msg);
             }
 
+            // We have just proved that this cast is correct
+            Class<? extends T> providerClassT = Util.cast(providerClass);
             try {
-                return providerClass.newInstance();
+                return providerClassT.newInstance();
             } catch (Exception e) {
                 final String msg =
                     "Exception when instantiating provider [" + className +
@@ -523,14 +523,14 @@
                     "The ClassLoader supplied in the environment map using " +
                     "the " + PROTOCOL_PROVIDER_CLASS_LOADER +
                     " attribute is not an instance of java.lang.ClassLoader";
-                throw new IllegalArgumentException(msg); 
+                throw new IllegalArgumentException(msg);
             }
         }
 
         if (loader == null)
-            loader = (ClassLoader)
-                AccessController.doPrivileged(new PrivilegedAction() {
-                        public Object run() {
+            loader =
+                AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+                        public ClassLoader run() {
                             return
                                 Thread.currentThread().getContextClassLoader();
                         }
@@ -538,7 +538,7 @@
 
         return loader;
     }
-    
+
     private static String protocol2package(String protocol) {
         return protocol.replace('+', '.').replace('-', '_');
     }
--- a/j2se/src/share/classes/javax/management/remote/JMXConnectorServerFactory.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/management/remote/JMXConnectorServerFactory.java	Fri Jun 22 00:46:43 2007 +0000
@@ -35,6 +35,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.ServiceLoader;
 
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
@@ -210,15 +211,15 @@
                                     Map<String, ?> map,
                                     MBeanServer mbs)
         throws IOException {
-        Iterator providers = JMXConnectorFactory.getProviderIterator(
-            JMXConnectorServerProvider.class, loader);
-        JMXConnectorServerProvider provider = null;
+        Iterator<JMXConnectorServerProvider> providers = 
+                JMXConnectorFactory.
+                getProviderIterator(JMXConnectorServerProvider.class, loader);
+        
         JMXConnectorServer connection = null;
         IOException exception = null;
         while (providers.hasNext()) {
-            provider = (JMXConnectorServerProvider) providers.next();
             try {
-                connection = provider.newJMXConnectorServer(url, map, mbs);
+                connection = providers.next().newJMXConnectorServer(url, map, mbs);
                 return connection;
             } catch (JMXProviderException e) {
                 throw e;
@@ -296,17 +297,19 @@
             envcopy = new HashMap<String, Object>(environment);
         }
 
-        final Class targetInterface = JMXConnectorServerProvider.class;
+        final Class<JMXConnectorServerProvider> targetInterface =
+                JMXConnectorServerProvider.class;
         final ClassLoader loader = 
             JMXConnectorFactory.resolveClassLoader(envcopy);
         final String protocol = serviceURL.getProtocol();
         final String providerClassName = "ServerProvider";
         
         JMXConnectorServerProvider provider =
-            (JMXConnectorServerProvider)
-            JMXConnectorFactory.getProvider(serviceURL, envcopy,
+            JMXConnectorFactory.getProvider(serviceURL,
+                                            envcopy,
                                             providerClassName,
-                                            targetInterface, loader);
+                                            targetInterface,
+                                            loader);
 
         IOException exception = null;
         if (provider == null) {
@@ -329,7 +332,7 @@
                     exception = e;
                 }
             }
-            provider = (JMXConnectorServerProvider)
+            provider =
                 JMXConnectorFactory.getProvider(
                     protocol,
                     PROTOCOL_PROVIDER_DEFAULT_PACKAGE,
--- a/j2se/src/share/classes/javax/management/remote/rmi/RMIIIOPServerImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/management/remote/rmi/RMIIIOPServerImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -139,6 +139,9 @@
 
     @Override
     RMIConnection doNewClient(final Object credentials) throws IOException {
+        if (callerACC == null) {
+            throw new SecurityException("AccessControlContext cannot be null");
+        }
         try {
             return AccessController.doPrivileged(
                 new PrivilegedExceptionAction<RMIConnection>() {
--- a/j2se/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -76,8 +76,6 @@
      */
     public RMIServerImpl(Map<String,?> env) {
         this.env = (env == null) ? Collections.EMPTY_MAP : env;
-	if (logger.debugOn())
-	    logger.trace("RMIServerImpl","class="+this.getClass().getName());
     }
 
     void setRMIConnectorServer(RMIConnectorServer connServer)
--- a/j2se/src/share/classes/javax/print/ServiceUI.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/print/ServiceUI.java	Fri Jun 22 00:46:43 2007 +0000
@@ -216,11 +216,8 @@
 	GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
 	GraphicsDevice[] gs = ge.getScreenDevices();
 	for (int j=0; j<gs.length; j++) {
-	    GraphicsDevice gd = gs[j];
-	    GraphicsConfiguration[] gcs = gd.getConfigurations();
-	    for (int i=0; i<gcs.length; i++) {
-		gcBounds = gcBounds.union(gcs[i].getBounds());
-	    }
+            gcBounds =
+                gcBounds.union(gs[j].getDefaultConfiguration().getBounds());
 	}
 
 	// if portion of dialog is not within the gc boundary
--- a/j2se/src/share/classes/javax/swing/UIDefaults.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/swing/UIDefaults.java	Fri Jun 22 00:46:43 2007 +0000
@@ -68,7 +68,7 @@
  * Please see {@link java.beans.XMLEncoder}.
  *
  * @see UIManager
- * @version 1.69 05/05/07
+ * @version 1.70 05/10/07
  * @author Hans Muller
  */
 public class UIDefaults extends Hashtable<Object,Object>
@@ -301,8 +301,13 @@
             for (int i=resourceBundles.size()-1; i >= 0; i--) {
                 String bundleName = (String)resourceBundles.get(i);
                 try {
-                    ResourceBundle b = ResourceBundle.
-			getBundle(bundleName, l, CoreResourceBundleControl.getRBControlInstance());
+		    Control c = CoreResourceBundleControl.getRBControlInstance(bundleName);
+                    ResourceBundle b;
+		    if (c != null) {
+                        b = ResourceBundle.getBundle(bundleName, l, c);
+		    } else {
+                        b = ResourceBundle.getBundle(bundleName, l);
+		    }
                     Enumeration keys = b.getKeys();
 
                     while (keys.hasMoreElements()) {
--- a/j2se/src/share/classes/javax/xml/validation/SecuritySupport.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/xml/validation/SecuritySupport.java	Fri Jun 22 00:46:43 2007 +0000
@@ -106,7 +106,7 @@
                     if (cl == null) {
                         url = ClassLoader.getSystemResource(name);
                     } else {
-                        url = cl.getSystemResource(name);
+                        url = cl.getResource(name);
                     }
                     return url;
                 }
@@ -124,7 +124,7 @@
                     if (cl == null) {
                         enumeration = ClassLoader.getSystemResources(name);
                     } else {
-                        enumeration = cl.getSystemResources(name);
+                        enumeration = cl.getResources(name);
                     }
                     return enumeration;
                 }
--- a/j2se/src/share/classes/javax/xml/xpath/SecuritySupport.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/javax/xml/xpath/SecuritySupport.java	Fri Jun 22 00:46:43 2007 +0000
@@ -103,7 +103,7 @@
                     if (cl == null) {
                         url = ClassLoader.getSystemResource(name);
                     } else {
-                        url = cl.getSystemResource(name);
+                        url = cl.getResource(name);
                     }
                     return url;
                 }
@@ -121,7 +121,7 @@
                     if (cl == null) {
                         enumeration = ClassLoader.getSystemResources(name);
                     } else {
-                        enumeration = cl.getSystemResources(name);
+                        enumeration = cl.getResources(name);
                     }
                     return enumeration;
                 }
--- a/j2se/src/share/classes/sun/awt/AppContext.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/awt/AppContext.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
 
 package sun.awt;
 
-import java.awt.AWTEvent;
 import java.awt.EventQueue;
 import java.awt.Window;
 import java.awt.SystemTray;
@@ -33,15 +32,14 @@
 import java.awt.Toolkit;
 import java.awt.GraphicsEnvironment;
 import java.awt.event.InvocationEvent;
-import java.lang.ref.WeakReference;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.Collections;
 import java.util.HashMap;
-import java.util.Hashtable;
+import java.util.IdentityHashMap;
+import java.util.Map;
 import java.util.Set;
 import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Vector;
 import java.beans.PropertyChangeSupport;
 import java.beans.PropertyChangeListener;
 
@@ -126,7 +124,7 @@
  *
  * @author  Thomas Ball
  * @author  Fred Ecks
- * @version 1.45 05/05/07
+ * @version 1.47 05/28/07
  */
 public final class AppContext {
 
@@ -139,14 +137,14 @@
 
     /* A map of AppContexts, referenced by ThreadGroup.
      */
-    private static Hashtable threadGroup2appContext = null;
+    private static final Map<ThreadGroup, AppContext> threadGroup2appContext =
+            Collections.synchronizedMap(new IdentityHashMap<ThreadGroup, AppContext>());
 
     /**
      * Returns a set containing all <code>AppContext</code>s.
      */
-    public static Set getAppContexts() {
-        return ( threadGroup2appContext == null ? new HashSet() :
-                 new HashSet(((Hashtable)threadGroup2appContext.clone()).values()) );
+    public static Set<AppContext> getAppContexts() {
+        return new HashSet<AppContext>(threadGroup2appContext.values());
     }
 
     /* The main "system" AppContext, used by everything not otherwise
@@ -235,9 +233,6 @@
     AppContext(ThreadGroup threadGroup) {
         numAppContexts++;
 
-        if (threadGroup2appContext == null) {
-            threadGroup2appContext = new Hashtable(2, 0.2f);
-        }
         this.threadGroup = threadGroup;
         threadGroup2appContext.put(threadGroup, this);
 
@@ -290,8 +285,7 @@
             // when new AppContext objects are created.
             ThreadGroup currentThreadGroup = currentThread.getThreadGroup();
             ThreadGroup threadGroup = currentThreadGroup;
-            AppContext context =
-                          (AppContext)threadGroup2appContext.get(threadGroup);
+            AppContext context = threadGroup2appContext.get(threadGroup);
             while (context == null) {
                 threadGroup = threadGroup.getParent();
                 if (threadGroup == null) {
@@ -302,7 +296,7 @@
                     // under.
                     throw new RuntimeException("Invalid ThreadGroup");
                 }
-                context = (AppContext)threadGroup2appContext.get(threadGroup);
+                context = threadGroup2appContext.get(threadGroup);
             }
             // In case we did anything in the above while loop, we add
             // all the intermediate ThreadGroups to threadGroup2appContext
@@ -540,8 +534,7 @@
     }
 
     static void stopEventDispatchThreads() {
-        for (Iterator it = getAppContexts().iterator(); it.hasNext();) {
-            AppContext appContext = (AppContext)it.next();
+        for (AppContext appContext: getAppContexts()) {
             if (appContext.isDisposed()) {
                 continue;
             }
--- a/j2se/src/share/classes/sun/awt/ComponentAccessor.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/awt/ComponentAccessor.java	Fri Jun 22 00:46:43 2007 +0000
@@ -39,6 +39,9 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.logging.Logger;
+import java.util.logging.Level;
+
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
@@ -49,7 +52,7 @@
  * as we move away from native code to Pure-java peers we need this class. 
  *
  * @author Bino George
- * @version  1.26
+ * @version  1.27
  */
 
 
@@ -77,6 +80,11 @@
     private static Method methodGetCursorNoClientCode;
     private static Method methodLocationNoClientCode;
 
+    private static final Logger log = Logger.getLogger("sun.awt.ComponentAccessor");
+
+    private ComponentAccessor() {
+    }
+
     static {
         AccessController.doPrivileged( new PrivilegedAction() {
                 public Object run() {
@@ -133,16 +141,13 @@
                         methodLocationNoClientCode.setAccessible(true);
                     }
                     catch (NoSuchFieldException e) {
-                        System.out.println("Unable to create ComponentAccessor : ");
-                        e.printStackTrace(); 
+                        log.log(Level.FINE, "Unable to initialize ComponentAccessor", e);
                     }
                     catch (ClassNotFoundException e) {
-                        System.out.println("Unable to create ComponentAccessor : ");
-                        e.printStackTrace(); 
+                        log.log(Level.FINE, "Unable to initialize ComponentAccessor", e);
                     }
                     catch (NoSuchMethodException e) {
-                        System.out.println("Unable to create ComponentAccessor : ");
-                        e.printStackTrace(); 
+                        log.log(Level.FINE, "Unable to initialize ComponentAccessor", e);
                     }
                     // to please javac
                     return null;
@@ -157,7 +162,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
     }
     
@@ -168,7 +173,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
     }
 
@@ -179,7 +184,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
     }
     
@@ -190,7 +195,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
     }
 
@@ -204,7 +209,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
     }
 
@@ -214,7 +219,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return 0;
     }
@@ -225,7 +230,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return 0;
     }
@@ -236,7 +241,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return 0;
     }
@@ -247,7 +252,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return 0;
     }
@@ -258,7 +263,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return false;
     }
@@ -271,10 +276,10 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
 
         return parent;
@@ -288,10 +293,10 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
 
         return font;
@@ -307,10 +312,10 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
     }
 
@@ -322,10 +327,10 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
     }
 
@@ -336,7 +341,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
     }
 
@@ -348,7 +353,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return color;
     }
@@ -361,7 +366,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return color;
     }
@@ -372,7 +377,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
     }
 
@@ -384,7 +389,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return f;
     }
@@ -396,7 +401,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return peer;
     }
@@ -406,7 +411,7 @@
             fieldPeer.set(c, peer);
         } catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }            
     }
 
@@ -415,7 +420,7 @@
             return fieldIgnoreRepaint.getBoolean(comp);
         }
         catch (IllegalAccessException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
 
         return false;
@@ -426,10 +431,10 @@
             methodResetGC.invoke(c, (Object[]) null);
         }
         catch (IllegalAccessException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
     }
 
@@ -439,7 +444,7 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         return false;
     }
@@ -451,10 +456,10 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
         return enabled;
     }
@@ -467,10 +472,10 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
 
         return cursor;
@@ -484,10 +489,10 @@
         }
         catch (IllegalAccessException e)
         {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to access the Component object", e);
         }
         catch (InvocationTargetException e) {
-            e.printStackTrace();
+            log.log(Level.FINE, "Unable to invoke on the Component object", e);
         }
 
         return loc;
--- a/j2se/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,11 +24,15 @@
  */
 package sun.awt;
 
-import java.awt.event.*;
-import java.awt.*;
-import java.util.logging.*;
-import java.lang.reflect.*;
-import java.awt.peer.*;
+import java.awt.Component;
+import java.awt.KeyboardFocusManager;
+import java.awt.Window;
+
+import java.awt.peer.KeyboardFocusManagerPeer;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
 
 public class KeyboardFocusManagerPeerImpl implements KeyboardFocusManagerPeer {
     static native Window getNativeFocusedWindow();
@@ -38,9 +42,6 @@
     KeyboardFocusManagerPeerImpl(KeyboardFocusManager manager) {
     }
 
-    public void setCurrentFocusedWindow(Window win) {
-    }
-
     public Window getCurrentFocusedWindow() {
         return getNativeFocusedWindow();
     }
--- a/j2se/src/share/classes/sun/awt/SunToolkit.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/awt/SunToolkit.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1520,17 +1520,35 @@
     public static class InfiniteLoop extends RuntimeException {
     }
 
-    public static final int WAIT_TIME = 10000;
+    public static class IllegalThreadException extends RuntimeException {
+        public IllegalThreadException(String msg) {
+            super(msg);
+        }
+        public IllegalThreadException() {
+        }
+    }
+
+    public static final int DEFAULT_WAIT_TIME = 10000;
     private static final int MAX_ITERS = 20;
     private static final int MIN_ITERS = 0;
     private static final int MINIMAL_EDELAY = 0;
 
     /**
+     * Parameterless version of realsync which uses default timout (see DEFAUL_WAIT_TIME).
+     */
+    public void realSync() throws OperationTimedOut, InfiniteLoop {
+        realSync(DEFAULT_WAIT_TIME);
+    }
+
+    /**
      * Forces toolkit to synchronize with the native windowing
      * sub-system, flushing all pending work and waiting for all the
      * events to be processed.  This method guarantees that after
      * return no additional Java events will be generated, unless
-     * cause by user.
+     * cause by user. Obviously, the method cannot be used on the
+     * event dispatch thread (EDT). In case it nevertheless gets
+     * invoked on this thread, the method throws the
+     * IllegalThreadException runtime exception.
      *
      * <p> This method allows to write tests without explicit timeouts
      * or wait for some event.  Example:
@@ -1564,8 +1582,14 @@
      * serie of paint events, a serie of Java focus events, which then
      * generate a serie of paint events which then are processed -
      * three cycles, minimum.
+     *
+     * @param timeout the maximum time to wait in milliseconds, negative means "forever". 
      */
-    public void realSync() throws OperationTimedOut, InfiniteLoop {
+    public void realSync(final long timeout) throws OperationTimedOut, InfiniteLoop
+    {
+        if (EventQueue.isDispatchThread()) {
+            throw new IllegalThreadException("The SunToolkit.realSync() method cannot be used on the event dispatch thread (EDT).");
+        }
         int bigLoop = 0;
         do {
             // Let's do sync first
@@ -1578,10 +1602,10 @@
             // to dispatch.
             int iters = 0;
             while (iters < MIN_ITERS) {
-                syncNativeQueue();
+                syncNativeQueue(timeout);
                 iters++;
             }
-            while (syncNativeQueue() && iters < MAX_ITERS) {
+            while (syncNativeQueue(timeout) && iters < MAX_ITERS) {
                 iters++;
             }
             if (iters >= MAX_ITERS) {
@@ -1597,10 +1621,10 @@
             // waitForIdle, we may end up with full EventQueue
             iters = 0;
             while (iters < MIN_ITERS) {
-                waitForIdle();
+                waitForIdle(timeout);
                 iters++;
             }
-            while (waitForIdle() && iters < MAX_ITERS) {
+            while (waitForIdle(timeout) && iters < MAX_ITERS) {
                 iters++;
             }
             if (iters >= MAX_ITERS) {
@@ -1611,7 +1635,7 @@
             // Again, for Java events, it was simple to check for new Java
             // events by checking event queue, but what if Java events
             // resulted in native requests?  Therefor, check native events again.
-        } while ((syncNativeQueue() || waitForIdle()) && bigLoop < MAX_ITERS);
+        } while ((syncNativeQueue(timeout) || waitForIdle(timeout)) && bigLoop < MAX_ITERS);
     }
 
     /**
@@ -1622,7 +1646,7 @@
      * <code>true</code> if some events were processed,
      * <code>false</code> otherwise.
      */
-    protected abstract boolean syncNativeQueue();
+    protected abstract boolean syncNativeQueue(final long timeout);
 
     private boolean eventDispatched = false;
     private boolean queueEmpty = false;
@@ -1652,7 +1676,7 @@
      * Should return <code>true</code> if more processing is
      * necessary, <code>false</code> otherwise.
      */
-    protected boolean waitForIdle() {
+    protected final boolean waitForIdle(final long timeout) {
         flushPendingEvents();  
         boolean queueWasEmpty = isEQEmpty();
         queueEmpty = false;
@@ -1668,10 +1692,10 @@
                               // flush Java events again.
                               int iters = 0;
                               while (iters < MIN_ITERS) {
-                                  syncNativeQueue();
+                                  syncNativeQueue(timeout);
                                   iters++;
                               }
-                              while (syncNativeQueue() && iters < MAX_ITERS) {
+                              while (syncNativeQueue(timeout) && iters < MAX_ITERS) {
                                   iters++;
                               }
                               flushPendingEvents();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/awt/WindowAccessor.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *  
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *  
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *  
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.awt;
+
+import java.awt.Window;
+
+import java.lang.reflect.Field;
+
+import java.util.logging.Logger;
+import java.util.logging.Level;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+public class WindowAccessor {
+
+    private static Class windowClass;
+    private static Field fieldIsAutoRequestFocus;
+    private static Field fieldIsTrayIconWindow;
+
+    private static final Logger log = Logger.getLogger("sun.awt.WindowAccessor");
+
+    private WindowAccessor() {
+    }
+
+    static {
+        AccessController.doPrivileged( new PrivilegedAction() {
+                public Object run() {
+                    try {
+                        windowClass = Class.forName("java.awt.Window");
+                        fieldIsAutoRequestFocus = windowClass.getDeclaredField("autoRequestFocus");
+                        fieldIsAutoRequestFocus.setAccessible(true);
+                        fieldIsTrayIconWindow = windowClass.getDeclaredField("isTrayIconWindow");
+                        fieldIsTrayIconWindow.setAccessible(true);
+
+                    } catch (NoSuchFieldException e) {
+                        log.log(Level.FINE, "Unable to initialize WindowAccessor: ", e);
+                    } catch (ClassNotFoundException e) {
+                        log.log(Level.FINE, "Unable to initialize WindowAccessor: ", e);
+                    }
+                    return null;
+                }
+            });
+    }
+
+    public static boolean isAutoRequestFocus(Window w) {
+        try {
+            return fieldIsAutoRequestFocus.getBoolean(w);
+
+        } catch (IllegalAccessException e) {
+            log.log(Level.FINE, "Unable to access the Window object", e);
+        }
+        return true;
+    }
+
+    public static boolean isTrayIconWindow(Window w) {
+        try {
+            return fieldIsTrayIconWindow.getBoolean(w);
+
+        } catch (IllegalAccessException e) {
+            log.log(Level.FINE, "Unable to access the Window object", e);
+        }
+        return false;
+    }
+
+    public static void setTrayIconWindow(Window w, boolean isTrayIconWindow) {
+        try {
+            fieldIsTrayIconWindow.set(w, isTrayIconWindow);
+
+        } catch (IllegalAccessException e) {
+            log.log(Level.FINE, "Unable to access the Window object", e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/awt/geom/PathConsumer2D.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.awt.geom;
+
+public interface PathConsumer2D {
+    /**
+     * @see java.awt.geom.Path2D.Float.moveTo
+     */
+    public void moveTo(float x, float y);
+
+    /**
+     * @see java.awt.geom.Path2D.Float.lineTo
+     */
+    public void lineTo(float x, float y);
+
+    /**
+     * @see java.awt.geom.Path2D.Float.quadTo
+     */
+    public void quadTo(float x1, float y1,
+                       float x2, float y2);
+
+    /**
+     * @see java.awt.geom.Path2D.Float.curveTo
+     */
+    public void curveTo(float x1, float y1,
+                        float x2, float y2,
+                        float x3, float y3);
+
+    /**
+     * @see java.awt.geom.Path2D.Float.closePath
+     */
+    public void closePath();
+
+    /**
+     * Called after the last segment of the last subpath when the
+     * iteration of the path segments is completely done.  This
+     * method serves to trigger the end of path processing in the
+     * consumer that would normally be triggered when a
+     * {@link java.awt.geom.PathIterator PathIterator}
+     * returns {@code true} from its {@code done} method.
+     */
+    public void pathDone();
+
+    /**
+     * If a given PathConsumer performs all or most of its work
+     * natively then it can return a (non-zero) pointer to a
+     * native function vector that defines C functions for all
+     * of the above methods.
+     * The specific pointer it returns is a pointer to a
+     * PathConsumerVec structure as defined in the include file
+     * src/share/native/sun/java2d/pipe/PathConsumer2D.h
+     * @return a native pointer to a PathConsumerVec structure.
+     */
+    public long getNativeConsumer();
+}
--- a/j2se/src/share/classes/sun/awt/im/InputMethodManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/awt/im/InputMethodManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -46,11 +46,11 @@
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Locale;
+import java.util.ServiceLoader;
 import java.util.Vector;
 import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
 import sun.awt.InputMethodSupport;
-import sun.misc.Service;
 
 /**
  * <code>InputMethodManager</code> is an abstract class that manages the input
@@ -118,7 +118,7 @@
  * as above.</LI>
  * </UL>
  * 
- * @version 1.43 05/05/07
+ * @version 1.44 05/10/07
  * @see java.awt.im.spi.InputMethod
  * @see sun.awt.im.InputContext
  * @see sun.awt.im.InputMethodAdapter
@@ -255,7 +255,7 @@
      
     // locators for Java input methods
     private int javaInputMethodCount;         // number of Java input methods found
-    private Vector javaInputMethodLocatorList;
+    private Vector<InputMethodLocator> javaInputMethodLocatorList;
 
     // component that is requesting input method switch
     // must be Frame or Dialog
@@ -287,7 +287,7 @@
 	    // if we can't get a descriptor, we'll just have to do without native input methods
 	}
 
-	javaInputMethodLocatorList = new Vector();
+	javaInputMethodLocatorList = new Vector<InputMethodLocator>();
 	initializeInputMethodLocatorList();
     }
 
@@ -389,9 +389,8 @@
             try {
                 AccessController.doPrivileged(new PrivilegedExceptionAction() {
                     public Object run() {
-			Iterator ims = Service.installedProviders(InputMethodDescriptor.class);
-			while (ims.hasNext()) {
-			    InputMethodDescriptor descriptor = (InputMethodDescriptor) ims.next();
+			for (InputMethodDescriptor descriptor : 
+			    ServiceLoader.loadInstalled(InputMethodDescriptor.class)) {
 			    ClassLoader cl = descriptor.getClass().getClassLoader();
 			    javaInputMethodLocatorList.add(new InputMethodLocator(descriptor, cl, null));
 			}
@@ -443,7 +442,7 @@
 
         // Add menu items for other input methods
         for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-            InputMethodLocator locator = (InputMethodLocator) javaInputMethodLocatorList.get(i);
+            InputMethodLocator locator = javaInputMethodLocatorList.get(i);
             selectionMenu.addOneInputMethodToMenu(locator, currentSelection);
         }
 
@@ -480,7 +479,7 @@
 	    locator = hostAdapterLocator;
 	} else {
             for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-                InputMethodLocator candidate = (InputMethodLocator) javaInputMethodLocatorList.get(i);
+                InputMethodLocator candidate = javaInputMethodLocatorList.get(i);
                 String name = candidate.getActionCommandString();
                 if (name.equals(inputMethodName)) {
                     locator = candidate;
@@ -537,7 +536,7 @@
 	initializeInputMethodLocatorList();
 
         for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-            InputMethodLocator candidate = (InputMethodLocator) javaInputMethodLocatorList.get(i);
+            InputMethodLocator candidate = javaInputMethodLocatorList.get(i);
             if (candidate.isLocaleAvailable(locale)) {
                 return candidate.deriveLocator(locale);
             }
@@ -593,7 +592,7 @@
 	    }
 	    // look for Java input methods
             for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-                InputMethodLocator locator = (InputMethodLocator) javaInputMethodLocatorList.get(i);
+                InputMethodLocator locator = javaInputMethodLocatorList.get(i);
                 InputMethodDescriptor descriptor = locator.getDescriptor();
 		if (descriptor.getClass().getName().equals(descriptorName)) {
 		    advertised = getAdvertisedLocale(locator, locale);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/awt/util/IdentityArrayList.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,541 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.awt.util;
+
+import java.util.AbstractList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.List;
+import java.util.RandomAccess;
+
+/**
+ * Resizable-array implementation of the <tt>List</tt> interface.  Implements
+ * all optional list operations, and permits all elements, including
+ * <tt>null</tt>.  In addition to implementing the <tt>List</tt> interface,
+ * this class provides methods to manipulate the size of the array that is
+ * used internally to store the list.  (This class is roughly equivalent to
+ * <tt>Vector</tt>, except that it is unsynchronized.)<p>
+ *
+ * The <tt>size</tt>, <tt>isEmpty</tt>, <tt>get</tt>, <tt>set</tt>,
+ * <tt>iterator</tt>, and <tt>listIterator</tt> operations run in constant
+ * time.  The <tt>add</tt> operation runs in <i>amortized constant time</i>,
+ * that is, adding n elements requires O(n) time.  All of the other operations
+ * run in linear time (roughly speaking).  The constant factor is low compared
+ * to that for the <tt>LinkedList</tt> implementation.<p>
+ *
+ * Each <tt>IdentityArrayList</tt> instance has a <i>capacity</i>.  The capacity is
+ * the size of the array used to store the elements in the list.  It is always
+ * at least as large as the list size.  As elements are added to an IdentityArrayList,
+ * its capacity grows automatically.  The details of the growth policy are not
+ * specified beyond the fact that adding an element has constant amortized
+ * time cost.<p>
+ *
+ * An application can increase the capacity of an <tt>IdentityArrayList</tt> instance
+ * before adding a large number of elements using the <tt>ensureCapacity</tt>
+ * operation.  This may reduce the amount of incremental reallocation.
+ *
+ * <p><strong>Note that this implementation is not synchronized.</strong>
+ * If multiple threads access an <tt>IdentityArrayList</tt> instance concurrently,
+ * and at least one of the threads modifies the list structurally, it
+ * <i>must</i> be synchronized externally.  (A structural modification is
+ * any operation that adds or deletes one or more elements, or explicitly
+ * resizes the backing array; merely setting the value of an element is not
+ * a structural modification.)  This is typically accomplished by
+ * synchronizing on some object that naturally encapsulates the list.
+ *
+ * If no such object exists, the list should be "wrapped" using the
+ * {@link Collections#synchronizedList Collections.synchronizedList}
+ * method.  This is best done at creation time, to prevent accidental
+ * unsynchronized access to the list:<pre>
+ *   List list = Collections.synchronizedList(new IdentityArrayList(...));</pre>
+ *
+ * <p>The iterators returned by this class's <tt>iterator</tt> and
+ * <tt>listIterator</tt> methods are <i>fail-fast</i>: if the list is
+ * structurally modified at any time after the iterator is created, in any way
+ * except through the iterator's own <tt>remove</tt> or <tt>add</tt> methods,
+ * the iterator will throw a {@link ConcurrentModificationException}.  Thus, in
+ * the face of concurrent modification, the iterator fails quickly and cleanly,
+ * rather than risking arbitrary, non-deterministic behavior at an undetermined
+ * time in the future.<p>
+ *
+ * Note that the fail-fast behavior of an iterator cannot be guaranteed
+ * as it is, generally speaking, impossible to make any hard guarantees in the
+ * presence of unsynchronized concurrent modification.  Fail-fast iterators
+ * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
+ * Therefore, it would be wrong to write a program that depended on this
+ * exception for its correctness: <i>the fail-fast behavior of iterators
+ * should be used only to detect bugs.</i><p>
+ *
+ */
+
+public class IdentityArrayList<E> extends AbstractList<E>
+        implements List<E>, RandomAccess
+{
+    
+    /**
+     * The array buffer into which the elements of the IdentityArrayList are stored.
+     * The capacity of the IdentityArrayList is the length of this array buffer.
+     */
+    private transient Object[] elementData;
+    
+    /**
+     * The size of the IdentityArrayList (the number of elements it contains).
+     *
+     * @serial
+     */
+    private int size;
+    
+    /**
+     * Constructs an empty list with the specified initial capacity.
+     *
+     * @param   initialCapacity   the initial capacity of the list
+     * @exception IllegalArgumentException if the specified initial capacity
+     *            is negative
+     */
+    public IdentityArrayList(int initialCapacity) {
+        super();
+        if (initialCapacity < 0)
+            throw new IllegalArgumentException("Illegal Capacity: "+
+                    initialCapacity);
+        this.elementData = new Object[initialCapacity];
+    }
+    
+    /**
+     * Constructs an empty list with an initial capacity of ten.
+     */
+    public IdentityArrayList() {
+        this(10);
+    }
+    
+    /**
+     * Constructs a list containing the elements of the specified
+     * collection, in the order they are returned by the collection's
+     * iterator.
+     *
+     * @param c the collection whose elements are to be placed into this list
+     * @throws NullPointerException if the specified collection is null
+     */
+    public IdentityArrayList(Collection<? extends E> c) {
+        elementData = c.toArray();
+        size = elementData.length;
+        // c.toArray might (incorrectly) not return Object[] (see 6260652)
+        if (elementData.getClass() != Object[].class)
+            elementData = Arrays.copyOf(elementData, size, Object[].class);
+    }
+    
+    /**
+     * Trims the capacity of this <tt>IdentityArrayList</tt> instance to be the
+     * list's current size.  An application can use this operation to minimize
+     * the storage of an <tt>IdentityArrayList</tt> instance.
+     */
+    public void trimToSize() {
+        modCount++;
+        int oldCapacity = elementData.length;
+        if (size < oldCapacity) {
+            elementData = Arrays.copyOf(elementData, size);
+        }
+    }
+    
+    /**
+     * Increases the capacity of this <tt>IdentityArrayList</tt> instance, if
+     * necessary, to ensure that it can hold at least the number of elements
+     * specified by the minimum capacity argument.
+     *
+     * @param   minCapacity   the desired minimum capacity
+     */
+    public void ensureCapacity(int minCapacity) {
+        modCount++;
+        int oldCapacity = elementData.length;
+        if (minCapacity > oldCapacity) {
+            Object oldData[] = elementData;
+            int newCapacity = (oldCapacity * 3)/2 + 1;
+            if (newCapacity < minCapacity)
+                newCapacity = minCapacity;
+            // minCapacity is usually close to size, so this is a win:
+            elementData = Arrays.copyOf(elementData, newCapacity);
+        }
+    }
+    
+    /**
+     * Returns the number of elements in this list.
+     *
+     * @return the number of elements in this list
+     */
+    public int size() {
+        return size;
+    }
+    
+    /**
+     * Returns <tt>true</tt> if this list contains no elements.
+     *
+     * @return <tt>true</tt> if this list contains no elements
+     */
+    public boolean isEmpty() {
+        return size == 0;
+    }
+    
+    /**
+     * Returns <tt>true</tt> if this list contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this list contains
+     * at least one element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o == e)</tt>.
+     *
+     * @param o element whose presence in this list is to be tested
+     * @return <tt>true</tt> if this list contains the specified element
+     */
+    public boolean contains(Object o) {
+        return indexOf(o) >= 0;
+    }
+    
+    /**
+     * Returns the index of the first occurrence of the specified element
+     * in this list, or -1 if this list does not contain the element.
+     * More formally, returns the lowest index <tt>i</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o == get(i))</tt>,
+     * or -1 if there is no such index.
+     */
+    public int indexOf(Object o) {
+        for (int i = 0; i < size; i++) {
+            if (o == elementData[i]) {
+                return i;
+            }
+        }
+        return -1;
+    }
+    
+    /**
+     * Returns the index of the last occurrence of the specified element
+     * in this list, or -1 if this list does not contain the element.
+     * More formally, returns the highest index <tt>i</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o == get(i))</tt>,
+     * or -1 if there is no such index.
+     */
+    public int lastIndexOf(Object o) {
+        for (int i = size-1; i >= 0; i--) {
+            if (o == elementData[i]) {
+                return i;
+            }
+        }
+        return -1;
+    }
+    
+    /**
+     * Returns an array containing all of the elements in this list
+     * in proper sequence (from first to last element).
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this list.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this list in
+     *         proper sequence
+     */
+    public Object[] toArray() {
+        return Arrays.copyOf(elementData, size);
+    }
+    
+    /**
+     * Returns an array containing all of the elements in this list in proper
+     * sequence (from first to last element); the runtime type of the returned
+     * array is that of the specified array.  If the list fits in the
+     * specified array, it is returned therein.  Otherwise, a new array is
+     * allocated with the runtime type of the specified array and the size of
+     * this list.
+     *
+     * <p>If the list fits in the specified array with room to spare
+     * (i.e., the array has more elements than the list), the element in
+     * the array immediately following the end of the collection is set to
+     * <tt>null</tt>.  (This is useful in determining the length of the
+     * list <i>only</i> if the caller knows that the list does not contain
+     * any null elements.)
+     *
+     * @param a the array into which the elements of the list are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose.
+     * @return an array containing the elements of the list
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this list
+     * @throws NullPointerException if the specified array is null
+     */
+    public <T> T[] toArray(T[] a) {
+        if (a.length < size)
+            // Make a new array of a's runtime type, but my contents:
+            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
+        System.arraycopy(elementData, 0, a, 0, size);
+        if (a.length > size)
+            a[size] = null;
+        return a;
+    }
+    
+    // Positional Access Operations
+    
+    /**
+     * Returns the element at the specified position in this list.
+     *
+     * @param  index index of the element to return
+     * @return the element at the specified position in this list
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public E get(int index) {
+        rangeCheck(index);
+        
+        return (E) elementData[index];
+    }
+    
+    /**
+     * Replaces the element at the specified position in this list with
+     * the specified element.
+     *
+     * @param index index of the element to replace
+     * @param element element to be stored at the specified position
+     * @return the element previously at the specified position
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public E set(int index, E element) {
+        rangeCheck(index);
+        
+        E oldValue = (E) elementData[index];
+        elementData[index] = element;
+        return oldValue;
+    }
+    
+    /**
+     * Appends the specified element to the end of this list.
+     *
+     * @param e element to be appended to this list
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     */
+    public boolean add(E e) {
+        ensureCapacity(size + 1);  // Increments modCount!!
+        elementData[size++] = e;
+        return true;
+    }
+    
+    /**
+     * Inserts the specified element at the specified position in this
+     * list. Shifts the element currently at that position (if any) and
+     * any subsequent elements to the right (adds one to their indices).
+     *
+     * @param index index at which the specified element is to be inserted
+     * @param element element to be inserted
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public void add(int index, E element) {
+        rangeCheckForAdd(index);
+        
+        ensureCapacity(size+1);  // Increments modCount!!
+        System.arraycopy(elementData, index, elementData, index + 1,
+                size - index);
+        elementData[index] = element;
+        size++;
+    }
+    
+    /**
+     * Removes the element at the specified position in this list.
+     * Shifts any subsequent elements to the left (subtracts one from their
+     * indices).
+     *
+     * @param index the index of the element to be removed
+     * @return the element that was removed from the list
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public E remove(int index) {
+        rangeCheck(index);
+        
+        modCount++;
+        E oldValue = (E) elementData[index];
+        
+        int numMoved = size - index - 1;
+        if (numMoved > 0)
+            System.arraycopy(elementData, index+1, elementData, index,
+                    numMoved);
+        elementData[--size] = null; // Let gc do its work
+        
+        return oldValue;
+    }
+    
+    /**
+     * Removes the first occurrence of the specified element from this list,
+     * if it is present.  If the list does not contain the element, it is
+     * unchanged.  More formally, removes the element with the lowest index
+     * <tt>i</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o == get(i))</tt>
+     * (if such an element exists).  Returns <tt>true</tt> if this list
+     * contained the specified element (or equivalently, if this list
+     * changed as a result of the call).
+     *
+     * @param o element to be removed from this list, if present
+     * @return <tt>true</tt> if this list contained the specified element
+     */
+    public boolean remove(Object o) {
+        for (int index = 0; index < size; index++) {
+            if (o == elementData[index]) {
+                fastRemove(index);
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    /*
+     * Private remove method that skips bounds checking and does not
+     * return the value removed.
+     */
+    private void fastRemove(int index) {
+        modCount++;
+        int numMoved = size - index - 1;
+        if (numMoved > 0)
+            System.arraycopy(elementData, index+1, elementData, index,
+                    numMoved);
+        elementData[--size] = null; // Let gc do its work
+    }
+    
+    /**
+     * Removes all of the elements from this list.  The list will
+     * be empty after this call returns.
+     */
+    public void clear() {
+        modCount++;
+        
+        // Let gc do its work
+        for (int i = 0; i < size; i++)
+            elementData[i] = null;
+        
+        size = 0;
+    }
+    
+    /**
+     * Appends all of the elements in the specified collection to the end of
+     * this list, in the order that they are returned by the
+     * specified collection's Iterator.  The behavior of this operation is
+     * undefined if the specified collection is modified while the operation
+     * is in progress.  (This implies that the behavior of this call is
+     * undefined if the specified collection is this list, and this
+     * list is nonempty.)
+     *
+     * @param c collection containing elements to be added to this list
+     * @return <tt>true</tt> if this list changed as a result of the call
+     * @throws NullPointerException if the specified collection is null
+     */
+    public boolean addAll(Collection<? extends E> c) {
+        Object[] a = c.toArray();
+        int numNew = a.length;
+        ensureCapacity(size + numNew);  // Increments modCount
+        System.arraycopy(a, 0, elementData, size, numNew);
+        size += numNew;
+        return numNew != 0;
+    }
+    
+    /**
+     * Inserts all of the elements in the specified collection into this
+     * list, starting at the specified position.  Shifts the element
+     * currently at that position (if any) and any subsequent elements to
+     * the right (increases their indices).  The new elements will appear
+     * in the list in the order that they are returned by the
+     * specified collection's iterator.
+     *
+     * @param index index at which to insert the first element from the
+     *              specified collection
+     * @param c collection containing elements to be added to this list
+     * @return <tt>true</tt> if this list changed as a result of the call
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     * @throws NullPointerException if the specified collection is null
+     */
+    public boolean addAll(int index, Collection<? extends E> c) {
+        rangeCheckForAdd(index);
+        
+        Object[] a = c.toArray();
+        int numNew = a.length;
+        ensureCapacity(size + numNew);  // Increments modCount
+        
+        int numMoved = size - index;
+        if (numMoved > 0) {
+            System.arraycopy(elementData, index, elementData, index + numNew, numMoved);
+        }
+        
+        System.arraycopy(a, 0, elementData, index, numNew);
+        size += numNew;
+        return numNew != 0;
+    }
+    
+    /**
+     * Removes from this list all of the elements whose index is between
+     * <tt>fromIndex</tt>, inclusive, and <tt>toIndex</tt>, exclusive.
+     * Shifts any succeeding elements to the left (reduces their index).
+     * This call shortens the list by <tt>(toIndex - fromIndex)</tt> elements.
+     * (If <tt>toIndex==fromIndex</tt>, this operation has no effect.)
+     *
+     * @param fromIndex index of first element to be removed
+     * @param toIndex index after last element to be removed
+     * @throws IndexOutOfBoundsException if fromIndex or toIndex out of
+     *              range (fromIndex &lt; 0 || fromIndex &gt;= size() || toIndex
+     *              &gt; size() || toIndex &lt; fromIndex)
+     */
+    protected void removeRange(int fromIndex, int toIndex) {
+        modCount++;
+        int numMoved = size - toIndex;
+        System.arraycopy(elementData, toIndex, elementData, fromIndex,
+                numMoved);
+        
+        // Let gc do its work
+        int newSize = size - (toIndex-fromIndex);
+        while (size != newSize)
+            elementData[--size] = null;
+    }
+    
+    /**
+     * Checks if the given index is in range.  If not, throws an appropriate
+     * runtime exception.  This method does *not* check if the index is
+     * negative: It is always used immediately prior to an array access,
+     * which throws an ArrayIndexOutOfBoundsException if index is negative.
+     */
+    private void rangeCheck(int index) {
+        if (index >= size)
+            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+    }
+    
+    /**
+     * A version of rangeCheck used by add and addAll.
+     */
+    private void rangeCheckForAdd(int index) {
+        if (index > size || index < 0)
+            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
+    }
+    
+    /**
+     * Constructs an IndexOutOfBoundsException detail message.
+     * Of the many possible refactorings of the error handling code,
+     * this "outlining" performs best with both server and client VMs.
+     */
+    private String outOfBoundsMsg(int index) {
+        return "Index: "+index+", Size: "+size;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/awt/util/IdentityLinkedList.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,877 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *  
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *  
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *  
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *  
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.awt.util;
+
+import java.util.AbstractSequentialList;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.Deque;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+/**
+ * Linked list implementation of the <tt>List</tt> interface.  Implements all
+ * optional list operations, and permits all elements (including
+ * <tt>null</tt>).  In addition to implementing the <tt>List</tt> interface,
+ * the <tt>IdentityLinkedList</tt> class provides uniformly named methods to
+ * <tt>get</tt>, <tt>remove</tt> and <tt>insert</tt> an element at the
+ * beginning and end of the list.  These operations allow linked lists to be
+ * used as a stack, {@linkplain Queue queue}, or {@linkplain Deque
+ * double-ended queue}. <p>
+ *
+ * The class implements the <tt>Deque</tt> interface, providing
+ * first-in-first-out queue operations for <tt>add</tt>,
+ * <tt>poll</tt>, along with other stack and deque operations.<p>
+ *
+ * All of the operations perform as could be expected for a doubly-linked
+ * list.  Operations that index into the list will traverse the list from
+ * the beginning or the end, whichever is closer to the specified index.<p>
+ *
+ * <p><strong>Note that this implementation is not synchronized.</strong>
+ * If multiple threads access a linked list concurrently, and at least
+ * one of the threads modifies the list structurally, it <i>must</i> be
+ * synchronized externally.  (A structural modification is any operation
+ * that adds or deletes one or more elements; merely setting the value of
+ * an element is not a structural modification.)  This is typically
+ * accomplished by synchronizing on some object that naturally
+ * encapsulates the list.
+ *
+ * If no such object exists, the list should be "wrapped" using the
+ * {@link Collections#synchronizedList Collections.synchronizedList}
+ * method.  This is best done at creation time, to prevent accidental
+ * unsynchronized access to the list:<pre>
+ *   List list = Collections.synchronizedList(new IdentityLinkedList(...));</pre>
+ *
+ * <p>The iterators returned by this class's <tt>iterator</tt> and
+ * <tt>listIterator</tt> methods are <i>fail-fast</i>: if the list is
+ * structurally modified at any time after the iterator is created, in
+ * any way except through the Iterator's own <tt>remove</tt> or
+ * <tt>add</tt> methods, the iterator will throw a {@link
+ * ConcurrentModificationException}.  Thus, in the face of concurrent
+ * modification, the iterator fails quickly and cleanly, rather than
+ * risking arbitrary, non-deterministic behavior at an undetermined
+ * time in the future.
+ *
+ * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
+ * as it is, generally speaking, impossible to make any hard guarantees in the
+ * presence of unsynchronized concurrent modification.  Fail-fast iterators
+ * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
+ * Therefore, it would be wrong to write a program that depended on this
+ * exception for its correctness:   <i>the fail-fast behavior of iterators
+ * should be used only to detect bugs.</i>
+ */
+
+public class IdentityLinkedList<E>
+    extends AbstractSequentialList<E>
+    implements List<E>, Deque<E>
+{
+    private transient Entry<E> header = new Entry<E>(null, null, null);
+    private transient int size = 0;
+
+    /**
+     * Constructs an empty list.
+     */
+    public IdentityLinkedList() {
+        header.next = header.previous = header;
+    }
+
+    /**
+     * Constructs a list containing the elements of the specified
+     * collection, in the order they are returned by the collection's
+     * iterator.
+     *
+     * @param  c the collection whose elements are to be placed into this list
+     * @throws NullPointerException if the specified collection is null
+     */
+    public IdentityLinkedList(Collection<? extends E> c) {
+	this();
+	addAll(c);
+    }
+
+    /**
+     * Returns the first element in this list.
+     *
+     * @return the first element in this list
+     * @throws NoSuchElementException if this list is empty
+     */
+    public E getFirst() {
+	if (size==0)
+	    throw new NoSuchElementException();
+
+	return header.next.element;
+    }
+
+    /**
+     * Returns the last element in this list.
+     *
+     * @return the last element in this list
+     * @throws NoSuchElementException if this list is empty
+     */
+    public E getLast()  {
+	if (size==0)
+	    throw new NoSuchElementException();
+
+	return header.previous.element;
+    }
+
+    /**
+     * Removes and returns the first element from this list.
+     *
+     * @return the first element from this list
+     * @throws NoSuchElementException if this list is empty
+     */
+    public E removeFirst() {
+	return remove(header.next);
+    }
+
+    /**
+     * Removes and returns the last element from this list.
+     *
+     * @return the last element from this list
+     * @throws NoSuchElementException if this list is empty
+     */
+    public E removeLast() {
+	return remove(header.previous);
+    }
+
+    /**
+     * Inserts the specified element at the beginning of this list.
+     *
+     * @param e the element to add
+     */
+    public void addFirst(E e) {
+	addBefore(e, header.next);
+    }
+
+    /**
+     * Appends the specified element to the end of this list.
+     *
+     * <p>This method is equivalent to {@link #add}.
+     *
+     * @param e the element to add
+     */
+    public void addLast(E e) {
+	addBefore(e, header);
+    }
+
+    /**
+     * Returns <tt>true</tt> if this list contains the specified element.
+     * More formally, returns <tt>true</tt> if and only if this list contains
+     * at least one element <tt>e</tt> such that
+     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o == e)</tt>.
+     *
+     * @param o element whose presence in this list is to be tested
+     * @return <tt>true</tt> if this list contains the specified element
+     */
+    public boolean contains(Object o) {
+        return indexOf(o) != -1;
+    }
+
+    /**
+     * Returns the number of elements in this list.
+     *
+     * @return the number of elements in this list
+     */
+    public int size() {
+	return size;
+    }
+
+    /**
+     * Appends the specified element to the end of this list.
+     *
+     * <p>This method is equivalent to {@link #addLast}.
+     *
+     * @param e element to be appended to this list
+     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     */
+    public boolean add(E e) {
+	addBefore(e, header);
+        return true;
+    }
+
+    /**
+     * Removes the first occurrence of the specified element from this list,
+     * if it is present.  If this list does not contain the element, it is
+     * unchanged.  More formally, removes the element with the lowest index
+     * <tt>i</tt> such that <tt>get(i)==o</tt>
+     * (if such an element exists).  Returns <tt>true</tt> if this list
+     * contained the specified element (or equivalently, if this list
+     * changed as a result of the call).
+     *
+     * @param o element to be removed from this list, if present
+     * @return <tt>true</tt> if this list contained the specified element
+     */
+    public boolean remove(Object o) {
+        for (Entry<E> e = header.next; e != header; e = e.next) {
+            if (o == e.element) {
+                remove(e);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Appends all of the elements in the specified collection to the end of
+     * this list, in the order that they are returned by the specified
+     * collection's iterator.  The behavior of this operation is undefined if
+     * the specified collection is modified while the operation is in
+     * progress.  (Note that this will occur if the specified collection is
+     * this list, and it's nonempty.)
+     *
+     * @param c collection containing elements to be added to this list
+     * @return <tt>true</tt> if this list changed as a result of the call
+     * @throws NullPointerException if the specified collection is null
+     */
+    public boolean addAll(Collection<? extends E> c) {
+        return addAll(size, c);
+    }
+
+    /**
+     * Inserts all of the elements in the specified collection into this
+     * list, starting at the specified position.  Shifts the element
+     * currently at that position (if any) and any subsequent elements to
+     * the right (increases their indices).  The new elements will appear
+     * in the list in the order that they are returned by the
+     * specified collection's iterator.
+     *
+     * @param index index at which to insert the first element
+     *              from the specified collection
+     * @param c collection containing elements to be added to this list
+     * @return <tt>true</tt> if this list changed as a result of the call
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     * @throws NullPointerException if the specified collection is null
+     */
+    public boolean addAll(int index, Collection<? extends E> c) {
+        if (index < 0 || index > size)
+            throw new IndexOutOfBoundsException("Index: "+index+
+                                                ", Size: "+size);
+        Object[] a = c.toArray();
+        int numNew = a.length;
+        if (numNew==0)
+            return false;
+	modCount++;
+
+        Entry<E> successor = (index==size ? header : entry(index));
+        Entry<E> predecessor = successor.previous;
+	for (int i=0; i<numNew; i++) {
+            Entry<E> e = new Entry<E>((E)a[i], successor, predecessor);
+            predecessor.next = e;
+            predecessor = e;
+        }
+        successor.previous = predecessor;
+
+        size += numNew;
+        return true;
+    }
+
+    /**
+     * Removes all of the elements from this list.
+     */
+    public void clear() {
+        Entry<E> e = header.next;
+        while (e != header) {
+            Entry<E> next = e.next;
+            e.next = e.previous = null;
+            e.element = null;
+            e = next;
+        }
+        header.next = header.previous = header;
+        size = 0;
+	modCount++;
+    }
+
+
+    // Positional Access Operations
+
+    /**
+     * Returns the element at the specified position in this list.
+     *
+     * @param index index of the element to return
+     * @return the element at the specified position in this list
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public E get(int index) {
+        return entry(index).element;
+    }
+
+    /**
+     * Replaces the element at the specified position in this list with the
+     * specified element.
+     *
+     * @param index index of the element to replace
+     * @param element element to be stored at the specified position
+     * @return the element previously at the specified position
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public E set(int index, E element) {
+        Entry<E> e = entry(index);
+        E oldVal = e.element;
+        e.element = element;
+        return oldVal;
+    }
+
+    /**
+     * Inserts the specified element at the specified position in this list.
+     * Shifts the element currently at that position (if any) and any
+     * subsequent elements to the right (adds one to their indices).
+     *
+     * @param index index at which the specified element is to be inserted
+     * @param element element to be inserted
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public void add(int index, E element) {
+        addBefore(element, (index==size ? header : entry(index)));
+    }
+
+    /**
+     * Removes the element at the specified position in this list.  Shifts any
+     * subsequent elements to the left (subtracts one from their indices).
+     * Returns the element that was removed from the list.
+     *
+     * @param index the index of the element to be removed
+     * @return the element previously at the specified position
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     */
+    public E remove(int index) {
+        return remove(entry(index));
+    }
+
+    /**
+     * Returns the indexed entry.
+     */
+    private Entry<E> entry(int index) {
+        if (index < 0 || index >= size)
+            throw new IndexOutOfBoundsException("Index: "+index+
+                                                ", Size: "+size);
+        Entry<E> e = header;
+        if (index < (size >> 1)) {
+            for (int i = 0; i <= index; i++)
+                e = e.next;
+        } else {
+            for (int i = size; i > index; i--)
+                e = e.previous;
+        }
+        return e;
+    }
+
+
+    // Search Operations
+
+    /**
+     * Returns the index of the first occurrence of the specified element
+     * in this list, or -1 if this list does not contain the element.
+     * More formally, returns the lowest index <tt>i</tt> such that
+     * <tt>get(i)==o</tt>,
+     * or -1 if there is no such index.
+     *
+     * @param o element to search for
+     * @return the index of the first occurrence of the specified element in
+     *         this list, or -1 if this list does not contain the element
+     */
+    public int indexOf(Object o) {
+        int index = 0;
+        for (Entry e = header.next; e != header; e = e.next) {
+            if (o == e.element) {
+                return index;
+            }
+            index++;
+        }
+        return -1;
+    }
+
+    /**
+     * Returns the index of the last occurrence of the specified element
+     * in this list, or -1 if this list does not contain the element.
+     * More formally, returns the highest index <tt>i</tt> such that
+     * <tt>get(i)==o</tt>,
+     * or -1 if there is no such index.
+     *
+     * @param o element to search for
+     * @return the index of the last occurrence of the specified element in
+     *         this list, or -1 if this list does not contain the element
+     */
+    public int lastIndexOf(Object o) {
+        int index = size;
+        for (Entry e = header.previous; e != header; e = e.previous) {
+            index--;
+            if (o == e.element) {
+                return index;
+            }
+        }
+        return -1;
+    }
+
+    // Queue operations.
+
+    /**
+     * Retrieves, but does not remove, the head (first element) of this list.
+     * @return the head of this list, or <tt>null</tt> if this list is empty
+     * @since 1.5
+     */
+    public E peek() {
+        if (size==0)
+            return null;
+        return getFirst();
+    }
+
+    /**
+     * Retrieves, but does not remove, the head (first element) of this list.
+     * @return the head of this list
+     * @throws NoSuchElementException if this list is empty
+     * @since 1.5
+     */
+    public E element() {
+        return getFirst();
+    }
+
+    /**
+     * Retrieves and removes the head (first element) of this list
+     * @return the head of this list, or <tt>null</tt> if this list is empty
+     * @since 1.5
+     */
+    public E poll() {
+        if (size==0)
+            return null;
+        return removeFirst();
+    }
+
+    /**
+     * Retrieves and removes the head (first element) of this list.
+     *
+     * @return the head of this list
+     * @throws NoSuchElementException if this list is empty
+     * @since 1.5
+     */
+    public E remove() {
+        return removeFirst();
+    }
+
+    /**
+     * Adds the specified element as the tail (last element) of this list.
+     *
+     * @param e the element to add
+     * @return <tt>true</tt> (as specified by {@link Queue#offer})
+     * @since 1.5
+     */
+    public boolean offer(E e) {
+        return add(e);
+    }
+
+    // Deque operations
+    /**
+     * Inserts the specified element at the front of this list.
+     *
+     * @param e the element to insert
+     * @return <tt>true</tt> (as specified by {@link Deque#offerFirst})
+     * @since 1.6
+     */
+    public boolean offerFirst(E e) {
+        addFirst(e);
+        return true;
+    }
+
+    /**
+     * Inserts the specified element at the end of this list.
+     *
+     * @param e the element to insert
+     * @return <tt>true</tt> (as specified by {@link Deque#offerLast})
+     * @since 1.6
+     */
+    public boolean offerLast(E e) {
+        addLast(e);
+        return true;
+    }
+
+    /**
+     * Retrieves, but does not remove, the first element of this list,
+     * or returns <tt>null</tt> if this list is empty.
+     *
+     * @return the first element of this list, or <tt>null</tt>
+     *         if this list is empty
+     * @since 1.6
+     */
+    public E peekFirst() {
+        if (size==0)
+            return null;
+        return getFirst();
+    }
+
+    /**
+     * Retrieves, but does not remove, the last element of this list,
+     * or returns <tt>null</tt> if this list is empty.
+     *
+     * @return the last element of this list, or <tt>null</tt>
+     *         if this list is empty
+     * @since 1.6
+     */
+    public E peekLast() {
+        if (size==0)
+            return null;
+        return getLast();
+    }
+
+    /**
+     * Retrieves and removes the first element of this list,
+     * or returns <tt>null</tt> if this list is empty.
+     *
+     * @return the first element of this list, or <tt>null</tt> if
+     *     this list is empty
+     * @since 1.6
+     */
+    public E pollFirst() {
+        if (size==0)
+            return null;
+        return removeFirst();
+    }
+
+    /**
+     * Retrieves and removes the last element of this list,
+     * or returns <tt>null</tt> if this list is empty.
+     *
+     * @return the last element of this list, or <tt>null</tt> if
+     *     this list is empty
+     * @since 1.6
+     */
+    public E pollLast() {
+        if (size==0)
+            return null;
+        return removeLast();
+    }
+
+    /**
+     * Pushes an element onto the stack represented by this list.  In other
+     * words, inserts the element at the front of this list.
+     *
+     * <p>This method is equivalent to {@link #addFirst}.
+     *
+     * @param e the element to push
+     * @since 1.6
+     */
+    public void push(E e) {
+        addFirst(e);
+    }
+
+    /**
+     * Pops an element from the stack represented by this list.  In other
+     * words, removes and returns the first element of this list.
+     *
+     * <p>This method is equivalent to {@link #removeFirst()}.
+     *
+     * @return the element at the front of this list (which is the top
+     *         of the stack represented by this list)
+     * @throws NoSuchElementException if this list is empty
+     * @since 1.6
+     */
+    public E pop() {
+        return removeFirst();
+    }
+
+    /**
+     * Removes the first occurrence of the specified element in this
+     * list (when traversing the list from head to tail).  If the list
+     * does not contain the element, it is unchanged.
+     *
+     * @param o element to be removed from this list, if present
+     * @return <tt>true</tt> if the list contained the specified element
+     * @since 1.6
+     */
+    public boolean removeFirstOccurrence(Object o) {
+        return remove(o);
+    }
+
+    /**
+     * Removes the last occurrence of the specified element in this
+     * list (when traversing the list from head to tail).  If the list
+     * does not contain the element, it is unchanged.
+     *
+     * @param o element to be removed from this list, if present
+     * @return <tt>true</tt> if the list contained the specified element
+     * @since 1.6
+     */
+    public boolean removeLastOccurrence(Object o) {
+        for (Entry<E> e = header.previous; e != header; e = e.previous) {
+            if (o == e.element) {
+                remove(e);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns a list-iterator of the elements in this list (in proper
+     * sequence), starting at the specified position in the list.
+     * Obeys the general contract of <tt>List.listIterator(int)</tt>.<p>
+     *
+     * The list-iterator is <i>fail-fast</i>: if the list is structurally
+     * modified at any time after the Iterator is created, in any way except
+     * through the list-iterator's own <tt>remove</tt> or <tt>add</tt>
+     * methods, the list-iterator will throw a
+     * <tt>ConcurrentModificationException</tt>.  Thus, in the face of
+     * concurrent modification, the iterator fails quickly and cleanly, rather
+     * than risking arbitrary, non-deterministic behavior at an undetermined
+     * time in the future.
+     *
+     * @param index index of the first element to be returned from the
+     *              list-iterator (by a call to <tt>next</tt>)
+     * @return a ListIterator of the elements in this list (in proper
+     *         sequence), starting at the specified position in the list
+     * @throws IndexOutOfBoundsException {@inheritDoc}
+     * @see List#listIterator(int)
+     */
+    public ListIterator<E> listIterator(int index) {
+	return new ListItr(index);
+    }
+
+    private class ListItr implements ListIterator<E> {
+	private Entry<E> lastReturned = header;
+	private Entry<E> next;
+	private int nextIndex;
+	private int expectedModCount = modCount;
+
+	ListItr(int index) {
+	    if (index < 0 || index > size)
+		throw new IndexOutOfBoundsException("Index: "+index+
+						    ", Size: "+size);
+	    if (index < (size >> 1)) {
+		next = header.next;
+		for (nextIndex=0; nextIndex<index; nextIndex++)
+		    next = next.next;
+	    } else {
+		next = header;
+		for (nextIndex=size; nextIndex>index; nextIndex--)
+		    next = next.previous;
+	    }
+	}
+
+	public boolean hasNext() {
+	    return nextIndex != size;
+	}
+
+	public E next() {
+	    checkForComodification();
+	    if (nextIndex == size)
+		throw new NoSuchElementException();
+
+	    lastReturned = next;
+	    next = next.next;
+	    nextIndex++;
+	    return lastReturned.element;
+	}
+
+	public boolean hasPrevious() {
+	    return nextIndex != 0;
+	}
+
+	public E previous() {
+	    if (nextIndex == 0)
+		throw new NoSuchElementException();
+
+	    lastReturned = next = next.previous;
+	    nextIndex--;
+	    checkForComodification();
+	    return lastReturned.element;
+	}
+
+	public int nextIndex() {
+	    return nextIndex;
+	}
+
+	public int previousIndex() {
+	    return nextIndex-1;
+	}
+
+	public void remove() {
+            checkForComodification();
+            Entry<E> lastNext = lastReturned.next;
+            try {
+                IdentityLinkedList.this.remove(lastReturned);
+            } catch (NoSuchElementException e) {
+                throw new IllegalStateException();
+            }
+	    if (next==lastReturned)
+                next = lastNext;
+            else
+		nextIndex--;
+	    lastReturned = header;
+	    expectedModCount++;
+	}
+
+	public void set(E e) {
+	    if (lastReturned == header)
+		throw new IllegalStateException();
+	    checkForComodification();
+	    lastReturned.element = e;
+	}
+
+	public void add(E e) {
+	    checkForComodification();
+	    lastReturned = header;
+	    addBefore(e, next);
+	    nextIndex++;
+	    expectedModCount++;
+	}
+
+	final void checkForComodification() {
+	    if (modCount != expectedModCount)
+		throw new ConcurrentModificationException();
+	}
+    }
+
+    private static class Entry<E> {
+	E element;
+	Entry<E> next;
+	Entry<E> previous;
+
+	Entry(E element, Entry<E> next, Entry<E> previous) {
+	    this.element = element;
+	    this.next = next;
+	    this.previous = previous;
+	}
+    }
+
+    private Entry<E> addBefore(E e, Entry<E> entry) {
+	Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
+	newEntry.previous.next = newEntry;
+	newEntry.next.previous = newEntry;
+	size++;
+	modCount++;
+	return newEntry;
+    }
+
+    private E remove(Entry<E> e) {
+	if (e == header)
+	    throw new NoSuchElementException();
+
+        E result = e.element;
+	e.previous.next = e.next;
+	e.next.previous = e.previous;
+        e.next = e.previous = null;
+        e.element = null;
+	size--;
+	modCount++;
+        return result;
+    }
+
+    /**
+     * @since 1.6
+     */
+    public Iterator<E> descendingIterator() {
+        return new DescendingIterator();
+    }
+
+    /** Adapter to provide descending iterators via ListItr.previous */
+    private class DescendingIterator implements Iterator {
+        final ListItr itr = new ListItr(size());
+	public boolean hasNext() {
+	    return itr.hasPrevious();
+	}
+	public E next() {
+            return itr.previous();
+        }
+	public void remove() {
+            itr.remove();
+        }
+    }
+
+    /**
+     * Returns an array containing all of the elements in this list
+     * in proper sequence (from first to last element).
+     *
+     * <p>The returned array will be "safe" in that no references to it are
+     * maintained by this list.  (In other words, this method must allocate
+     * a new array).  The caller is thus free to modify the returned array.
+     *
+     * <p>This method acts as bridge between array-based and collection-based
+     * APIs.
+     *
+     * @return an array containing all of the elements in this list
+     *         in proper sequence
+     */
+    public Object[] toArray() {
+	Object[] result = new Object[size];
+        int i = 0;
+        for (Entry<E> e = header.next; e != header; e = e.next)
+            result[i++] = e.element;
+	return result;
+    }
+
+    /**
+     * Returns an array containing all of the elements in this list in
+     * proper sequence (from first to last element); the runtime type of
+     * the returned array is that of the specified array.  If the list fits
+     * in the specified array, it is returned therein.  Otherwise, a new
+     * array is allocated with the runtime type of the specified array and
+     * the size of this list.
+     *
+     * <p>If the list fits in the specified array with room to spare (i.e.,
+     * the array has more elements than the list), the element in the array
+     * immediately following the end of the list is set to <tt>null</tt>.
+     * (This is useful in determining the length of the list <i>only</i> if
+     * the caller knows that the list does not contain any null elements.)
+     *
+     * <p>Like the {@link #toArray()} method, this method acts as bridge between
+     * array-based and collection-based APIs.  Further, this method allows
+     * precise control over the runtime type of the output array, and may,
+     * under certain circumstances, be used to save allocation costs.
+     *
+     * <p>Suppose <tt>x</tt> is a list known to contain only strings.
+     * The following code can be used to dump the list into a newly
+     * allocated array of <tt>String</tt>:
+     *
+     * <pre>
+     *     String[] y = x.toArray(new String[0]);</pre>
+     *
+     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
+     * <tt>toArray()</tt>.
+     *
+     * @param a the array into which the elements of the list are to
+     *          be stored, if it is big enough; otherwise, a new array of the
+     *          same runtime type is allocated for this purpose.
+     * @return an array containing the elements of the list
+     * @throws ArrayStoreException if the runtime type of the specified array
+     *         is not a supertype of the runtime type of every element in
+     *         this list
+     * @throws NullPointerException if the specified array is null
+     */
+    public <T> T[] toArray(T[] a) {
+        if (a.length < size)
+            a = (T[])java.lang.reflect.Array.newInstance(
+                                a.getClass().getComponentType(), size);
+        int i = 0;
+	Object[] result = a;
+        for (Entry<E> e = header.next; e != header; e = e.next)
+            result[i++] = e.element;
+
+        if (a.length > size)
+            a[size] = null;
+
+        return a;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/dc/DuctusRenderingEngine.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,754 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.dc;
+
+import java.awt.Shape;
+import java.awt.BasicStroke;
+import java.awt.geom.Path2D;
+import java.awt.geom.PathIterator;
+import java.awt.geom.AffineTransform;
+
+import sun.awt.geom.PathConsumer2D;
+import sun.java2d.pipe.Region;
+import sun.java2d.pipe.AATileGenerator;
+import sun.java2d.pipe.RenderingEngine;
+
+import sun.dc.pr.Rasterizer;
+import sun.dc.pr.PathStroker;
+import sun.dc.pr.PathDasher;
+import sun.dc.pr.PRException;
+import sun.dc.path.PathConsumer;
+import sun.dc.path.PathException;
+import sun.dc.path.FastPathProducer;
+
+public class DuctusRenderingEngine extends RenderingEngine {
+    static final float PenUnits = 0.01f;
+    static final int MinPenUnits = 100;
+    static final int MinPenUnitsAA = 20;
+    static final float MinPenSizeAA = PenUnits * MinPenUnitsAA;
+
+    static final float UPPER_BND = Float.MAX_VALUE / 2.0f;
+    static final float LOWER_BND = -UPPER_BND;
+
+    private static final int RasterizerCaps[] = {
+	Rasterizer.BUTT, Rasterizer.ROUND, Rasterizer.SQUARE
+    };
+
+    private static final int RasterizerCorners[] = {
+	Rasterizer.MITER, Rasterizer.ROUND, Rasterizer.BEVEL
+    };
+
+    static float[] getTransformMatrix(AffineTransform transform) {
+	float matrix[] = new float[4];
+	double dmatrix[] = new double[6];
+	transform.getMatrix(dmatrix);
+	for (int i = 0; i < 4; i++) {
+	    matrix[i] = (float) dmatrix[i];
+	}
+	return matrix;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Shape createStrokedShape(Shape src,
+                                    float width,
+                                    int caps,
+                                    int join,
+                                    float miterlimit,
+                                    float dashes[],
+                                    float dashphase)
+    {
+	FillAdapter filler = new FillAdapter();
+	PathStroker stroker = new PathStroker(filler);
+	PathDasher dasher = null;
+
+	try {
+	    PathConsumer consumer;
+
+	    stroker.setPenDiameter(width);
+	    stroker.setPenT4(null);
+	    stroker.setCaps(RasterizerCaps[caps]);
+	    stroker.setCorners(RasterizerCorners[join], miterlimit);
+	    if (dashes != null) {
+		dasher = new PathDasher(stroker);
+		dasher.setDash(dashes, dashphase);
+		dasher.setDashT4(null);
+		consumer = dasher;
+	    } else {
+		consumer = stroker;
+	    }
+
+	    feedConsumer(consumer, src.getPathIterator(null));
+	} finally {
+	    stroker.dispose();
+	    if (dasher != null) {
+		dasher.dispose();
+	    }
+	}
+
+	return filler.getShape();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void strokeTo(Shape src,
+                         AffineTransform transform,
+                         BasicStroke bs,
+                         boolean thin,
+                         boolean normalize,
+                         boolean antialias,
+                         PathConsumer2D sr)
+    {
+	PathStroker stroker = new PathStroker(sr);
+	PathConsumer consumer = stroker;
+
+	float matrix[] = null;
+	if (!thin) {
+	    stroker.setPenDiameter(bs.getLineWidth());
+	    if (transform != null) {
+		matrix = getTransformMatrix(transform);
+	    }
+	    stroker.setPenT4(matrix);
+	    stroker.setPenFitting(PenUnits, MinPenUnits);
+	}
+	stroker.setCaps(RasterizerCaps[bs.getEndCap()]);
+	stroker.setCorners(RasterizerCorners[bs.getLineJoin()],
+			   bs.getMiterLimit());
+	float[] dashes = bs.getDashArray();
+	if (dashes != null) {
+	    PathDasher dasher = new PathDasher(stroker);
+	    dasher.setDash(dashes, bs.getDashPhase());
+	    if (transform != null && matrix == null) {
+		matrix = getTransformMatrix(transform);
+	    }
+	    dasher.setDashT4(matrix);
+	    consumer = dasher;
+	}
+
+        try {
+            PathIterator pi = src.getPathIterator(transform);
+
+            feedConsumer(pi, consumer, normalize, 0.25f);
+        } catch (PathException e) {
+            throw new InternalError("Unable to Stroke shape ("+
+                                    e.getMessage()+")");
+        } finally {
+            while (consumer != null && consumer != sr) {
+                PathConsumer next = consumer.getConsumer();
+                consumer.dispose();
+                consumer = next;
+            }
+        }
+    }
+
+    /*
+     * Feed a path from a PathIterator to a Ductus PathConsumer.
+     */
+    public static void feedConsumer(PathIterator pi, PathConsumer consumer,
+				    boolean normalize, float norm)
+	throws PathException
+    {
+	consumer.beginPath();
+	boolean pathClosed = false;
+        boolean skip = false;
+        boolean subpathStarted = false;
+	float mx = 0.0f;
+	float my = 0.0f;
+	float point[]  = new float[6];
+	float rnd = (0.5f - norm);
+	float ax = 0.0f;
+	float ay = 0.0f;
+
+	while (!pi.isDone()) {
+	    int type = pi.currentSegment(point);
+	    if (pathClosed == true) {
+		pathClosed = false;
+		if (type != PathIterator.SEG_MOVETO) {
+		    // Force current point back to last moveto point
+		    consumer.beginSubpath(mx, my);
+                    subpathStarted = true;
+		}
+	    }
+	    if (normalize) {
+		int index;
+		switch (type) {
+		case PathIterator.SEG_CUBICTO:
+		    index = 4;
+		    break;
+		case PathIterator.SEG_QUADTO:
+		    index = 2;
+		    break;
+		case PathIterator.SEG_MOVETO:
+		case PathIterator.SEG_LINETO:
+		    index = 0;
+		    break;
+		case PathIterator.SEG_CLOSE:
+		default:
+		    index = -1;
+		    break;
+		}
+		if (index >= 0) {
+		    float ox = point[index];
+		    float oy = point[index+1];
+		    float newax = (float) Math.floor(ox + rnd) + norm;
+		    float neway = (float) Math.floor(oy + rnd) + norm;
+		    point[index] = newax;
+		    point[index+1] = neway;
+		    newax -= ox;
+		    neway -= oy;
+		    switch (type) {
+		    case PathIterator.SEG_CUBICTO:
+			point[0] += ax;
+			point[1] += ay;
+			point[2] += newax;
+			point[3] += neway;
+			break;
+		    case PathIterator.SEG_QUADTO:
+			point[0] += (newax + ax) / 2;
+			point[1] += (neway + ay) / 2;
+			break;
+		    case PathIterator.SEG_MOVETO:
+		    case PathIterator.SEG_LINETO:
+		    case PathIterator.SEG_CLOSE:
+			break;
+		    }
+		    ax = newax;
+		    ay = neway;
+		}
+	    }
+	    switch (type) {
+	    case PathIterator.SEG_MOVETO:
+
+                /* Checking SEG_MOVETO coordinates if they are out of the 
+                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
+                 * and Infinity values. Skipping next path segment in case of 
+                 * invalid data.
+                 */
+                if (point[0] < UPPER_BND && point[0] > LOWER_BND && 
+                    point[1] < UPPER_BND && point[1] > LOWER_BND) 
+                {
+                    mx = point[0];
+                    my = point[1];
+		    consumer.beginSubpath(mx, my);
+                    subpathStarted = true;
+                    skip = false;
+                } else {
+                    skip = true;
+                }
+		break;
+	    case PathIterator.SEG_LINETO:
+                /* Checking SEG_LINETO coordinates if they are out of the 
+                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
+                 * and Infinity values. Ignoring current path segment in case  
+                 * of invalid data. If segment is skipped its endpoint 
+                 * (if valid) is used to begin new subpath. 
+                 */
+                if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
+                    point[1] < UPPER_BND && point[1] > LOWER_BND) 
+                {
+                    if (skip) {
+                        consumer.beginSubpath(point[0], point[1]);
+                        subpathStarted = true;
+                        skip = false;
+                    } else {
+                        consumer.appendLine(point[0], point[1]);
+                    }
+                } 
+		break;
+	    case PathIterator.SEG_QUADTO:
+		// Quadratic curves take two points
+                
+                /* Checking SEG_QUADTO coordinates if they are out of the 
+                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
+                 * and Infinity values. Ignoring current path segment in case  
+                 * of invalid endpoints's data. Equivalent to the SEG_LINETO
+                 * if endpoint coordinates are valid but there are invalid data
+                 * amoung other coordinates
+                 */
+                if (point[2] < UPPER_BND && point[2] > LOWER_BND &&
+                    point[3] < UPPER_BND && point[3] > LOWER_BND) 
+                {
+                    if (skip) {
+                        consumer.beginSubpath(point[2], point[3]);
+                        subpathStarted = true;
+                        skip = false;
+                    } else {
+                        if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
+                            point[1] < UPPER_BND && point[1] > LOWER_BND) 
+                        {
+                            consumer.appendQuadratic(point[0], point[1],
+                                                     point[2], point[3]);
+                        } else {
+                            consumer.appendLine(point[2], point[3]);
+                        }
+                    }
+                } 
+		break;
+	    case PathIterator.SEG_CUBICTO:
+		// Cubic curves take three points
+                
+                /* Checking SEG_CUBICTO coordinates if they are out of the 
+                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
+                 * and Infinity values. Ignoring current path segment in case  
+                 * of invalid endpoints's data. Equivalent to the SEG_LINETO
+                 * if endpoint coordinates are valid but there are invalid data
+                 * amoung other coordinates
+                 */
+                if (point[4] < UPPER_BND && point[4] > LOWER_BND &&
+                    point[5] < UPPER_BND && point[5] > LOWER_BND) 
+                {
+                    if (skip) {
+                        consumer.beginSubpath(point[4], point[5]);
+                        subpathStarted = true;
+                        skip = false;
+                    } else {
+                        if (point[0] < UPPER_BND && point[0] > LOWER_BND && 
+                            point[1] < UPPER_BND && point[1] > LOWER_BND &&
+                            point[2] < UPPER_BND && point[2] > LOWER_BND &&
+                            point[3] < UPPER_BND && point[3] > LOWER_BND) 
+                        {
+                            consumer.appendCubic(point[0], point[1],
+                                                 point[2], point[3],
+                                                 point[4], point[5]);
+                        } else {
+                            consumer.appendLine(point[4], point[5]);
+                        }
+                    }
+                }
+		break;
+	    case PathIterator.SEG_CLOSE:
+                if (subpathStarted) {
+                    consumer.closedSubpath();
+                    subpathStarted = false;
+		    pathClosed = true;
+                }
+		break;
+	    }
+	    pi.next();
+	}
+
+	consumer.endPath();
+    }
+
+    private static Rasterizer theRasterizer;
+
+    public synchronized static Rasterizer getRasterizer() {
+	Rasterizer r = theRasterizer;
+	if (r == null) {
+	    r = new Rasterizer();
+	} else {
+	    theRasterizer = null;
+	}
+	return r;
+    }
+
+    public synchronized static void dropRasterizer(Rasterizer r) {
+	r.reset();
+	theRasterizer = r;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public float getMinimumAAPenSize() {
+        return MinPenSizeAA;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public AATileGenerator getAATileGenerator(Shape s,
+                                              AffineTransform at,
+                                              Region clip,
+                                              BasicStroke bs,
+                                              boolean thin,
+                                              boolean normalize,
+                                              int bbox[])
+    {
+	Rasterizer r = getRasterizer();
+        PathIterator pi = s.getPathIterator(at);
+
+        if (bs != null) {
+	    float matrix[] = null;
+            r.setUsage(Rasterizer.STROKE);
+	    if (thin) {
+		r.setPenDiameter(MinPenSizeAA);
+	    } else {
+		r.setPenDiameter(bs.getLineWidth());
+		if (at != null) {
+		    matrix = getTransformMatrix(at);
+		    r.setPenT4(matrix);
+		}
+		r.setPenFitting(PenUnits, MinPenUnitsAA);
+	    }
+	    r.setCaps(RasterizerCaps[bs.getEndCap()]);
+	    r.setCorners(RasterizerCorners[bs.getLineJoin()],
+			 bs.getMiterLimit());
+	    float[] dashes = bs.getDashArray();
+	    if (dashes != null) {
+		r.setDash(dashes, bs.getDashPhase());
+		if (at != null && matrix == null) {
+		    matrix = getTransformMatrix(at);
+		}
+		r.setDashT4(matrix);
+	    }
+        } else {
+            r.setUsage(pi.getWindingRule() == PathIterator.WIND_EVEN_ODD
+                       ? Rasterizer.EOFILL
+                       : Rasterizer.NZFILL);
+        }
+
+	r.beginPath();
+	{
+            boolean pathClosed = false;
+            boolean skip = false;
+            boolean subpathStarted = false;
+            float mx = 0.0f;
+            float my = 0.0f;
+            float point[]  = new float[6];
+	    float ax = 0.0f;
+	    float ay = 0.0f;
+
+	    while (!pi.isDone()) {
+		int type = pi.currentSegment(point);
+                if (pathClosed == true) {
+                    pathClosed = false;
+                    if (type != PathIterator.SEG_MOVETO) {
+                        // Force current point back to last moveto point
+                        r.beginSubpath(mx, my);
+                        subpathStarted = true;
+                    }
+                }
+		if (normalize) {
+		    int index;
+		    switch (type) {
+		    case PathIterator.SEG_CUBICTO:
+			index = 4;
+			break;
+		    case PathIterator.SEG_QUADTO:
+			index = 2;
+			break;
+		    case PathIterator.SEG_MOVETO:
+		    case PathIterator.SEG_LINETO:
+			index = 0;
+			break;
+		    case PathIterator.SEG_CLOSE:
+		    default:
+			index = -1;
+			break;
+		    }
+		    if (index >= 0) {
+			float ox = point[index];
+			float oy = point[index+1];
+			float newax = (float) Math.floor(ox) + 0.5f;
+			float neway = (float) Math.floor(oy) + 0.5f;
+			point[index] = newax;
+			point[index+1] = neway;
+			newax -= ox;
+			neway -= oy;
+			switch (type) {
+			case PathIterator.SEG_CUBICTO:
+			    point[0] += ax;
+			    point[1] += ay;
+			    point[2] += newax;
+			    point[3] += neway;
+			    break;
+			case PathIterator.SEG_QUADTO:
+			    point[0] += (newax + ax) / 2;
+			    point[1] += (neway + ay) / 2;
+			    break;
+			case PathIterator.SEG_MOVETO:
+			case PathIterator.SEG_LINETO:
+			case PathIterator.SEG_CLOSE:
+			    break;
+			}
+			ax = newax;
+			ay = neway;
+		    }
+		}
+		switch (type) {
+		case PathIterator.SEG_MOVETO:
+
+                   /* Checking SEG_MOVETO coordinates if they are out of the 
+                    * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
+                    * and Infinity values. Skipping next path segment in case 
+                    * of invalid data.
+                    */
+ 
+                    if (point[0] < UPPER_BND &&  point[0] > LOWER_BND && 
+                        point[1] < UPPER_BND &&  point[1] > LOWER_BND) 
+                    {
+                        mx = point[0];
+                        my = point[1];
+		        r.beginSubpath(mx, my);
+                        subpathStarted = true;
+                        skip = false;
+                    } else {
+                        skip = true;
+                    }
+		    break;
+
+		case PathIterator.SEG_LINETO:
+                    /* Checking SEG_LINETO coordinates if they are out of the 
+                     * [LOWER_BND, UPPER_BND] range. This check also handles 
+                     * NaN and Infinity values. Ignoring current path segment 
+                     * in case of invalid data. If segment is skipped its 
+                     * endpoint (if valid) is used to begin new subpath. 
+                     */
+                    if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
+                        point[1] < UPPER_BND && point[1] > LOWER_BND) 
+                    {
+                        if (skip) {
+                            r.beginSubpath(point[0], point[1]);
+                            subpathStarted = true;
+                            skip = false;
+                        } else {
+                            r.appendLine(point[0], point[1]);
+                        }
+                    }
+		    break;
+
+		case PathIterator.SEG_QUADTO:
+                    // Quadratic curves take two points
+                    
+                    /* Checking SEG_QUADTO coordinates if they are out of the 
+                     * [LOWER_BND, UPPER_BND] range. This check also handles 
+                     * NaN and Infinity values. Ignoring current path segment  
+                     * in case of invalid endpoints's data. Equivalent to the 
+                     * SEG_LINETO if endpoint coordinates are valid but there 
+                     * are invalid data amoung other coordinates
+                     */
+                    if (point[2] < UPPER_BND && point[2] > LOWER_BND &&
+                        point[3] < UPPER_BND && point[3] > LOWER_BND) 
+                    {
+                        if (skip) {
+                            r.beginSubpath(point[2], point[3]);
+                            subpathStarted = true;
+                            skip = false;
+                        } else {
+                            if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
+                                point[1] < UPPER_BND && point[1] > LOWER_BND) 
+                            {
+                                r.appendQuadratic(point[0], point[1],
+                                                  point[2], point[3]);
+                            } else {
+                                r.appendLine(point[2], point[3]);
+                            }
+                        }
+                    }
+		    break;
+		case PathIterator.SEG_CUBICTO:
+                    // Cubic curves take three points
+                    
+                    /* Checking SEG_CUBICTO coordinates if they are out of the 
+                     * [LOWER_BND, UPPER_BND] range. This check also handles 
+                     * NaN and Infinity values. Ignoring  current path segment 
+                     * in case of invalid endpoints's data. Equivalent to the 
+                     * SEG_LINETO if endpoint coordinates are valid but there 
+                     * are invalid data amoung other coordinates
+                     */
+
+                    if (point[4] < UPPER_BND && point[4] > LOWER_BND &&
+                        point[5] < UPPER_BND && point[5] > LOWER_BND) 
+                    {
+                        if (skip) {
+                            r.beginSubpath(point[4], point[5]);
+                            subpathStarted = true;
+                            skip = false;
+                        } else {
+                            if (point[0] < UPPER_BND && point[0] > LOWER_BND && 
+                                point[1] < UPPER_BND && point[1] > LOWER_BND &&
+                                point[2] < UPPER_BND && point[2] > LOWER_BND &&
+                                point[3] < UPPER_BND && point[3] > LOWER_BND) 
+                            {
+                                r.appendCubic(point[0], point[1],
+                                              point[2], point[3],
+                                              point[4], point[5]);
+                            } else {
+                                r.appendLine(point[4], point[5]);
+                            }
+                        }
+                    }
+		    break;
+		case PathIterator.SEG_CLOSE:
+                    if (subpathStarted) {
+		        r.closedSubpath();
+                        subpathStarted = false;
+                        pathClosed = true;
+                    }
+		    break;
+		}
+		pi.next();
+	    }
+	}
+
+        try {
+            r.endPath();
+            r.getAlphaBox(bbox);
+            clip.clipBoxToBounds(bbox);
+            if (bbox[0] >= bbox[2] || bbox[1] >= bbox[3]) {
+                dropRasterizer(r);
+                return null;
+            }
+            r.setOutputArea(bbox[0], bbox[1],
+                            bbox[2] - bbox[0],
+                            bbox[3] - bbox[1]);
+        } catch (PRException e) {
+            /*
+             * This exeption is thrown from the native part of the Ductus
+             * (only in case of a debug build) to indicate that some
+             * segments of the path have very large coordinates.
+             * See 4485298 for more info.
+             */
+            System.err.println("DuctusRenderingEngine.getAATileGenerator: "+e);
+        }
+
+        return r;
+    }
+
+    private void feedConsumer(PathConsumer consumer, PathIterator pi) {
+	try {
+	    consumer.beginPath();
+	    boolean pathClosed = false;
+	    float mx = 0.0f;
+	    float my = 0.0f;
+	    float point[]  = new float[6];
+
+	    while (!pi.isDone()) {
+		int type = pi.currentSegment(point);
+		if (pathClosed == true) {
+		    pathClosed = false;
+		    if (type != PathIterator.SEG_MOVETO) {
+			// Force current point back to last moveto point
+			consumer.beginSubpath(mx, my);
+		    }
+		}
+		switch (type) {
+		case PathIterator.SEG_MOVETO:
+		    mx = point[0];
+		    my = point[1];
+		    consumer.beginSubpath(point[0], point[1]);
+		    break;
+		case PathIterator.SEG_LINETO:
+		    consumer.appendLine(point[0], point[1]);
+		    break;
+		case PathIterator.SEG_QUADTO:
+		    consumer.appendQuadratic(point[0], point[1],
+					     point[2], point[3]);
+		    break;
+		case PathIterator.SEG_CUBICTO:
+		    consumer.appendCubic(point[0], point[1],
+					 point[2], point[3],
+					 point[4], point[5]);
+		    break;
+		case PathIterator.SEG_CLOSE:
+		    consumer.closedSubpath();
+		    pathClosed = true;
+		    break;
+		}
+		pi.next();
+	    }
+
+	    consumer.endPath();
+	} catch (PathException e) {
+	    throw new InternalError("Unable to Stroke shape ("+
+				    e.getMessage()+")");
+	}
+    }
+
+    private class FillAdapter implements PathConsumer {
+	boolean closed;
+	Path2D.Float path;
+
+	public FillAdapter() {
+            // Ductus only supplies float coordinates so
+            // Path2D.Double is not necessary here.
+	    path = new Path2D.Float(Path2D.WIND_NON_ZERO);
+	}
+
+	public Shape getShape() {
+	    return path;
+	}
+
+	public void dispose() {
+	}
+
+	public PathConsumer getConsumer() {
+	    return null;
+	}
+
+	public void beginPath() {}
+
+	public void beginSubpath(float x0, float y0) {
+	    if (closed) {
+		path.closePath();
+		closed = false;
+	    }
+	    path.moveTo(x0, y0);
+	}
+
+	public void appendLine(float x1, float y1) {
+	    path.lineTo(x1, y1);
+	}
+
+	public void appendQuadratic(float xm, float ym, float x1, float y1) {
+	    path.quadTo(xm, ym, x1, y1);
+	}
+
+	public void appendCubic(float xm, float ym,
+				float xn, float yn,
+				float x1, float y1) {
+	    path.curveTo(xm, ym, xn, yn, x1, y1);
+	}
+
+	public void closedSubpath() {
+	    closed = true;
+	}
+
+	public void endPath() {
+	    if (closed) {
+		path.closePath();
+		closed = false;
+	    }
+	}
+
+	public void useProxy(FastPathProducer proxy)
+	    throws PathException
+	{
+	    proxy.sendTo(this);
+	}
+
+	public long getCPathConsumer() {
+	    return 0;
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/dc/META-INF/services/sun.java2d.pipe.RenderingEngine	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,2 @@
+#  Ductus Rendering Engine module
+sun.dc.DuctusRenderingEngine
--- a/j2se/src/share/classes/sun/font/FileFontStrike.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/font/FileFontStrike.java	Fri Jun 22 00:46:43 2007 +0000
@@ -67,17 +67,18 @@
     private long[][] segLongGlyphImages;
 
     /* The "metrics" information requested by clients is usually nothing
-     * more than the horizontal advance of the character. So cache this
-     * information.
-     * This advance cache will take an extra (4 * numglyphs) bytes per
-     * strike and profiling will be needed to distinguish if its beneficial.
-     * The big advantage is the glyph Image pointers can then be more simply
-     * distinguished as valid images.
-     * Metrics other than horizontal advance is not cached in Java code but
-     * if a valid glyph Image exists it will contain all the metrics
-     * info (except for outline bounds which is even more rarely needed).
+     * more than the horizontal advance of the character.
+     * In most cases this advance and other metrics information is stored
+     * in the glyph image cache.
+     * But in some cases we do not automatically retrieve the glyph
+     * image when the advance is requested. In those cases we want to
+     * cache the advances since this has been shown to be important for
+     * performance.
+     * The segmented cache is used in cases when the single array
+     * would be too large.
      */
-    protected float[] horizontalAdvances;
+    private float[] horizontalAdvances;
+    private float[][] segHorizontalAdvances;
 
     /* Outline bounds are used when printing and when drawing outlines
      * to the screen. On balance the relative rarity of these cases
@@ -155,7 +156,7 @@
 	mapper = fileFont.getMapper();
 	int numGlyphs = mapper.getNumGlyphs();
 
-        /* Always segment for fonts with > 4K glyphs, but also for smaller
+        /* Always segment for fonts with > 2K glyphs, but also for smaller
          * fonts with non-typical sizes and transforms.
          * Segmenting for all non-typical pt sizes helps to minimise memory
          * usage when very many distinct strikes are created.
@@ -167,7 +168,7 @@
         int iSize = (int)ptSize;
         boolean isSimpleTx = (at.getType() & complexTX) == 0;
         segmentedCache =
-            (numGlyphs > SEGSIZE << 4) ||
+            (numGlyphs > SEGSIZE << 3) ||
             ((numGlyphs > SEGSIZE << 1) &&
              (!isSimpleTx || ptSize != iSize || iSize < 6 || iSize > 36));
 
@@ -214,28 +215,32 @@
 
         /* Always get the image and the advance together for smaller sizes
          * that are likely to be important to rendering performance.
-         * Also if the cache is "segmented", then this indicates a
-         * large font and we would be better to do this rather than create
-         * an unsegmented advance cache. The point size of 48.0
-         * can be thought of as "maximumSizeForGetImageWithAdvance"
+         * The pixel size of 48.0 can be thought of as
+         * "maximumSizeForGetImageWithAdvance".
+         * This should be no greater than OutlineTextRender.THRESHOLD.
 	 */
-        getImageWithAdvance = at.getScaleY() <= 48.0 || segmentedCache;
+        getImageWithAdvance = at.getScaleY() <= 48.0;
 
         /* Some applications request advance frequently during layout.
          * If we are not getting and caching the image with the advance,
-         * we should at least cache the horizontal advance for smaller fonts.
-         * For sizes and fonts which don't fit these criteria there is
-         * a potentially significant performance penalty if the advance is
-         * repeatedly requested before requesting the image.
-         * REMIND: should address this, perhaps by using htmx for large sizes.
+         * there is a potentially significant performance penalty if the
+         * advance is repeatedly requested before requesting the image.
+         * We should at least cache the horizontal advance.
+         * REMIND: could use info in the font, eg hmtx, to retrieve some
+         * advances. But still want to cache it here.
          */
 
-        if (!getImageWithAdvance && numGlyphs < MAXADVANCECACHESIZE) {
-	    horizontalAdvances = new float[numGlyphs];
-	    /* use max float as uninitialised advance */
-	    for (int i=0; i<numGlyphs; i++) {
-		horizontalAdvances[i] = Float.MAX_VALUE;
-	    }
+        if (!getImageWithAdvance) {
+            if (!segmentedCache) {
+                horizontalAdvances = new float[numGlyphs];
+                /* use max float as uninitialised advance */
+                for (int i=0; i<numGlyphs; i++) {
+                    horizontalAdvances[i] = Float.MAX_VALUE;
+                }
+            } else {
+                int numSegments = (numGlyphs + SEGSIZE-1)/SEGSIZE;
+                segHorizontalAdvances = new float[numSegments][];
+            }
 	}
     }
 
@@ -477,7 +482,16 @@
 	    if (advance != Float.MAX_VALUE) {
 		return advance;
 	    }
-	}
+        } else if (segmentedCache && segHorizontalAdvances != null) {
+            int segIndex = glyphCode >> SEGSHIFT;
+            float[] subArray = segHorizontalAdvances[segIndex];
+            if (subArray != null) {
+                advance = subArray[glyphCode % SEGSIZE];
+                if (advance != Float.MAX_VALUE) {
+                    return advance;
+                }
+            }
+        }
 
 	if (invertDevTx != null) {
 	    /* If there is a device transform need x & y advance to
@@ -507,7 +521,17 @@
 
 	if (horizontalAdvances != null) {
 	    horizontalAdvances[glyphCode] = advance;
-	}
+        } else if (segmentedCache && segHorizontalAdvances != null) {
+            int segIndex = glyphCode >> SEGSHIFT;
+            int subIndex = glyphCode % SEGSIZE;
+            if (segHorizontalAdvances[segIndex] == null) {
+                segHorizontalAdvances[segIndex] = new float[SEGSIZE];
+                for (int i=0; i<SEGSIZE; i++) {
+                     segHorizontalAdvances[segIndex][i] = Float.MAX_VALUE;
+                }
+            }
+            segHorizontalAdvances[segIndex][subIndex] = advance;
+        }
 	return advance;
     }
 
--- a/j2se/src/share/classes/sun/font/FontManager.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/font/FontManager.java	Fri Jun 22 00:46:43 2007 +0000
@@ -29,6 +29,7 @@
 import java.awt.GraphicsEnvironment;
 import java.awt.FontFormatException;
 import java.io.File;
+import java.io.FilenameFilter;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
@@ -1158,12 +1159,20 @@
     /* The directories which contain platform fonts */
     private static String[] pathDirs = null;
 
-    private static String[] getFontFilesFromPath() {
+    private static boolean haveCheckedUnreferencedFontFiles;
+
+    private static String[] getFontFilesFromPath(boolean noType1) {
+        final FilenameFilter filter;
+        if (noType1) {
+            filter = SunGraphicsEnvironment.ttFilter;
+        } else {
+            filter = new SunGraphicsEnvironment.TTorT1Filter();
+        }
         return (String[])AccessController.doPrivileged(new PrivilegedAction() {
             public Object run() {
                 if (pathDirs.length == 1) {
                     File dir = new File(pathDirs[0]);
-                    String[] files = dir.list(SunGraphicsEnvironment.ttFilter);
+                    String[] files = dir.list(filter);
                     if (files == null) {
                         return new String[0];
                     }
@@ -1175,7 +1184,7 @@
                     ArrayList<String> fileList = new ArrayList<String>();
                     for (int i = 0; i< pathDirs.length; i++) {
                         File dir = new File(pathDirs[i]);
-                        String[] files = dir.list(SunGraphicsEnvironment.ttFilter);
+                        String[] files = dir.list(filter);
                         if (files == null) {
                             continue;
                         }
@@ -1303,7 +1312,12 @@
                 for (String regFile : fontToFileMap.values()) {
                     registryFiles.add(regFile.toLowerCase());
                 }
-                for (String pathFile : getFontFilesFromPath()) {
+                /* We don't look for Type1 files here as windows will
+                 * not enumerate these, so aren't useful in reconciling
+                 * GDI's unmapped files. We do find these later when
+                 * we enumerate all fonts.
+                 */
+                for (String pathFile : getFontFilesFromPath(true)) {
                     if (!registryFiles.contains(pathFile)) {
                         unmappedFontFiles.add(pathFile);
                     }
@@ -1337,6 +1351,84 @@
 	}
     }
 
+    /**
+     * In some cases windows may have fonts in the fonts folder that
+     * don't show up in the registry or in the GDI calls to enumerate fonts.
+     * The only way to find these is to list the directory. We invoke this
+     * only in getAllFonts/Families, so most searches for a specific
+     * font that is satisfied by the GDI/registry calls don't take the
+     * additional hit of listing the directory. This hit is small enough
+     * that its not significant in these 'enumerate all the fonts' cases.
+     * The basic approach is to cross-reference the files windows found
+     * with the ones in the directory listing approach, and for each
+     * in the latter list that is missing from the former list, register it.
+     */
+    private static synchronized void checkForUnreferencedFontFiles() {
+        if (haveCheckedUnreferencedFontFiles) {
+            return;
+        }
+        haveCheckedUnreferencedFontFiles = true;
+        if (!isWindows) {
+            return;
+        }
+        /* getFontFilesFromPath() returns all lower case names.
+         * To compare we also need lower case
+         * versions of the names from the registry.
+         */
+        ArrayList<String> registryFiles = new ArrayList<String>();
+        for (String regFile : fontToFileMap.values()) {
+            registryFiles.add(regFile.toLowerCase());
+        }
+
+        /* To avoid any issues with concurrent modification, create
+         * copies of the existing maps, add the new fonts into these
+         * and then replace the references to the old ones with the
+         * new maps. ConcurrentHashmap is another option but its a lot
+         * more changes and with this exception, these maps are intended
+         * to be static.
+         */
+        HashMap<String,String> fontToFileMap2 = null;
+        HashMap<String,String> fontToFamilyNameMap2 = null;
+        HashMap<String,ArrayList<String>> familyToFontListMap2 = null;;
+
+        for (String pathFile : getFontFilesFromPath(false)) {
+            if (!registryFiles.contains(pathFile)) {
+                if (logging) {
+                    logger.info("Found non-registry file : " + pathFile);
+                }
+                PhysicalFont f = registerFontFile(getPathName(pathFile));
+                if (f == null) {
+                    continue;
+                }
+                if (fontToFileMap2 == null) {
+                    fontToFileMap2 = new HashMap<String,String>(fontToFileMap);
+                    fontToFamilyNameMap2 =
+                        new HashMap<String,String>(fontToFamilyNameMap);
+                    familyToFontListMap2 = new
+                        HashMap<String,ArrayList<String>>(familyToFontListMap);
+                }
+                String fontName = f.getFontName(null);
+                String family = f.getFamilyName(null);
+                String familyLC = family.toLowerCase();
+                fontToFamilyNameMap2.put(fontName, family);
+                fontToFileMap2.put(fontName, pathFile);
+                ArrayList<String> fonts = familyToFontListMap2.get(familyLC);
+                if (fonts == null) {
+                    fonts = new ArrayList<String>();
+                } else {
+                    fonts = new ArrayList<String>(fonts);
+                }
+                fonts.add(fontName);
+                familyToFontListMap2.put(familyLC, fonts);
+            }
+        }
+        if (fontToFileMap2 != null) {
+            fontToFileMap = fontToFileMap2;
+            familyToFontListMap = familyToFontListMap2;
+            fontToFamilyNameMap = fontToFamilyNameMap2;
+        }
+    }
+
     private static void resolveFontFiles(HashSet<String> unmappedFiles,
                                          ArrayList<String> unmappedFonts) {
 
@@ -1414,6 +1506,7 @@
 	if (getFullNameToFileMap().size() == 0) {
             return null;
 	} 
+        checkForUnreferencedFontFiles();
 	/* This odd code with TreeMap is used to preserve a historical
 	 * behaviour wrt the sorting order .. */
 	ArrayList<String> fontNames = new ArrayList<String>();
@@ -1434,6 +1527,27 @@
 	return fontToFileMap.get(fontNameLC);
     }
 
+    private static PhysicalFont registerFontFile(String file) {
+        if (new File(file).isAbsolute() &&
+            !registeredFontFiles.contains(file)) {
+            int fontFormat = FONTFORMAT_NONE;
+            int fontRank = Font2D.UNKNOWN_RANK;
+            if (SunGraphicsEnvironment.ttFilter.accept(null, file)) {
+                fontFormat = FONTFORMAT_TRUETYPE;
+                fontRank = Font2D.TTF_RANK;
+            } else if
+                (SunGraphicsEnvironment.t1Filter.accept(null, file)) {
+                fontFormat = FONTFORMAT_TYPE1;
+                fontRank = Font2D.TYPE1_RANK;
+            }
+            if (fontFormat == FONTFORMAT_NONE) {
+                return null;
+            }
+            return registerFontFile(file, null, fontFormat, false, fontRank);
+        }
+        return null;
+    }
+
     /* Used to register any font files that are found by platform APIs
      * that weren't previously found in the standard font locations.
      * the isAbsolute() check is needed since that's whats stored in the
@@ -1447,24 +1561,8 @@
             return;
 	}
         for (String file : fontToFileMap.values()) {
-            if (new File(file).isAbsolute() &&
-                !registeredFontFiles.contains(file)) {
-		int fontFormat = FONTFORMAT_NONE;
-		int fontRank = Font2D.UNKNOWN_RANK;
-                if (SunGraphicsEnvironment.ttFilter.accept(null, file)) {
-		    fontFormat = FONTFORMAT_TRUETYPE;
-		    fontRank = Font2D.TTF_RANK;
-		} else if
-                    (SunGraphicsEnvironment.t1Filter.accept(null, file)) {
-		    fontFormat = FONTFORMAT_TYPE1;
-		    fontRank = Font2D.TYPE1_RANK;
-		}
-		if (fontFormat == FONTFORMAT_NONE) {
-		    continue;
-		}
-                registerFontFile(file, null, fontFormat, false, fontRank);
-	    }
-	}
+            registerFontFile(file);
+        }
     }
 
     public static boolean
@@ -1473,6 +1571,7 @@
 	if (getFullNameToFileMap().size() == 0) {
             return false;
 	}
+        checkForUnreferencedFontFiles();
         for (String name : fontToFamilyNameMap.values()) {
             familyNames.put(name.toLowerCase(requestedLocale), name);
 	}
--- a/j2se/src/share/classes/sun/font/PhysicalStrike.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/font/PhysicalStrike.java	Fri Jun 22 00:46:43 2007 +0000
@@ -64,11 +64,6 @@
      */
     ConcurrentHashMap<Integer, Point2D.Float> glyphPointMapCache;
 
-    /* If there are more than this number of glyphs in the font, then
-     * don't cache advances as it will take > 4Kbytes
-     */
-    protected static final int MAXADVANCECACHESIZE = 1000;
-
     protected boolean getImageWithAdvance;
     protected static final int complexTX =
 	AffineTransform.TYPE_FLIP |
--- a/j2se/src/share/classes/sun/java2d/SunGraphics2D.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/SunGraphics2D.java	Fri Jun 22 00:46:43 2007 +0000
@@ -84,7 +84,6 @@
 import sun.java2d.pipe.RegionIterator;
 import sun.java2d.pipe.TextPipe;
 import sun.java2d.pipe.DrawImagePipe;
-import sun.java2d.pipe.DuctusRenderer;
 import sun.java2d.loops.FontInfo;
 import sun.java2d.loops.RenderLoops;
 import sun.java2d.loops.CompositeType;
@@ -968,8 +967,10 @@
     static final int NON_UNIFORM_SCALE_MASK =
 	(AffineTransform.TYPE_GENERAL_TRANSFORM |
 	 AffineTransform.TYPE_GENERAL_SCALE);
-    public static final double MinPenSizeAASquared = 
-	(DuctusRenderer.MinPenSizeAA * DuctusRenderer.MinPenSizeAA);
+    public static final double MinPenSizeAA =
+        sun.java2d.pipe.RenderingEngine.getInstance().getMinimumAAPenSize();
+    public static final double MinPenSizeAASquared =
+        (MinPenSizeAA * MinPenSizeAA);
     // Since inaccuracies in the trig package can cause us to
     // calculated a rotated pen width of just slightly greater
     // than 1.0, we add a fudge factor to our comparison value
@@ -981,7 +982,7 @@
 	boolean aa = (antialiasHint == SunHints.INTVAL_ANTIALIAS_ON);
 	if (transformState < TRANSFORM_TRANSLATESCALE) {
 	    if (aa) {
-		if (bs.getLineWidth() <= DuctusRenderer.MinPenSizeAA) {
+		if (bs.getLineWidth() <= MinPenSizeAA) {
 		    if (bs.getDashArray() == null) {
 			strokeState = STROKE_THIN;
 		    } else {
--- a/j2se/src/share/classes/sun/java2d/SunGraphicsEnvironment.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/SunGraphicsEnvironment.java	Fri Jun 22 00:46:43 2007 +0000
@@ -71,7 +71,7 @@
  *
  * @see GraphicsDevice
  * @see GraphicsConfiguration
- * @version 1.145 05/05/07
+ * @version 1.146 05/11/07
  */
 
 public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
@@ -816,6 +816,33 @@
         }
     }
 
+     public static class TTorT1Filter implements FilenameFilter {
+        public boolean accept(File dir, String name) {
+
+            /* all conveniently have the same suffix length */
+            int offset = name.length()-4;
+            if (offset <= 0) { /* must be at least A.ttf or A.pfa */
+                return false;
+            } else {
+                boolean isTT =
+                    name.startsWith(".ttf", offset) ||
+                    name.startsWith(".TTF", offset) ||
+                    name.startsWith(".ttc", offset) ||
+                    name.startsWith(".TTC", offset);
+                if (isTT) {
+                    return true;
+                } else if (noType1Font) {
+                    return false;
+                } else {
+                    return(name.startsWith(".pfa", offset) ||
+                           name.startsWith(".pfb", offset) ||
+                           name.startsWith(".PFA", offset) ||
+                           name.startsWith(".PFB", offset));
+                }
+            }
+        }
+    }
+
     /* No need to keep consing up new instances - reuse a singleton.
      * The trade-off is that these objects don't get GC'd.
      */
--- a/j2se/src/share/classes/sun/java2d/SurfaceData.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/SurfaceData.java	Fri Jun 22 00:46:43 2007 +0000
@@ -55,7 +55,7 @@
 import sun.java2d.pipe.GeneralCompositePipe;
 import sun.java2d.pipe.SpanClipRenderer;
 import sun.java2d.pipe.SpanShapeRenderer;
-import sun.java2d.pipe.DuctusShapeRenderer;
+import sun.java2d.pipe.AAShapePipe;
 import sun.java2d.pipe.AlphaPaintPipe;
 import sun.java2d.pipe.AlphaColorPipe;
 import sun.java2d.pipe.PixelToShapeConverter;
@@ -366,9 +366,9 @@
     protected static final TextPipe colorText;
     protected static final CompositePipe clipColorPipe;
     protected static final TextPipe clipColorText;
-    protected static final DuctusShapeRenderer AAColorShape;
+    protected static final AAShapePipe AAColorShape;
     protected static final PixelToShapeConverter AAColorViaShape;
-    protected static final DuctusShapeRenderer AAClipColorShape;
+    protected static final AAShapePipe AAClipColorShape;
     protected static final PixelToShapeConverter AAClipColorViaShape;
 
     protected static final CompositePipe paintPipe;
@@ -377,9 +377,9 @@
     protected static final TextPipe paintText;
     protected static final CompositePipe clipPaintPipe;
     protected static final TextPipe clipPaintText;
-    protected static final DuctusShapeRenderer AAPaintShape;
+    protected static final AAShapePipe AAPaintShape;
     protected static final PixelToShapeConverter AAPaintViaShape;
-    protected static final DuctusShapeRenderer AAClipPaintShape;
+    protected static final AAShapePipe AAClipPaintShape;
     protected static final PixelToShapeConverter AAClipPaintViaShape;
 
     protected static final CompositePipe compPipe;
@@ -388,9 +388,9 @@
     protected static final TextPipe compText;
     protected static final CompositePipe clipCompPipe;
     protected static final TextPipe clipCompText;
-    protected static final DuctusShapeRenderer AACompShape;
+    protected static final AAShapePipe AACompShape;
     protected static final PixelToShapeConverter AACompViaShape;
-    protected static final DuctusShapeRenderer AAClipCompShape;
+    protected static final AAShapePipe AAClipCompShape;
     protected static final PixelToShapeConverter AAClipCompViaShape;
 
     protected static final DrawImagePipe imagepipe;
@@ -409,9 +409,9 @@
 	colorText = new TextRenderer(colorPipe);
 	clipColorPipe = new SpanClipRenderer(colorPipe);
 	clipColorText = new TextRenderer(clipColorPipe);
-	AAColorShape = new DuctusShapeRenderer(colorPipe);
+	AAColorShape = new AAShapePipe(colorPipe);
 	AAColorViaShape = new PixelToShapeConverter(AAColorShape);
-	AAClipColorShape = new DuctusShapeRenderer(clipColorPipe);
+	AAClipColorShape = new AAShapePipe(clipColorPipe);
 	AAClipColorViaShape = new PixelToShapeConverter(AAClipColorShape);
 
 	paintPipe = new AlphaPaintPipe();
@@ -420,9 +420,9 @@
 	paintText = new TextRenderer(paintPipe);
 	clipPaintPipe = new SpanClipRenderer(paintPipe);
 	clipPaintText = new TextRenderer(clipPaintPipe);
-	AAPaintShape = new DuctusShapeRenderer(paintPipe);
+	AAPaintShape = new AAShapePipe(paintPipe);
 	AAPaintViaShape = new PixelToShapeConverter(AAPaintShape);
-	AAClipPaintShape = new DuctusShapeRenderer(clipPaintPipe);
+	AAClipPaintShape = new AAShapePipe(clipPaintPipe);
 	AAClipPaintViaShape = new PixelToShapeConverter(AAClipPaintShape);
 
 	compPipe = new GeneralCompositePipe();
@@ -431,9 +431,9 @@
 	compText = new TextRenderer(compPipe);
 	clipCompPipe = new SpanClipRenderer(compPipe);
 	clipCompText = new TextRenderer(clipCompPipe);
-	AACompShape = new DuctusShapeRenderer(compPipe);
+	AACompShape = new AAShapePipe(compPipe);
 	AACompViaShape = new PixelToShapeConverter(AACompShape);
-	AAClipCompShape = new DuctusShapeRenderer(clipCompPipe);
+	AAClipCompShape = new AAShapePipe(clipCompPipe);
 	AAClipCompViaShape = new PixelToShapeConverter(AAClipCompShape);
 
 	imagepipe = new DrawImage();
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLBlitLoops.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLBlitLoops.java	Fri Jun 22 00:46:43 2007 +0000
@@ -235,12 +235,6 @@
                      double dx2, double dy2,
                      int srctype, boolean texture)
     {
-        // set each component of the fragment color to the extra alpha
-        // value, which will effectively apply the extra alpha to each
-        // pixel in the texture (this is only applicable when this is a
-        // sw->texture->surface copy operation)
-        int pixel = OGLContext.getExtraAlphaPixel(comp);
-
         int ctxflags = 0;
         if (srcData.getTransparency() == Transparency.OPAQUE) {
             ctxflags |= OGLContext.SRC_IS_OPAQUE;
@@ -262,7 +256,7 @@
                 OGLContext.setScratchSurface(gc);
             } else {
                 OGLContext.validateContext(oglDst, oglDst,
-                                           clip, comp, xform, pixel,
+                                           clip, comp, xform, null, null,
                                            ctxflags);
             }
 
@@ -298,12 +292,6 @@
                         double dx2, double dy2,
                         boolean texture)
     {
-        // set each component of the fragment color to the extra alpha value,
-        // which will effectively apply the extra alpha to each pixel in the
-        // texture (this is applicable when this is a texture->surface or
-        // surface->texture->surface copy operation)
-        int pixel = OGLContext.getExtraAlphaPixel(comp);
-
         int ctxflags = 0;
         if (srcData.getTransparency() == Transparency.OPAQUE) {
             ctxflags |= OGLContext.SRC_IS_OPAQUE;
@@ -336,7 +324,7 @@
             }
 
             OGLContext.validateContext(srcCtxData, oglDst,
-                                       clip, comp, xform, pixel,
+                                       clip, comp, xform, null, null,
                                        ctxflags);
 
             if (biop != null) {
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLBufImgOps.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLBufImgOps.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,28 +25,18 @@
 
 package sun.java2d.opengl;
 
-import java.awt.color.ColorSpace;
 import java.awt.image.AffineTransformOp;
 import java.awt.image.BufferedImage;
 import java.awt.image.BufferedImageOp;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.ByteLookupTable;
-import java.awt.image.ColorModel;
 import java.awt.image.ConvolveOp;
-import java.awt.image.IndexColorModel;
-import java.awt.image.Kernel;
 import java.awt.image.LookupOp;
-import java.awt.image.LookupTable;
 import java.awt.image.RescaleOp;
-import java.awt.image.ShortLookupTable;
 import sun.java2d.SunGraphics2D;
 import sun.java2d.SurfaceData;
 import sun.java2d.loops.CompositeType;
-import sun.java2d.pipe.RenderBuffer;
-import sun.java2d.pipe.RenderQueue;
-import static sun.java2d.pipe.BufferedOpCodes.*;
+import sun.java2d.pipe.BufferedBufImgOps;
 
-class OGLBufImgOps {
+class OGLBufImgOps extends BufferedBufImgOps {
 
     /**
      * This method is called from OGLDrawImage.transformImage() only.  It
@@ -121,354 +111,4 @@
 
         return true;
     }
-    
-    /*
-     * The remaining methods are invoked by OGLBlitLoops.IsoBlit() for
-     * the purposes of enabling/disabling a BufferedImageOp...
-     */
-
-    static void enableBufImgOp(RenderQueue rq, OGLSurfaceData srcData,
-                               BufferedImage srcImg, BufferedImageOp biop)
-    {
-        if (biop instanceof ConvolveOp) {
-            enableConvolveOp(rq, srcData, (ConvolveOp)biop);
-        } else if (biop instanceof RescaleOp) {
-            enableRescaleOp(rq, srcData, srcImg, (RescaleOp)biop);
-        } else if (biop instanceof LookupOp) {
-            enableLookupOp(rq, srcData, srcImg, (LookupOp)biop);
-        } else {
-            throw new InternalError("Unknown BufferedImageOp");
-        }
-    }
-
-    static void disableBufImgOp(RenderQueue rq, BufferedImageOp biop) {
-        if (biop instanceof ConvolveOp) {
-            disableConvolveOp(rq);
-        } else if (biop instanceof RescaleOp) {
-            disableRescaleOp(rq);
-        } else if (biop instanceof LookupOp) {
-            disableLookupOp(rq);
-        } else {
-            throw new InternalError("Unknown BufferedImageOp");
-        }
-    }
-
-/**************************** ConvolveOp support ****************************/
-
-    private static boolean isConvolveOpValid(ConvolveOp cop) {
-        Kernel kernel = cop.getKernel();
-        int kw = kernel.getWidth();
-        int kh = kernel.getHeight();
-        // REMIND: we currently can only handle 3x3 and 5x5 kernels,
-        //         but hopefully this is just a temporary restriction;
-        //         see native shader comments for more details
-        if (!(kw == 3 && kh == 3) && !(kw == 5 && kh == 5)) {
-            return false;
-        }
-        return true;
-    }
-
-    private static void enableConvolveOp(RenderQueue rq,
-                                         OGLSurfaceData srcData,
-                                         ConvolveOp cop)
-    {
-        // assert rq.lock.isHeldByCurrentThread();
-        boolean edgeZero =
-            cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
-        Kernel kernel = cop.getKernel();
-        int kernelWidth = kernel.getWidth();
-        int kernelHeight = kernel.getHeight();
-        int kernelSize = kernelWidth * kernelHeight;
-        int sizeofFloat = 4;
-        int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);
-
-        RenderBuffer buf = rq.getBuffer();
-        rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
-        buf.putInt(ENABLE_CONVOLVE_OP);
-        buf.putLong(srcData.getNativeOps());
-        buf.putInt(edgeZero ? 1 : 0);
-        buf.putInt(kernelWidth);
-        buf.putInt(kernelHeight);
-        buf.put(kernel.getKernelData(null));
-    }
-
-    private static void disableConvolveOp(RenderQueue rq) {
-        // assert rq.lock.isHeldByCurrentThread();
-        RenderBuffer buf = rq.getBuffer();
-        rq.ensureCapacity(4);
-        buf.putInt(DISABLE_CONVOLVE_OP);
-    }
-
-/**************************** RescaleOp support *****************************/
-
-    private static boolean isRescaleOpValid(RescaleOp rop,
-                                            BufferedImage srcImg)
-    {
-        int numFactors = rop.getNumFactors();
-        ColorModel srcCM = srcImg.getColorModel();
-
-        if (srcCM instanceof IndexColorModel) {
-            throw new
-                IllegalArgumentException("Rescaling cannot be "+
-                                         "performed on an indexed image");
-        }
-        if (numFactors != 1 &&
-            numFactors != srcCM.getNumColorComponents() &&
-            numFactors != srcCM.getNumComponents())
-        {
-            throw new IllegalArgumentException("Number of scaling constants "+
-                                               "does not equal the number of"+
-                                               " of color or color/alpha "+
-                                               " components");
-        }
-
-        int csType = srcCM.getColorSpace().getType();
-        if (csType != ColorSpace.TYPE_RGB &&
-            csType != ColorSpace.TYPE_GRAY)
-        {
-            // Not prepared to deal with other color spaces
-            return false;
-        }
-
-        if (numFactors == 2 || numFactors > 4) {
-            // Not really prepared to handle this at the native level, so...
-            return false;
-        }
-
-        return true;
-    }
-
-    private static void enableRescaleOp(RenderQueue rq,
-                                        OGLSurfaceData srcData,
-                                        BufferedImage srcImg,
-                                        RescaleOp rop)
-    {
-        // assert rq.lock.isHeldByCurrentThread();
-        ColorModel srcCM = srcImg.getColorModel();
-        boolean nonPremult =
-            srcCM.hasAlpha() &&
-            srcCM.isAlphaPremultiplied();
-
-        /*
-         * Note: The user-provided scale factors and offsets are arranged
-         * in R/G/B/A order, regardless of the raw data order of the
-         * underlying Raster/DataBuffer.  The source image data is ultimately
-         * converted into RGBA data when uploaded to an OpenGL texture
-         * (even for TYPE_GRAY), so the scale factors and offsets are already
-         * in the order expected by the native OpenGL code.
-         *
-         * However, the offsets provided by the user are in a range dictated
-         * by the size of each color/alpha band in the source image.  For
-         * example, for 8/8/8 data each offset is in the range [0,255],
-         * for 5/5/5 data each offset is in the range [0,31], and so on.
-         * The OpenGL shader only thinks in terms of [0,1], so below we need
-         * to normalize the user-provided offset values into the range [0,1].
-         */
-        int numFactors = rop.getNumFactors();
-        float[] origScaleFactors = rop.getScaleFactors(null);
-        float[] origOffsets = rop.getOffsets(null);
-
-        // To make things easier, we will always pass all four bands
-        // down to native code...
-        float[] normScaleFactors;
-        float[] normOffsets;
-
-        if (numFactors == 1) {
-            normScaleFactors = new float[4];
-            normOffsets      = new float[4];
-            for (int i = 0; i < 3; i++) {
-                normScaleFactors[i] = origScaleFactors[0];
-                normOffsets[i]      = origOffsets[0];
-            }
-            // Leave alpha untouched...
-            normScaleFactors[3] = 1.0f;
-            normOffsets[3]      = 0.0f;
-        } else if (numFactors == 3) {
-            normScaleFactors = new float[4];
-            normOffsets      = new float[4];
-            for (int i = 0; i < 3; i++) {
-                normScaleFactors[i] = origScaleFactors[i];
-                normOffsets[i]      = origOffsets[i];
-            }
-            // Leave alpha untouched...
-            normScaleFactors[3] = 1.0f;
-            normOffsets[3]      = 0.0f;            
-        } else { // (numFactors == 4)
-            normScaleFactors = origScaleFactors;
-            normOffsets      = origOffsets;
-        }
-
-        // The user-provided offsets are specified in the range
-        // of each source color band, but the OpenGL shader only wants
-        // to deal with data in the range [0,1], so we need to normalize
-        // each offset value to the range [0,1] here.
-        if (srcCM.getNumComponents() == 1) {
-            // Gray data
-            int nBits = srcCM.getComponentSize(0);
-            int maxValue = (1 << nBits) - 1;
-            for (int i = 0; i < 3; i++) {
-                normOffsets[i] /= maxValue;
-            }
-        } else {
-            // RGB(A) data
-            for (int i = 0; i < srcCM.getNumComponents(); i++) {
-                int nBits = srcCM.getComponentSize(i);
-                int maxValue = (1 << nBits) - 1;
-                normOffsets[i] /= maxValue;
-            }
-        }
-
-        int sizeofFloat = 4;
-        int totalBytesRequired = 4 + 8 + 4 + (4 * sizeofFloat * 2);
-
-        RenderBuffer buf = rq.getBuffer();
-        rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
-        buf.putInt(ENABLE_RESCALE_OP);
-        buf.putLong(srcData.getNativeOps());
-        buf.putInt(nonPremult ? 1 : 0);
-        buf.put(normScaleFactors);
-        buf.put(normOffsets);
-    }
-
-    private static void disableRescaleOp(RenderQueue rq) {
-        // assert rq.lock.isHeldByCurrentThread();
-        RenderBuffer buf = rq.getBuffer();
-        rq.ensureCapacity(4);
-        buf.putInt(DISABLE_RESCALE_OP);
-    }
-
-/**************************** LookupOp support ******************************/
-
-    private static boolean isLookupOpValid(LookupOp lop,
-                                           BufferedImage srcImg)
-    {
-        LookupTable table = lop.getTable();
-        int numComps = table.getNumComponents();
-        ColorModel srcCM = srcImg.getColorModel();
-
-        if (srcCM instanceof IndexColorModel) {
-            throw new
-                IllegalArgumentException("LookupOp cannot be "+
-                                         "performed on an indexed image");
-        }
-        if (numComps != 1 &&
-            numComps != srcCM.getNumComponents() &&
-            numComps != srcCM.getNumColorComponents())
-        {
-            throw new IllegalArgumentException("Number of arrays in the "+
-                                               " lookup table ("+
-                                               numComps+
-                                               ") is not compatible with"+
-                                               " the src image: "+srcImg);
-        }
-
-        int csType = srcCM.getColorSpace().getType();
-        if (csType != ColorSpace.TYPE_RGB &&
-            csType != ColorSpace.TYPE_GRAY)
-        {
-            // Not prepared to deal with other color spaces
-            return false;
-        }
-
-        if (numComps == 2 || numComps > 4) {
-            // Not really prepared to handle this at the native level, so...
-            return false;
-        }
-
-        // The LookupTable spec says that "all arrays must be the
-        // same size" but unfortunately the constructors do not
-        // enforce that.  Also, our native code only works with
-        // arrays no larger than 256 elements, so check both of
-        // these restrictions here.
-        if (table instanceof ByteLookupTable) {
-            byte[][] data = ((ByteLookupTable)table).getTable();
-            for (int i = 1; i < data.length; i++) {
-                if (data[i].length > 256 ||
-                    data[i].length != data[i-1].length)
-                {
-                    return false;
-                }
-            }
-        } else if (table instanceof ShortLookupTable) {
-            short[][] data = ((ShortLookupTable)table).getTable();
-            for (int i = 1; i < data.length; i++) {
-                if (data[i].length > 256 ||
-                    data[i].length != data[i-1].length)
-                {
-                    return false;
-                }
-            }
-        } else {
-            return false;
-        }
-
-        return true;
-    }
-
-    private static void enableLookupOp(RenderQueue rq,
-                                       OGLSurfaceData srcData,
-                                       BufferedImage srcImg,
-                                       LookupOp lop)
-    {
-        // assert rq.lock.isHeldByCurrentThread();
-        boolean nonPremult =
-            srcImg.getColorModel().hasAlpha() &&
-            srcImg.isAlphaPremultiplied();
-
-        LookupTable table = lop.getTable();
-        int numBands = table.getNumComponents();
-        int offset = table.getOffset();
-        int bandLength;
-        int bytesPerElem;
-        boolean shortData;
-
-        if (table instanceof ShortLookupTable) {
-            short[][] data = ((ShortLookupTable)table).getTable();
-            bandLength = data[0].length;
-            bytesPerElem = 2;
-            shortData = true;
-        } else { // (table instanceof ByteLookupTable)
-            byte[][] data = ((ByteLookupTable)table).getTable();
-            bandLength = data[0].length;
-            bytesPerElem = 1;
-            shortData = false;
-        }
-
-        // Adjust the LUT length so that it ends on a 4-byte boundary
-        int totalLutBytes = numBands * bandLength * bytesPerElem;
-        int paddedLutBytes = (totalLutBytes + 3) & (~3);
-        int padding = paddedLutBytes - totalLutBytes;
-        int totalBytesRequired = 4 + 8 + 20 + paddedLutBytes;
-
-        RenderBuffer buf = rq.getBuffer();
-        rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
-        buf.putInt(ENABLE_LOOKUP_OP);
-        buf.putLong(srcData.getNativeOps());
-        buf.putInt(nonPremult ? 1 : 0);
-        buf.putInt(shortData ? 1 : 0);
-        buf.putInt(numBands);
-        buf.putInt(bandLength);
-        buf.putInt(offset);
-        if (shortData) {
-            short[][] data = ((ShortLookupTable)table).getTable();
-            for (int i = 0; i < numBands; i++) {
-                buf.put(data[i]);
-            }
-        } else {
-            byte[][] data = ((ByteLookupTable)table).getTable();
-            for (int i = 0; i < numBands; i++) {
-                buf.put(data[i]);
-            }
-        }
-        if (padding != 0) {
-            buf.position(buf.position() + padding);
-        }
-    }
-
-    private static void disableLookupOp(RenderQueue rq) {
-        // assert rq.lock.isHeldByCurrentThread();
-        RenderBuffer buf = rq.getBuffer();
-        rq.ensureCapacity(4);
-        buf.putInt(DISABLE_LOOKUP_OP);
-    }
 }
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLContext.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLContext.java	Fri Jun 22 00:46:43 2007 +0000
@@ -27,7 +27,9 @@
 
 import java.awt.AlphaComposite;
 import java.awt.Composite;
+import java.awt.Paint;
 import java.awt.geom.AffineTransform;
+import sun.java2d.SunGraphics2D;
 import sun.java2d.pipe.BufferedContext;
 import sun.java2d.pipe.Region;
 import sun.java2d.pipe.RenderBuffer;
@@ -40,12 +42,6 @@
  */
 class OGLContext extends BufferedContext {
 
-    /**
-     * Context flags (see OGLContext.h for more information on each flag).
-     */
-    static final int NO_CONTEXT_FLAGS = 0;
-    static final int SRC_IS_OPAQUE    = 1;
-
     /** Indicates that the context has no capabilities. */
     static final int CAPS_EMPTY            = (0 << 0);
     /** Indicates that the context is doublebuffered. */
@@ -97,11 +93,13 @@
                                 OGLSurfaceData dstData,
                                 Region clip, Composite comp,
                                 AffineTransform xform,
-                                int pixel, int flags)
+                                Paint paint, SunGraphics2D sg2d,
+                                int flags)
     {
         // assert rq.lock.isHeldByCurrentThread();
         OGLContext oglc = dstData.getContext();
-        oglc.validate(srcData, dstData, clip, comp, xform, pixel, flags);
+        oglc.validate(srcData, dstData,
+                      clip, comp, xform, paint, sg2d, flags);
     }
 
     /**
@@ -111,7 +109,7 @@
     static void validateContext(OGLSurfaceData dstData) {
         // assert rq.lock.isHeldByCurrentThread();
         validateContext(dstData, dstData,
-                        null, null, null, 0, NO_CONTEXT_FLAGS);
+                        null, null, null, null, null, NO_CONTEXT_FLAGS);
     }
 
     /**
@@ -177,27 +175,4 @@
             currentContext = null;
         }
     }
-    
-    /**
-     * Returns an integer pixel value with the extra alpha value replicated
-     * in each of the four component slots.  If the given comp value is not an
-     * AlphaComposite, or if it's extra alpha value is 1.0, then this method simply
-     * returns all ones.
-     *
-     * This method is useful in those cases when modulation is used to apply
-     * an extra alpha value to the alpha/color components in a texturing operation.
-     */
-    static int getExtraAlphaPixel(Composite comp) {
-        try {
-	    // Using try/catch is faster than instanceof (benchmark data)
-            AlphaComposite acomp = (AlphaComposite)comp;
-            float ea = acomp.getAlpha();
-            if (ea != 1.0f) {
-                // this is faster than using Math.round()
-                int a = (int)(ea * 0xff + 0.5f);
-                return (a << 24) | (a << 16) | (a << 8) | (a << 0);
-            }
-        } catch (Exception e) {}
-        return 0xffffffff;
-    }
 }
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLMaskBlit.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLMaskBlit.java	Fri Jun 22 00:46:43 2007 +0000
@@ -133,7 +133,7 @@
 
             OGLSurfaceData oglDst = (OGLSurfaceData)dst;
             OGLContext.validateContext(oglDst, oglDst,
-                                       clip, comp, null, 0,
+                                       clip, comp, null, null, null,
                                        OGLContext.NO_CONTEXT_FLAGS);
 
             RenderBuffer buf = rq.getBuffer();
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLMaskFill.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLMaskFill.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,210 +25,51 @@
 
 package sun.java2d.opengl;
 
-import java.awt.AlphaComposite;
 import java.awt.Composite;
-import java.util.Collection;
 import sun.java2d.SunGraphics2D;
-import sun.java2d.SurfaceData;
 import sun.java2d.loops.GraphicsPrimitive;
 import sun.java2d.loops.GraphicsPrimitiveMgr;
 import sun.java2d.loops.CompositeType;
-import sun.java2d.loops.MaskFill;
 import sun.java2d.loops.SurfaceType;
-import sun.java2d.pipe.Region;
-import sun.java2d.pipe.RenderBuffer;
-import sun.java2d.pipe.RenderQueue;
+import sun.java2d.pipe.BufferedMaskFill;
 import static sun.java2d.loops.CompositeType.*;
 import static sun.java2d.loops.SurfaceType.*;
-import static sun.java2d.pipe.BufferedOpCodes.*;
 
-/**
- * The MaskFill operation is expressed as:
- *   dst = ((src <MODE> dst) * pathA) + (dst * (1 - pathA))
- *
- * The OGL implementation of the MaskFill operation differs from the above
- * equation because it is not possible to perform such a complex operation in
- * OpenGL (without the use of advanced techniques like fragment shaders and
- * multitexturing).  Therefore, the OGLMaskFill operation is expressed as:
- *   dst = (src * pathA) <SrcOver> dst
- *
- * This simplified formula is only equivalent to the "true" MaskFill equation
- * in the following situations:
- *   - <MODE> is SrcOver
- *   - <MODE> is Src, extra alpha == 1.0, and the source paint is opaque
- *
- * Therefore, we register OGLMaskFill primitives for only the SurfaceType and
- * CompositeType restrictions mentioned above.  In addition, for the SrcNoEa
- * case we must override the incoming composite with a SrcOver (no extra alpha)
- * instance, so that we set up the OpenGL blending mode to match the
- * OGLMaskFill equation.
- */
-abstract class OGLMaskFill extends MaskFill {
+class OGLMaskFill extends BufferedMaskFill {
 
     static void register() {
-        Collection<OGLPaints> impls = OGLPaints.getAllInstances();
-        int numPrims = 2 + (impls.size() * 2);
-        int i = 0;
-        GraphicsPrimitive[] primitives = new GraphicsPrimitive[numPrims];
-        primitives[i++] = new Solid(AnyColor, SrcOver);
-        primitives[i++] = new Solid(OpaqueColor, SrcNoEa);
-        for (OGLPaints impl : impls) {
-            primitives[i++] = new Paint(impl, false, SrcOver);
-            primitives[i++] = new Paint(impl, true, SrcNoEa);
-        }
+        GraphicsPrimitive[] primitives = {
+            new OGLMaskFill(AnyColor,                  SrcOver),
+            new OGLMaskFill(OpaqueColor,               SrcNoEa),
+            new OGLMaskFill(GradientPaint,             SrcOver),
+            new OGLMaskFill(OpaqueGradientPaint,       SrcNoEa),
+            new OGLMaskFill(LinearGradientPaint,       SrcOver),
+            new OGLMaskFill(OpaqueLinearGradientPaint, SrcNoEa),
+            new OGLMaskFill(RadialGradientPaint,       SrcOver),
+            new OGLMaskFill(OpaqueRadialGradientPaint, SrcNoEa),
+            new OGLMaskFill(TexturePaint,              SrcOver),
+            new OGLMaskFill(OpaqueTexturePaint,        SrcNoEa),
+        };
         GraphicsPrimitiveMgr.register(primitives);
     }
 
-    private final boolean isSimpleColor;
-
-    protected OGLMaskFill(SurfaceType srcType,
-                          CompositeType compType,
-                          boolean isSimpleColor)
-    {
-        super(srcType, compType, OGLSurfaceData.OpenGLSurface);
-        this.isSimpleColor = isSimpleColor;
+    protected OGLMaskFill(SurfaceType srcType, CompositeType compType) {
+        super(OGLRenderQueue.getInstance(),
+              srcType, compType, OGLSurfaceData.OpenGLSurface);
     }
 
     @Override
-    public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
-                         Composite comp,
-                         final int x, final int y, final int w, final int h,
-                         final byte[] mask,
-                         final int maskoff, final int maskscan)
-    {
-        AlphaComposite acomp = (AlphaComposite)comp;
-        if (acomp.getRule() != AlphaComposite.SRC_OVER) {
-            comp = AlphaComposite.SrcOver;
-        }
-
-        OGLRenderQueue rq = OGLRenderQueue.getInstance();
-        rq.lock();
-        try {
-            validateOperation(sg2d, comp, mask != null);
-
-            RenderBuffer buf = rq.getBuffer();
-            if (mask != null) {
-                // we adjust the mask length so that the mask ends on a
-                // 4-byte boundary
-                int maskBytesRequired = (mask.length + 3) & (~3);
-                int padding = maskBytesRequired - mask.length;
-                int totalBytesRequired = 36 + maskBytesRequired;
+    protected native void maskFill(int x, int y, int w, int h,
+                                   int maskoff, int maskscan, int masklen,
+                                   byte[] mask);
 
-                if (totalBytesRequired <= buf.capacity()) {
-                    if (totalBytesRequired > buf.remaining()) {
-                        // process the queue first and then enqueue the mask
-                        rq.flushNow();
-                    }
-                    buf.putInt(MASK_FILL);
-                    // enqueue parameters
-                    buf.putInt(isSimpleColor ? 1 : 0);
-                    buf.putInt(x).putInt(y).putInt(w).putInt(h);
-                    buf.putInt(maskoff);
-                    buf.putInt(maskscan);
-                    buf.putInt(maskBytesRequired);
-                    // enqueue the mask
-                    buf.put(mask);
-                    if (padding != 0) {
-                        buf.position(buf.position() + padding);
-                    }
-                } else {
-                    // queue is too small to accomodate entire mask; perform
-                    // the operation directly on the queue flushing thread
-                    rq.flushAndInvokeNow(new Runnable() {
-                        public void run() {
-                            maskFill(isSimpleColor, x, y, w, h,
-                                     maskoff, maskscan, mask.length, mask);
-                        }
-                    });
-                }
-            } else {
-                // this should work because the current fillpipe will always
-                // be OGLRenderer for any of the compositing modes
-                // for which OGLMaskFill is defined
-                rq.ensureCapacity(20);
-                buf.putInt(FILL_RECT);
-                buf.putInt(x).putInt(y).putInt(w).putInt(h);
-            }
-
-            completeOperation();
-        } finally {
-            rq.unlock();
-        }
-    }
-
-    private native void maskFill(boolean isColor,
-                                 int x, int y, int w, int h,
-                                 int maskoff, int maskscan, int masklen,
-                                 byte[] mask);
-
-    protected void validateOperation(SunGraphics2D sg2d,
-                                     int pixel, Composite comp)
+    @Override
+    protected void validateContext(SunGraphics2D sg2d,
+                                   Composite comp, int ctxflags)
     {
         OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
         OGLContext.validateContext(dstData, dstData,
                                    sg2d.getCompClip(), comp,
-                                   null, pixel,
-                                   OGLContext.NO_CONTEXT_FLAGS);
-    }
-
-    /**
-     * Validates the state in the provided SunGraphics2D object and sets up
-     * any special resources for this operation (e.g. enabling gradient
-     * shading).
-     */
-    protected abstract void validateOperation(SunGraphics2D sg2d,
-                                              Composite comp,
-                                              boolean useMask);
-
-    /**
-     * Completes the operation by releasing any resources that were set up
-     * in validateOperation().
-     */
-    protected abstract void completeOperation();
-
-    private static class Solid extends OGLMaskFill {
-        protected Solid(SurfaceType srcType, CompositeType compType) {
-            super(srcType, compType, true);
-        }
-
-        @Override
-        protected void validateOperation(SunGraphics2D sg2d,
-                                         Composite comp, boolean useMask)
-        {
-            validateOperation(sg2d, sg2d.pixel, comp);
-        }
-
-        @Override
-        protected void completeOperation() {
-        }
-    }
-
-    private static class Paint extends OGLMaskFill {
-        private OGLPaints impl;
-
-        protected Paint(OGLPaints impl, boolean opaque,
-                        CompositeType compType)
-        {
-            super(impl.getSurfaceType(opaque), compType, false);
-            this.impl = impl;
-        }
-
-        @Override
-        protected void validateOperation(SunGraphics2D sg2d,
-                                         Composite comp, boolean useMask)
-        {
-            OGLRenderQueue rq = OGLRenderQueue.getInstance();
-            // assert rq.lock.isHeldByCurrentThread();
-            int pixel = OGLContext.getExtraAlphaPixel(comp);
-            validateOperation(sg2d, pixel, comp);
-            impl.enablePaint(rq, sg2d, useMask);
-        }
-
-        @Override
-        protected void completeOperation() {
-            OGLRenderQueue rq = OGLRenderQueue.getInstance();
-            // assert rq.lock.isHeldByCurrentThread();
-            impl.disablePaint(rq);
-        }
+                                   null, sg2d.paint, sg2d, ctxflags);
     }
 }
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLPaints.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLPaints.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,31 +25,20 @@
 
 package sun.java2d.opengl;
 
-import java.awt.Color;
 import java.awt.GradientPaint;
 import java.awt.LinearGradientPaint;
 import java.awt.MultipleGradientPaint;
 import java.awt.MultipleGradientPaint.ColorSpaceType;
 import java.awt.MultipleGradientPaint.CycleMethod;
-import java.awt.Paint;
 import java.awt.RadialGradientPaint;
 import java.awt.TexturePaint;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.AffineTransformOp;
 import java.awt.image.BufferedImage;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
-import sun.awt.image.PixelConverter;
 import sun.java2d.SunGraphics2D;
 import sun.java2d.SurfaceData;
 import sun.java2d.loops.CompositeType;
-import sun.java2d.loops.SurfaceType;
-import sun.java2d.pipe.RenderBuffer;
-import sun.java2d.pipe.RenderQueue;
-import static sun.java2d.pipe.BufferedOpCodes.*;
+import static sun.java2d.pipe.BufferedPaints.*;
 
 abstract class OGLPaints {
 
@@ -71,69 +60,26 @@
      * Attempts to locate an implementation corresponding to the paint state
      * of the provided SunGraphics2D object.  If no implementation can be
      * found, or if the paint cannot be accelerated under the conditions
-     * of the SunGraphics2D, this method returns null; otherwise, returns
-     * the located implementation.
+     * of the SunGraphics2D, this method returns false; otherwise, returns
+     * true.
      */
-    static OGLPaints getInstance(SunGraphics2D sg2d) {
+    static boolean isValid(SunGraphics2D sg2d) {
         OGLPaints impl = impls.get(sg2d.paintState);
-        if (impl == null || !impl.isPaintValid(sg2d)) {
-            return null;
-        }
-        return impl;
+        return (impl != null && impl.isPaintValid(sg2d));
     }
 
     /**
-     * Returns a Collection of all the registered implementations.
-     */
-    static Collection<OGLPaints> getAllInstances() {
-        return impls.values();
-    }
-
-    /**
-     * Returns the SurfaceType instance that describes the Paint that
-     * is accelerated by this implementation.
-     *
-     * @param opaque if true, this method may return a more specific
-     * SurfaceType that is optimized for opaque colors
-     */
-    abstract SurfaceType getSurfaceType(boolean opaque);
-
-    /**
      * Returns true if this implementation is able to accelerate the
      * Paint object associated with, and under the conditions of, the
      * provided SunGraphics2D instance; otherwise returns false.
      */
     abstract boolean isPaintValid(SunGraphics2D sg2d);
 
-    /**
-     * Enqueues the appropriate parameters that will enable acceleration
-     * of the Paint associated with the given SunGraphics2D instance.
-     *
-     * @param useMask if true, the Paint will need to be modulated with
-     * an alpha mask (specified separately), so the native code may need
-     * to perform extra steps to prepare for this situation
-     */
-    abstract void enablePaint(RenderQueue rq, SunGraphics2D sg2d,
-                              boolean useMask);
-
-    /**
-     * Enqueues the appropriate parameters that will disable acceleration
-     * of the current Paint object.
-     */
-    abstract void disablePaint(RenderQueue rq);
-
 /************************* GradientPaint support ****************************/
 
     private static class Gradient extends OGLPaints {
         private Gradient() {}
 
-        @Override
-        SurfaceType getSurfaceType(boolean opaque) {
-            return opaque ?
-                SurfaceType.OpaqueGradientPaint :
-                SurfaceType.GradientPaint;
-        }
-
         /**
          * There are no restrictions for accelerating GradientPaint, so
          * this method always returns true.
@@ -142,124 +88,6 @@
         boolean isPaintValid(SunGraphics2D sg2d) {
             return true;
         }
-
-        /**
-         * Note: This code is factored out into a separate static method
-         * so that it can be shared by both the Gradient and LinearGradient
-         * implementations.  LinearGradient uses this code (for the
-         * two-color sRGB case only) because it can be much faster than the
-         * equivalent implementation that uses fragment shaders.
-         *
-         * We use OpenGL's texture coordinate generator to automatically
-         * apply a smooth gradient (either cyclic or acyclic) to the geometry
-         * being rendered.  This technique is almost identical to the one
-         * described in the comments for OGLPaints.Texture.enablePaint(),
-         * except the calculations take place in one dimension instead of two.
-         * Instead of an anchor rectangle in the TexturePaint case, we use
-         * the vector between the two GradientPaint end points in our
-         * calculations.  The generator uses a single plane equation that
-         * takes the (x,y) location (in device space) of the fragment being
-         * rendered to calculate a (u) texture coordinate for that fragment:
-         *     u = Ax + By + Cz + Dw
-         *
-         * The gradient renderer uses a two-pixel 1D texture where the first
-         * pixel contains the first GradientPaint color, and the second pixel
-         * contains the second GradientPaint color.  (Note that we use the
-         * GL_CLAMP_TO_EDGE wrapping mode for acyclic gradients so that we
-         * clamp the colors properly at the extremes.)  The following diagram
-         * attempts to show the layout of the texture containing the two
-         * GradientPaint colors (C1 and C2):
-         *
-         *                        +-----------------+
-         *                        |   C1   |   C2   |
-         *                        |        |        |
-         *                        +-----------------+
-         *                      u=0  .25  .5   .75  1
-         *
-         * We calculate our plane equation constants (A,B,D) such that u=0.25
-         * corresponds to the first GradientPaint end point in user space and
-         * u=0.75 corresponds to the second end point.  This is somewhat
-         * non-obvious, but since the gradient colors are generated by
-         * interpolating between C1 and C2, we want the pure color at the
-         * end points, and we will get the pure color only when u correlates
-         * to the center of a texel.  The following chart shows the expected
-         * color for some sample values of u (where C' is the color halfway
-         * between C1 and C2):
-         *
-         *       u value      acyclic (GL_CLAMP)      cyclic (GL_REPEAT)
-         *       -------      ------------------      ------------------
-         *        -0.25              C1                       C2
-         *         0.0               C1                       C'
-         *         0.25              C1                       C1
-         *         0.5               C'                       C'
-         *         0.75              C2                       C2
-         *         1.0               C2                       C'
-         *         1.25              C2                       C1
-         *
-         * Original inspiration for this technique came from UMD's Agile2D
-         * project (GradientManager.java).
-         */
-        static void enableGradientPaint(RenderQueue rq, AffineTransform at,
-                                        Color c1, Color c2,
-                                        Point2D pt1, Point2D pt2,
-                                        boolean isCyclic, boolean useMask)
-        {
-            // convert gradient colors to IntRgbaPre format
-            PixelConverter pc = PixelConverter.RgbaPre.instance;
-            int pixel1 = pc.rgbToPixel(c1.getRGB(), null);
-            int pixel2 = pc.rgbToPixel(c2.getRGB(), null);
-
-            // calculate plane equation constants
-            double x = pt1.getX();
-            double y = pt1.getY();
-            at.translate(x, y);
-            // now gradient point 1 is at the origin
-            x = pt2.getX() - x;
-            y = pt2.getY() - y;
-            double len = Math.sqrt(x * x + y * y);
-            at.rotate(x, y);
-            // now gradient point 2 is on the positive x-axis
-            at.scale(2*len, 1);
-            // now gradient point 2 is at (0.5, 0)
-            at.translate(-0.25, 0);
-            // now gradient point 1 is at (0.25, 0), point 2 is at (0.75, 0)
-
-            double p0, p1, p3;
-            try {
-                at.invert();
-                p0 = at.getScaleX();
-                p1 = at.getShearX();
-                p3 = at.getTranslateX();
-            } catch (java.awt.geom.NoninvertibleTransformException e) {
-                p0 = p1 = p3 = 0.0;
-            }
-
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacityAndAlignment(40, 8);
-            RenderBuffer buf = rq.getBuffer();
-            buf.putInt(ENABLE_GRADIENT_PAINT);
-            buf.putInt(isCyclic ? 1 : 0);
-            buf.putDouble(p0).putDouble(p1).putDouble(p3);
-            buf.putInt(pixel1).putInt(pixel2);            
-        }
-
-        @Override
-        void enablePaint(RenderQueue rq, SunGraphics2D sg2d,
-                         boolean useMask)
-        {
-            GradientPaint paint = (GradientPaint)sg2d.paint;
-            enableGradientPaint(rq, (AffineTransform)sg2d.transform.clone(),
-                                paint.getColor1(), paint.getColor2(),
-                                paint.getPoint1(), paint.getPoint2(),
-                                paint.isCyclic(), false);
-        }
-
-        @Override
-        void disablePaint(RenderQueue rq) {
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacity(4);
-            rq.getBuffer().putInt(DISABLE_GRADIENT_PAINT);
-        }
     }
 
 /************************** TexturePaint support ****************************/
@@ -267,13 +95,6 @@
     private static class Texture extends OGLPaints {
         private Texture() {}
 
-        @Override
-        SurfaceType getSurfaceType(boolean opaque) {
-            return opaque ?
-                SurfaceType.OpaqueTexturePaint :
-                SurfaceType.TexturePaint;
-        }
-
         /**
          * Returns true if the given TexturePaint instance can be used by the
          * accelerated OGLPaints.Texture implementation.  A TexturePaint is
@@ -323,114 +144,11 @@
 
             return true;
         }
-
-        /**
-         * We use OpenGL's texture coordinate generator to automatically
-         * map the TexturePaint image to the geometry being rendered.  The
-         * generator uses two separate plane equations that take the (x,y)
-         * location (in device space) of the fragment being rendered to
-         * calculate (u,v) texture coordinates for that fragment:
-         *     u = Ax + By + Cz + Dw
-         *     v = Ex + Fy + Gz + Hw
-         *
-         * Since we use a 2D orthographic projection, we can assume that z=0
-         * and w=1 for any fragment.  So we need to calculate appropriate
-         * values for the plane equation constants (A,B,D) and (E,F,H) such
-         * that {u,v}=0 for the top-left of the TexturePaint's anchor
-         * rectangle and {u,v}=1 for the bottom-right of the anchor rectangle.
-         * We can easily make the texture image repeat for {u,v} values
-         * outside the range [0,1] by specifying the GL_REPEAT texture wrap
-         * mode.
-         *
-         * Calculating the plane equation constants is surprisingly simple.
-         * We can think of it as an inverse matrix operation that takes
-         * device space coordinates and transforms them into user space
-         * coordinates that correspond to a location relative to the anchor
-         * rectangle.  First, we translate and scale the current user space
-         * transform by applying the anchor rectangle bounds.  We then take
-         * the inverse of this affine transform.  The rows of the resulting
-         * inverse matrix correlate nicely to the plane equation constants
-         * we were seeking.
-         */
-        @Override
-        void enablePaint(RenderQueue rq, SunGraphics2D sg2d,
-                         boolean useMask)
-        {
-            TexturePaint paint = (TexturePaint)sg2d.paint;
-            BufferedImage bi = paint.getImage();
-            SurfaceData dstData = sg2d.surfaceData;
-            SurfaceData srcData =
-                dstData.getSourceSurfaceData(bi, sg2d.TRANSFORM_ISIDENT,
-                                             CompositeType.SrcOver, null);
-            if (!(srcData instanceof OGLSurfaceData)) {
-                // this should not happen because we've already validated
-                // things in isPaintValid(), but just in case of failure
-                // we can no-op here
-                return;
-            }
-
-            boolean filter =
-                (sg2d.interpolationType !=
-                 AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
-
-            // calculate plane equation constants
-            AffineTransform at = (AffineTransform)sg2d.transform.clone();
-            Rectangle2D anchor = paint.getAnchorRect();
-            at.translate(anchor.getX(), anchor.getY());
-            at.scale(anchor.getWidth(), anchor.getHeight());
-
-            double xp0, xp1, xp3, yp0, yp1, yp3;
-            try {
-                at.invert();
-                xp0 = at.getScaleX();
-                xp1 = at.getShearX();
-                xp3 = at.getTranslateX();
-                yp0 = at.getShearY();
-                yp1 = at.getScaleY();
-                yp3 = at.getTranslateY();
-            } catch (java.awt.geom.NoninvertibleTransformException e) {
-                xp0 = xp1 = xp3 = yp0 = yp1 = yp3 = 0.0;
-            }
-
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacityAndAlignment(64, 8);
-            RenderBuffer buf = rq.getBuffer();
-            buf.putInt(ENABLE_TEXTURE_PAINT);
-            buf.putInt(filter ? 1 : 0);
-            buf.putLong(srcData.getNativeOps());
-            buf.putDouble(xp0).putDouble(xp1).putDouble(xp3);
-            buf.putDouble(yp0).putDouble(yp1).putDouble(yp3);
-        }
-
-        @Override
-        void disablePaint(RenderQueue rq) {
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacity(4);
-            rq.getBuffer().putInt(DISABLE_TEXTURE_PAINT);
-        }
     }
 
 /****************** Shared MultipleGradientPaint support ********************/
 
     private static abstract class MultiGradient extends OGLPaints {
-
-        /**
-         * The maximum number of gradient "stops" supported by our native
-         * fragment shader implementations.
-         *
-         * This value has been empirically determined and capped to allow
-         * our native shaders to run on all shader-level graphics hardware,
-         * even on the older, more limited GPUs.  Even the oldest Nvidia
-         * hardware could handle 16, or even 32 fractions without any problem.
-         * But the first-generation boards from ATI would fall back into
-         * software mode (which is unusably slow) for values larger than 12;
-         * it appears that those boards do not have enough native registers
-         * to support the number of array accesses required by our gradient
-         * shaders.  So for now we will cap this value at 12, but we can
-         * re-evaluate this in the future as hardware becomes more capable.
-         */
-        public static final int MAX_FRACTIONS = 12;
-
         protected MultiGradient() {}
 
         /**
@@ -446,7 +164,7 @@
             MultipleGradientPaint paint = (MultipleGradientPaint)sg2d.paint;
             // REMIND: ugh, this creates garbage; would be nicer if
             // we had a MultipleGradientPaint.getNumStops() method...
-            if (paint.getFractions().length > MAX_FRACTIONS) {
+            if (paint.getFractions().length > MULTI_MAX_FRACTIONS) {
                 return false;
             }
 
@@ -458,91 +176,14 @@
 
             return true;
         }
-
-        /**
-         * Helper function to convert a color component in sRGB space to
-         * linear RGB space.  Copied directly from the
-         * MultipleGradientPaintContext class.
-         */
-        private static int convertSRGBtoLinearRGB(int color) {
-            float input, output;
-
-            input = color / 255.0f;
-            if (input <= 0.04045f) {
-                output = input / 12.92f;
-            } else {
-                output = (float)Math.pow((input + 0.055) / 1.055, 2.4);
-            }
-
-            return Math.round(output * 255.0f);
-        }
-
-        /**
-         * Helper function to convert a (non-premultiplied) Color in sRGB
-         * space to an IntRgbaPre pixel value, optionally in linear RGB space.
-         * Based on the PixelConverter.RgbaPre.rgbToPixel() method.
-         */
-	private static int colorToIntRgbaPrePixel(Color c, boolean linear) {
-            int rgb = c.getRGB();
-	    if (!linear && ((rgb >> 24) == -1)) {
-                return ((rgb << 8) | (rgb >>> 24));
-	    }
-	    int a = rgb >>> 24;
-	    int r = (rgb >> 16) & 0xff;
-	    int g = (rgb >>  8) & 0xff;
-	    int b = (rgb      ) & 0xff;
-            if (linear) {
-                r = convertSRGBtoLinearRGB(r);
-                g = convertSRGBtoLinearRGB(g);
-                b = convertSRGBtoLinearRGB(b);
-            }
-	    int a2 = a + (a >> 7);
-	    r = (r * a2) >> 8;
-	    g = (g * a2) >> 8;
-	    b = (b * a2) >> 8;
-	    return ((r << 24) | (g << 16) | (b << 8) | (a));
-	}
-
-        /**
-         * Converts the given array of Color objects into an int array
-         * containing IntRgbaPre pixel values.  If the linear parameter
-         * is true, the Color values will be converted into a linear RGB
-         * color space before being returned.
-         */
-        protected static int[] convertToIntRgbaPrePixels(Color[] colors,
-                                                         boolean linear)
-        {
-            int[] pixels = new int[colors.length];
-            for (int i = 0; i < colors.length; i++) {
-                pixels[i] = colorToIntRgbaPrePixel(colors[i], linear);
-            }
-            return pixels;
-        }
     }
 
 /********************** LinearGradientPaint support *************************/
 
     private static class LinearGradient extends MultiGradient {
-
-        /*
-         * Flag that is set in enablePaint() to indicate whether we are
-         * delegating to the two-color optimized path.  Only used by
-         * disablePaint() to know which opcode to place on the queue.  Note
-         * that this variable is always used under the RenderQueue lock, so
-         * no extra synchronization is required.
-         */
-        private boolean isSimpleGradient;
-
         private LinearGradient() {}
 
         @Override
-        SurfaceType getSurfaceType(boolean opaque) {
-            return opaque ?
-                SurfaceType.OpaqueLinearGradientPaint :
-                SurfaceType.LinearGradientPaint;
-        }
-
-        @Override
         boolean isPaintValid(SunGraphics2D sg2d) {
             LinearGradientPaint paint = (LinearGradientPaint)sg2d.paint;
 
@@ -557,203 +198,11 @@
 
             return super.isPaintValid(sg2d);
         }
-
-        /**
-         * This method uses techniques that are nearly identical to those
-         * employed in Gradient.enablePaint() above.  The primary difference
-         * is that at the native level we use a fragment shader to manually
-         * apply the plane equation constants to the current fragment position
-         * to calculate the gradient position in the range [0,1] (the native
-         * code for GradientPaint does the same, except that it uses OpenGL's
-         * automatic texture coordinate generation facilities).
-         *
-         * One other minor difference worth mentioning is that
-         * Gradient.enablePaint() calculates the plane equation constants
-         * such that the gradient end points are positioned at 0.25 and 0.75
-         * (for reasons discussed in the comments for that method).  In
-         * contrast, for LinearGradientPaint we setup the equation constants
-         * such that the gradient end points fall at 0.0 and 1.0.  The
-         * reason for this difference is that in the fragment shader we
-         * have more control over how the gradient values are interpreted
-         * (depending on the paint's CycleMethod).
-         */
-        @Override
-        void enablePaint(RenderQueue rq, SunGraphics2D sg2d,
-                         boolean useMask)
-        {
-            LinearGradientPaint paint = (LinearGradientPaint)sg2d.paint;
-            boolean linear =
-                (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
-            Color[] colors = paint.getColors();
-            int numStops = colors.length;
-            Point2D pt1 = paint.getStartPoint();
-            Point2D pt2 = paint.getEndPoint();
-            AffineTransform at = paint.getTransform();
-            at.preConcatenate(sg2d.transform);
-
-            if (!linear && numStops == 2 &&
-                paint.getCycleMethod() != CycleMethod.REPEAT)
-            {
-                // delegate to the optimized two-color gradient codepath
-                isSimpleGradient = true;
-                boolean isCyclic =
-                    (paint.getCycleMethod() != CycleMethod.NO_CYCLE);
-                Gradient.enableGradientPaint(rq, at,
-                                             colors[0], colors[1],
-                                             pt1, pt2,
-                                             isCyclic, useMask);
-                return;
-            } else {
-                // use the more general multi-stop codepath
-                isSimpleGradient = false;
-            }
-
-            int cycleMethod = paint.getCycleMethod().ordinal();
-            float[] fractions = paint.getFractions();
-            int[] pixels = convertToIntRgbaPrePixels(colors, linear);
-
-            // calculate plane equation constants
-            double x = pt1.getX();
-            double y = pt1.getY();
-            at.translate(x, y);
-            // now gradient point 1 is at the origin
-            x = pt2.getX() - x;
-            y = pt2.getY() - y;
-            double len = Math.sqrt(x * x + y * y);
-            at.rotate(x, y);
-            // now gradient point 2 is on the positive x-axis
-            at.scale(len, 1);
-            // now gradient point 1 is at (0.0, 0), point 2 is at (1.0, 0)
-
-            float p0, p1, p3;
-            try {
-                at.invert();
-                p0 = (float)at.getScaleX();
-                p1 = (float)at.getShearX();
-                p3 = (float)at.getTranslateX();
-            } catch (java.awt.geom.NoninvertibleTransformException e) {
-                p0 = p1 = p3 = 0.0f;
-            }
-
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacity(20 + 12 + (numStops*4*2));
-            RenderBuffer buf = rq.getBuffer();
-            buf.putInt(ENABLE_LINEAR_GRADIENT_PAINT);
-            buf.putInt(useMask ? 1 : 0);
-            buf.putInt(linear  ? 1 : 0);
-            buf.putInt(cycleMethod);
-            buf.putInt(numStops);
-            buf.putFloat(p0);
-            buf.putFloat(p1);
-            buf.putFloat(p3);
-            buf.put(fractions);
-            buf.put(pixels);
-        }
-
-        @Override
-        void disablePaint(RenderQueue rq) {
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacity(4);
-            rq.getBuffer().putInt(isSimpleGradient ?
-                                  DISABLE_GRADIENT_PAINT :
-                                  DISABLE_LINEAR_GRADIENT_PAINT);
-        }
     }
 
 /********************** RadialGradientPaint support *************************/
 
     private static class RadialGradient extends MultiGradient {
         private RadialGradient() {}
-
-        @Override
-        SurfaceType getSurfaceType(boolean opaque) {
-            return opaque ?
-                SurfaceType.OpaqueRadialGradientPaint :
-                SurfaceType.RadialGradientPaint;
-        }
-
-        /**
-         * This method calculates six m** values and a focusX value that
-         * are used by the native fragment shader.  These techniques are
-         * based on a whitepaper by Daniel Rice on radial gradient performance
-         * (attached to the bug report for 6521533).  One can refer to that
-         * document for the complete set of formulas and calculations, but
-         * the basic goal is to compose a transform that will convert an
-         * (x,y) position in device space into a "u" value that represents
-         * the relative distance to the gradient focus point.  The resulting
-         * value can be used to look up the appropriate color by linearly
-         * interpolating between the two nearest colors in the gradient.
-         */
-        @Override
-        void enablePaint(RenderQueue rq, SunGraphics2D sg2d,
-                         boolean useMask)
-        {
-            RadialGradientPaint paint = (RadialGradientPaint)sg2d.paint;
-            boolean linear =
-                (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
-            int cycleMethod = paint.getCycleMethod().ordinal();
-            float[] fractions = paint.getFractions();
-            Color[] colors = paint.getColors();
-            int numStops = colors.length;
-            int[] pixels = convertToIntRgbaPrePixels(colors, linear);
-            Point2D center = paint.getCenterPoint();
-            Point2D focus = paint.getFocusPoint();
-            float radius = paint.getRadius();
-
-            // save original (untransformed) center and focus points
-            double cx = center.getX();
-            double cy = center.getY();
-            double fx = focus.getX();
-            double fy = focus.getY();
-
-            // transform from gradient coords to device coords
-            AffineTransform at = paint.getTransform();
-            at.preConcatenate(sg2d.transform);
-            focus = at.transform(focus, focus);
-
-            // transform unit circle to gradient coords; we start with the
-            // unit circle (center=(0,0), focus on positive x-axis, radius=1)
-            // and then transform into gradient space
-            at.translate(cx, cy);
-            at.rotate(fx - cx, fy - cy);
-            at.scale(radius, radius);
-            
-            // invert to get mapping from device coords to unit circle
-            try {
-                at.invert();
-            } catch (Exception e) {
-                at.setToScale(0.0, 0.0);
-            }
-            focus = at.transform(focus, focus);
-
-            // clamp the focus point so that it does not rest on, or outside
-            // of, the circumference of the gradient circle
-            fx = Math.min(focus.getX(), 0.99);
-
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacity(20 + 28 + (numStops*4*2));
-            RenderBuffer buf = rq.getBuffer();
-            buf.putInt(ENABLE_RADIAL_GRADIENT_PAINT);
-            buf.putInt(useMask ? 1 : 0);
-            buf.putInt(linear  ? 1 : 0);
-            buf.putInt(numStops);
-            buf.putInt(cycleMethod);
-            buf.putFloat((float)at.getScaleX());
-            buf.putFloat((float)at.getShearX());
-            buf.putFloat((float)at.getTranslateX());
-            buf.putFloat((float)at.getShearY());
-            buf.putFloat((float)at.getScaleY());
-            buf.putFloat((float)at.getTranslateY());
-            buf.putFloat((float)fx);
-            buf.put(fractions);
-            buf.put(pixels);
-        }
-
-        @Override
-        void disablePaint(RenderQueue rq) {
-            // assert rq.lock.isHeldByCurrentThread();
-            rq.ensureCapacity(4);
-            rq.getBuffer().putInt(DISABLE_RADIAL_GRADIENT_PAINT);
-        }
     }
 }
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLRenderer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLRenderer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -34,60 +34,21 @@
 import sun.java2d.pipe.SpanIterator;
 import static sun.java2d.pipe.BufferedOpCodes.*;
 
-abstract class OGLRenderer extends BufferedRenderPipe {
+class OGLRenderer extends BufferedRenderPipe {
 
     OGLRenderer(RenderQueue rq) {
         super(rq);
     }
 
-    protected void validateOperation(SunGraphics2D sg2d,
-                                     int pixel, boolean opaque)
-    {
+    @Override
+    protected void validateContext(SunGraphics2D sg2d) {
         int ctxflags =
-            opaque ? OGLContext.SRC_IS_OPAQUE : OGLContext.NO_CONTEXT_FLAGS;
+            sg2d.paint.getTransparency() == Transparency.OPAQUE ?
+                OGLContext.SRC_IS_OPAQUE : OGLContext.NO_CONTEXT_FLAGS;
         OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
         OGLContext.validateContext(dstData, dstData,
                                    sg2d.getCompClip(), sg2d.composite,
-                                   null, pixel, ctxflags);
-    }
-
-    static class Solid extends OGLRenderer {
-        Solid(RenderQueue rq) {
-            super(rq);
-        }
-
-        @Override
-        protected void validateOperation(SunGraphics2D sg2d) {
-            int pixel = sg2d.pixel;
-            validateOperation(sg2d, pixel, (pixel >>> 24) == 0xff);
-        }
-
-        @Override
-        protected void completeOperation() {
-        }
-    }
-
-    static class Paint extends OGLRenderer {
-        private OGLPaints impl;
-
-        Paint(RenderQueue rq, OGLPaints impl) {
-            super(rq);
-            this.impl = impl;
-        }
-
-        @Override
-        protected void validateOperation(SunGraphics2D sg2d) {
-            boolean opaque =
-                sg2d.paint.getTransparency() == Transparency.OPAQUE;
-            int pixel = OGLContext.getExtraAlphaPixel(sg2d.composite);
-            validateOperation(sg2d, pixel, opaque);
-            impl.enablePaint(rq, sg2d, false);
-        }
-
-        @Override
-        protected void completeOperation() {
-            impl.disablePaint(rq);
-        }
+                                   null, sg2d.paint, sg2d, ctxflags);
     }
 
     void copyArea(SunGraphics2D sg2d,
@@ -95,14 +56,18 @@
     {
         rq.lock();
         try {
-            boolean opaque =
-                sg2d.surfaceData.getTransparency() == Transparency.OPAQUE;
-            validateOperation(sg2d, sg2d.pixel, opaque);
+            int ctxflags =
+                sg2d.surfaceData.getTransparency() == Transparency.OPAQUE ?
+                    OGLContext.SRC_IS_OPAQUE : OGLContext.NO_CONTEXT_FLAGS;
+            OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
+            OGLContext.validateContext(dstData, dstData,
+                                       sg2d.getCompClip(), sg2d.composite,
+                                       null, null, null, ctxflags);
+
             rq.ensureCapacity(28);
             buf.putInt(COPY_AREA);
             buf.putInt(x).putInt(y).putInt(w).putInt(h);
             buf.putInt(dx).putInt(dy);
-            completeOperation();
         } finally {
             rq.unlock();
         }
@@ -123,11 +88,8 @@
             super(oglr.rq);
             this.oglr = oglr;
         }
-        protected void validateOperation(SunGraphics2D sg2d) {
-            oglr.validateOperation(sg2d);
-        }
-        protected void completeOperation() {
-            oglr.completeOperation();
+        protected void validateContext(SunGraphics2D sg2d) {
+            oglr.validateContext(sg2d);
         }
         public void drawLine(SunGraphics2D sg2d,
                              int x1, int y1, int x2, int y2)
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLSurfaceData.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLSurfaceData.java	Fri Jun 22 00:46:43 2007 +0000
@@ -27,12 +27,9 @@
 
 import java.awt.AlphaComposite;
 import java.awt.GraphicsEnvironment;
-import java.awt.TexturePaint;
 import java.awt.Transparency;
 import java.awt.image.ColorModel;
 import java.awt.image.Raster;
-import java.util.HashMap;
-import java.util.Map;
 import sun.awt.SunHints;
 import sun.awt.image.PixelConverter;
 import sun.java2d.SunGraphics2D;
@@ -154,12 +151,8 @@
     private int textureTarget;
     protected int type;
 
-    protected static OGLRenderer oglSolidPipe;
-    protected static PixelToShapeConverter oglTxSolidPipe;
-    protected static Map<OGLPaints, OGLRenderer> oglPaintPipes =
-        new HashMap<OGLPaints, OGLRenderer>(4, 1.0f);
-    protected static Map<OGLPaints, PixelToShapeConverter> oglTxPaintPipes =
-        new HashMap<OGLPaints, PixelToShapeConverter>(4, 1.0f);
+    protected static OGLRenderer oglRenderPipe;
+    protected static PixelToShapeConverter oglTxRenderPipe;
     protected static OGLTextRenderer oglTextPipe;
     protected static OGLDrawImage oglImagePipe;
 
@@ -204,26 +197,15 @@
                     "sun.java2d.opengl.gradshader"));
             isGradShaderEnabled = !"false".equals(grad);
 
-            boolean tracing = GraphicsPrimitive.tracingEnabled();
             OGLRenderQueue rq = OGLRenderQueue.getInstance();
             oglImagePipe = new OGLDrawImage();
-
-            oglTextPipe = new OGLTextRenderer();
-            oglSolidPipe = new OGLRenderer.Solid(rq);
-            if (tracing) {
+            oglTextPipe = new OGLTextRenderer(rq);
+            oglRenderPipe = new OGLRenderer(rq);
+            if (GraphicsPrimitive.tracingEnabled()) {
                 oglTextPipe = oglTextPipe.traceWrap();
-                oglSolidPipe = oglSolidPipe.traceWrap();
+                oglRenderPipe = oglRenderPipe.traceWrap();
             }
-            oglTxSolidPipe = new PixelToShapeConverter(oglSolidPipe);
-
-            for (OGLPaints impl : OGLPaints.getAllInstances()) {
-                OGLRenderer pipe = new OGLRenderer.Paint(rq, impl);
-                if (tracing) {
-                    pipe = pipe.traceWrap();
-                }
-                oglPaintPipes.put(impl, pipe);
-                oglTxPaintPipes.put(impl, new PixelToShapeConverter(pipe));
-            }
+            oglTxRenderPipe = new PixelToShapeConverter(oglRenderPipe);
 
             OGLBlitLoops.register();
             OGLMaskFill.register();
@@ -432,14 +414,13 @@
         if (sg2d.antialiasHint != SunHints.INTVAL_ANTIALIAS_ON) {
             if (sg2d.paintState <= sg2d.PAINT_ALPHACOLOR) {
                 if (sg2d.compositeState <= sg2d.COMP_XOR) {
-                    txPipe = oglTxSolidPipe;
-                    nonTxPipe = oglSolidPipe;
+                    txPipe = oglTxRenderPipe;
+                    nonTxPipe = oglRenderPipe;
                 }
             } else if (sg2d.compositeState <= sg2d.COMP_ALPHA) {
-                OGLPaints impl = OGLPaints.getInstance(sg2d);
-                if (impl != null) {
-                    txPipe = oglTxPaintPipes.get(impl);
-                    nonTxPipe = oglPaintPipes.get(impl);
+                if (OGLPaints.isValid(sg2d)) {
+                    txPipe = oglTxRenderPipe;
+                    nonTxPipe = oglRenderPipe;
                 }
                 // custom paints handled by super.validatePipe() below
             }
@@ -448,8 +429,8 @@
                 sg2d.compositeState == sg2d.COMP_XOR)
             {
                 // install the solid pipes when AA and XOR are both enabled
-                txPipe = oglTxSolidPipe;
-                nonTxPipe = oglSolidPipe;
+                txPipe = oglTxRenderPipe;
+                nonTxPipe = oglRenderPipe;
             }
             // other cases handled by super.validatePipe() below
         }
@@ -493,8 +474,7 @@
              * In all other cases, we return null, in which case the
              * validation code will choose a more general software-based loop.
              */
-            OGLPaints impl = OGLPaints.getInstance(sg2d);
-            if (impl == null ||
+            if (!OGLPaints.isValid(sg2d) ||
                 !graphicsConfig.isCapPresent(CAPS_EXT_MULTITEXTURE))
             {
                 return null;
@@ -512,7 +492,7 @@
             x += sg2d.transX;
             y += sg2d.transY;
 
-            oglSolidPipe.copyArea(sg2d, x, y, w, h, dx, dy);
+            oglRenderPipe.copyArea(sg2d, x, y, w, h, dx, dy);
 
             return true;
         }
--- a/j2se/src/share/classes/sun/java2d/opengl/OGLTextRenderer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/opengl/OGLTextRenderer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,149 +25,44 @@
 
 package sun.java2d.opengl;
 
-import java.awt.AlphaComposite;
 import java.awt.Composite;
 import sun.font.GlyphList;
 import sun.java2d.SunGraphics2D;
-import sun.java2d.SurfaceData;
 import sun.java2d.loops.GraphicsPrimitive;
-import sun.java2d.pipe.GlyphListPipe;
-import sun.java2d.pipe.Region;
-import sun.java2d.pipe.RenderBuffer;
+import sun.java2d.pipe.BufferedTextPipe;
 import sun.java2d.pipe.RenderQueue;
-import static sun.java2d.pipe.BufferedOpCodes.*;
-
-/**
- * The native OGLTextRenderer implementation is similar to the OGLMaskFill
- * operation and shares the same restrictions regarding SurfaceType and
- * CompositeType.  See OGLMaskFill.java for more information.
- */
-class OGLTextRenderer extends GlyphListPipe {
-
-    private static final int BYTES_PER_GLYPH_IMAGE = 8;
-    private static final int BYTES_PER_GLYPH_POSITION = 8;
 
-    /**
-     * The following offsets are used to pack the parameters in
-     * createPackedParams().  (They are also used at the native level when
-     * unpacking the params.)
-     */
-    private static final int OFFSET_CONTRAST  = 8;
-    private static final int OFFSET_RGBORDER  = 2;
-    private static final int OFFSET_SUBPIXPOS = 1;
-    private static final int OFFSET_POSITIONS = 0;
+class OGLTextRenderer extends BufferedTextPipe {
 
-    /**
-     * Packs the given parameters into a single int value in order to save
-     * space on the rendering queue.  Note that most of these parameters
-     * are only used for rendering LCD-optimized text, but conditionalizing
-     * this work wouldn't make any impact on performance, so we will pack
-     * those parameters even in the non-LCD case.
-     */
-    private static int createPackedParams(SunGraphics2D sg2d, GlyphList gl) {
-        return
-            (((gl.usePositions() ? 1 : 0)   << OFFSET_POSITIONS) |
-             ((gl.isSubPixPos()  ? 1 : 0)   << OFFSET_SUBPIXPOS) |
-             ((gl.isRGBOrder()   ? 1 : 0)   << OFFSET_RGBORDER ) |
-             ((sg2d.lcdTextContrast & 0xff) << OFFSET_CONTRAST ));
+    OGLTextRenderer(RenderQueue rq) {
+        super(rq);
     }
 
-    private void drawGlyphList(RenderQueue rq,
-                               final SunGraphics2D sg2d, final GlyphList gl)
-    {
-        // assert rq.lock.isHeldByCurrentThread();
-        RenderBuffer buf = rq.getBuffer();
-        final int totalGlyphs = gl.getNumGlyphs();
-        int glyphBytesRequired = totalGlyphs * BYTES_PER_GLYPH_IMAGE;
-        int posBytesRequired =
-            gl.usePositions() ? totalGlyphs * BYTES_PER_GLYPH_POSITION : 0;
-        int totalBytesRequired = 24 + glyphBytesRequired + posBytesRequired;
-
-        final long[] images = gl.getImages();
-        final float glyphListOrigX = gl.getX() + 0.5f;
-        final float glyphListOrigY = gl.getY() + 0.5f;
-
-        // make sure the RenderQueue keeps a hard reference to the FontStrike
-        // so that the associated glyph images are not disposed while enqueued
-        rq.addReference(gl.getStrike());
+    @Override
+    protected native void drawGlyphList(int numGlyphs, boolean usePositions,
+                                        boolean subPixPos, boolean rgbOrder,
+                                        int lcdContrast,
+                                        float glOrigX, float glOrigY,
+                                        long[] images, float[] positions);
 
-        if (totalBytesRequired <= buf.capacity()) {
-            if (totalBytesRequired > buf.remaining()) {
-                // process the queue first and then enqueue the glyphs
-                rq.flushNow();
-            }
-            rq.ensureAlignment(20);
-            buf.putInt(DRAW_GLYPH_LIST);
-            // enqueue parameters
-            buf.putInt(totalGlyphs);
-            buf.putInt(createPackedParams(sg2d, gl));
-            buf.putFloat(glyphListOrigX);
-            buf.putFloat(glyphListOrigY);
-            // now enqueue glyph information
-            buf.put(images, 0, totalGlyphs);
-            if (gl.usePositions()) {
-                float[] positions = gl.getPositions();
-                buf.put(positions, 0, 2*totalGlyphs);
-            }
-        } else {
-            // queue is too small to accomodate glyphs; perform
-            // the operation directly on the queue flushing thread
-            rq.flushAndInvokeNow(new Runnable() {
-                public void run() {
-                    drawGlyphList(totalGlyphs, gl.usePositions(),
-                                  gl.isSubPixPos(), gl.isRGBOrder(),
-                                  sg2d.lcdTextContrast,
-                                  glyphListOrigX, glyphListOrigY,
-                                  images, gl.getPositions());
-                }
-            });
-        }
-    }
-
-    private native void drawGlyphList(int numGlyphs, boolean usePositions,
-                                      boolean subPixPos, boolean rgbOrder,
-                                      int lcdContrast,
-                                      float glOrigX, float glOrigY,
-                                      long[] images, float[] positions);
-
-    protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
-        /*
-         * The native drawGlyphList() only works with two composite types:
-         *    - CompositeType.SrcOver (with any extra alpha), or
-         *    - CompositeType.Xor
-         */
-        Composite comp = sg2d.composite;
-        if (comp == AlphaComposite.Src) {
-            /*
-             * In addition to the composite types listed above, the logic
-             * in OGLSurfaceData.validatePipe() allows for
-             * CompositeType.SrcNoEa, but only in the presence of an opaque
-             * color.  If we reach this case, we know the color is opaque,
-             * and therefore SrcNoEa is the same as SrcOverNoEa, so we
-             * override the composite here.
-             */
-            comp = AlphaComposite.SrcOver;
-        }
-
-        OGLRenderQueue rq = OGLRenderQueue.getInstance();
-        rq.lock();
-        try {
-            OGLSurfaceData oglDst = (OGLSurfaceData)sg2d.surfaceData;
-            OGLContext.validateContext(oglDst, oglDst,
-                                       sg2d.getCompClip(), comp,
-                                       null, sg2d.pixel,
-                                       OGLContext.NO_CONTEXT_FLAGS);
-            drawGlyphList(rq, sg2d, gl);
-        } finally {
-            rq.unlock();
-        }
+    @Override
+    protected void validateContext(SunGraphics2D sg2d, Composite comp) {
+        // assert rq.lock.isHeldByCurrentThread();
+        OGLSurfaceData oglDst = (OGLSurfaceData)sg2d.surfaceData;
+        OGLContext.validateContext(oglDst, oglDst,
+                                   sg2d.getCompClip(), comp,
+                                   null, sg2d.paint, sg2d,
+                                   OGLContext.NO_CONTEXT_FLAGS);
     }
 
     OGLTextRenderer traceWrap() {
-        return new Tracer();
+        return new Tracer(this);
     }
 
     private static class Tracer extends OGLTextRenderer {
+        Tracer(OGLTextRenderer ogltr) {
+            super(ogltr.rq);
+        }
 	protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
 	    GraphicsPrimitive.tracePrimitive("OGLDrawGlyphs");
 	    super.drawGlyphList(sg2d, gl);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/AAShapePipe.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,149 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.pipe;
+
+import java.awt.BasicStroke;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.PathIterator;
+import sun.awt.SunHints;
+import sun.java2d.SunGraphics2D;
+
+/**
+ * This class is used to convert raw geometry into 8-bit alpha tiles
+ * using an AATileGenerator for application by the next stage of
+ * the pipeline.
+ * This class sets up the Generator and computes the alpha tiles
+ * and then passes them on to a CompositePipe object for painting.
+ */
+public class AAShapePipe implements ShapeDrawPipe {
+    static RenderingEngine renderengine = RenderingEngine.getInstance();
+
+    CompositePipe outpipe;
+
+    public AAShapePipe(CompositePipe pipe) {
+	outpipe = pipe;
+    }
+
+    public void draw(SunGraphics2D sg, Shape s) {
+	BasicStroke bs;
+
+	if (sg.stroke instanceof BasicStroke) {
+	    bs = (BasicStroke) sg.stroke;
+	} else {
+	    s = sg.stroke.createStrokedShape(s);
+	    bs = null;
+	}
+
+	renderPath(sg, s, bs);
+    }
+
+    public void fill(SunGraphics2D sg, Shape s) {
+	renderPath(sg, s, null);
+    }
+
+    private static byte[] theTile;
+
+    public synchronized static byte[] getAlphaTile(int len) {	
+	byte[] t = theTile;
+	if (t == null || t.length < len) {
+	    t = new byte[len];
+	} else {
+	    theTile = null;
+	}
+	return t;
+    }
+
+    public synchronized static void dropAlphaTile(byte[] t) {
+	theTile = t;
+    }
+
+    public void renderPath(SunGraphics2D sg, Shape s, BasicStroke bs) {
+	boolean adjust = (bs != null &&
+			  sg.strokeHint != SunHints.INTVAL_STROKE_PURE);
+	boolean thin = (sg.strokeState <= sg.STROKE_THINDASHED);
+	Object context = null;
+	byte alpha[] = null;
+
+        Region clip = sg.getCompClip();
+        int abox[] = new int[4];
+        AATileGenerator aatg =
+            renderengine.getAATileGenerator(s, sg.transform, clip,
+                                            bs, thin, adjust, abox);
+        if (aatg == null) {
+            // Nothing to render
+            return;
+        }
+
+	try {
+	    context = outpipe.startSequence(sg, s,
+                                            new Rectangle(abox[0], abox[1],
+                                                          abox[2] - abox[0],
+                                                          abox[3] - abox[1]),
+                                            abox);
+
+	    int tw = aatg.getTileWidth();
+	    int th = aatg.getTileHeight();
+	    alpha = getAlphaTile(tw * th);
+
+	    byte[] atile;
+
+	    for (int y = abox[1]; y < abox[3]; y += th) {
+		for (int x = abox[0]; x < abox[2]; x += tw) {
+		    int w = Math.min(tw, abox[2] - x);
+		    int h = Math.min(th, abox[3] - y);
+
+		    int a = aatg.getTypicalAlpha();
+		    if (a == 0x00 ||
+			outpipe.needTile(context, x, y, w, h) == false)
+		    {
+			aatg.nextTile();
+			outpipe.skipTile(context, x, y);
+			continue;
+		    }
+                    if (a == 0xff) {
+			atile = null;
+			aatg.nextTile();
+                    } else {
+			atile = alpha;
+			aatg.getAlpha(alpha, 0, tw);
+		    }
+
+		    outpipe.renderPathTile(context, atile, 0, tw,
+					   x, y, w, h);
+		}
+	    }
+	} finally {
+            aatg.dispose();
+	    if (context != null) {
+		outpipe.endSequence(context);
+	    }
+	    if (alpha != null) {
+		dropAlphaTile(alpha);
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/AATileGenerator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.pipe;
+
+/**
+ * The API for an object that generates alpha coverage tiles for a given
+ * path.
+ * The {@link RenderingEngine} will be consulted as a factory to return
+ * one of these objects for a given Shape and a given set of rendering
+ * attributes.
+ * This object will iterate through the bounds of the rendering primitive
+ * and return tiles of a constant size as specified by the getTileWidth()
+ * and getTileHeight() parameters.
+ * The iteration order of the tiles will be as specified by the pseudo-code:
+ * <pre>
+ *     int bbox[] = {left, top, right, bottom};
+ *     AATileGenerator aatg = renderengine.getAATileGenerator(..., bbox);
+ *     int tw = aatg.getTileWidth();
+ *     int th = aatg.getTileHeight();
+ *     byte tile[] = new byte[tw * th];
+ *     for (y = top; y < bottom; y += th) {
+ *         for (x = left; x < right; x += tw) {
+ *             int a = aatg.getTypicalAlpha();
+ *             int w = Math.min(tw, right-x);
+ *             int h = Math.min(th, bottom-y);
+ *             if (a == 0x00) {
+ *                 // can skip this tile...
+ *                 aatg.nextTile();
+ *             } else if (a == 0xff) {
+ *                 // can treat this tile like a fillRect
+ *                 aatg.nextTile();
+ *                 doFill(x, y, w, h);
+ *             } else {
+ *                 aatg.getAlpha(tile, 0, tw);
+ *                 handleAlpha(tile, x, y, w, h);
+ *             }
+ *         }
+ *     }
+ *     aatg.dispose();
+ * </pre>
+ * The bounding box for the iteration will be returned by the
+ * {@code RenderingEngine} via an argument to the getAATileGenerator() method.
+ */
+public interface AATileGenerator {
+    /**
+     * Gets the width of the tiles that the generator batches output into.
+     * @return the width of the standard alpha tile
+     */
+    public int getTileWidth();
+
+    /**
+     * Gets the height of the tiles that the generator batches output into.
+     * @return the height of the standard alpha tile
+     */
+    public int getTileHeight();
+
+    /**
+     * Gets the typical alpha value that will characterize the current
+     * tile.
+     * The answer may be 0x00 to indicate that the current tile has
+     * no coverage in any of its pixels, or it may be 0xff to indicate
+     * that the current tile is completely covered by the path, or any
+     * other value to indicate non-trivial coverage cases.
+     * @return 0x00 for no coverage, 0xff for total coverage, or any other
+     *         value for partial coverage of the tile
+     */
+    public int getTypicalAlpha();
+
+    /**
+     * Skips the current tile and moves on to the next tile.
+     * Either this method, or the getAlpha() method should be called
+     * once per tile, but not both.
+     */
+    public void nextTile();
+
+    /**
+     * Gets the alpha coverage values for the current tile.
+     * Either this method, or the nextTile() method should be called
+     * once per tile, but not both.
+     */
+    public void getAlpha(byte tile[], int offset, int rowstride);
+
+    /**
+     * Disposes this tile generator.
+     * No further calls will be made on this instance.
+     */
+    public void dispose();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/BufferedBufImgOps.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,393 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.pipe;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ByteLookupTable;
+import java.awt.image.ColorModel;
+import java.awt.image.ConvolveOp;
+import java.awt.image.IndexColorModel;
+import java.awt.image.Kernel;
+import java.awt.image.LookupOp;
+import java.awt.image.LookupTable;
+import java.awt.image.RescaleOp;
+import java.awt.image.ShortLookupTable;
+import sun.java2d.SurfaceData;
+import sun.java2d.loops.CompositeType;
+import static sun.java2d.pipe.BufferedOpCodes.*;
+
+public class BufferedBufImgOps {
+
+    public static void enableBufImgOp(RenderQueue rq, SurfaceData srcData,
+                                      BufferedImage srcImg,
+                                      BufferedImageOp biop)
+    {
+        if (biop instanceof ConvolveOp) {
+            enableConvolveOp(rq, srcData, (ConvolveOp)biop);
+        } else if (biop instanceof RescaleOp) {
+            enableRescaleOp(rq, srcData, srcImg, (RescaleOp)biop);
+        } else if (biop instanceof LookupOp) {
+            enableLookupOp(rq, srcData, srcImg, (LookupOp)biop);
+        } else {
+            throw new InternalError("Unknown BufferedImageOp");
+        }
+    }
+
+    public static void disableBufImgOp(RenderQueue rq, BufferedImageOp biop) {
+        if (biop instanceof ConvolveOp) {
+            disableConvolveOp(rq);
+        } else if (biop instanceof RescaleOp) {
+            disableRescaleOp(rq);
+        } else if (biop instanceof LookupOp) {
+            disableLookupOp(rq);
+        } else {
+            throw new InternalError("Unknown BufferedImageOp");
+        }
+    }
+
+/**************************** ConvolveOp support ****************************/
+
+    public static boolean isConvolveOpValid(ConvolveOp cop) {
+        Kernel kernel = cop.getKernel();
+        int kw = kernel.getWidth();
+        int kh = kernel.getHeight();
+        // REMIND: we currently can only handle 3x3 and 5x5 kernels,
+        //         but hopefully this is just a temporary restriction;
+        //         see native shader comments for more details
+        if (!(kw == 3 && kh == 3) && !(kw == 5 && kh == 5)) {
+            return false;
+        }
+        return true;
+    }
+
+    private static void enableConvolveOp(RenderQueue rq,
+                                         SurfaceData srcData,
+                                         ConvolveOp cop)
+    {
+        // assert rq.lock.isHeldByCurrentThread();
+        boolean edgeZero =
+            cop.getEdgeCondition() == ConvolveOp.EDGE_ZERO_FILL;
+        Kernel kernel = cop.getKernel();
+        int kernelWidth = kernel.getWidth();
+        int kernelHeight = kernel.getHeight();
+        int kernelSize = kernelWidth * kernelHeight;
+        int sizeofFloat = 4;
+        int totalBytesRequired = 4 + 8 + 12 + (kernelSize * sizeofFloat);
+
+        RenderBuffer buf = rq.getBuffer();
+        rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
+        buf.putInt(ENABLE_CONVOLVE_OP);
+        buf.putLong(srcData.getNativeOps());
+        buf.putInt(edgeZero ? 1 : 0);
+        buf.putInt(kernelWidth);
+        buf.putInt(kernelHeight);
+        buf.put(kernel.getKernelData(null));
+    }
+
+    private static void disableConvolveOp(RenderQueue rq) {
+        // assert rq.lock.isHeldByCurrentThread();
+        RenderBuffer buf = rq.getBuffer();
+        rq.ensureCapacity(4);
+        buf.putInt(DISABLE_CONVOLVE_OP);
+    }
+
+/**************************** RescaleOp support *****************************/
+
+    public static boolean isRescaleOpValid(RescaleOp rop,
+                                           BufferedImage srcImg)
+    {
+        int numFactors = rop.getNumFactors();
+        ColorModel srcCM = srcImg.getColorModel();
+
+        if (srcCM instanceof IndexColorModel) {
+            throw new
+                IllegalArgumentException("Rescaling cannot be "+
+                                         "performed on an indexed image");
+        }
+        if (numFactors != 1 &&
+            numFactors != srcCM.getNumColorComponents() &&
+            numFactors != srcCM.getNumComponents())
+        {
+            throw new IllegalArgumentException("Number of scaling constants "+
+                                               "does not equal the number of"+
+                                               " of color or color/alpha "+
+                                               " components");
+        }
+
+        int csType = srcCM.getColorSpace().getType();
+        if (csType != ColorSpace.TYPE_RGB &&
+            csType != ColorSpace.TYPE_GRAY)
+        {
+            // Not prepared to deal with other color spaces
+            return false;
+        }
+
+        if (numFactors == 2 || numFactors > 4) {
+            // Not really prepared to handle this at the native level, so...
+            return false;
+        }
+
+        return true;
+    }
+
+    private static void enableRescaleOp(RenderQueue rq,
+                                        SurfaceData srcData,
+                                        BufferedImage srcImg,
+                                        RescaleOp rop)
+    {
+        // assert rq.lock.isHeldByCurrentThread();
+        ColorModel srcCM = srcImg.getColorModel();
+        boolean nonPremult =
+            srcCM.hasAlpha() &&
+            srcCM.isAlphaPremultiplied();
+
+        /*
+         * Note: The user-provided scale factors and offsets are arranged
+         * in R/G/B/A order, regardless of the raw data order of the
+         * underlying Raster/DataBuffer.  The source image data is ultimately
+         * converted into RGBA data when uploaded to an OpenGL texture
+         * (even for TYPE_GRAY), so the scale factors and offsets are already
+         * in the order expected by the native OpenGL code.
+         *
+         * However, the offsets provided by the user are in a range dictated
+         * by the size of each color/alpha band in the source image.  For
+         * example, for 8/8/8 data each offset is in the range [0,255],
+         * for 5/5/5 data each offset is in the range [0,31], and so on.
+         * The OpenGL shader only thinks in terms of [0,1], so below we need
+         * to normalize the user-provided offset values into the range [0,1].
+         */
+        int numFactors = rop.getNumFactors();
+        float[] origScaleFactors = rop.getScaleFactors(null);
+        float[] origOffsets = rop.getOffsets(null);
+
+        // To make things easier, we will always pass all four bands
+        // down to native code...
+        float[] normScaleFactors;
+        float[] normOffsets;
+
+        if (numFactors == 1) {
+            normScaleFactors = new float[4];
+            normOffsets      = new float[4];
+            for (int i = 0; i < 3; i++) {
+                normScaleFactors[i] = origScaleFactors[0];
+                normOffsets[i]      = origOffsets[0];
+            }
+            // Leave alpha untouched...
+            normScaleFactors[3] = 1.0f;
+            normOffsets[3]      = 0.0f;
+        } else if (numFactors == 3) {
+            normScaleFactors = new float[4];
+            normOffsets      = new float[4];
+            for (int i = 0; i < 3; i++) {
+                normScaleFactors[i] = origScaleFactors[i];
+                normOffsets[i]      = origOffsets[i];
+            }
+            // Leave alpha untouched...
+            normScaleFactors[3] = 1.0f;
+            normOffsets[3]      = 0.0f;            
+        } else { // (numFactors == 4)
+            normScaleFactors = origScaleFactors;
+            normOffsets      = origOffsets;
+        }
+
+        // The user-provided offsets are specified in the range
+        // of each source color band, but the OpenGL shader only wants
+        // to deal with data in the range [0,1], so we need to normalize
+        // each offset value to the range [0,1] here.
+        if (srcCM.getNumComponents() == 1) {
+            // Gray data
+            int nBits = srcCM.getComponentSize(0);
+            int maxValue = (1 << nBits) - 1;
+            for (int i = 0; i < 3; i++) {
+                normOffsets[i] /= maxValue;
+            }
+        } else {
+            // RGB(A) data
+            for (int i = 0; i < srcCM.getNumComponents(); i++) {
+                int nBits = srcCM.getComponentSize(i);
+                int maxValue = (1 << nBits) - 1;
+                normOffsets[i] /= maxValue;
+            }
+        }
+
+        int sizeofFloat = 4;
+        int totalBytesRequired = 4 + 8 + 4 + (4 * sizeofFloat * 2);
+
+        RenderBuffer buf = rq.getBuffer();
+        rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
+        buf.putInt(ENABLE_RESCALE_OP);
+        buf.putLong(srcData.getNativeOps());
+        buf.putInt(nonPremult ? 1 : 0);
+        buf.put(normScaleFactors);
+        buf.put(normOffsets);
+    }
+
+    private static void disableRescaleOp(RenderQueue rq) {
+        // assert rq.lock.isHeldByCurrentThread();
+        RenderBuffer buf = rq.getBuffer();
+        rq.ensureCapacity(4);
+        buf.putInt(DISABLE_RESCALE_OP);
+    }
+
+/**************************** LookupOp support ******************************/
+
+    public static boolean isLookupOpValid(LookupOp lop,
+                                          BufferedImage srcImg)
+    {
+        LookupTable table = lop.getTable();
+        int numComps = table.getNumComponents();
+        ColorModel srcCM = srcImg.getColorModel();
+
+        if (srcCM instanceof IndexColorModel) {
+            throw new
+                IllegalArgumentException("LookupOp cannot be "+
+                                         "performed on an indexed image");
+        }
+        if (numComps != 1 &&
+            numComps != srcCM.getNumComponents() &&
+            numComps != srcCM.getNumColorComponents())
+        {
+            throw new IllegalArgumentException("Number of arrays in the "+
+                                               " lookup table ("+
+                                               numComps+
+                                               ") is not compatible with"+
+                                               " the src image: "+srcImg);
+        }
+
+        int csType = srcCM.getColorSpace().getType();
+        if (csType != ColorSpace.TYPE_RGB &&
+            csType != ColorSpace.TYPE_GRAY)
+        {
+            // Not prepared to deal with other color spaces
+            return false;
+        }
+
+        if (numComps == 2 || numComps > 4) {
+            // Not really prepared to handle this at the native level, so...
+            return false;
+        }
+
+        // The LookupTable spec says that "all arrays must be the
+        // same size" but unfortunately the constructors do not
+        // enforce that.  Also, our native code only works with
+        // arrays no larger than 256 elements, so check both of
+        // these restrictions here.
+        if (table instanceof ByteLookupTable) {
+            byte[][] data = ((ByteLookupTable)table).getTable();
+            for (int i = 1; i < data.length; i++) {
+                if (data[i].length > 256 ||
+                    data[i].length != data[i-1].length)
+                {
+                    return false;
+                }
+            }
+        } else if (table instanceof ShortLookupTable) {
+            short[][] data = ((ShortLookupTable)table).getTable();
+            for (int i = 1; i < data.length; i++) {
+                if (data[i].length > 256 ||
+                    data[i].length != data[i-1].length)
+                {
+                    return false;
+                }
+            }
+        } else {
+            return false;
+        }
+
+        return true;
+    }
+
+    private static void enableLookupOp(RenderQueue rq,
+                                       SurfaceData srcData,
+                                       BufferedImage srcImg,
+                                       LookupOp lop)
+    {
+        // assert rq.lock.isHeldByCurrentThread();
+        boolean nonPremult =
+            srcImg.getColorModel().hasAlpha() &&
+            srcImg.isAlphaPremultiplied();
+
+        LookupTable table = lop.getTable();
+        int numBands = table.getNumComponents();
+        int offset = table.getOffset();
+        int bandLength;
+        int bytesPerElem;
+        boolean shortData;
+
+        if (table instanceof ShortLookupTable) {
+            short[][] data = ((ShortLookupTable)table).getTable();
+            bandLength = data[0].length;
+            bytesPerElem = 2;
+            shortData = true;
+        } else { // (table instanceof ByteLookupTable)
+            byte[][] data = ((ByteLookupTable)table).getTable();
+            bandLength = data[0].length;
+            bytesPerElem = 1;
+            shortData = false;
+        }
+
+        // Adjust the LUT length so that it ends on a 4-byte boundary
+        int totalLutBytes = numBands * bandLength * bytesPerElem;
+        int paddedLutBytes = (totalLutBytes + 3) & (~3);
+        int padding = paddedLutBytes - totalLutBytes;
+        int totalBytesRequired = 4 + 8 + 20 + paddedLutBytes;
+
+        RenderBuffer buf = rq.getBuffer();
+        rq.ensureCapacityAndAlignment(totalBytesRequired, 4);
+        buf.putInt(ENABLE_LOOKUP_OP);
+        buf.putLong(srcData.getNativeOps());
+        buf.putInt(nonPremult ? 1 : 0);
+        buf.putInt(shortData ? 1 : 0);
+        buf.putInt(numBands);
+        buf.putInt(bandLength);
+        buf.putInt(offset);
+        if (shortData) {
+            short[][] data = ((ShortLookupTable)table).getTable();
+            for (int i = 0; i < numBands; i++) {
+                buf.put(data[i]);
+            }
+        } else {
+            byte[][] data = ((ByteLookupTable)table).getTable();
+            for (int i = 0; i < numBands; i++) {
+                buf.put(data[i]);
+            }
+        }
+        if (padding != 0) {
+            buf.position(buf.position() + padding);
+        }
+    }
+
+    private static void disableLookupOp(RenderQueue rq) {
+        // assert rq.lock.isHeldByCurrentThread();
+        RenderBuffer buf = rq.getBuffer();
+        rq.ensureCapacity(4);
+        buf.putInt(DISABLE_LOOKUP_OP);
+    }
+}
--- a/j2se/src/share/classes/sun/java2d/pipe/BufferedContext.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/BufferedContext.java	Fri Jun 22 00:46:43 2007 +0000
@@ -27,8 +27,10 @@
 
 import java.awt.AlphaComposite;
 import java.awt.Composite;
+import java.awt.Paint;
 import java.awt.geom.AffineTransform;
 import sun.java2d.InvalidPipeException;
+import sun.java2d.SunGraphics2D;
 import sun.java2d.SurfaceData;
 import sun.java2d.loops.XORComposite;
 import static sun.java2d.pipe.BufferedOpCodes.*;
@@ -44,6 +46,30 @@
  */
 public class BufferedContext {
 
+    /*
+     * The following flags help the internals of validate() determine
+     * the appropriate (meaning correct, or optimal) code path when
+     * setting up the current context.  The flags can be bitwise OR'd
+     * together as needed.
+     */
+
+    /**
+     * Indicates that no flags are needed; take all default code paths.
+     */
+    public static final int NO_CONTEXT_FLAGS = (0 << 0);
+    /**
+     * Indicates that the source surface (or color value, if it is a simple
+     * rendering operation) is opaque (has an alpha value of 1.0).  If this
+     * flag is present, it allows us to disable blending in certain
+     * situations in order to improve performance.
+     */
+    public static final int SRC_IS_OPAQUE    = (1 << 0);
+    /**
+     * Indicates that the operation uses an alpha mask, which may determine
+     * the code path that is used when setting up the current paint state.
+     */
+    public static final int USE_MASK         = (1 << 1);
+
     protected RenderQueue rq;
     protected RenderBuffer buf;
 
@@ -60,7 +86,7 @@
     private SurfaceData     validatedDstData;
     private Region          validatedClip;
     private Composite       validatedComp;
-    private int             validatedPixel;
+    private Paint           validatedPaint;
     private int             validatedFlags;
     private boolean         xformInUse;
 
@@ -76,16 +102,20 @@
      * be updated.  Then each part of the context state (clip, composite,
      * etc.) is checked against the previous value.  If the value has changed
      * since the last call to validate(), it will be updated accordingly.
+     *
+     * Note that the SunGraphics2D parameter is only used for the purposes
+     * of validating a (non-null) Paint parameter.  In all other cases it
+     * is safe to pass a null SunGraphics2D and it will be ignored.
      */
     public void validate(SurfaceData srcData, SurfaceData dstData,
                          Region clip, Composite comp,
                          AffineTransform xform,
-                         int pixel, int flags)
+                         Paint paint, SunGraphics2D sg2d, int flags)
     {
         // assert rq.lock.isHeldByCurrentThread();
 
         boolean updateClip = (clip != validatedClip);
-        boolean updatePixel = (pixel != validatedPixel);
+        boolean updatePaint = (paint != validatedPaint);
 
         if (!dstData.isValid()) {
             throw new InvalidPipeException("bounds changed");
@@ -101,11 +131,11 @@
                 updateClip = true;
             }
 
-            if (pixel == 0) {
+            if (paint == null) {
                 // make sure we update the color state (otherwise, it might
                 // not be updated if this is the first time the context
                 // is being validated)
-                updatePixel = true;
+                updatePaint = true;
             }
 
             // update the current source and destination surfaces
@@ -135,9 +165,9 @@
             } else {
                 resetComposite();
             }
-            // the color state is dependent on the composite state, so make
+            // the paint state is dependent on the composite state, so make
             // sure we update the color below
-            updatePixel = true;
+            updatePaint = true;
             validatedComp = comp;
             validatedFlags = flags;
         }
@@ -153,10 +183,14 @@
             xformInUse = true;
         }
 
-        // validate pixel
-        if (updatePixel) {
-            setColor(pixel);
-            validatedPixel = pixel;
+        // validate paint
+        if (updatePaint) {
+            if (paint != null) {
+                BufferedPaints.setPaint(rq, sg2d, paint, flags);
+            } else {
+                BufferedPaints.resetPaint(rq);
+            }
+            validatedPaint = paint;
         }
 
         // mark dstData dirty
@@ -270,11 +304,4 @@
         buf.putDouble(xform.getTranslateX());
         buf.putDouble(xform.getTranslateY());
     }
-
-    private void setColor(int pixel) {
-        // assert rq.lock.isHeldByCurrentThread();
-        rq.ensureCapacity(8);
-        buf.putInt(SET_COLOR);
-        buf.putInt(pixel);
-    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/BufferedMaskFill.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.pipe;
+
+import java.awt.AlphaComposite;
+import java.awt.Composite;
+import sun.java2d.SunGraphics2D;
+import sun.java2d.SurfaceData;
+import sun.java2d.loops.CompositeType;
+import sun.java2d.loops.MaskFill;
+import sun.java2d.loops.SurfaceType;
+import static sun.java2d.pipe.BufferedOpCodes.*;
+
+/**
+ * The MaskFill operation is expressed as:
+ *   dst = ((src <MODE> dst) * pathA) + (dst * (1 - pathA))
+ *
+ * The OGL/D3D implementation of the MaskFill operation differs from the above
+ * equation because it is not possible to perform such a complex operation in
+ * OpenGL/Direct3D (without the use of advanced techniques like fragment
+ * shaders and multitexturing).  Therefore, the BufferedMaskFill operation
+ * is expressed as:
+ *   dst = (src * pathA) <SrcOver> dst
+ *
+ * This simplified formula is only equivalent to the "true" MaskFill equation
+ * in the following situations:
+ *   - <MODE> is SrcOver
+ *   - <MODE> is Src, extra alpha == 1.0, and the source paint is opaque
+ *
+ * Therefore, we register BufferedMaskFill primitives for only the SurfaceType
+ * and CompositeType restrictions mentioned above.  In addition, for the
+ * SrcNoEa case we must override the incoming composite with a SrcOver (no
+ * extra alpha) instance, so that we set up the OpenGL/Direct3D blending
+ * mode to match the BufferedMaskFill equation.
+ */
+public abstract class BufferedMaskFill extends MaskFill {
+
+    protected final RenderQueue rq;
+
+    protected BufferedMaskFill(RenderQueue rq,
+                               SurfaceType srcType,
+                               CompositeType compType,
+                               SurfaceType dstType)
+    {
+        super(srcType, compType, dstType);
+        this.rq = rq;
+    }
+
+    @Override
+    public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
+                         Composite comp,
+                         final int x, final int y, final int w, final int h,
+                         final byte[] mask,
+                         final int maskoff, final int maskscan)
+    {
+        AlphaComposite acomp = (AlphaComposite)comp;
+        if (acomp.getRule() != AlphaComposite.SRC_OVER) {
+            comp = AlphaComposite.SrcOver;
+        }
+
+        rq.lock();
+        try {
+            validateContext(sg2d, comp, BufferedContext.USE_MASK);
+
+            // we adjust the mask length so that the mask ends on a
+            // 4-byte boundary
+            int maskBytesRequired;
+            if (mask != null) {
+                // we adjust the mask length so that the mask ends on a
+                // 4-byte boundary
+                maskBytesRequired = (mask.length + 3) & (~3);
+            } else {
+                // mask not needed
+                maskBytesRequired = 0;
+            }
+            int totalBytesRequired = 32 + maskBytesRequired;
+
+            RenderBuffer buf = rq.getBuffer();
+            if (totalBytesRequired <= buf.capacity()) {
+                if (totalBytesRequired > buf.remaining()) {
+                    // process the queue first and then enqueue the mask
+                    rq.flushNow();
+                }
+
+                buf.putInt(MASK_FILL);
+                // enqueue parameters
+                buf.putInt(x).putInt(y).putInt(w).putInt(h);
+                buf.putInt(maskoff);
+                buf.putInt(maskscan);
+                buf.putInt(maskBytesRequired);
+                if (mask != null) {
+                    // enqueue the mask
+                    int padding = maskBytesRequired - mask.length;
+                    buf.put(mask);
+                    if (padding != 0) {
+                        buf.position(buf.position() + padding);
+                    }
+                }
+            } else {
+                // queue is too small to accomodate entire mask; perform
+                // the operation directly on the queue flushing thread
+                rq.flushAndInvokeNow(new Runnable() {
+                    public void run() {
+                        maskFill(x, y, w, h,
+                                 maskoff, maskscan, mask.length, mask);
+                    }
+                });
+            }
+        } finally {
+            rq.unlock();
+        }
+    }
+
+    /**
+     * Called as a separate Runnable when the operation is too large to fit
+     * on the RenderQueue.  The OGL/D3D pipelines each have their own (small)
+     * native implementation of this method.
+     */
+    protected abstract void maskFill(int x, int y, int w, int h,
+                                     int maskoff, int maskscan, int masklen,
+                                     byte[] mask);
+
+    /**
+     * Validates the state in the provided SunGraphics2D object and sets up
+     * any special resources for this operation (e.g. enabling gradient
+     * shading).
+     */
+    protected abstract void validateContext(SunGraphics2D sg2d,
+                                            Composite comp, int ctxflags);
+}
--- a/j2se/src/share/classes/sun/java2d/pipe/BufferedOpCodes.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/BufferedOpCodes.java	Fri Jun 22 00:46:43 2007 +0000
@@ -48,7 +48,6 @@
     public static final int DRAW_GLYPH_LIST      = 40;
 
     // state-related ops
-    public static final int SET_COLOR            = 50;
     public static final int SET_RECT_CLIP        = 51;
     public static final int BEGIN_SHAPE_CLIP     = 52;
     public static final int SET_SHAPE_CLIP_SPANS = 53;
@@ -76,14 +75,12 @@
     public static final int NOOP                 = 90;
 
     // paint-related ops
-    public static final int ENABLE_GRADIENT_PAINT         = 100;
-    public static final int DISABLE_GRADIENT_PAINT        = 101;
-    public static final int ENABLE_LINEAR_GRADIENT_PAINT  = 102;
-    public static final int DISABLE_LINEAR_GRADIENT_PAINT = 103;
-    public static final int ENABLE_RADIAL_GRADIENT_PAINT  = 104;
-    public static final int DISABLE_RADIAL_GRADIENT_PAINT = 105;
-    public static final int ENABLE_TEXTURE_PAINT          = 106;
-    public static final int DISABLE_TEXTURE_PAINT         = 107;
+    public static final int RESET_PAINT               = 100;
+    public static final int SET_COLOR                 = 101;
+    public static final int SET_GRADIENT_PAINT        = 102;
+    public static final int SET_LINEAR_GRADIENT_PAINT = 103;
+    public static final int SET_RADIAL_GRADIENT_PAINT = 104;
+    public static final int SET_TEXTURE_PAINT         = 105;
 
     // BufferedImageOp-related ops
     public static final int ENABLE_CONVOLVE_OP     = 120;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/BufferedPaints.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,533 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.pipe;
+
+import java.awt.Color;
+import java.awt.GradientPaint;
+import java.awt.LinearGradientPaint;
+import java.awt.MultipleGradientPaint;
+import java.awt.MultipleGradientPaint.ColorSpaceType;
+import java.awt.MultipleGradientPaint.CycleMethod;
+import java.awt.Paint;
+import java.awt.RadialGradientPaint;
+import java.awt.TexturePaint;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import sun.awt.image.PixelConverter;
+import sun.java2d.SunGraphics2D;
+import sun.java2d.SurfaceData;
+import sun.java2d.loops.CompositeType;
+import sun.java2d.loops.SurfaceType;
+import static sun.java2d.pipe.BufferedOpCodes.*;
+
+public class BufferedPaints {
+
+    static void setPaint(RenderQueue rq, SunGraphics2D sg2d,
+                         Paint paint, int ctxflags)
+    {
+        if (sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR) {
+            setColor(rq, sg2d.pixel);
+        } else {
+            boolean useMask = (ctxflags & BufferedContext.USE_MASK) != 0;
+            switch (sg2d.paintState) {
+            case SunGraphics2D.PAINT_GRADIENT:
+                setGradientPaint(rq, sg2d,
+                                 (GradientPaint)paint, useMask);
+                break;
+            case SunGraphics2D.PAINT_LIN_GRADIENT:
+                setLinearGradientPaint(rq, sg2d,
+                                       (LinearGradientPaint)paint, useMask);
+                break;
+            case SunGraphics2D.PAINT_RAD_GRADIENT:
+                setRadialGradientPaint(rq, sg2d,
+                                       (RadialGradientPaint)paint, useMask);
+                break;
+            case SunGraphics2D.PAINT_TEXTURE:
+                setTexturePaint(rq, sg2d,
+                                (TexturePaint)paint, useMask);
+                break;
+            default:
+                break;
+            }
+        }
+    }
+
+    static void resetPaint(RenderQueue rq) {
+        // assert rq.lock.isHeldByCurrentThread();
+        rq.ensureCapacity(4);
+        RenderBuffer buf = rq.getBuffer();
+        buf.putInt(RESET_PAINT);
+    }
+
+/****************************** Color support *******************************/
+
+    private static void setColor(RenderQueue rq, int pixel) {
+        // assert rq.lock.isHeldByCurrentThread();
+        rq.ensureCapacity(8);
+        RenderBuffer buf = rq.getBuffer();
+        buf.putInt(SET_COLOR);
+        buf.putInt(pixel);
+    }
+
+/************************* GradientPaint support ****************************/
+
+    /**
+     * Note: This code is factored out into a separate static method
+     * so that it can be shared by both the Gradient and LinearGradient
+     * implementations.  LinearGradient uses this code (for the
+     * two-color sRGB case only) because it can be much faster than the
+     * equivalent implementation that uses fragment shaders.
+     *
+     * We use OpenGL's texture coordinate generator to automatically
+     * apply a smooth gradient (either cyclic or acyclic) to the geometry
+     * being rendered.  This technique is almost identical to the one
+     * described in the comments for BufferedPaints.setTexturePaint(),
+     * except the calculations take place in one dimension instead of two.
+     * Instead of an anchor rectangle in the TexturePaint case, we use
+     * the vector between the two GradientPaint end points in our
+     * calculations.  The generator uses a single plane equation that
+     * takes the (x,y) location (in device space) of the fragment being
+     * rendered to calculate a (u) texture coordinate for that fragment:
+     *     u = Ax + By + Cz + Dw
+     *
+     * The gradient renderer uses a two-pixel 1D texture where the first
+     * pixel contains the first GradientPaint color, and the second pixel
+     * contains the second GradientPaint color.  (Note that we use the
+     * GL_CLAMP_TO_EDGE wrapping mode for acyclic gradients so that we
+     * clamp the colors properly at the extremes.)  The following diagram
+     * attempts to show the layout of the texture containing the two
+     * GradientPaint colors (C1 and C2):
+     *
+     *                        +-----------------+
+     *                        |   C1   |   C2   |
+     *                        |        |        |
+     *                        +-----------------+
+     *                      u=0  .25  .5   .75  1
+     *
+     * We calculate our plane equation constants (A,B,D) such that u=0.25
+     * corresponds to the first GradientPaint end point in user space and
+     * u=0.75 corresponds to the second end point.  This is somewhat
+     * non-obvious, but since the gradient colors are generated by
+     * interpolating between C1 and C2, we want the pure color at the
+     * end points, and we will get the pure color only when u correlates
+     * to the center of a texel.  The following chart shows the expected
+     * color for some sample values of u (where C' is the color halfway
+     * between C1 and C2):
+     *
+     *       u value      acyclic (GL_CLAMP)      cyclic (GL_REPEAT)
+     *       -------      ------------------      ------------------
+     *        -0.25              C1                       C2
+     *         0.0               C1                       C'
+     *         0.25              C1                       C1
+     *         0.5               C'                       C'
+     *         0.75              C2                       C2
+     *         1.0               C2                       C'
+     *         1.25              C2                       C1
+     *
+     * Original inspiration for this technique came from UMD's Agile2D
+     * project (GradientManager.java).
+     */
+    private static void setGradientPaint(RenderQueue rq, AffineTransform at,
+                                         Color c1, Color c2,
+                                         Point2D pt1, Point2D pt2,
+                                         boolean isCyclic, boolean useMask)
+    {
+        // convert gradient colors to IntArgbPre format
+        PixelConverter pc = PixelConverter.ArgbPre.instance;
+        int pixel1 = pc.rgbToPixel(c1.getRGB(), null);
+        int pixel2 = pc.rgbToPixel(c2.getRGB(), null);
+
+        // calculate plane equation constants
+        double x = pt1.getX();
+        double y = pt1.getY();
+        at.translate(x, y);
+        // now gradient point 1 is at the origin
+        x = pt2.getX() - x;
+        y = pt2.getY() - y;
+        double len = Math.sqrt(x * x + y * y);
+        at.rotate(x, y);
+        // now gradient point 2 is on the positive x-axis
+        at.scale(2*len, 1);
+        // now gradient point 2 is at (0.5, 0)
+        at.translate(-0.25, 0);
+        // now gradient point 1 is at (0.25, 0), point 2 is at (0.75, 0)
+
+        double p0, p1, p3;
+        try {
+            at.invert();
+            p0 = at.getScaleX();
+            p1 = at.getShearX();
+            p3 = at.getTranslateX();
+        } catch (java.awt.geom.NoninvertibleTransformException e) {
+            p0 = p1 = p3 = 0.0;
+        }
+
+        // assert rq.lock.isHeldByCurrentThread();
+        rq.ensureCapacityAndAlignment(44, 12);
+        RenderBuffer buf = rq.getBuffer();
+        buf.putInt(SET_GRADIENT_PAINT);
+        buf.putInt(useMask ? 1 : 0);
+        buf.putInt(isCyclic ? 1 : 0);
+        buf.putDouble(p0).putDouble(p1).putDouble(p3);
+        buf.putInt(pixel1).putInt(pixel2);            
+    }
+
+    private static void setGradientPaint(RenderQueue rq,
+                                         SunGraphics2D sg2d,
+                                         GradientPaint paint,
+                                         boolean useMask)
+    {
+        setGradientPaint(rq, (AffineTransform)sg2d.transform.clone(),
+                         paint.getColor1(), paint.getColor2(),
+                         paint.getPoint1(), paint.getPoint2(),
+                         paint.isCyclic(), useMask);
+    }
+
+/************************** TexturePaint support ****************************/
+
+    /**
+     * We use OpenGL's texture coordinate generator to automatically
+     * map the TexturePaint image to the geometry being rendered.  The
+     * generator uses two separate plane equations that take the (x,y)
+     * location (in device space) of the fragment being rendered to
+     * calculate (u,v) texture coordinates for that fragment:
+     *     u = Ax + By + Cz + Dw
+     *     v = Ex + Fy + Gz + Hw
+     *
+     * Since we use a 2D orthographic projection, we can assume that z=0
+     * and w=1 for any fragment.  So we need to calculate appropriate
+     * values for the plane equation constants (A,B,D) and (E,F,H) such
+     * that {u,v}=0 for the top-left of the TexturePaint's anchor
+     * rectangle and {u,v}=1 for the bottom-right of the anchor rectangle.
+     * We can easily make the texture image repeat for {u,v} values
+     * outside the range [0,1] by specifying the GL_REPEAT texture wrap
+     * mode.
+     *
+     * Calculating the plane equation constants is surprisingly simple.
+     * We can think of it as an inverse matrix operation that takes
+     * device space coordinates and transforms them into user space
+     * coordinates that correspond to a location relative to the anchor
+     * rectangle.  First, we translate and scale the current user space
+     * transform by applying the anchor rectangle bounds.  We then take
+     * the inverse of this affine transform.  The rows of the resulting
+     * inverse matrix correlate nicely to the plane equation constants
+     * we were seeking.
+     */
+    private static void setTexturePaint(RenderQueue rq,
+                                        SunGraphics2D sg2d,
+                                        TexturePaint paint,
+                                        boolean useMask)
+    {
+        BufferedImage bi = paint.getImage();
+        SurfaceData dstData = sg2d.surfaceData;
+        SurfaceData srcData =
+            dstData.getSourceSurfaceData(bi, sg2d.TRANSFORM_ISIDENT,
+                                         CompositeType.SrcOver, null);
+        boolean filter =
+            (sg2d.interpolationType !=
+             AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
+
+        // calculate plane equation constants
+        AffineTransform at = (AffineTransform)sg2d.transform.clone();
+        Rectangle2D anchor = paint.getAnchorRect();
+        at.translate(anchor.getX(), anchor.getY());
+        at.scale(anchor.getWidth(), anchor.getHeight());
+
+        double xp0, xp1, xp3, yp0, yp1, yp3;
+        try {
+            at.invert();
+            xp0 = at.getScaleX();
+            xp1 = at.getShearX();
+            xp3 = at.getTranslateX();
+            yp0 = at.getShearY();
+            yp1 = at.getScaleY();
+            yp3 = at.getTranslateY();
+        } catch (java.awt.geom.NoninvertibleTransformException e) {
+            xp0 = xp1 = xp3 = yp0 = yp1 = yp3 = 0.0;
+        }
+
+        // assert rq.lock.isHeldByCurrentThread();
+        rq.ensureCapacityAndAlignment(68, 12);
+        RenderBuffer buf = rq.getBuffer();
+        buf.putInt(SET_TEXTURE_PAINT);
+        buf.putInt(useMask ? 1 : 0);
+        buf.putInt(filter ? 1 : 0);
+        buf.putLong(srcData.getNativeOps());
+        buf.putDouble(xp0).putDouble(xp1).putDouble(xp3);
+        buf.putDouble(yp0).putDouble(yp1).putDouble(yp3);
+    }
+
+/****************** Shared MultipleGradientPaint support ********************/
+
+    /**
+     * The maximum number of gradient "stops" supported by our native
+     * fragment shader implementations.
+     *
+     * This value has been empirically determined and capped to allow
+     * our native shaders to run on all shader-level graphics hardware,
+     * even on the older, more limited GPUs.  Even the oldest Nvidia
+     * hardware could handle 16, or even 32 fractions without any problem.
+     * But the first-generation boards from ATI would fall back into
+     * software mode (which is unusably slow) for values larger than 12;
+     * it appears that those boards do not have enough native registers
+     * to support the number of array accesses required by our gradient
+     * shaders.  So for now we will cap this value at 12, but we can
+     * re-evaluate this in the future as hardware becomes more capable.
+     */
+    public static final int MULTI_MAX_FRACTIONS = 12;
+
+    /**
+     * Helper function to convert a color component in sRGB space to
+     * linear RGB space.  Copied directly from the
+     * MultipleGradientPaintContext class.
+     */
+    private static int convertSRGBtoLinearRGB(int color) {
+        float input, output;
+
+        input = color / 255.0f;
+        if (input <= 0.04045f) {
+            output = input / 12.92f;
+        } else {
+            output = (float)Math.pow((input + 0.055) / 1.055, 2.4);
+        }
+
+        return Math.round(output * 255.0f);
+    }
+
+    /**
+     * Helper function to convert a (non-premultiplied) Color in sRGB
+     * space to an IntArgbPre pixel value, optionally in linear RGB space.
+     * Based on the PixelConverter.ArgbPre.rgbToPixel() method.
+     */
+    private static int colorToIntArgbPrePixel(Color c, boolean linear) {
+        int rgb = c.getRGB();
+        if (!linear && ((rgb >> 24) == -1)) {
+            return rgb;
+        }
+        int a = rgb >>> 24;
+        int r = (rgb >> 16) & 0xff;
+        int g = (rgb >>  8) & 0xff;
+        int b = (rgb      ) & 0xff;
+        if (linear) {
+            r = convertSRGBtoLinearRGB(r);
+            g = convertSRGBtoLinearRGB(g);
+            b = convertSRGBtoLinearRGB(b);
+        }
+        int a2 = a + (a >> 7);
+        r = (r * a2) >> 8;
+        g = (g * a2) >> 8;
+        b = (b * a2) >> 8;
+        return ((a << 24) | (r << 16) | (g << 8) | (b));
+    }
+
+    /**
+     * Converts the given array of Color objects into an int array
+     * containing IntArgbPre pixel values.  If the linear parameter
+     * is true, the Color values will be converted into a linear RGB
+     * color space before being returned.
+     */
+    private static int[] convertToIntArgbPrePixels(Color[] colors,
+                                                   boolean linear)
+    {
+        int[] pixels = new int[colors.length];
+        for (int i = 0; i < colors.length; i++) {
+            pixels[i] = colorToIntArgbPrePixel(colors[i], linear);
+        }
+        return pixels;
+    }
+
+/********************** LinearGradientPaint support *************************/
+
+    /**
+     * This method uses techniques that are nearly identical to those
+     * employed in setGradientPaint() above.  The primary difference
+     * is that at the native level we use a fragment shader to manually
+     * apply the plane equation constants to the current fragment position
+     * to calculate the gradient position in the range [0,1] (the native
+     * code for GradientPaint does the same, except that it uses OpenGL's
+     * automatic texture coordinate generation facilities).
+     *
+     * One other minor difference worth mentioning is that
+     * setGradientPaint() calculates the plane equation constants
+     * such that the gradient end points are positioned at 0.25 and 0.75
+     * (for reasons discussed in the comments for that method).  In
+     * contrast, for LinearGradientPaint we setup the equation constants
+     * such that the gradient end points fall at 0.0 and 1.0.  The
+     * reason for this difference is that in the fragment shader we
+     * have more control over how the gradient values are interpreted
+     * (depending on the paint's CycleMethod).
+     */
+    private static void setLinearGradientPaint(RenderQueue rq,
+                                               SunGraphics2D sg2d,
+                                               LinearGradientPaint paint,
+                                               boolean useMask)
+    {
+        boolean linear =
+            (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
+        Color[] colors = paint.getColors();
+        int numStops = colors.length;
+        Point2D pt1 = paint.getStartPoint();
+        Point2D pt2 = paint.getEndPoint();
+        AffineTransform at = paint.getTransform();
+        at.preConcatenate(sg2d.transform);
+
+        if (!linear && numStops == 2 &&
+            paint.getCycleMethod() != CycleMethod.REPEAT)
+        {
+            // delegate to the optimized two-color gradient codepath
+            boolean isCyclic =
+                (paint.getCycleMethod() != CycleMethod.NO_CYCLE);
+            setGradientPaint(rq, at,
+                             colors[0], colors[1],
+                             pt1, pt2,
+                             isCyclic, useMask);
+            return;
+        }
+
+        int cycleMethod = paint.getCycleMethod().ordinal();
+        float[] fractions = paint.getFractions();
+        int[] pixels = convertToIntArgbPrePixels(colors, linear);
+
+        // calculate plane equation constants
+        double x = pt1.getX();
+        double y = pt1.getY();
+        at.translate(x, y);
+        // now gradient point 1 is at the origin
+        x = pt2.getX() - x;
+        y = pt2.getY() - y;
+        double len = Math.sqrt(x * x + y * y);
+        at.rotate(x, y);
+        // now gradient point 2 is on the positive x-axis
+        at.scale(len, 1);
+        // now gradient point 1 is at (0.0, 0), point 2 is at (1.0, 0)
+
+        float p0, p1, p3;
+        try {
+            at.invert();
+            p0 = (float)at.getScaleX();
+            p1 = (float)at.getShearX();
+            p3 = (float)at.getTranslateX();
+        } catch (java.awt.geom.NoninvertibleTransformException e) {
+            p0 = p1 = p3 = 0.0f;
+        }
+
+        // assert rq.lock.isHeldByCurrentThread();
+        rq.ensureCapacity(20 + 12 + (numStops*4*2));
+        RenderBuffer buf = rq.getBuffer();
+        buf.putInt(SET_LINEAR_GRADIENT_PAINT);
+        buf.putInt(useMask ? 1 : 0);
+        buf.putInt(linear  ? 1 : 0);
+        buf.putInt(cycleMethod);
+        buf.putInt(numStops);
+        buf.putFloat(p0);
+        buf.putFloat(p1);
+        buf.putFloat(p3);
+        buf.put(fractions);
+        buf.put(pixels);
+    }
+
+/********************** RadialGradientPaint support *************************/
+
+    /**
+     * This method calculates six m** values and a focusX value that
+     * are used by the native fragment shader.  These techniques are
+     * based on a whitepaper by Daniel Rice on radial gradient performance
+     * (attached to the bug report for 6521533).  One can refer to that
+     * document for the complete set of formulas and calculations, but
+     * the basic goal is to compose a transform that will convert an
+     * (x,y) position in device space into a "u" value that represents
+     * the relative distance to the gradient focus point.  The resulting
+     * value can be used to look up the appropriate color by linearly
+     * interpolating between the two nearest colors in the gradient.
+     */
+    private static void setRadialGradientPaint(RenderQueue rq,
+                                               SunGraphics2D sg2d,
+                                               RadialGradientPaint paint,
+                                               boolean useMask)
+    {
+        boolean linear =
+            (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
+        int cycleMethod = paint.getCycleMethod().ordinal();
+        float[] fractions = paint.getFractions();
+        Color[] colors = paint.getColors();
+        int numStops = colors.length;
+        int[] pixels = convertToIntArgbPrePixels(colors, linear);
+        Point2D center = paint.getCenterPoint();
+        Point2D focus = paint.getFocusPoint();
+        float radius = paint.getRadius();
+
+        // save original (untransformed) center and focus points
+        double cx = center.getX();
+        double cy = center.getY();
+        double fx = focus.getX();
+        double fy = focus.getY();
+
+        // transform from gradient coords to device coords
+        AffineTransform at = paint.getTransform();
+        at.preConcatenate(sg2d.transform);
+        focus = at.transform(focus, focus);
+
+        // transform unit circle to gradient coords; we start with the
+        // unit circle (center=(0,0), focus on positive x-axis, radius=1)
+        // and then transform into gradient space
+        at.translate(cx, cy);
+        at.rotate(fx - cx, fy - cy);
+        at.scale(radius, radius);
+            
+        // invert to get mapping from device coords to unit circle
+        try {
+            at.invert();
+        } catch (Exception e) {
+            at.setToScale(0.0, 0.0);
+        }
+        focus = at.transform(focus, focus);
+
+        // clamp the focus point so that it does not rest on, or outside
+        // of, the circumference of the gradient circle
+        fx = Math.min(focus.getX(), 0.99);
+
+        // assert rq.lock.isHeldByCurrentThread();
+        rq.ensureCapacity(20 + 28 + (numStops*4*2));
+        RenderBuffer buf = rq.getBuffer();
+        buf.putInt(SET_RADIAL_GRADIENT_PAINT);
+        buf.putInt(useMask ? 1 : 0);
+        buf.putInt(linear  ? 1 : 0);
+        buf.putInt(numStops);
+        buf.putInt(cycleMethod);
+        buf.putFloat((float)at.getScaleX());
+        buf.putFloat((float)at.getShearX());
+        buf.putFloat((float)at.getTranslateX());
+        buf.putFloat((float)at.getShearY());
+        buf.putFloat((float)at.getScaleY());
+        buf.putFloat((float)at.getTranslateY());
+        buf.putFloat((float)fx);
+        buf.put(fractions);
+        buf.put(pixels);
+    }
+}
--- a/j2se/src/share/classes/sun/java2d/pipe/BufferedRenderPipe.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/BufferedRenderPipe.java	Fri Jun 22 00:46:43 2007 +0000
@@ -72,13 +72,7 @@
      * any special resources for this operation (e.g. enabling gradient
      * shading).
      */
-    protected abstract void validateOperation(SunGraphics2D sg2d);
-
-    /**
-     * Completes the operation by releasing any resources that were set up
-     * in validateOperation().
-     */
-    protected abstract void completeOperation();
+    protected abstract void validateContext(SunGraphics2D sg2d);
 
     public void drawLine(SunGraphics2D sg2d,
                          int x1, int y1, int x2, int y2)
@@ -87,14 +81,13 @@
         int transy = sg2d.transY;
         rq.lock();
         try {
-            validateOperation(sg2d);
+            validateContext(sg2d);
             rq.ensureCapacity(20);
             buf.putInt(DRAW_LINE);
             buf.putInt(x1 + transx);
             buf.putInt(y1 + transy);
             buf.putInt(x2 + transx);
             buf.putInt(y2 + transy);
-            completeOperation();
         } finally {
             rq.unlock();
         }
@@ -105,14 +98,13 @@
     {
         rq.lock();
         try {
-            validateOperation(sg2d);
+            validateContext(sg2d);
             rq.ensureCapacity(20);
             buf.putInt(DRAW_RECT);
             buf.putInt(x + sg2d.transX);
             buf.putInt(y + sg2d.transY);
             buf.putInt(width);
             buf.putInt(height);
-            completeOperation();
         } finally {
             rq.unlock();
         }
@@ -123,14 +115,13 @@
     {
         rq.lock();
         try {
-            validateOperation(sg2d);
+            validateContext(sg2d);
             rq.ensureCapacity(20);
             buf.putInt(FILL_RECT);
             buf.putInt(x + sg2d.transX);
             buf.putInt(y + sg2d.transY);
             buf.putInt(width);
             buf.putInt(height);
-            completeOperation();
         } finally {
             rq.unlock();
         }
@@ -204,7 +195,7 @@
 
         rq.lock();
         try {
-            validateOperation(sg2d);
+            validateContext(sg2d);
 
             int pointBytesRequired = nPoints * BYTES_PER_POLY_POINT;
             int totalBytesRequired = 20 + pointBytesRequired;
@@ -234,8 +225,6 @@
                     }
                 });
             }
-
-            completeOperation();
         } finally {
             rq.unlock();
         }
@@ -364,10 +353,9 @@
     {
         rq.lock();
         try {
-            validateOperation(sg2d);
+            validateContext(sg2d);
             drawHandler.validate(sg2d);
             ProcessPath.drawPath(drawHandler, p2df, transx, transy);
-            completeOperation();
         } finally {
             rq.unlock();
         }
@@ -378,12 +366,11 @@
     {
         rq.lock();
         try {
-            validateOperation(sg2d);
+            validateContext(sg2d);
             drawHandler.validate(sg2d);
             drawHandler.startFillPath();
             ProcessPath.fillPath(drawHandler, p2df, transx, transy);
             drawHandler.endFillPath();
-            completeOperation();
         } finally {
             rq.unlock();
         }
@@ -399,14 +386,13 @@
     {
         rq.lock();
         try {
-            validateOperation(sg2d);
+            validateContext(sg2d);
             rq.ensureCapacity(24); // so that we have room for at least a span
             int newpos = fillSpans(rq, buf.getAddress(),
                                    buf.position(), buf.capacity(),
                                    si, si.getNativeIterator(),
                                    transx, transy);
             buf.position(newpos);
-            completeOperation();
         } finally {
             rq.unlock();
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/BufferedTextPipe.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.pipe;
+
+import java.awt.AlphaComposite;
+import java.awt.Composite;
+import sun.font.GlyphList;
+import sun.java2d.SunGraphics2D;
+import sun.java2d.SurfaceData;
+import static sun.java2d.pipe.BufferedOpCodes.*;
+
+public abstract class BufferedTextPipe extends GlyphListPipe {
+
+    private static final int BYTES_PER_GLYPH_IMAGE = 8;
+    private static final int BYTES_PER_GLYPH_POSITION = 8;
+
+    /**
+     * The following offsets are used to pack the parameters in
+     * createPackedParams().  (They are also used at the native level when
+     * unpacking the params.)
+     */
+    private static final int OFFSET_CONTRAST  = 8;
+    private static final int OFFSET_RGBORDER  = 2;
+    private static final int OFFSET_SUBPIXPOS = 1;
+    private static final int OFFSET_POSITIONS = 0;
+
+    /**
+     * Packs the given parameters into a single int value in order to save
+     * space on the rendering queue.  Note that most of these parameters
+     * are only used for rendering LCD-optimized text, but conditionalizing
+     * this work wouldn't make any impact on performance, so we will pack
+     * those parameters even in the non-LCD case.
+     */
+    private static int createPackedParams(SunGraphics2D sg2d, GlyphList gl) {
+        return
+            (((gl.usePositions() ? 1 : 0)   << OFFSET_POSITIONS) |
+             ((gl.isSubPixPos()  ? 1 : 0)   << OFFSET_SUBPIXPOS) |
+             ((gl.isRGBOrder()   ? 1 : 0)   << OFFSET_RGBORDER ) |
+             ((sg2d.lcdTextContrast & 0xff) << OFFSET_CONTRAST ));
+    }
+
+    protected final RenderQueue rq;
+
+    protected BufferedTextPipe(RenderQueue rq) {
+        this.rq = rq;
+    }
+
+    @Override
+    protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
+        /*
+         * The native drawGlyphList() only works with two composite types:
+         *    - CompositeType.SrcOver (with any extra alpha), or
+         *    - CompositeType.Xor
+         */
+        Composite comp = sg2d.composite;
+        if (comp == AlphaComposite.Src) {
+            /*
+             * In addition to the composite types listed above, the logic
+             * in OGL/D3DSurfaceData.validatePipe() allows for
+             * CompositeType.SrcNoEa, but only in the presence of an opaque
+             * color.  If we reach this case, we know the color is opaque,
+             * and therefore SrcNoEa is the same as SrcOverNoEa, so we
+             * override the composite here.
+             */
+            comp = AlphaComposite.SrcOver;
+        }
+
+        rq.lock();
+        try {
+            validateContext(sg2d, comp);
+            enqueueGlyphList(sg2d, gl);
+        } finally {
+            rq.unlock();
+        }
+    }
+
+    private void enqueueGlyphList(final SunGraphics2D sg2d,
+                                  final GlyphList gl)
+    {
+        // assert rq.lock.isHeldByCurrentThread();
+        RenderBuffer buf = rq.getBuffer();
+        final int totalGlyphs = gl.getNumGlyphs();
+        int glyphBytesRequired = totalGlyphs * BYTES_PER_GLYPH_IMAGE;
+        int posBytesRequired =
+            gl.usePositions() ? totalGlyphs * BYTES_PER_GLYPH_POSITION : 0;
+        int totalBytesRequired = 24 + glyphBytesRequired + posBytesRequired;
+
+        final long[] images = gl.getImages();
+        final float glyphListOrigX = gl.getX() + 0.5f;
+        final float glyphListOrigY = gl.getY() + 0.5f;
+
+        // make sure the RenderQueue keeps a hard reference to the FontStrike
+        // so that the associated glyph images are not disposed while enqueued
+        rq.addReference(gl.getStrike());
+
+        if (totalBytesRequired <= buf.capacity()) {
+            if (totalBytesRequired > buf.remaining()) {
+                // process the queue first and then enqueue the glyphs
+                rq.flushNow();
+            }
+            rq.ensureAlignment(20);
+            buf.putInt(DRAW_GLYPH_LIST);
+            // enqueue parameters
+            buf.putInt(totalGlyphs);
+            buf.putInt(createPackedParams(sg2d, gl));
+            buf.putFloat(glyphListOrigX);
+            buf.putFloat(glyphListOrigY);
+            // now enqueue glyph information
+            buf.put(images, 0, totalGlyphs);
+            if (gl.usePositions()) {
+                float[] positions = gl.getPositions();
+                buf.put(positions, 0, 2*totalGlyphs);
+            }
+        } else {
+            // queue is too small to accomodate glyphs; perform
+            // the operation directly on the queue flushing thread
+            rq.flushAndInvokeNow(new Runnable() {
+                public void run() {
+                    drawGlyphList(totalGlyphs, gl.usePositions(),
+                                  gl.isSubPixPos(), gl.isRGBOrder(),
+                                  sg2d.lcdTextContrast,
+                                  glyphListOrigX, glyphListOrigY,
+                                  images, gl.getPositions());
+                }
+            });
+        }
+    }
+
+    /**
+     * Called as a separate Runnable when the operation is too large to fit
+     * on the RenderQueue.  The OGL/D3D pipelines each have their own (small)
+     * native implementation of this method.
+     */
+    protected abstract void drawGlyphList(int numGlyphs, boolean usePositions,
+                                          boolean subPixPos, boolean rgbOrder,
+                                          int lcdContrast,
+                                          float glOrigX, float glOrigY,
+                                          long[] images, float[] positions);
+
+    /**
+     * Validates the state in the provided SunGraphics2D object.
+     */
+    protected abstract void validateContext(SunGraphics2D sg2d,
+                                            Composite comp);
+}
--- a/j2se/src/share/classes/sun/java2d/pipe/CompositePipe.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/CompositePipe.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,7 @@
 
 /**
  * This interface defines the set of calls used by a rendering pipeline
- * based on the Ductus Rasterizer to communicate the alpha tile sequence
+ * based on an AATileGenerator to communicate the alpha tile sequence
  * to the output (compositing) stages of the pipeline.
  */
 public interface CompositePipe {
--- a/j2se/src/share/classes/sun/java2d/pipe/DuctusRenderer.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,607 +0,0 @@
-/*
- * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.java2d.pipe;
-
-import java.awt.geom.AffineTransform;
-import java.awt.BasicStroke;
-import java.awt.Shape;
-import java.awt.geom.PathIterator;
-import java.awt.geom.Point2D;
-import sun.dc.path.PathConsumer;
-import sun.dc.path.PathException;
-import sun.dc.pr.Rasterizer;
-import sun.dc.pr.PathStroker;
-import sun.dc.pr.PathDasher;
-import sun.dc.pr.PRException;
-
-/**
- * This is the superclass of any class that needs to use the Ductus
- * Rasterizer.
- * This class provides utility routines to create, cache, initialize
- * and release Rasterizer objects.
- */
-public class DuctusRenderer {
-    public static final float PenUnits = 0.01f;
-    public static final int MinPenUnits = 100;
-    public static final int MinPenUnitsAA = 20;
-    public static final float MinPenSizeAA = PenUnits * MinPenUnitsAA;
-
-    static final int RasterizerCaps[] = {
-	Rasterizer.BUTT, Rasterizer.ROUND, Rasterizer.SQUARE
-    };
-
-    static final int RasterizerCorners[] = {
-	Rasterizer.MITER, Rasterizer.ROUND, Rasterizer.BEVEL
-    };
-
-    private static Rasterizer theRasterizer;
-
-    public synchronized static Rasterizer getRasterizer() {
-	Rasterizer r = theRasterizer;
-	if (r == null) {
-	    r = new Rasterizer();
-	} else {
-	    theRasterizer = null;
-	}
-	return r;
-    }
-
-    public synchronized static void dropRasterizer(Rasterizer r) {
-	r.reset();
-	theRasterizer = r;
-    }
-
-    private static byte[] theTile;
-
-    public synchronized static byte[] getAlphaTile() {	
-	byte[] t = theTile;
-	if (t == null) {
-	    int dim = Rasterizer.TILE_SIZE;
-	    t = new byte[dim * dim];
-	} else {
-	    theTile = null;
-	}
-	return t;
-    }
-
-    public synchronized static void dropAlphaTile(byte[] t) {
-	theTile = t;
-    }
-
-    /*
-     * writeAlpha is not threadsafe (it uses a global table without
-     * locking), so we must use this static synchronized accessor
-     * method to serialize accesses to it.
-     */
-    public synchronized static void getAlpha(Rasterizer r, byte[] alpha,
-					     int xstride, int ystride,
-					     int offset)
-	throws PRException
-    {
-	try {
-	    r.writeAlpha(alpha, xstride, ystride, offset);
-	} catch (InterruptedException e) {
-	    Thread.currentThread().interrupt();
-	}
-    }
-
-    /*
-     * Returns a new PathConsumer that will take a path trajectory and
-     * feed the stroked outline for that trajectory to the supplied
-     * PathConsumer.
-     */
-    public static PathConsumer createStroker(PathConsumer consumer,
-					     BasicStroke bs, boolean thin,
-					     AffineTransform transform)
-    {
-	PathStroker stroker = new PathStroker(consumer);
-	consumer = stroker;
-
-	float matrix[] = null;
-	if (!thin) {
-	    stroker.setPenDiameter(bs.getLineWidth());
-	    if (transform != null) {
-		matrix = getTransformMatrix(transform);
-	    }
-	    stroker.setPenT4(matrix);
-	    stroker.setPenFitting(PenUnits, MinPenUnits);
-	}
-	stroker.setCaps(RasterizerCaps[bs.getEndCap()]);
-	stroker.setCorners(RasterizerCorners[bs.getLineJoin()],
-			   bs.getMiterLimit());
-	float[] dashes = bs.getDashArray();
-	if (dashes != null) {
-	    PathDasher dasher = new PathDasher(stroker);
-	    dasher.setDash(dashes, bs.getDashPhase());
-	    if (transform != null && matrix == null) {
-		matrix = getTransformMatrix(transform);
-	    }
-	    dasher.setDashT4(matrix);
-	    consumer = dasher;
-	}
-
-	return consumer;
-    }
-
-    static float[] getTransformMatrix(AffineTransform transform) {
-	float matrix[] = new float[4];
-	double dmatrix[] = new double[6];
-	transform.getMatrix(dmatrix);
-	for (int i = 0; i < 4; i++) {
-	    matrix[i] = (float) dmatrix[i];
-	}
-	return matrix;
-    }
-
-    /*
-     * Disposes a PathConsumer chain created by createStroker.
-     * This method will dispose all PathConsumers chained
-     * together starting from the stroker argument until it
-     * reaches the terminus object, or null.
-     */
-    public static void disposeStroker(PathConsumer stroker,
-				      PathConsumer terminus)
-    {
-	while (stroker != null && stroker != terminus) {
-	    PathConsumer next = stroker.getConsumer();
-	    stroker.dispose();
-	    stroker = next;
-	}
-    }
-
-    final static float UPPER_BND = Float.MAX_VALUE / 2.0f;
-    final static float LOWER_BND = -UPPER_BND;
-
-    /*
-     * Feed a path from a PathIterator to a Ductus PathConsumer.
-     */
-    public static void feedConsumer(PathIterator pi, PathConsumer consumer,
-				    boolean normalize, float norm)
-	throws PathException
-    {
-	consumer.beginPath();
-	boolean pathClosed = false;
-        boolean skip = false;
-        boolean subpathStarted = false;
-	float mx = 0.0f;
-	float my = 0.0f;
-	float point[]  = new float[6];
-	float rnd = (0.5f - norm);
-	float ax = 0.0f;
-	float ay = 0.0f;
-
-	while (!pi.isDone()) {
-	    int type = pi.currentSegment(point);
-	    if (pathClosed == true) {
-		pathClosed = false;
-		if (type != PathIterator.SEG_MOVETO) {
-		    // Force current point back to last moveto point
-		    consumer.beginSubpath(mx, my);
-                    subpathStarted = true;
-		}
-	    }
-	    if (normalize) {
-		int index;
-		switch (type) {
-		case PathIterator.SEG_CUBICTO:
-		    index = 4;
-		    break;
-		case PathIterator.SEG_QUADTO:
-		    index = 2;
-		    break;
-		case PathIterator.SEG_MOVETO:
-		case PathIterator.SEG_LINETO:
-		    index = 0;
-		    break;
-		case PathIterator.SEG_CLOSE:
-		default:
-		    index = -1;
-		    break;
-		}
-		if (index >= 0) {
-		    float ox = point[index];
-		    float oy = point[index+1];
-		    float newax = (float) Math.floor(ox + rnd) + norm;
-		    float neway = (float) Math.floor(oy + rnd) + norm;
-		    point[index] = newax;
-		    point[index+1] = neway;
-		    newax -= ox;
-		    neway -= oy;
-		    switch (type) {
-		    case PathIterator.SEG_CUBICTO:
-			point[0] += ax;
-			point[1] += ay;
-			point[2] += newax;
-			point[3] += neway;
-			break;
-		    case PathIterator.SEG_QUADTO:
-			point[0] += (newax + ax) / 2;
-			point[1] += (neway + ay) / 2;
-			break;
-		    case PathIterator.SEG_MOVETO:
-		    case PathIterator.SEG_LINETO:
-		    case PathIterator.SEG_CLOSE:
-			break;
-		    }
-		    ax = newax;
-		    ay = neway;
-		}
-	    }
-	    switch (type) {
-	    case PathIterator.SEG_MOVETO:
-
-                /* Checking SEG_MOVETO coordinates if they are out of the 
-                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
-                 * and Infinity values. Skipping next path segment in case of 
-                 * invalid data.
-                 */
-                if (point[0] < UPPER_BND && point[0] > LOWER_BND && 
-                    point[1] < UPPER_BND && point[1] > LOWER_BND) 
-                {
-                    mx = point[0];
-                    my = point[1];
-		    consumer.beginSubpath(mx, my);
-                    subpathStarted = true;
-                    skip = false;
-                } else {
-                    skip = true;
-                }
-		break;
-	    case PathIterator.SEG_LINETO:
-                /* Checking SEG_LINETO coordinates if they are out of the 
-                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
-                 * and Infinity values. Ignoring current path segment in case  
-                 * of invalid data. If segment is skipped its endpoint 
-                 * (if valid) is used to begin new subpath. 
-                 */
-                if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
-                    point[1] < UPPER_BND && point[1] > LOWER_BND) 
-                {
-                    if (skip) {
-                        consumer.beginSubpath(point[0], point[1]);
-                        subpathStarted = true;
-                        skip = false;
-                    } else {
-                        consumer.appendLine(point[0], point[1]);
-                    }
-                } 
-		break;
-	    case PathIterator.SEG_QUADTO:
-		// Quadratic curves take two points
-                
-                /* Checking SEG_QUADTO coordinates if they are out of the 
-                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
-                 * and Infinity values. Ignoring current path segment in case  
-                 * of invalid endpoints's data. Equivalent to the SEG_LINETO
-                 * if endpoint coordinates are valid but there are invalid data
-                 * amoung other coordinates
-                 */
-                if (point[2] < UPPER_BND && point[2] > LOWER_BND &&
-                    point[3] < UPPER_BND && point[3] > LOWER_BND) 
-                {
-                    if (skip) {
-                        consumer.beginSubpath(point[2], point[3]);
-                        subpathStarted = true;
-                        skip = false;
-                    } else {
-                        if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
-                            point[1] < UPPER_BND && point[1] > LOWER_BND) 
-                        {
-                            consumer.appendQuadratic(point[0], point[1],
-                                                     point[2], point[3]);
-                        } else {
-                            consumer.appendLine(point[2], point[3]);
-                        }
-                    }
-                } 
-		break;
-	    case PathIterator.SEG_CUBICTO:
-		// Cubic curves take three points
-                
-                /* Checking SEG_CUBICTO coordinates if they are out of the 
-                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
-                 * and Infinity values. Ignoring current path segment in case  
-                 * of invalid endpoints's data. Equivalent to the SEG_LINETO
-                 * if endpoint coordinates are valid but there are invalid data
-                 * amoung other coordinates
-                 */
-                if (point[4] < UPPER_BND && point[4] > LOWER_BND &&
-                    point[5] < UPPER_BND && point[5] > LOWER_BND) 
-                {
-                    if (skip) {
-                        consumer.beginSubpath(point[4], point[5]);
-                        subpathStarted = true;
-                        skip = false;
-                    } else {
-                        if (point[0] < UPPER_BND && point[0] > LOWER_BND && 
-                            point[1] < UPPER_BND && point[1] > LOWER_BND &&
-                            point[2] < UPPER_BND && point[2] > LOWER_BND &&
-                            point[3] < UPPER_BND && point[3] > LOWER_BND) 
-                        {
-                            consumer.appendCubic(point[0], point[1],
-                                                 point[2], point[3],
-                                                 point[4], point[5]);
-                        } else {
-                            consumer.appendLine(point[4], point[5]);
-                        }
-                    }
-                }
-		break;
-	    case PathIterator.SEG_CLOSE:
-                if (subpathStarted) {
-                    consumer.closedSubpath();
-                    subpathStarted = false;
-		    pathClosed = true;
-                }
-		break;
-	    }
-	    pi.next();
-	}
-
-	consumer.endPath();
-    }
-
-    /*
-     * Returns a new Rasterizer that is ready to rasterize the given Shape.
-     */
-    public static Rasterizer createShapeRasterizer(PathIterator pi,
-						   AffineTransform transform,
-						   BasicStroke stroke,
-						   boolean thin,
-						   boolean normalize,
-						   float norm) {
-	Rasterizer r = getRasterizer();
-
-        if (stroke != null) {
-	    float matrix[] = null;
-            r.setUsage(Rasterizer.STROKE);
-	    if (thin) {
-		r.setPenDiameter(MinPenSizeAA);
-	    } else {
-		r.setPenDiameter(stroke.getLineWidth());
-		if (transform != null) {
-		    matrix = getTransformMatrix(transform);
-		    r.setPenT4(matrix);
-		}
-		r.setPenFitting(PenUnits, MinPenUnitsAA);
-	    }
-	    r.setCaps(RasterizerCaps[stroke.getEndCap()]);
-	    r.setCorners(RasterizerCorners[stroke.getLineJoin()],
-			 stroke.getMiterLimit());
-	    float[] dashes = stroke.getDashArray();
-	    if (dashes != null) {
-		r.setDash(dashes, stroke.getDashPhase());
-		if (transform != null && matrix == null) {
-		    matrix = getTransformMatrix(transform);
-		}
-		r.setDashT4(matrix);
-	    }
-        } else {
-            r.setUsage(pi.getWindingRule() == PathIterator.WIND_EVEN_ODD
-                       ? Rasterizer.EOFILL
-                       : Rasterizer.NZFILL);
-        }
-
-	r.beginPath();
-	{
-            boolean pathClosed = false;
-            boolean skip = false;
-            boolean subpathStarted = false;
-            float mx = 0.0f;
-            float my = 0.0f;
-            float point[]  = new float[6];
-	    float rnd = (0.5f - norm);
-	    float ax = 0.0f;
-	    float ay = 0.0f;
-
-	    while (!pi.isDone()) {
-		int type = pi.currentSegment(point);
-                if (pathClosed == true) {
-                    pathClosed = false;
-                    if (type != PathIterator.SEG_MOVETO) {
-                        // Force current point back to last moveto point
-                        r.beginSubpath(mx, my);
-                        subpathStarted = true;
-                    }
-                }
-		if (normalize) {
-		    int index;
-		    switch (type) {
-		    case PathIterator.SEG_CUBICTO:
-			index = 4;
-			break;
-		    case PathIterator.SEG_QUADTO:
-			index = 2;
-			break;
-		    case PathIterator.SEG_MOVETO:
-		    case PathIterator.SEG_LINETO:
-			index = 0;
-			break;
-		    case PathIterator.SEG_CLOSE:
-		    default:
-			index = -1;
-			break;
-		    }
-		    if (index >= 0) {
-			float ox = point[index];
-			float oy = point[index+1];
-			float newax = (float) Math.floor(ox + rnd) + norm;
-			float neway = (float) Math.floor(oy + rnd) + norm;
-			point[index] = newax;
-			point[index+1] = neway;
-			newax -= ox;
-			neway -= oy;
-			switch (type) {
-			case PathIterator.SEG_CUBICTO:
-			    point[0] += ax;
-			    point[1] += ay;
-			    point[2] += newax;
-			    point[3] += neway;
-			    break;
-			case PathIterator.SEG_QUADTO:
-			    point[0] += (newax + ax) / 2;
-			    point[1] += (neway + ay) / 2;
-			    break;
-			case PathIterator.SEG_MOVETO:
-			case PathIterator.SEG_LINETO:
-			case PathIterator.SEG_CLOSE:
-			    break;
-			}
-			ax = newax;
-			ay = neway;
-		    }
-		}
-		switch (type) {
-		case PathIterator.SEG_MOVETO:
-
-                   /* Checking SEG_MOVETO coordinates if they are out of the 
-                    * [LOWER_BND, UPPER_BND] range. This check also handles NaN 
-                    * and Infinity values. Skipping next path segment in case 
-                    * of invalid data.
-                    */
- 
-                    if (point[0] < UPPER_BND &&  point[0] > LOWER_BND && 
-                        point[1] < UPPER_BND &&  point[1] > LOWER_BND) 
-                    {
-                        mx = point[0];
-                        my = point[1];
-		        r.beginSubpath(mx, my);
-                        subpathStarted = true;
-                        skip = false;
-                    } else {
-                        skip = true;
-                    }
-		    break;
-
-		case PathIterator.SEG_LINETO:
-                    /* Checking SEG_LINETO coordinates if they are out of the 
-                     * [LOWER_BND, UPPER_BND] range. This check also handles 
-                     * NaN and Infinity values. Ignoring current path segment 
-                     * in case of invalid data. If segment is skipped its 
-                     * endpoint (if valid) is used to begin new subpath. 
-                     */
-                    if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
-                        point[1] < UPPER_BND && point[1] > LOWER_BND) 
-                    {
-                        if (skip) {
-                            r.beginSubpath(point[0], point[1]);
-                            subpathStarted = true;
-                            skip = false;
-                        } else {
-                            r.appendLine(point[0], point[1]);
-                        }
-                    }
-		    break;
-
-		case PathIterator.SEG_QUADTO:
-                    // Quadratic curves take two points
-                    
-                    /* Checking SEG_QUADTO coordinates if they are out of the 
-                     * [LOWER_BND, UPPER_BND] range. This check also handles 
-                     * NaN and Infinity values. Ignoring current path segment  
-                     * in case of invalid endpoints's data. Equivalent to the 
-                     * SEG_LINETO if endpoint coordinates are valid but there 
-                     * are invalid data amoung other coordinates
-                     */
-                    if (point[2] < UPPER_BND && point[2] > LOWER_BND &&
-                        point[3] < UPPER_BND && point[3] > LOWER_BND) 
-                    {
-                        if (skip) {
-                            r.beginSubpath(point[2], point[3]);
-                            subpathStarted = true;
-                            skip = false;
-                        } else {
-                            if (point[0] < UPPER_BND && point[0] > LOWER_BND &&
-                                point[1] < UPPER_BND && point[1] > LOWER_BND) 
-                            {
-                                r.appendQuadratic(point[0], point[1],
-                                                  point[2], point[3]);
-                            } else {
-                                r.appendLine(point[2], point[3]);
-                            }
-                        }
-                    }
-		    break;
-		case PathIterator.SEG_CUBICTO:
-                    // Cubic curves take three points
-                    
-                    /* Checking SEG_CUBICTO coordinates if they are out of the 
-                     * [LOWER_BND, UPPER_BND] range. This check also handles 
-                     * NaN and Infinity values. Ignoring  current path segment 
-                     * in case of invalid endpoints's data. Equivalent to the 
-                     * SEG_LINETO if endpoint coordinates are valid but there 
-                     * are invalid data amoung other coordinates
-                     */
-
-                    if (point[4] < UPPER_BND && point[4] > LOWER_BND &&
-                        point[5] < UPPER_BND && point[5] > LOWER_BND) 
-                    {
-                        if (skip) {
-                            r.beginSubpath(point[4], point[5]);
-                            subpathStarted = true;
-                            skip = false;
-                        } else {
-                            if (point[0] < UPPER_BND && point[0] > LOWER_BND && 
-                                point[1] < UPPER_BND && point[1] > LOWER_BND &&
-                                point[2] < UPPER_BND && point[2] > LOWER_BND &&
-                                point[3] < UPPER_BND && point[3] > LOWER_BND) 
-                            {
-                                r.appendCubic(point[0], point[1],
-                                              point[2], point[3],
-                                              point[4], point[5]);
-                            } else {
-                                r.appendLine(point[4], point[5]);
-                            }
-                        }
-                    }
-		    break;
-		case PathIterator.SEG_CLOSE:
-                    if (subpathStarted) {
-		        r.closedSubpath();
-                        subpathStarted = false;
-                        pathClosed = true;
-                    }
-		    break;
-		}
-		pi.next();
-	    }
-	}
-
-        try {
-            r.endPath();
-        } catch (PRException e) {
-            /*
-             * This exeption is thrown from the native part of the Ductus
-             * (only in case of a debug build) to indicate that some
-             * segments of the path have very large coordinates.
-             * See 4485298 for more info.
-             */
-            System.err.println("DuctusRenderer.createShapeRasterizer: " +  e);
-        }
-
-        return r;
-    }
-}
--- a/j2se/src/share/classes/sun/java2d/pipe/DuctusShapeRenderer.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-/*
- * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.java2d.pipe;
-
-import java.awt.BasicStroke;
-import java.awt.Rectangle;
-import java.awt.Shape;
-import java.awt.geom.PathIterator;
-import sun.awt.SunHints;
-import sun.java2d.SunGraphics2D;
-import sun.dc.pr.Rasterizer;
-import sun.dc.pr.PRException;
-
-/**
- * This class is used to convert raw geometry into 8-bit alpha tiles
- * using the Ductus Rasterizer for application by the next stage of
- * the pipeline.
- * This class sets up the Rasterizer and computes the alpha tiles
- * and then passes them on to a CompositePipe object for painting.
- */
-public class DuctusShapeRenderer extends DuctusRenderer
-				 implements ShapeDrawPipe
-{
-    CompositePipe outpipe;
-
-    public DuctusShapeRenderer(CompositePipe pipe) {
-	outpipe = pipe;
-    }
-
-    public void draw(SunGraphics2D sg, Shape s) {
-	BasicStroke bs;
-
-	if (sg.stroke instanceof BasicStroke) {
-	    bs = (BasicStroke) sg.stroke;
-	} else {
-	    s = sg.stroke.createStrokedShape(s);
-	    bs = null;
-	}
-
-	renderPath(sg, s, bs);
-    }
-
-    public void fill(SunGraphics2D sg, Shape s) {
-	renderPath(sg, s, null);
-    }
-
-    public void renderPath(SunGraphics2D sg, Shape s, BasicStroke bs) {
-	PathIterator pi = s.getPathIterator(sg.transform);
-	boolean adjust = (bs != null &&
-			  sg.strokeHint != SunHints.INTVAL_STROKE_PURE);
-	boolean thin = (sg.strokeState <= sg.STROKE_THINDASHED);
-	Rasterizer r = createShapeRasterizer(pi, sg.transform, bs, thin,
-					     adjust, 0.5f);
-	Object context = null;
-	byte alpha[] = null;
-
-	try {
-	    int abox[] = new int[4];
-	    r.getAlphaBox(abox);
-	    Rectangle devR = new Rectangle(abox[0], abox[1],
-					   abox[2] - abox[0],
-					   abox[3] - abox[1]);
-	    sg.getCompClip().clipBoxToBounds(abox);
-	    if (abox[0] >= abox[2] || abox[1] >= abox[3]) {
-		return;
-	    }
-	    r.setOutputArea(abox[0], abox[1],
-			    abox[2] - abox[0], abox[3] - abox[1]);
-	    context = outpipe.startSequence(sg, s, devR, abox);
-
-	    int tsize = Rasterizer.TILE_SIZE;
-	    alpha = getAlphaTile();
-
-	    byte[] atile;
-
-	    for (int y = abox[1]; y < abox[3]; y += tsize) {
-		for (int x = abox[0]; x < abox[2]; x += tsize) {
-		    int w = Math.min(tsize, abox[2] - x);
-		    int h = Math.min(tsize, abox[3] - y);
-
-		    int state = r.getTileState();
-		    if (state == Rasterizer.TILE_IS_ALL_0 ||
-			outpipe.needTile(context, x, y, w, h) == false)
-		    {
-			r.nextTile();
-			outpipe.skipTile(context, x, y);
-			continue;
-		    }
-		    if (state == Rasterizer.TILE_IS_GENERAL) {
-			atile = alpha;
-			getAlpha(r, alpha, 1, tsize, 0);
-		    } else {
-			atile = null;
-			r.nextTile();
-		    }
-
-		    outpipe.renderPathTile(context, atile, 0, tsize,
-					   x, y, w, h);
-		}
-	    }
-	} catch (PRException e) {
-	    e.printStackTrace();
-	} finally {
-	    dropRasterizer(r);
-	    if (context != null) {
-		outpipe.endSequence(context);
-	    }
-	    if (alpha != null) {
-		dropAlphaTile(alpha);
-	    }
-	}
-    }
-}
--- a/j2se/src/share/classes/sun/java2d/pipe/LoopPipe.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/LoopPipe.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,8 +37,6 @@
 import java.awt.geom.IllegalPathStateException;
 import java.awt.geom.Path2D;
 import java.awt.font.GlyphVector;
-import sun.dc.path.PathConsumer;
-import sun.dc.path.PathException;
 import sun.java2d.SunGraphics2D;
 import sun.java2d.SurfaceData;
 import sun.java2d.loops.FontInfo;
@@ -50,6 +48,8 @@
 	       PixelFillPipe,
 	       ShapeDrawPipe
 {
+    final static RenderingEngine RenderEngine = RenderingEngine.getInstance();
+
     public void drawLine(SunGraphics2D sg2d,
 			 int x1, int y1, int x2, int y2)
     {
@@ -222,33 +222,17 @@
 	    sr.setRule(PathIterator.WIND_NON_ZERO);
 
 	    BasicStroke bs = (BasicStroke) sg2d.stroke;
-	    AffineTransform transform =
-		(sg2d.transformState >= sg2d.TRANSFORM_TRANSLATESCALE
-		 ? sg2d.transform : null);
 	    boolean thin = (sg2d.strokeState <= sg2d.STROKE_THINDASHED);
-
-	    PathConsumer stroker =
-		DuctusRenderer.createStroker(sr, bs, thin, transform);
+            boolean normalize =
+                (sg2d.strokeHint != SunHints.INTVAL_STROKE_PURE);
 
-	    try {
-		transform =
-		    ((sg2d.transformState == sg2d.TRANSFORM_ISIDENT)
-		     ? null
-		     : sg2d.transform);
-		PathIterator pi = s.getPathIterator(transform);
-
-		boolean adjust =
-		    (sg2d.strokeHint != SunHints.INTVAL_STROKE_PURE);
-		DuctusRenderer.feedConsumer(pi, stroker, adjust, 0.25f);
-	    } catch (PathException e) {
-		throw new InternalError("Unable to Stroke shape ("+
-					e.getMessage()+")");
-	    } finally {
-		DuctusRenderer.disposeStroker(stroker, sr);
-	    }
+            RenderEngine.strokeTo(s,
+                                  sg2d.transform, bs,
+                                  thin, normalize, false, sr);
 	} catch (Throwable t) {
 	    sr.dispose();
 	    sr = null;
+            t.printStackTrace();
 	    throw new InternalError("Unable to Stroke shape ("+
 				    t.getMessage()+")");
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/RenderingEngine.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.pipe;
+
+import java.awt.Shape;
+import java.awt.BasicStroke;
+import java.awt.geom.PathIterator;
+import java.awt.geom.AffineTransform;
+
+import java.security.PrivilegedAction;
+import java.security.AccessController;
+import java.util.ServiceLoader;
+import sun.security.action.GetPropertyAction;
+
+import sun.awt.geom.PathConsumer2D;
+
+/**
+ * This class abstracts a number of features for which the Java 2D
+ * implementation relies on proprietary licensed software libraries.
+ * Access to those features is now achieved by retrieving the singleton
+ * instance of this class and calling the appropriate methods on it.
+ * The 3 primary features abstracted here include:
+ * <dl>
+ * <dt>Shape createStrokedShape(Shape, [BasicStroke attributes]);
+ * <dd>This method implements the functionality of the method of the
+ * same name on the {@link BasicStroke} class.
+ * <dt>void strokeTo(Shape, [rendering parameters], PathConsumer2D);
+ * <dd>This method performs widening of the source path on the fly
+ * and sends the results to the given {@link PathConsumer2D} object.
+ * This procedure avoids having to create an intermediate Shape
+ * object to hold the results of the {@code createStrokedShape} method.
+ * The main user of this method is the Java 2D non-antialiasing renderer.
+ * <dt>AATileGenerator getAATileGenerator(Shape, [rendering parameters]);
+ * <dd>This method returns an object which can iterate over the
+ * specified bounding box and produce tiles of coverage values for
+ * antialiased rendering.  The details of the operation of the
+ * {@link AATileGenerator} object are explained in its class comments.
+ * </dl>
+ * Additionally, the following informational method supplies important
+ * data about the implementation.
+ * <dl>
+ * <dt>float getMinimumAAPenSize()
+ * <dd>This method provides information on how small the BasicStroke
+ * line width can get before dropouts occur.  Rendering with a BasicStroke
+ * is defined to never allow the line to have breaks, gaps, or dropouts
+ * even if the width is set to 0.0f, so this information allows the
+ * {@link SunGraphics2D} class to detect the "thin line" case and set
+ * the rendering attributes accordingly.
+ * </dl>
+ * At startup the runtime will load a single instance of this class.
+ * It searches the classpath for a registered provider of this API
+ * and returns either the last one it finds, or the instance whose
+ * class name matches the value supplied in the System property
+ * {@code sun.java2d.renderer}.
+ * Additionally, a runtime System property flag can be set to trace
+ * all calls to methods on the {@code RenderingEngine} in use by
+ * setting the sun.java2d.renderer.trace property to any non-null value.
+ * <p>
+ * Parts of the system that need to use any of the above features should
+ * call {@code RenderingEngine.getInstance()} to obtain the properly
+ * registered (and possibly trace-enabled) version of the RenderingEngine.
+ */
+public abstract class RenderingEngine {
+    private static RenderingEngine reImpl;
+
+    /**
+     * Returns an instance of {@code RenderingEngine} as determined
+     * by the installation environment and runtime flags.
+     * <p>
+     * A specific instance of the {@code RenderingEngine} can be
+     * chosen by specifying the runtime flag:
+     * <pre>
+     *     java -Dsun.java2d.renderer=&lt;classname&gt;
+     * </pre>
+     * If no specific {@code RenderingEngine} is specified on the command
+     * line then the last one returned by enumerating all subclasses of
+     * {@code RenderingEngine} known to the ServiceLoader is used.
+     * <p>
+     * Runtime tracing of the actions of the {@code RenderingEngine}
+     * can be enabled by specifying the runtime flag:
+     * <pre>
+     *     java -Dsun.java2d.renderer.trace=&lt;any string&gt;
+     * </pre>
+     * @return an instance of {@code RenderingEngine}
+     * @since 1.7
+     */
+    public static synchronized RenderingEngine getInstance() {
+        if (reImpl != null) {
+            return reImpl;
+        }
+
+        reImpl = (RenderingEngine)
+            AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
+                    String reClass =
+                        System.getProperty("sun.java2d.renderer",
+                                           "sun.dc.DuctusRenderingEngine");
+
+                    ServiceLoader<RenderingEngine> reLoader =
+                        ServiceLoader.loadInstalled(RenderingEngine.class);
+
+                    RenderingEngine service = null;
+
+                    for (RenderingEngine re : reLoader) {
+                        service = re;
+                        if (re.getClass().getName().equals(reClass)) {
+                            break;
+                        }
+                    }
+                    return service;
+                }
+            });
+
+        if (reImpl == null) {
+            throw new InternalError("No RenderingEngine module found");
+        }
+
+        GetPropertyAction gpa =
+            new GetPropertyAction("sun.java2d.renderer.trace");
+        String reTrace = (String) AccessController.doPrivileged(gpa);
+        if (reTrace != null) {
+            reImpl = new Tracer(reImpl);
+        }
+
+        return reImpl;
+    }
+
+    /**
+     * Create a widened path as specified by the parameters.
+     * <p>
+     * The specified {@code src} {@link Shape} is widened according
+     * to the specified attribute parameters as per the
+     * {@link BasicStroke} specification.
+     *
+     * @param src the source path to be widened
+     * @param width the width of the widened path as per {@code BasicStroke}
+     * @param caps the end cap decorations as per {@code BasicStroke}
+     * @param join the segment join decorations as per {@code BasicStroke}
+     * @param miterlimit the miter limit as per {@code BasicStroke}
+     * @param dashes the dash length array as per {@code BasicStroke}
+     * @param dashphase the initial dash phase as per {@code BasicStroke}
+     * @return the widened path stored in a new {@code Shape} object
+     * @since 1.7
+     */
+    public abstract Shape createStrokedShape(Shape src,
+                                             float width,
+                                             int caps,
+                                             int join,
+                                             float miterlimit,
+                                             float dashes[],
+                                             float dashphase);
+
+    /**
+     * Sends the geometry for a widened path as specified by the parameters
+     * to the specified consumer.
+     * <p>
+     * The specified {@code src} {@link Shape} is widened according
+     * to the parameters specified by the {@link BasicStroke} object.
+     * Adjustments are made to the path as appropriate for the
+     * {@link VALUE_STROKE_NORMALIZE} hint if the {@code normalize}
+     * boolean parameter is true.
+     * Adjustments are made to the path as appropriate for the
+     * {@link VALUE_ANTIALIAS_ON} hint if the {@code antialias}
+     * boolean parameter is true.
+     * <p>
+     * The geometry of the widened path is forwarded to the indicated
+     * {@link PathConsumer2D} object as it is calculated.
+     *
+     * @param src the source path to be widened
+     * @param bs the {@code BasicSroke} object specifying the
+     *           decorations to be applied to the widened path
+     * @param normalize indicates whether stroke normalization should
+     *                  be applied
+     * @param antialias indicates whether or not adjustments appropriate
+     *                  to antialiased rendering should be applied
+     * @param consumer the {@code PathConsumer2D} instance to forward
+     *                 the widened geometry to
+     * @since 1.7
+     */
+    public abstract void strokeTo(Shape src,
+                                  AffineTransform at,
+                                  BasicStroke bs,
+                                  boolean thin,
+                                  boolean normalize,
+                                  boolean antialias,
+                                  PathConsumer2D consumer);
+
+    /**
+     * Construct an antialiased tile generator for the given shape with
+     * the given rendering attributes and store the bounds of the tile
+     * iteration in the bbox parameter.
+     * The {@code at} parameter specifies a transform that should affect
+     * both the shape and the {@code BasicStroke} attributes.
+     * The {@code clip} parameter specifies the current clip in effect
+     * in device coordinates and can be used to prune the data for the
+     * operation, but the renderer is not required to perform any
+     * clipping.
+     * If the {@code BasicStroke} parameter is null then the shape
+     * should be filled as is, otherwise the attributes of the
+     * {@code BasicStroke} should be used to specify a draw operation.
+     * The {@code thin} parameter indicates whether or not the
+     * transformed {@code BasicStroke} represents coordinates smaller
+     * than the minimum resolution of the antialiasing rasterizer as
+     * specified by the {@code getMinimumAAPenWidth()} method.
+     * <p>
+     * Upon returning, this method will fill the {@code bbox} parameter
+     * with 4 values indicating the bounds of the iteration of the
+     * tile generator.
+     * The iteration order of the tiles will be as specified by the
+     * pseudo-code:
+     * <pre>
+     *     for (y = bbox[1]; y < bbox[3]; y += tileheight) {
+     *         for (x = bbox[0]; x < bbox[2]; x += tilewidth) {
+     *         }
+     *     }
+     * </pre>
+     * If there is no output to be rendered, this method may return
+     * null.
+     *
+     * @param s the shape to be rendered (fill or draw)
+     * @param at the transform to be applied to the shape and the
+     *           stroke attributes
+     * @param clip the current clip in effect in device coordinates
+     * @param bs if non-null, a {@code BasicStroke} whose attributes
+     *           should be applied to this operation
+     * @param thin true if the transformed stroke attributes are smaller
+     *             than the minimum dropout pen width
+     * @param normalize true if the {@code VALUE_STROKE_NORMALIZE}
+     *                  {@code RenderingHint} is in effect
+     * @param bbox returns the bounds of the iteration
+     * @return the {@code AATileGenerator} instance to be consulted
+     *         for tile coverages, or null if there is no output to render
+     * @since 1.7
+     */
+    public abstract AATileGenerator getAATileGenerator(Shape s,
+                                                       AffineTransform at,
+                                                       Region clip,
+                                                       BasicStroke bs,
+                                                       boolean thin,
+                                                       boolean normalize,
+                                                       int bbox[]);
+
+    /**
+     * Returns the minimum pen width that the antialiasing rasterizer
+     * can represent without dropouts occuring.
+     * @since 1.7
+     */
+    public abstract float getMinimumAAPenSize();
+
+    /**
+     * Utility method to feed a {@link PathConsumer2D} object from a
+     * given {@link PathIterator}.
+     * This method deals with the details of running the iterator and
+     * feeding the consumer a segment at a time.
+     */
+    public static void feedConsumer(PathIterator pi, PathConsumer2D consumer) {
+        float coords[] = new float[6];
+        while (!pi.isDone()) {
+            switch (pi.currentSegment(coords)) {
+            case PathIterator.SEG_MOVETO:
+                consumer.moveTo(coords[0], coords[1]);
+                break;
+            case PathIterator.SEG_LINETO:
+                consumer.lineTo(coords[0], coords[1]);
+                break;
+            case PathIterator.SEG_QUADTO:
+                consumer.quadTo(coords[0], coords[1],
+                                coords[2], coords[3]);
+                break;
+            case PathIterator.SEG_CUBICTO:
+                consumer.curveTo(coords[0], coords[1],
+                                 coords[2], coords[3],
+                                 coords[4], coords[5]);
+                break;
+            case PathIterator.SEG_CLOSE:
+                consumer.closePath();
+                break;
+            }
+            pi.next();
+        }
+    }
+
+    static class Tracer extends RenderingEngine {
+        RenderingEngine target;
+        String name;
+
+        public Tracer(RenderingEngine target) {
+            this.target = target;
+            name = target.getClass().getName();
+        }
+
+        public Shape createStrokedShape(Shape src,
+                                        float width,
+                                        int caps,
+                                        int join,
+                                        float miterlimit,
+                                        float dashes[],
+                                        float dashphase)
+        {
+            System.out.println(name+".createStrokedShape("+
+                               src.getClass().getName()+", "+
+                               "width = "+width+", "+
+                               "caps = "+caps+", "+
+                               "join = "+join+", "+
+                               "miter = "+miterlimit+", "+
+                               "dashes = "+dashes+", "+
+                               "dashphase = "+dashphase+")");
+            return target.createStrokedShape(src,
+                                             width, caps, join, miterlimit,
+                                             dashes, dashphase);
+        }
+
+        public void strokeTo(Shape src,
+                             AffineTransform at,
+                             BasicStroke bs,
+                             boolean thin,
+                             boolean normalize,
+                             boolean antialias,
+                             PathConsumer2D consumer)
+        {
+            System.out.println(name+".strokeTo("+
+                               src.getClass().getName()+", "+
+                               at+", "+
+                               bs+", "+
+                               (thin ? "thin" : "wide")+", "+
+                               (normalize ? "normalized" : "pure")+", "+
+                               (antialias ? "AA" : "non-AA")+", "+
+                               consumer.getClass().getName()+")");
+            target.strokeTo(src, at, bs, thin, normalize, antialias, consumer);
+        }
+
+        public float getMinimumAAPenSize() {
+            System.out.println(name+".getMinimumAAPenSize()");
+            return target.getMinimumAAPenSize();
+        }
+
+        public AATileGenerator getAATileGenerator(Shape s,
+                                                  AffineTransform at,
+                                                  Region clip,
+                                                  BasicStroke bs,
+                                                  boolean thin,
+                                                  boolean normalize,
+                                                  int bbox[])
+        {
+            System.out.println(name+".getAATileGenerator("+
+                               s.getClass().getName()+", "+
+                               at+", "+
+                               clip+", "+
+                               bs+", "+
+                               (thin ? "thin" : "wide")+", "+
+                               (normalize ? "normalized" : "pure")+")");
+            return target.getAATileGenerator(s, at, clip,
+                                             bs, thin, normalize,
+                                             bbox);
+        }
+    }
+}
--- a/j2se/src/share/classes/sun/java2d/pipe/ShapeSpanIterator.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/ShapeSpanIterator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -29,9 +29,7 @@
 import java.awt.Rectangle;
 import java.awt.BasicStroke;
 import sun.awt.SunHints;
-import sun.dc.path.PathConsumer;
-import sun.dc.path.PathException;
-import sun.dc.path.FastPathProducer;
+import sun.awt.geom.PathConsumer2D;
 import sun.java2d.SunGraphics2D;
 
 /**
@@ -67,7 +65,9 @@
  *     }
  * }
  */
-public final class ShapeSpanIterator implements SpanIterator, PathConsumer {
+public final class ShapeSpanIterator
+    implements SpanIterator, PathConsumer2D
+{
     long pData;
 
     static {
@@ -80,7 +80,7 @@
 
     public ShapeSpanIterator(SunGraphics2D sg2d, boolean isBasicStroke) {
 	// Note if this is a BasicStroke operation then the caller who
-	// feeds the path data to the Ductus PathStroker should normalize
+	// feeds the path data to the stroking engine should normalize
 	// prior to the stroking operation so we do not adjust here
 	boolean adjust = (!isBasicStroke &&
 			  sg2d != null &&
@@ -101,7 +101,7 @@
 	    addSegment(pi.currentSegment(coords), coords);
 	    pi.next();
 	}
-	endPath();
+	pathDone();
     }
 
     /*
@@ -200,34 +200,14 @@
      */
     public native void dispose();
 
-    public PathConsumer getConsumer() {
-	return null;
-    }
-
-    public void beginPath() {
-    }
-
-    public native void beginSubpath(float x0, float y0);
-
-    public native void appendLine(float x1, float y1);
-
-    public native void appendQuadratic(float xm, float ym,
-				       float x1, float y1);
-
-    public native void appendCubic(float xm, float ym,
-				   float xn, float yn,
-				   float x1, float y1);
-
-    public void closedSubpath() {
-    }
-
-    public native void endPath();
-
-    public void	useProxy(FastPathProducer proxy)
-	throws PathException
-    {
-	proxy.sendTo(this);
-    }
-
-    public native long getCPathConsumer();
+    public native void moveTo(float x, float y);
+    public native void lineTo(float x, float y);
+    public native void quadTo(float x1, float y1,
+                              float x2, float y2);
+    public native void curveTo(float x1, float y1,
+                               float x2, float y2,
+                               float x3, float y3);
+    public native void closePath();
+    public native void pathDone();
+    public native long getNativeConsumer();
 }
--- a/j2se/src/share/classes/sun/java2d/pipe/SpanShapeRenderer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/java2d/pipe/SpanShapeRenderer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,8 +34,6 @@
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 import sun.awt.SunHints;
-import sun.dc.path.PathConsumer;
-import sun.dc.path.PathException;
 
 /**
  * This class is used to convert raw geometry into a span iterator
@@ -44,6 +42,8 @@
  * perform the actual rendering.
  */
 public abstract class SpanShapeRenderer implements ShapeDrawPipe {
+    final static RenderingEngine RenderEngine = RenderingEngine.getInstance();
+
     public static class Composite extends SpanShapeRenderer {
 	CompositePipe comppipe;
 
@@ -102,29 +102,13 @@
 	sr.setRule(PathIterator.WIND_NON_ZERO);
 
 	BasicStroke bs = (BasicStroke) sg.stroke;
-	AffineTransform transform =
-	    (sg.transformState >= sg.TRANSFORM_TRANSLATESCALE
-	     ? sg.transform : null);
 	boolean thin = (sg.strokeState <= sg.STROKE_THINDASHED);
-
-	PathConsumer stroker =
-	    DuctusRenderer.createStroker(sr, bs, thin, transform);
+        boolean normalize =
+            (sg.strokeHint != SunHints.INTVAL_STROKE_PURE);
 
-	try {
-	    transform =
-		((sg.transformState != sg.TRANSFORM_ISIDENT)
-		 ? sg.transform : null);
-	    PathIterator pi = s.getPathIterator(transform);
-
-	    boolean adjust =
-		(sg.strokeHint != SunHints.INTVAL_STROKE_PURE);
-	    DuctusRenderer.feedConsumer(pi, stroker, adjust, 0.25f);
-	} catch (PathException e) {
-	    throw new InternalError("Unable to Stroke shape ("+
-				    e.getMessage()+")");
-	} finally {
-	    DuctusRenderer.disposeStroker(stroker, sr);
-	}
+        RenderEngine.strokeTo(s,
+                              sg.transform, bs,
+                              thin, normalize, false, sr);
 
 	renderSpans(sg, clipRegion, s, sr);
     }
--- a/j2se/src/share/classes/sun/management/snmp/jvminstr/README	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/management/snmp/jvminstr/README	Fri Jun 22 00:46:43 2007 +0000
@@ -1,6 +1,6 @@
 #==============================================================================
 #          JVM Management MIB - Instrumentation Classes
-#          Date: 07/05/24, Version: 1.5
+#          Date: 07/06/21, Version: 1.5
 #==============================================================================
 
 In this directory:
--- a/j2se/src/share/classes/sun/misc/Unsafe.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/misc/Unsafe.java	Fri Jun 22 00:46:43 2007 +0000
@@ -35,7 +35,7 @@
  * limited because only trusted code can obtain instances of it.
  *
  * @author John R. Rose
- * @version  1.27, 07/05/05
+ * @version  1.28, 07/06/04
  * @see #getUnsafe
  */
 
@@ -499,15 +499,63 @@
     /**
      * Sets all bytes in a given block of memory to a fixed value
      * (usually zero).
+     *
+     * <p>This method determines a block's base address by means of two parameters,
+     * and so it provides (in effect) a <em>double-register</em> addressing mode,
+     * as discussed in {@link #getInt(Object,long)}.  When the object reference is null,
+     * the offset supplies an absolute base address.
+     *
+     * <p>The stores are in coherent (atomic) units of a size determined
+     * by the address and length parameters.  If the effective address and
+     * length are all even modulo 8, the stores take place in 'long' units.
+     * If the effective address and length are (resp.) even modulo 4 or 2,
+     * the stores take place in units of 'int' or 'short'.
+     * 
+     * @since 1.7
      */
-    public native void setMemory(long address, long bytes, byte value);
+    public native void setMemory(Object o, long offset, long bytes, byte value);
+
+    /**
+     * Sets all bytes in a given block of memory to a fixed value
+     * (usually zero).  This provides a <em>single-register</em> addressing mode,
+     * as discussed in {@link #getInt(Object,long)}.
+     *
+     * <p>Equivalent to <code>setMemory(null, address, bytes, value)</code>.
+     */
+    public void setMemory(long address, long bytes, byte value) {
+        setMemory(null, address, bytes, value);
+    }
 
     /**
      * Sets all bytes in a given block of memory to a copy of another
      * block.
+     *
+     * <p>This method determines each block's base address by means of two parameters,
+     * and so it provides (in effect) a <em>double-register</em> addressing mode,
+     * as discussed in {@link #getInt(Object,long)}.  When the object reference is null,
+     * the offset supplies an absolute base address.
+     *
+     * <p>The transfers are in coherent (atomic) units of a size determined
+     * by the address and length parameters.  If the effective addresses and
+     * length are all even modulo 8, the transfer takes place in 'long' units.
+     * If the effective addresses and length are (resp.) even modulo 4 or 2,
+     * the transfer takes place in units of 'int' or 'short'.
+     * 
+     * @since 1.7
      */
-    public native void copyMemory(long srcAddress, long destAddress,
+    public native void copyMemory(Object srcBase, long srcOffset,
+                                  Object destBase, long destOffset,
 				  long bytes);
+    /**
+     * Sets all bytes in a given block of memory to a copy of another
+     * block.  This provides a <em>single-register</em> addressing mode,
+     * as discussed in {@link #getInt(Object,long)}.
+     *
+     * Equivalent to <code>copyMemory(null, srcAddress, null, destAddress, bytes)</code>.
+     */
+    public void copyMemory(long srcAddress, long destAddress, long bytes) {
+        copyMemory(null, srcAddress, null, destAddress, bytes);
+    }
 
     /**
      * Disposes of a block of native memory, as obtained from {@link
@@ -649,6 +697,42 @@
      */
     public native int arrayBaseOffset(Class arrayClass);
 
+    /** The value of {@code arrayBaseOffset(boolean[].class)} */
+    public static final int ARRAY_BOOLEAN_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(boolean[].class);
+
+    /** The value of {@code arrayBaseOffset(byte[].class)} */
+    public static final int ARRAY_BYTE_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(byte[].class);
+
+    /** The value of {@code arrayBaseOffset(short[].class)} */
+    public static final int ARRAY_SHORT_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(short[].class);
+
+    /** The value of {@code arrayBaseOffset(char[].class)} */
+    public static final int ARRAY_CHAR_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(char[].class);
+
+    /** The value of {@code arrayBaseOffset(int[].class)} */
+    public static final int ARRAY_INT_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(int[].class);
+
+    /** The value of {@code arrayBaseOffset(long[].class)} */
+    public static final int ARRAY_LONG_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(long[].class);
+
+    /** The value of {@code arrayBaseOffset(float[].class)} */
+    public static final int ARRAY_FLOAT_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(float[].class);
+
+    /** The value of {@code arrayBaseOffset(double[].class)} */
+    public static final int ARRAY_DOUBLE_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(double[].class);
+
+    /** The value of {@code arrayBaseOffset(Object[].class)} */
+    public static final int ARRAY_OBJECT_BASE_OFFSET
+	    = theUnsafe.arrayBaseOffset(Object[].class);
+
     /**
      * Report the scale factor for addressing elements in the storage
      * allocation of a given array class.  However, arrays of "narrow" types
@@ -662,6 +746,42 @@
      */
     public native int arrayIndexScale(Class arrayClass);
 
+    /** The value of {@code arrayIndexScale(boolean[].class)} */
+    public static final int ARRAY_BOOLEAN_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(boolean[].class);
+
+    /** The value of {@code arrayIndexScale(byte[].class)} */
+    public static final int ARRAY_BYTE_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(byte[].class);
+
+    /** The value of {@code arrayIndexScale(short[].class)} */
+    public static final int ARRAY_SHORT_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(short[].class);
+
+    /** The value of {@code arrayIndexScale(char[].class)} */
+    public static final int ARRAY_CHAR_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(char[].class);
+
+    /** The value of {@code arrayIndexScale(int[].class)} */
+    public static final int ARRAY_INT_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(int[].class);
+
+    /** The value of {@code arrayIndexScale(long[].class)} */
+    public static final int ARRAY_LONG_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(long[].class);
+
+    /** The value of {@code arrayIndexScale(float[].class)} */
+    public static final int ARRAY_FLOAT_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(float[].class);
+
+    /** The value of {@code arrayIndexScale(double[].class)} */
+    public static final int ARRAY_DOUBLE_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(double[].class);
+
+    /** The value of {@code arrayIndexScale(Object[].class)} */
+    public static final int ARRAY_OBJECT_INDEX_SCALE
+	    = theUnsafe.arrayIndexScale(Object[].class);
+
     /**
      * Report the size in bytes of a native pointer, as stored via {@link
      * #putAddress}.  This value will be either 4 or 8.  Note that the sizes of
@@ -670,6 +790,9 @@
      */
     public native int addressSize();
 
+    /** The value of {@code addressSize()} */
+    public static final int ADDRESS_SIZE = theUnsafe.addressSize();
+
     /**
      * Report the size in bytes of a native memory page (whatever that is).
      * This value will always be a power of two.
--- a/j2se/src/share/classes/sun/net/spi/DefaultProxySelector.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/net/spi/DefaultProxySelector.java	Fri Jun 22 00:46:43 2007 +0000
@@ -189,7 +189,7 @@
 	 */
 	final String proto = protocol;
 	final NonProxyInfo nprop = pinfo;
-	final String urlhost = host;
+	final String urlhost = host.toLowerCase();
 
 	/**
 	 * This is one big doPrivileged call, but we're trying to optimize
--- a/j2se/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java	Fri Jun 22 00:46:43 2007 +0000
@@ -215,13 +215,7 @@
 	    }
 	}
 	
-	try {
-	    return negotiator.firstToken();
-	} catch (Exception e) {
-	    IOException ioe = new IOException("firstToken fails");
-	    ioe.initCause(e);
-	    throw ioe;
-	}
+        return negotiator.firstToken();
     }
 
     /**
@@ -232,14 +226,7 @@
      *  May happen if the input token is invalid.
      */
     private byte[] nextToken(byte[] token) throws IOException {
-
-        try {
-	    return negotiator.nextToken(token);
-        } catch (Exception e) {
-            IOException ioe = new IOException("nextToken fails");
-            ioe.initCause(e);
-            throw ioe;
-        }
+        return negotiator.nextToken(token);
     }
 
     /**
@@ -282,7 +269,7 @@
 	return (Negotiator) (c.newInstance(hostname, scheme));
     }
     
-    abstract byte[] firstToken() throws Exception;
+    abstract byte[] firstToken() throws IOException;
     
-    abstract byte[] nextToken(byte[] in) throws Exception;
+    abstract byte[] nextToken(byte[] in) throws IOException;
 }
--- a/j2se/src/share/classes/sun/net/www/protocol/http/NegotiatorImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/net/www/protocol/http/NegotiatorImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,23 +1,23 @@
 /*
  * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
+ *  
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Sun designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Sun in the LICENSE file that accompanied this code.
- *
+ *  
  * This code 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
  * version 2 for more details (a copy is included in the LICENSE file that
  * accompanied this code).
- *
+ *  
  * You should have received a copy of the GNU General Public License version
  * 2 along with this work; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
+ *  
  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  * CA 95054 USA or visit www.sun.com if you need additional information or
  * have any questions.
@@ -26,14 +26,9 @@
 package sun.net.www.protocol.http;
 
 import java.io.IOException;
-import java.security.PrivilegedActionException;
-import java.net.Authenticator;
-import java.net.PasswordAuthentication;
-import java.security.Security;
 
 import org.ietf.jgss.GSSContext;
 import org.ietf.jgss.GSSException;
-import org.ietf.jgss.GSSManager;
 import org.ietf.jgss.GSSName;
 import org.ietf.jgss.Oid;
 
@@ -50,6 +45,10 @@
  */
 public class NegotiatorImpl extends Negotiator {
 
+    private static final boolean DEBUG =
+	java.security.AccessController.doPrivileged( 
+	      new sun.security.action.GetBooleanAction("sun.security.krb5.debug"));
+            
     private GSSContext context;
     private byte[] oneToken;
    
@@ -73,9 +72,9 @@
             // we can only use Kerberos mech when the scheme is kerberos
             oid = GSSUtil.GSS_KRB5_MECH_OID;
         } else {
-            String pref = (String)java.security.AccessController.doPrivileged( 
-                    new java.security.PrivilegedAction() {
-                        public Object run() {
+            String pref = java.security.AccessController.doPrivileged( 
+                    new java.security.PrivilegedAction<String>() {
+                        public String run() {
                             return System.getProperty(
                                 "http.auth.preference",
                                 "spnego");
@@ -101,19 +100,32 @@
                                         GSSContext.DEFAULT_LIFETIME);
         
         oneToken = context.initSecContext(new byte[0], 0, 0);
+        System.err.println(">>>>>>>>>> DELEG STATE is " +context.getCredDelegState());
     }
 
     /**
      * Constructor
      * @param hostname name of peer server
      * @param scheme auth scheme requested, Negotiate ot Kerberos
+     * @throws java.io.IOException If negotiator cannot be constructed
      */
-    public NegotiatorImpl(String hostname, String scheme) throws Exception {
-        init(hostname, scheme);
+    public NegotiatorImpl(String hostname, String scheme) throws IOException {
+        try {
+            init(hostname, scheme);
+        } catch (GSSException e) {
+            if (DEBUG) {
+                System.out.println("Negotiate support not initiated, will fallback to other scheme if allowed. Reason:");
+                e.printStackTrace();
+            }
+            IOException ioe = new IOException("Negotiate support not initiated");
+            ioe.initCause(e); 
+            throw ioe;
+        }
     }
     
     /**
      * Return the first token of GSS, in SPNEGO, it's called NegTokenInit
+     * @return the first token
      */
     public byte[] firstToken() {
 	return oneToken;
@@ -121,8 +133,21 @@
     
     /**
      * Return the rest tokens of GSS, in SPNEGO, it's called NegTokenTarg
+     * @param token the token received from server
+     * @return the next token
+     * @throws java.io.IOException if the token cannot be created successfully
      */
-    public byte[] nextToken(byte[] token) throws Exception {
-        return context.initSecContext(token, 0, token.length);
+    public byte[] nextToken(byte[] token) throws IOException {
+        try {
+            return context.initSecContext(token, 0, token.length);
+        } catch (GSSException e) {
+            if (DEBUG) {
+                System.out.println("Negotiate support cannot continue. Reason:");
+                e.printStackTrace();
+            }
+            IOException ioe = new IOException("Negotiate support cannot continue");
+            ioe.initCause(e); 
+            throw ioe;
+        }
     }
 }
--- a/j2se/src/share/classes/sun/print/PSPathGraphics.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/print/PSPathGraphics.java	Fri Jun 22 00:46:43 2007 +0000
@@ -484,13 +484,20 @@
                     double origDpi = (devResX < devResY) ? devResX : devResY;
                     int dpi = (int)origDpi;
                     double scaleFactor = 1;
-                    while (nbytes > maxBytes && dpi > DEFAULT_USER_RES) {
+
+                    double maxSFX = w/(double)boundsWidth;
+                    double maxSFY = h/(double)boundsHeight;
+                    double maxSF = (maxSFX > maxSFY) ? maxSFY : maxSFX;
+                    int minDpi = (int)(dpi/maxSF);
+                    if (minDpi < DEFAULT_USER_RES) minDpi = DEFAULT_USER_RES;
+
+                    while (nbytes > maxBytes && dpi > minDpi) {
                         scaleFactor *= 2;
                         dpi /= 2;
                         nbytes /= 4;
                     }
-                    if (dpi < DEFAULT_USER_RES) {
-                        scaleFactor = (origDpi / DEFAULT_USER_RES);
+                    if (dpi < minDpi) {
+                        scaleFactor = (origDpi / minDpi);
                     }
 
                     region.setRect(region.getX()/scaleFactor,
--- a/j2se/src/share/classes/sun/print/PathGraphics.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/print/PathGraphics.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1678,6 +1678,12 @@
 	if (img == null) {
 	    return true;
 	}
+        int imgWidth = img.getWidth(null);
+        int imgHeight = img.getHeight(null);
+
+        if (imgWidth < 0 || imgHeight < 0) {
+            return true;
+        }
 
 	int srcWidth = sx2 - sx1;
 	int srcHeight = sy2 - sy1;
@@ -1702,15 +1708,49 @@
          * a positive width and height. The xform describes how to map
          * src->dest, so that information is not lost.
          */
+        int tmp=0;
         if (sx2 < sx1) {
+            tmp = sx1;
             sx1 = sx2;
-            srcWidth = -srcWidth;
+            sx2 = tmp;
         }
         if (sy2 < sy1) {
+            tmp = sy1;
             sy1 = sy2;
-            srcHeight = -srcHeight;
+            sy2 = tmp;
         }
 
+        /* if src area is beyond the bounds of the image, we must clip it.
+         * The transform is based on the specified area, not the clipped one.
+         */
+        if (sx1 < 0) {
+            sx1 = 0;
+        } else if (sx1 > imgWidth) { // empty srcArea, nothing to draw
+            sx1 = imgWidth; 
+        }
+        if (sx2 < 0) { // empty srcArea, nothing to draw
+            sx2 = 0;
+        } else if (sx2 > imgWidth) {
+            sx2 = imgWidth;
+        }
+        if (sy1 < 0) {
+            sy1 = 0;
+        } else if (sy1 > imgHeight) { // empty srcArea
+            sy1 = imgHeight;
+        }
+        if (sy2 < 0) {  // empty srcArea
+            sy2 = 0;
+        } else if (sy2 > imgHeight) {
+            sy2 = imgHeight;
+        }
+
+        srcWidth =  sx2 - sx1;
+        srcHeight = sy2 - sy1;
+
+        if (srcWidth <= 0 || srcHeight <= 0) {
+            return true;
+        }
+                    
 	return drawImageToPlatform(img, xForm, bgcolor,
 				   sx1, sy1, srcWidth, srcHeight, false);
 
--- a/j2se/src/share/classes/sun/print/RasterPrinterJob.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/print/RasterPrinterJob.java	Fri Jun 22 00:46:43 2007 +0000
@@ -571,6 +571,7 @@
 	float iw = (float)(page.getPaper().getImageableWidth()/DPI);
 	float iy = (float)(page.getPaper().getImageableY()/DPI);
 	float ih = (float)(page.getPaper().getImageableHeight()/DPI);
+        if (ix < 0) ix = 0f; if (iy < 0) iy = 0f;
 	try {
 	    attributes.add(new MediaPrintableArea(ix, iy, iw, ih, 
 						  MediaPrintableArea.INCH));
@@ -682,7 +683,7 @@
 	    Class amCategory = SunAlternateMedia.class;
 		    
 	    if (attributes.containsKey(amCategory) &&
-		newas.containsKey(amCategory)) {
+		!newas.containsKey(amCategory)) {
 		attributes.remove(amCategory);
 	    } 
 	    attributes.addAll(newas);
@@ -715,13 +716,11 @@
 	    if (size == null) {
 		size = MediaSize.NA.LETTER;
 	    }
-	    int units = (int)(Size2DSyntax.INCH / 72.0);
 	    Paper paper = new Paper();
-	    float dim[] = size.getSize(units);
-	    double w = Math.rint(dim[0]);
-	    double h = Math.rint(dim[1]);
+            float dim[] = size.getSize(1); //units == 1 to avoid FP error
+            double w = Math.rint((dim[0]*72.0)/Size2DSyntax.INCH);
+            double h = Math.rint((dim[1]*72.0)/Size2DSyntax.INCH);
 	    paper.setSize(w, h);
-
 	    MediaPrintableArea area =
 		(MediaPrintableArea)
 		attributes.get(MediaPrintableArea.class);
--- a/j2se/src/share/classes/sun/print/ServiceDialog.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/print/ServiceDialog.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1891,8 +1891,23 @@
                     int index = cbSource.getSelectedIndex();
                     
                     if ((index >= 1) && (index < (sources.size() + 1))) {
-                        asCurrent.remove(SunAlternateMedia.class);
-                        asCurrent.add((MediaTray)sources.get(index - 1));
+                       asCurrent.remove(SunAlternateMedia.class);
+                       MediaTray newTray = (MediaTray)sources.get(index - 1);
+                       Media m = (Media)asCurrent.get(Media.class);
+                       if (m == null || m instanceof MediaTray) {
+                           asCurrent.add(newTray);
+                       } else if (m instanceof MediaSizeName) {
+                           MediaSizeName msn = (MediaSizeName)m;
+                           Media def = (Media)psCurrent.getDefaultAttributeValue(Media.class);
+                           if (def instanceof MediaSizeName && def.equals(msn)) {
+                               asCurrent.add(newTray);
+                           } else {
+                               /* Non-default paper size, so need to store tray
+                                * as SunAlternateMedia
+                                */
+                               asCurrent.add(new SunAlternateMedia(newTray));
+                           }
+                       } 
                     } else if (index == 0) {
                         asCurrent.remove(SunAlternateMedia.class);
                         if (cbSize.getItemCount() > 0) {
@@ -1967,11 +1982,17 @@
 
                 Media medium = (Media)asCurrent.get(mdCategory);
 
+               // initialize size selection to default
+                Media defMedia = (Media)psCurrent.getDefaultAttributeValue(mdCategory);
+                if (defMedia instanceof MediaSizeName) {
+                    cbSize.setSelectedIndex(sizes.size() > 0 ? sizes.indexOf(defMedia) : -1);
+                }
+		
                 if (medium == null ||
 		    !psCurrent.isAttributeValueSupported(medium, 
 							 docFlavor, asCurrent)) {
 
-                    medium = (Media)psCurrent.getDefaultAttributeValue(mdCategory);
+                    medium = defMedia;
 
                     if (medium == null) {
                         if (sizes.size() > 0) {
@@ -2011,7 +2032,12 @@
 
 		selIndex = cbSource.getSelectedIndex();
 		if ((selIndex >= 1) && (selIndex < (sources.size()+1))) {
-		  asCurrent.add((MediaTray)sources.get(selIndex-1));
+                    MediaTray mt = (MediaTray)sources.get(selIndex-1);
+                    if (medium instanceof MediaTray) {
+                        asCurrent.add(mt);
+                    } else {
+                        asCurrent.add(new SunAlternateMedia(mt));
+                    }
 		}
 			      
 
--- a/j2se/src/share/classes/sun/print/SunAlternateMedia.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/print/SunAlternateMedia.java	Fri Jun 22 00:46:43 2007 +0000
@@ -56,7 +56,7 @@
     }
  
     public String toString() {
-       return "alternatate-media: " + media.toString();
+       return "alternate-media: " + media.toString();
     }
 
     /**
--- a/j2se/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java	Fri Jun 22 00:46:43 2007 +0000
@@ -47,7 +47,7 @@
  *
  * @author Andreas Sterbenz
  * @author Sean Mullan
- * @version 1.19, 05/05/07
+ * @version 1.20, 05/22/07
  * @since 1.4.2
  */
 class DistributionPointFetcher {
@@ -108,18 +108,14 @@
      * If CRLDP support is disabled, this method always returns an
      * empty set.
      */
-    Collection<X509CRL> getCRLs(CRLSelector selector, boolean signFlag, 
+    Collection<X509CRL> getCRLs(X509CRLSelector selector, boolean signFlag, 
 	PublicKey prevKey, String provider, List<CertStore> certStores, 
 	boolean[] reasonsMask, TrustAnchor anchor) throws CertStoreException 
     {
 	if (USE_CRLDP == false) {
 	    return Collections.emptySet();
 	}
-	if (selector instanceof X509CRLSelector == false) {
-	    return Collections.emptySet();
-	}
-	X509CRLSelector x509Selector = (X509CRLSelector)selector;
-	X509Certificate cert = x509Selector.getCertificateChecking();
+	X509Certificate cert = selector.getCertificateChecking();
 	if (cert == null) {
 	    return Collections.emptySet();
 	}
@@ -143,7 +139,7 @@
 	    for (Iterator<DistributionPoint> t = points.iterator(); 
 		 t.hasNext() && !Arrays.equals(reasonsMask, ALL_REASONS); ) {
 		DistributionPoint point = t.next();
-		Collection<X509CRL> crls = getCRLs(x509Selector, certImpl, 
+		Collection<X509CRL> crls = getCRLs(selector, certImpl, 
 		    point, reasonsMask, signFlag, prevKey, provider, 
 		    certStores, anchor);
 		results.addAll(crls);
@@ -168,10 +164,31 @@
 	boolean signFlag, PublicKey prevKey, String provider, 
 	List<CertStore> certStores, TrustAnchor anchor) 
     {
-        // must have full name 
+        // check for full name 
         GeneralNames fullName = point.getFullName(); 
         if (fullName == null) { 
-            return Collections.emptySet();
+	    // check for relative name
+	    RDN relativeName = point.getRelativeName();
+	    if (relativeName == null) {
+                return Collections.emptySet();
+	    }
+	    try {
+		GeneralNames crlIssuers = point.getCRLIssuer();
+		if (crlIssuers == null) {
+	            fullName = getFullNames
+		        ((X500Name) certImpl.getIssuerDN(), relativeName);
+		} else {
+		    // should only be one CRL Issuer
+		    if (crlIssuers.size() != 1) {
+			return Collections.emptySet();
+		    } else {
+	                fullName = getFullNames
+			    ((X500Name) crlIssuers.get(0).getName(), relativeName);
+		    }
+		}
+	    } catch (IOException ioe) {
+		return Collections.emptySet();
+	    }
         } 
 	Collection<X509CRL> possibleCRLs = new ArrayList<X509CRL>();
 	Collection<X509CRL> crls = new ArrayList<X509CRL>(2);
--- a/j2se/src/share/classes/sun/swing/SwingUtilities2.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/swing/SwingUtilities2.java	Fri Jun 22 00:46:43 2007 +0000
@@ -69,7 +69,7 @@
  * releases and even patch releases. You should not rely on this class even
  * existing.
  *
- * @version 1.58 05/05/07
+ * @version 1.59 05/23/07
  */
 public class SwingUtilities2 {
     /**
@@ -791,7 +791,8 @@
                                        g2d.getFont(),
                                        deviceFontRenderContext);
                     float screenWidth = (float)g2d.getFont().
-                        getStringBounds(data, offset, length, frc).getWidth();
+                        getStringBounds(data, offset, offset + length, frc).
+                        getWidth();
                     layout = layout.getJustifiedLayout(screenWidth);
 
                     /* Use alternate print color if specified */
--- a/j2se/src/share/classes/sun/tools/hprof/Tracker.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/*
- * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.tools.hprof;
-
-/* This class and it's methods are used by 5.0 hprof when injecting bytecodes
- *   into class file images.
- *   WARNING: This class may not be used by newer versions of hprof.
- *   See the directory src/share/demo/jvmti/hprof and the file README.txt
- *   for more details.
- */
-
-public class Tracker {
- 
-    /* Master switch that activates calls to native functions. */
-    
-    private static int engaged = 0; 
-  
-    /* To track memory allocated, we need to catch object init's and arrays. */
-    
-    /* At the beginning of java.jang.Object.<init>(), a call to
-     *   sun.tools.hprof.Tracker.ObjectInit() is injected.
-     */
-
-    private static native void nativeObjectInit(Object thr, Object obj);
-    
-    public static void ObjectInit(Object obj)
-    {
-	if ( engaged != 0 ) {
-	    nativeObjectInit(Thread.currentThread(), obj);
-	}
-    }
-    
-    /* Immediately following any of the newarray bytecodes, a call to
-     *   sun.tools.hprof.Tracker.NewArray() is injected.
-     */
-
-    private static native void nativeNewArray(Object thr, Object obj);
-   
-    public static void NewArray(Object obj)
-    {
-	if ( engaged != 0 ) {
-	    nativeNewArray(Thread.currentThread(), obj);
-	}
-    }
-   
-    /* For cpu time spent in methods, we need to inject for every method. */
-
-    /* At the very beginning of every method, a call to
-     *   sun.tools.hprof.Tracker.CallSite() is injected.
-     */
-
-    private static native void nativeCallSite(Object thr, int cnum, int mnum);
-    
-    public static void CallSite(int cnum, int mnum)
-    {
-	if ( engaged != 0 ) {
-	    nativeCallSite(Thread.currentThread(), cnum, mnum);
-	}
-    }
-    
-    /* Before any of the return bytecodes, a call to
-     *   sun.tools.hprof.Tracker.ReturnSite() is injected.
-     */
-
-    private static native void nativeReturnSite(Object thr, int cnum, int mnum);
-    
-    public static void ReturnSite(int cnum, int mnum)
-    {
-	if ( engaged != 0 ) {
-	    nativeReturnSite(Thread.currentThread(), cnum, mnum);
-	}
-    }
-    
-}
-
--- a/j2se/src/share/classes/sun/tools/javap/Main.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/tools/javap/Main.java	Fri Jun 22 00:46:43 2007 +0000
@@ -122,18 +122,7 @@
 	for (int i = 0 ; i < argv.length ; i++) {
 	    String arg = argv[i];
 	    if (arg.startsWith("-")) {
-		if (arg.equals("-Xold")) {
-		    String[] oldjpargs = new String[(argv.length)-1];
-		    int l = 0;
-		    for(int k = 0; k < argv.length; k++){
-			if(!(argv[k].equals("-Xold"))){
-			    oldjpargs[l] = argv[k];
-			    l++;
-			}
-		    }
-		    sun.tools.javap.oldjavap.JavaP.main(oldjpargs);
-		    
-		} else if (arg.equals("-l")) {
+		if (arg.equals("-l")) {
 		    env.showLineAndLocal = true;
 		} else if (arg.equals("-private") || arg.equals("-p")) {
 		    env.showAccess = env.PRIVATE;
--- a/j2se/src/share/classes/sun/tools/javap/oldjavap/ConstantPrinter.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-/*
- * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/*
- * Provides printing related access to the BinaryConstantPool.
- * Prints constant and provides other utilities.
- *
- */
-
-package sun.tools.javap.oldjavap;
-
-import java.io.PrintWriter;
-
-import sun.tools.java.BinaryConstantPool;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.ClassDefinition;
-import sun.tools.java.Constants;
-
-/**
- * This class is used to print constants in the constant pool
- */
-public final
-class ConstantPrinter implements Constants {
-
-    BinaryConstantPool cpool;
-    private JavaPEnvironment env;
-    private PrintWriter output;
-    private boolean decodeTypeSignatures;
-
-
-    /**
-     * Constructor
-     */
-    public
-    ConstantPrinter(BinaryConstantPool cpool, JavaPEnvironment env, PrintWriter output, boolean decodeTypeSignatures) {
-	this.cpool = cpool;
-	this.env = env;
-	this.output = output;
-	this.decodeTypeSignatures = decodeTypeSignatures;
-    }
-
-    /**
-     * get a string
-     */
-    public String getString(int n) {
-	return cpool.getString(n);
-    }
-
-    /**
-     * Print a constant name and its type
-     */
-    private void printNameAndType(int key, String separator, boolean decodeType) {
-	int fieldnameindex = key >> 16;
-	int fieldtypeindex = key & 0xFFFF;
-	output.print(cpool.getString(fieldnameindex) + separator);
-    	if (decodeType) 
-	    output.print(cpool.getType(fieldtypeindex));
-    	else 
-	    output.print(cpool.getString(fieldtypeindex));
-    }
-
-    /**
-     * Print a constant name and its type from an index
-     */
-    private void printNameAndTypeFromIndex(int index, String separator) {
-	int key = cpool.getInteger(index); 
-	printNameAndType(key, separator, decodeTypeSignatures);
-    }
-    
-    /**
-     * Print a reference
-     */
-    private void printRef(int index, String separator) {
-    	if (decodeTypeSignatures) {
-            output.print(cpool.getConstant(index, env));
-    	} else {
-            int key = cpool.getInteger(index);
-	    int classkey = key >> 16; 
-	    int nametypekey = key & 0xFFFF;
-	    output.print(cpool.getDeclaration(env, classkey).getName());
-	    output.print(".");
-	    printNameAndTypeFromIndex(nametypekey, separator);
-	}
-    }
-    	    
-    /**
-     * Print a constant in the constant pool
-     */
-    public void printClassDeclaration(ClassDeclaration cdcl) {
-    	ClassDefinition cdef = cdcl.getClassDefinition();
-    	if (cdef != null && cdef.isInterface())
-	    output.print("<Interface ");
-	else
-	    output.print("<Class ");
-    	output.print(cdcl.getName());
-	output.print(">");
-    }
-    	    
-    /**
-     * Print a constant in the constant pool
-     */
-    public void printConstant(int index) {
-    	int typeId = cpool.getConstantType(index);
-        switch(typeId) {
-        case CONSTANT_STRING: 
-	    output.print("<String \"" + cpool.getConstant(index, env) + "\"");
-	    break;
-	   
-        case CONSTANT_UTF8:
-            output.print("<\"" + cpool.getString(index) + "\"");
-	    break;
-	
-        case CONSTANT_INTEGER:
-	    output.print("<Integer " + cpool.getInteger(index));
-	    break;
-
-        case CONSTANT_FLOAT:
-	    output.print("<Real " + cpool.getValue(index));
-	    break;
-
-        case CONSTANT_LONG: 
-	    output.print("<Long " + cpool.getValue(index));
-	    break;
-
-        case CONSTANT_DOUBLE:
-	    output.print("<Double " + cpool.getValue(index));
-	    break;
-
-        case CONSTANT_CLASS:  
-	    printClassDeclaration(cpool.getDeclaration(env, index));
-	    return;
-
-	case CONSTANT_METHOD: 
-	    output.print("<Method ");
-	    printRef(index, "");
-	    break;
-	
-        case CONSTANT_FIELD:  
-	    output.print("<Field ");
-	    printRef(index, " ");
-	    break;
-	    
-	case CONSTANT_INTERFACEMETHOD: 
-	    output.print("<InterfaceMethod ");
-	    printRef(index, "");
-	    break;
-	    	    
-        case CONSTANT_NAMEANDTYPE:
-	    output.print("<NameAndType");
-	    printNameAndTypeFromIndex(index, " ");
-	    break;
-	    
-	default:
-	    output.print("<Unknown " + typeId);
-	    break;
-	
-        }
-        output.print('>');
-    }
-
-}
--- a/j2se/src/share/classes/sun/tools/javap/oldjavap/JavaP.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,257 +0,0 @@
-/*
- * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/*
- *   Main for the 'javap' program
- *   @version @(#)JavaP.java	1.29 07/05/05
- *   @author Robert Field
- */
-
-package sun.tools.javap.oldjavap;
-
-import sun.tools.java.BinaryClass;
-import sun.tools.java.ClassNotFound;
-import sun.tools.java.Identifier;
-
-import sun.tools.util.ModifierFilter;
-
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-
-import java.util.Vector;
-
-/**
- *  JavaP - program to print information about class files
- */
-public 
-class JavaP {
-
-    private JavaPEnvironment env;
-    private Vector classList = new Vector();
-    private PrintWriter output;
-    private static boolean errorOccurred = false;
-    
-    private static final String progname = "javap";
-
-    /**
-     * Constructor
-     */
-    public
-    JavaP(PrintWriter output) {
-    	this.output = output;
-	this.env = new JavaPEnvironment(output);
-    }
-    
-	
-    /**
-    * Output an error message.
-    */
-    private void error(String msg) {
-        errorOccurred = true;
-        System.err.println(msg);
-        System.err.flush();
-    }
-
-    /**
-     * Print usage information
-     */
-    private void usage() {
-        java.io.PrintStream out = System.out;
-        out.println("Usage: " + progname + " <options> <classes>...");
-        out.println();
-        out.println("where options include:");
-        out.println("   -b                        Backward compatibility with " + progname + " in JDK 1.1");
-        out.println("   -c                        Disassemble the code");
-        out.println("   -classpath <pathlist>     Specify where to find user class files");
-        out.println("   -extdirs <dirs>           Override location of installed extensions");
-        out.println("   -help                     Print this usage message");
-        out.println("   -J<flag>                  Pass <flag> directly to the runtime system");
-        out.println("   -l                        Print line number and local variable tables");
-	out.println("   -public                   Show only public classes and members");
-	out.println("   -protected                Show protected/public classes and members");
-	out.println("   -package                  Show package/protected/public classes");
-	out.println("                             and members (default)");
-	out.println("   -private                  Show all classes and members");
-        out.println("   -s                        Print internal type signatures");
-        out.println("   -bootclasspath <pathlist> Override location of class files loaded");
-        out.println("                             by the bootstrap class loader");
-        out.println("   -verbose                  Print stack size, number of locals and args for methods");
-        out.println("                             If verifying, print reasons for failure");
-        out.println();
-    }
-    
-    /**
-     * Parse the command line arguments. 
-     * Set flags, construct the class list and create environment.
-     */
-    private boolean parseArguments(String argv[]) {
-	String classPathString = null;
-	String sysClassPathString = null;
-	String extDirsString = null;
-	boolean nothingToDo = true;
-	    
-	for (int i = 0 ; i < argv.length ; i++) {
-	    String arg = argv[i];
-	    if (arg.startsWith("-")) {
-		if (arg.equals("-l")) {
-		    env.showLineAndLocal = true;
-		} else if (arg.equals("-private") || arg.equals("-p")) {
-		    env.showAccess = new ModifierFilter(ModifierFilter.ALL_ACCESS);
-		} else if (arg.equals("-package")) {
-		    env.showAccess = new ModifierFilter(
-				    ModifierFilter.PUBLIC |
-				    ModifierFilter.PROTECTED |
-				    ModifierFilter.PACKAGE );
-		} else if (arg.equals("-protected")) {
-		    env.showAccess = new ModifierFilter(
-				    ModifierFilter.PUBLIC |
-				    ModifierFilter.PROTECTED );
-		} else if (arg.equals("-public")) {
-		    env.showAccess = new ModifierFilter(ModifierFilter.PUBLIC);
-		} else if (arg.equals("-b")) {
-		    env.showBackwardCompatible = true;
-		} else if (arg.equals("-c")) {
-		    env.showDisassembled = true;
-		} else if (arg.equals("-s")) {
-		    env.showInternalSigs = true;
-		} else if (arg.equals("-verbose"))  {
-		    env.showVerbose = true;
-		} else if (arg.equals("-v")) {
-		    env.showVerbose = true;
-		} else if (arg.equals("-h")) {
-                    error("-h is no longer available - use the 'javah' program");
-                    return false;
-		} else if (arg.equals("-verify")) {
-		    error("-verify is no longer available - use 'java -verify'");
-                    return false;
-		} else if (arg.equals("-verify-verbose")) {
-		    error("-verify is no longer available - use 'java -verify'");
-                    return false;
-		} else if (arg.equals("-help")) {
-                    usage();
-                    return false;
-		} else if (arg.equals("-classpath")) {
-		    if ((i + 1) < argv.length) {
-			classPathString = argv[++i];
-		    } else {
-			error("-classpath requires argument");
-			usage();
-			return false;
-		    }
-		} else if (arg.equals("-bootclasspath")) {
-		    if ((i + 1) < argv.length) {
-			sysClassPathString = argv[++i];
-		    } else {
-			error("-bootclasspath requires argument");
-			usage();
-			return false;
-		    }
-		} else if (arg.equals("-extdirs")) {
-		    if ((i + 1) < argv.length) {
-			extDirsString = argv[++i];
-		    } else {
-			error("-extdirs requires argument");
-			usage();
-			return false;
-		    }
-		} else {
-		    error("invalid flag: " + arg);
-		    usage();
-		    return false;
-		}
-	    } else {
-		classList.addElement(arg);
-		nothingToDo = false;
-	    }
-	}
-	if (nothingToDo) {
-	    usage();
-	    return false;
-	};
-	env.setPath(classPathString, sysClassPathString, extDirsString);
-	return true;
-    }
-
-    /**
-     * Display results
-     */
-    private void displayResults() {
-	for (int i = 0; i < classList.size() ; i++ ) {
-		String className = (String)classList.elementAt(i);
-		Identifier id = Identifier.lookup(className);
-		id = env.resolvePackageQualifiedName(id);
-		if (!env.classExists(id)) {
-		    error("Class '" + className + "' not found");
-		    continue;
-		}
-		try {
-		    BinaryClass cdef = (BinaryClass)env.getClassDefinition(id);
-		    cdef.loadNested(env);	// load inner classes
-		    JavaPClassPrinter printer = new JavaPClassPrinter(cdef, env);
-		    printer.print();		// actual do display
-		} catch (ClassNotFound exc) {
-		    error("Class '" + className + "' not found");
-		} catch (IOException exc) {
-                    error("I/O Exception - " + exc.getMessage());
-		} catch (IllegalArgumentException exc) {
-                    error(exc.getMessage());
-		}
-	}
-    }
-    
-    /**
-     * Process the arguments and perform the desired action
-     */
-    private void perform(String argv[]) {
-	if (parseArguments(argv)) {
-	    displayResults();
-	}
-    }
-    
-    /**
-     * Main of JavaP
-     */
-    public static void main(String argv[]) {
-        entry(argv);
-        if (errorOccurred) {
-            System.exit(1);
-        }
-    }
-
-    /**
-     * Entry point for tool if you don't want System.exit() called.
-     */
-    public static void entry(String argv[]) {
-	PrintWriter output = new PrintWriter( new OutputStreamWriter(System.out));
-	try {
-	    JavaP jp = new JavaP(output);
-	    jp.perform(argv);
-	} finally {
-	    output.close();
-	}
-    }
-    
-} // end JavaP
--- a/j2se/src/share/classes/sun/tools/javap/oldjavap/JavaPBinaryCode.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,417 +0,0 @@
-/*
- * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/*
- * An extension of BinaryCode that allows code to be printed.
- * Includes printing of disassembled byte codes, exception info,
- * local variable and line number info.
- *
- */
-
-package sun.tools.javap.oldjavap;
-
-import sun.tools.java.BinaryAttribute;
-import sun.tools.java.BinaryCode;
-import sun.tools.java.BinaryConstantPool;
-import sun.tools.java.BinaryExceptionHandler;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.Constants;
-import sun.tools.java.Identifier;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.MethodType;
-
-import sun.tools.util.*;
-
-import java.io.ByteArrayInputStream;
-import java.io.CharArrayWriter;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-class JavaPBinaryCode extends BinaryCode implements Constants {
-
-    private JavaPEnvironment env;
-    private PrintWriter output;
-    private byte codeBytes[];
-    private BinaryConstantPool cpool;
-    private ConstantPrinter constPrint;
-    private MemberDefinition fieldDef;	
-    private String methodName;
-    
-    private int offset;
-
-    /**
-     * Constructor
-     */  
-    JavaPBinaryCode(byte data[], 
-		BinaryConstantPool cpool, 
-		JavaPEnvironment env,
-		MemberDefinition fieldDef) {
-	super(data, cpool, env);
-	this.output = env.output;
-	this.codeBytes = getCode();
-	this.cpool = cpool;
-	this.constPrint = new ConstantPrinter(cpool, env, output, !env.showBackwardCompatible);
-	this.fieldDef = fieldDef;
-	this.methodName = fieldDef.toString();
-    }
-
-    /**
-     * Return the field definition for this code
-     */  
-    MemberDefinition fieldDefinition() {
-    	return fieldDef;
-    }
-
-    /**
-     * Return the byte stored at a given index from the offset
-     * within code bytes
-     */  
-    private final int at(int index) {
-    	return  codeBytes[offset+index] & 0xFF;
-    }
-
-    /**
-     * Return the short stored at a given index from the offset
-     * within code bytes
-     */  
-    private final int shortAt(int index) {
-        int base = offset + index;
-    	return ((codeBytes[base] & 0xFF) << 8) 
-    	    | (codeBytes[base+1] & 0xFF);
-    }
-
-    /**
-     * Given the table at the specified index, return the specified entry
-     */  
-    private final long intAt(int tbl, int entry) {
-        int base = tbl + (entry << 2);
-    	return (codeBytes[base] << 24) 
-    	    | ((codeBytes[base+1] & 0xFF) << 16)
-    	    | ((codeBytes[base+2] & 0xFF) << 8)
-    	    | ((codeBytes[base+3] & 0xFF));
-    }
-
-    /**
-     * Print an integer so that it takes 'length' characters in
-     * the output.  Temporary until formatting code is stable.
-     */  
-    private void printFixedWidthInt(long x, int length) {
-    	CharArrayWriter baStream = new CharArrayWriter();
-    	PrintWriter pStream = new PrintWriter(baStream);
-    	pStream.print(x);
-    	String str = baStream.toString();
-    	for (int cnt = length - str.length(); cnt > 0; --cnt)
-    	    output.print(' ');
-    	output.print(str);
-    }
-    
-    /**
-     * Print the code as Java assembly language instructions
-     */  
-    void printCodeSequence() throws IOException {
-	output.println();
-	output.println("Method " + methodName);
-	for (offset = 0; offset < codeBytes.length; ) {
-	    int opcode = at(0);
-	    printFixedWidthInt(offset, 4); 
-	    output.print(" ");
-	    if (opcode == opc_wide) {
-		opcode = at(1);
-		output.print(opcNames[opcode] + "_w ");
-		int arg = shortAt(2);
-		switch (opcode) {
-		    case opc_aload: case opc_astore:
-		    case opc_fload: case opc_fstore:
-		    case opc_iload: case opc_istore:
-		    case opc_lload: case opc_lstore:
-		    case opc_dload: case opc_dstore:
-		    case opc_ret:
-			output.print(arg);
-			offset += 4;
-			break;
-
-		    case opc_iinc:
-			output.print(arg + " " + (short) shortAt(4));
-			offset += 6;
-			break;
-		    default:
-			output.print("Invalid opcode");
-			offset++;
-			break;
-		}
-	    } else {
-		output.print(opcNames[opcode]);
-		switch (opcode) {
-		    case opc_aload: case opc_astore:
-		    case opc_fload: case opc_fstore:
-		    case opc_iload: case opc_istore:
-		    case opc_lload: case opc_lstore:
-		    case opc_dload: case opc_dstore:
-		    case opc_ret:
-			output.print(" " + at(1));
-			offset += 2;
-			break;
-		    
-		    case opc_iinc:
-			output.print(" " + at(1)  + " " + (byte) at(2));
-			offset += 3;
-			break;
-
-		    case opc_tableswitch:{
-			int tbl = (offset+1+3) & (~3);	// four byte boundry
-			long default_skip = intAt(tbl, 0);
-			long low = intAt(tbl, 1);
-			long high = intAt(tbl, 2);
-			output.print(" " + low + " to " + high + ": default=");
-			output.print(offset + default_skip);
-			tbl += 3 << 2; 			// three int header
-			for (long i = low; i <= high; ++i) {
-			    output.println("");
-			    output.print('\t');
-			    printFixedWidthInt(i, 5);
-			    output.print(": " + (offset + intAt(tbl, (int)(i-low))));
-			}
-			offset = tbl + (int)((high - low + 1) << 2);
-			break;
-		    }
-
-		    case opc_lookupswitch:{
-			int tbl = (offset+1+3) & (~3);	// four byte boundry
-			long default_skip = intAt(tbl, 0);
-			int npairs = (int)intAt(tbl, 1);
-			int nints = npairs * 2;
-			output.print(" " + npairs);
-			output.print(": default=" + (offset + default_skip));
-			tbl += 2 << 2; 			// two int header
-			for (int i = 0; i< nints; i += 2) {
-			    output.println("");
-			    output.print('\t');
-			    printFixedWidthInt(intAt(tbl, i), 5);
-			    output.print(": " + (offset + intAt(tbl, i+1)));
-			}
-			offset = tbl + (nints << 2);
-			break;
-		    }
-
-		    case opc_newarray:
-			switch (at(1)) {
-			    case T_INT:    output.print(" int");    break;
-			    case T_LONG:   output.print(" long");   break;
-			    case T_FLOAT:  output.print(" float");  break;
-			    case T_DOUBLE: output.print(" double"); break;
-			    case T_CHAR:   output.print(" char");   break;
-			    case T_SHORT:  output.print(" short");  break;
-			    case T_BYTE:   output.print(" byte");   break;
-			    case T_BOOLEAN:output.print(" boolean");   break;
-			    default:       output.print(" BOGUS TYPE"); break;
-			}
-			offset += 2;
-			break;
-
-		    case opc_anewarray: {
-			int index =  shortAt(1);
-			output.print(" class #" + index + " ");
-			constPrint.printConstant(index);
-			offset += 3;
-			break;
-		    }
-		      
-		    case opc_sipush:
-			output.print(" " + (short) shortAt(1));
-			offset += 3;
-			break;
-
-		    case opc_bipush:
-			output.print(" " + (byte) at(1));
-			offset += 2;
-			break;
-
-		    case opc_ldc: {
-			int index = at(1);
-			output.print(" #" + index + " ");
-			constPrint.printConstant(index);
-			offset += 2;
-			break;
-		    }
-
-		    case opc_ldc_w: case opc_ldc2_w:
-		    case opc_instanceof: case opc_checkcast:
-		    case opc_new:
-		    case opc_putstatic: case opc_getstatic:
-		    case opc_putfield: case opc_getfield:
-		    case opc_invokevirtual:
-		    case opc_invokespecial:
-		    case opc_invokestatic: {
-			int index = shortAt(1);
-			output.print(" #" + index + " ");
-			constPrint.printConstant(index);
-			offset += 3;
-			break;
-		    }
-
-		    case opc_invokeinterface: {
-			int index = shortAt(1);
-			output.print(" (args " + at(3) + ") #" + index + " ");
-			constPrint.printConstant(index);
-			offset += 5;
-			break;
-		    }
-
-		    case opc_multianewarray: {
-			int index = shortAt(1);
-			output.print(" #" + index + " dim #" + at(3) + " ");
-			constPrint.printConstant(index);
-			offset += 4;
-			break;
-		    }
-
-		    case opc_jsr: case opc_goto:
-		    case opc_ifeq: case opc_ifge: case opc_ifgt:
-		    case opc_ifle: case opc_iflt: case opc_ifne:
-		    case opc_if_icmpeq: case opc_if_icmpne: case opc_if_icmpge:
-		    case opc_if_icmpgt: case opc_if_icmple: case opc_if_icmplt:
-		    case opc_if_acmpeq: case opc_if_acmpne:
-		    case opc_ifnull: case opc_ifnonnull: {
-			int target = offset + (short) shortAt(1);
-			output.print(" " + target);
-			offset += 3;
-			break;
-		    }
-
-		    case opc_jsr_w:
-		    case opc_goto_w: {
-			long jumpPoint = offset + intAt(offset+1, 0);
-			output.print(" " + jumpPoint);
-			offset += 5;
-			break;
-		    }
-			
-		    default:
-			offset++;
-			break;
-		}
-	    }
-            output.println();
-	}
-    }
-
-    /**
-     * Print the exception table for this method code
-     */  
-    void printExceptionTable() throws IOException {
-	BinaryExceptionHandler handlers[] = getExceptionHandlers();
-	if (handlers.length > 0) { 
-	    output.print("Exception table:\n   from   to  target type\n");
-	    for (int idx = 0; idx < handlers.length; ++idx) {
-		BinaryExceptionHandler handler = handlers[idx];
-		printFixedWidthInt(handler.startPC, 6);
-		printFixedWidthInt(handler.endPC, 6);
-		printFixedWidthInt(handler.handlerPC, 6);
-		output.print("   ");
-		ClassDeclaration exceptionClass = handler.exceptionClass;
-		if (exceptionClass == null) 
-		    output.println("any");
-		else {
-		    constPrint.printClassDeclaration(exceptionClass);
-		    output.println("");
-		}
-	    }
-	}
-    }
-
-    /**
-     * Find a code attribute by name
-     */  
-    private DataInputStream findAttribute(Identifier name) {
-	BinaryAttribute attr = getAttributes();
-	while (attr != null) {
-	    if (attr.getName().equals(name)) {
-		ByteArrayInputStream inStream = new ByteArrayInputStream(attr.getData());
-		return new DataInputStream(inStream);
-	    }
-	    attr = attr.getNextAttribute();
-	}
-	return null;
-    }
-
-    /**
-     * Print the line number table for this method code
-     */  
-    void printLineNumberTable() throws IOException {
-	DataInputStream dataStream = findAttribute(idLineNumberTable);
-	int tableLength;
-	if (dataStream != null && ((tableLength = dataStream.readShort()) > 0)) {
-	    output.println("");
-	    output.println("Line numbers for method " + methodName);
-	    for (int tcnt = tableLength; tcnt > 0; --tcnt) {
-		int startPC = dataStream.readShort();
-		int lineNumber = dataStream.readShort();
-		output.println("   line " + lineNumber + ": " + startPC);
-	    }
-	}
-    }
-
-    /**
-     * Print the local variable table for this method code
-     */  
-    void printLocalVariableTable() throws IOException {
-// Fix this in java/Constants.java
-//	Identifier idLocalVariableTable = Identifier.lookup("LocalVariableTable");
-	DataInputStream dataStream = findAttribute(idLocalVariableTable);
-	int tableLength;
-	if (dataStream != null && ((tableLength = dataStream.readShort()) > 0)) {
-	    output.println("");
-	    output.println("Local variables for method " + methodName);
-	    for (int tcnt = tableLength; tcnt > 0; --tcnt) {
-		int startPC = dataStream.readShort();
-		int length = dataStream.readShort();
-		int nameIndex = dataStream.readShort();
-		int descriptorIndex = dataStream.readShort();
-		int index = dataStream.readShort();
-		output.print("   ");
-            	output.print(cpool.getType(descriptorIndex));
-		output.print(" ");
-            	output.print(cpool.getString(nameIndex));
-		output.println("  pc=" + startPC + ", length=" + length + ", slot=" + index);
-	    }
-	}
-    }
-
-    /**
-     * Print stack, argument and locals counts for this method 
-     */  
-    void printVerboseHeader() {
-	MethodType mtype = (MethodType)fieldDef.getType();
-	int argCount = mtype.getArgumentTypes().length;
-	if (!fieldDef.isStatic())  
-	    ++argCount;  // for 'this'
-	
-	output.println("\t/* Stack=" + getMaxStack() 
-		+ ", Locals=" + getMaxLocals() 
-		+ ", Args_size=" + argCount
-		+ " */");
-    }
-}
--- a/j2se/src/share/classes/sun/tools/javap/oldjavap/JavaPClassPrinter.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,300 +0,0 @@
-/*
- * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/*
- *   Class Printer for the 'javap' program
- */
-
-package sun.tools.javap.oldjavap;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import java.util.Vector;
-
-import java.lang.reflect.Modifier;
-
-import sun.tools.java.BinaryClass;
-import sun.tools.java.BinaryConstantPool;
-import sun.tools.java.BinaryMember;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.Constants;
-import sun.tools.java.Identifier;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.Type;
-
-/**
- *  JavaP
- */
-class JavaPClassPrinter implements Constants {
-
-    private BinaryClass cdef;
-    private JavaPEnvironment env;
-    private PrintWriter output;
-    private Vector codesVec;
-    private int depth;
-
-    /**
-     * Constructor
-     */
-    JavaPClassPrinter(BinaryClass cdef, JavaPEnvironment env, int depth) {
-	this.cdef = cdef;
-	this.env = env;
-	this.output = env.output;
-        this.depth = depth;
-    }
-
-    JavaPClassPrinter(BinaryClass cdef, JavaPEnvironment env) {
-	this(cdef, env, 0);
-    }
-
-    /**
-     * Given a member definition, return the byte code information
-     */
-    JavaPBinaryCode codeFor(MemberDefinition fld) {
-	byte attrData[] = ((BinaryMember)fld).getAttribute(env.idCode);
-	if (attrData != null) {
-	    BinaryConstantPool cpool = cdef.getConstants();
-	    return new JavaPBinaryCode(attrData, cpool, env, fld);
-	}
-	return null;
-    }
-
-    /**
-     * Innerclass for enumerating over method code for a class
-     */
-    private class Codes {
-
-	private int index;
-
-	Codes() {
-	    if (codesVec == null) {
-		codesVec = new Vector();
-		for (MemberDefinition fld = cdef.getFirstMember();
-				fld != null;
-				fld = fld.getNextMember()) {
-		    JavaPBinaryCode code = codeFor(fld);
-		    if (code != null)
-			codesVec.addElement(code);
-		}
-	    }
-	    index = 0;
-	}
-
-	JavaPBinaryCode next() {
-	    if (index < codesVec.size())
-		return (JavaPBinaryCode)codesVec.elementAt(index++);
-	    return null;
-	}
-
-    }
-
-    /**
-     * Print a description of the class (not members)
-     */
-    public void printClassHeader() {
-        boolean isClass = !cdef.isInterface();
-        int modbits = cdef.getModifiers() & ~M_SYNCHRONIZED;
-        if (!isClass) {   // interfaces should not be marked abstract
-            modbits &= ~M_ABSTRACT; 
-        }
-	String mods = Modifier.toString(modbits);
-	if (mods.length() > 0)
-	    output.print(mods + " ");
-	if (isClass)	{   // interface is a modifier
-	    output.print("class ");
-        }
-        output.print(cdef.getName() + " ");
-        if (isClass && cdef.getSuperClass() != null) {
-            output.print("extends " + cdef.getSuperClass().getName() + " ");
-        }
-	ClassDeclaration interfaces[] = cdef.getInterfaces();
-	if (interfaces.length > 0) {
-	    output.print(isClass? "implements " : "extends ");
-	    for (int i = 0 ; i < interfaces.length ; i++) {
-		if (i > 0) {
-		    output.print(", ");
-		}
-		output.print(interfaces[i].getName());
-	    }
-            output.print(" ");
-	}
-	if (env.showBackwardCompatible && 
-                         (cdef.getModifiers() & ACC_SUPER) != 0) {
-	    output.println();
-	    output.println("    /* ACC_SUPER bit set */");
-	}
-	if ((cdef.getModifiers() & ACC_SUPER) == 0) {
-	    output.println();
-	    output.println("    /* ACC_SUPER bit NOT set */");
-	}
-    }
-
-    /**
-     * Print a field definition
-     */
-    public void printMemberDefinition(MemberDefinition fld) {
-	String mods = Modifier.toString(fld.getModifiers());
-	if (mods.length() > 0)
-	    output.print(mods + " ");
-        output.print(convertMemberDefinition(fld));
-	if (!env.showBackwardCompatible) {
-            ClassDeclaration[] exp = fld.getExceptions(env);
-            if (exp != null && exp.length > 0) {
-                output.print(" throws ");
-                for(int i=0; i<exp.length; i++){
-                    if (i != 0) {
-                        output.print(", ");
-                    }
-                    output.print(exp[i].getName());
-                }
-            } 
-        }
-        output.println(";");
-    }
-
-    /**
-     * Convert any nested classes in the MemberDefinition
-     */
-    public String convertMemberDefinition(MemberDefinition fld) {
-        if (fld.isConstructor()) {
-            // Check for nested constructor (simulates most of toString)
-            // (Uses getDefining because a constructor's name is stored
-            //  as <init>)
-            Identifier className = fld.getDefiningClassDeclaration().getName();
-            StringBuffer buf = new StringBuffer();
-            buf.append(Identifier.lookup(className.getQualifier(),
-                                         className.getFlatName()));
-            buf.append('(');
-            Type argTypes[] = fld.getType().getArgumentTypes();
-            for (int i = 0; i < argTypes.length; i++) {
-              if (i > 0) {
-                buf.append(',');
-              }
-              buf.append(argTypes[i].toString());
-            }
-            buf.append(')');
-            return buf.toString();
-	} else if (fld.isInitializer()) {
-	    return "{}";
-        } else {
-            return fld.toString();
-        }
-    }
-
-    /**
-     * Print class level indent
-     */
-    private void printIndent(int cnt) {
-        for (int i = cnt; i >= 0; --i) {
-            output.print("    ");
-        }
-    }
-
-    /**
-     * Print the fields
-     */
-    public void printMembers() throws IOException {
-	for (MemberDefinition fld = cdef.getFirstMember();
-			fld != null;
-			fld = fld.getNextMember()) {
-	    if (env.showAccess.checkMember(fld)) {
-		printIndent(depth);
-		if (fld.isInnerClass()) {
-		    BinaryClass innerCdef = (BinaryClass)fld.getInnerClass();
-                    JavaPClassPrinter printer = 
-                        new JavaPClassPrinter(innerCdef, env, depth+1);
-                    printer.print();
-		} else {
-		    printMemberDefinition(fld);
-		    if (env.showInternalSigs)
-			output.println("\t/*   " + 
-                                       fld.getType().getTypeSignature() + 
-                                       "   */");
-		    if (env.showVerbose) {
-			JavaPBinaryCode code = codeFor(fld);
-			if (code != null)
-			    code.printVerboseHeader();
-		    }
-		}
-            }
-	}
-    }
-
-    /**
-     * Print all requested information about one class
-     */
-    public void print() throws IOException {
-	Object src = cdef.getSource();
-	JavaPBinaryCode code;
-
-	if (depth == 0) {   // only for outer class
-            if (src == null) 
-                output.print("No source");
-            else {
-                output.print("Compiled from ");
-                output.println((String)src);
-            }
-        }
-	printClassHeader();
-	output.println("{");
-	printMembers();
-
-	if (env.showBackwardCompatible) {
-	    if (env.showDisassembled) {
-		for (Codes codes = new Codes(); (code = codes.next()) != null; ) {
-		    code.printCodeSequence();
-		    code.printExceptionTable();
-		}
-	    }
-	    if (env.showLineAndLocal) {
-		output.println();
-		for (Codes codes = new Codes(); (code = codes.next()) != null; )
-		    code.printLineNumberTable();
-		output.println();
-		for (Codes codes = new Codes(); (code = codes.next()) != null; )
-		    code.printLocalVariableTable();
-	    }
-	    output.println();
-            printIndent(depth-1);
-	    output.println("}");
-	} else {
-            printIndent(depth-1);
-	    output.println("}");
-	    if (env.showDisassembled || env.showLineAndLocal) {
-		for (Codes codes = new Codes(); (code = codes.next()) != null; ) {
-		    if (env.showDisassembled) {
-			code.printCodeSequence();
-			code.printExceptionTable();
-		    }
-		    if (env.showLineAndLocal) {
-			code.printLineNumberTable();
-			code.printLocalVariableTable();
-		    }
-		}
-	    }
-	}
-    }
-}
--- a/j2se/src/share/classes/sun/tools/javap/oldjavap/JavaPEnvironment.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,310 +0,0 @@
-/*
- * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.tools.javap.oldjavap;
-
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-
-import sun.tools.util.ModifierFilter;
-
-import sun.tools.java.BinaryClass;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.ClassFile;
-import sun.tools.java.ClassPath;
-import sun.tools.java.Constants;
-import sun.tools.java.Environment;
-import sun.tools.java.Identifier;
-import sun.tools.java.Package;
-import sun.tools.java.Type;
-
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.File;
-import java.io.PrintWriter;
-
-/**
- *   Main environment of JavaP.
- *   Repository for flag settings.
- *   Inherits loading capability. 
- *   @version 1.30, 07/05/05
- *   @author Robert Field
- */
-class JavaPEnvironment extends Environment implements Constants {
-
-    /**
-     * Flags for Compiler classes
-     */
-    int flags = 0;
-    
-    /**
-     * The path we use for finding source files (always empty).
-     */
-    ClassPath sourcePath = new ClassPath("");
-    
-    /**
-     * The path we use for finding class (binary) files.
-     */
-    ClassPath binaryPath;
-    
-    /**
-     * A hashtable of resource contexts.
-     */
-    Hashtable packages = new Hashtable(31);
-
-    /**
-     * The classes, this is only a cache, not a
-     * complete list.
-     */
-    Hashtable classes = new Hashtable(351);
-
-    // JavaP flag settings
-    boolean showLineAndLocal = false;
-    ModifierFilter showAccess = new ModifierFilter(
-	ModifierFilter.PUBLIC | ModifierFilter.PROTECTED | ModifierFilter.PACKAGE);
-    boolean showDisassembled = false;
-    boolean showBackwardCompatible = false;
-    boolean showVerbose = false;
-    boolean showInternalSigs = false;
-
-    /**
-     * The destination for output
-     */
-    PrintWriter output;
-
-	
-    /**
-     * Constructor
-     */
-    JavaPEnvironment(PrintWriter printWriter) {
-	super();
-        this.output = printWriter;
-    }
-    
-    /**
-     * Default flags for loadFile.  Load byte codes.
-     */
-    protected int loadFileFlags() { 
-	return ATT_CODE|ATT_ALLCLASSES; 
-    }
-
-    /**
-     * Return flags
-     */
-    public int getFlags() {
-	return flags;
-    }
-
-
-    /**
-     * Check if a class exists
-     * Applies only to package members (non-nested classes).
-     */
-    public boolean classExists(Identifier nm) {
-	if (nm.isInner()) {
-	    nm = nm.getTopName();	// just in case
-	}
-	Type t = Type.tClass(nm);
-	try {
-	    ClassDeclaration c = (ClassDeclaration)classes.get(t);
-            if (c == null) {
-                Package pkg = getPackage(nm.getQualifier());
-                Identifier cn = nm.getName();
-                ClassFile cf = pkg.getBinaryFile(cn);
-                return cf != null;
-            } else {
-                return c.getName().equals(nm);
-            }
-	} catch (IOException e) {
-	    return false;
-	}
-    }
-
-    /**
-     * Get a class, given the fully qualified class name
-     */
-    public ClassDeclaration getClassDeclaration(Identifier nm) {
-	return getClassDeclaration(Type.tClass(nm));
-    }
-
-    /**
-     * Get a class, given a type
-     */
-    public ClassDeclaration getClassDeclaration(Type t) {
-	ClassDeclaration c = (ClassDeclaration)classes.get(t);
-	if (c == null) {
-	    classes.put(t, c = new ClassDeclaration(t.getClassName()));
-	}
-	return c;
-    }
-
-    /**
-     * Get the package path for a package
-     */
-    public Package getPackage(Identifier pkg) throws IOException {
-	Package p = (Package)packages.get(pkg);
-	if (p == null) {
-	    packages.put(pkg, p = new Package(sourcePath, binaryPath, pkg));
-	}
-	return p;
-    }
-    
-    /**
-     * Load a binary file
-     */
-    BinaryClass loadFile(ClassFile file) throws IOException {
-	long tm = System.currentTimeMillis();
-	InputStream input = file.getInputStream();
-	BinaryClass c = null;
-
-	try {
-	    DataInputStream is = 
-		new DataInputStream(new BufferedInputStream(input));
-	    c = BinaryClass.load(new Environment(this, file), is, 
-				 loadFileFlags());
-	} catch (ClassFormatError e) {
-	    throw new IllegalArgumentException("Error: bad class format" + file.getPath() + e.getMessage());
-	} catch (Exception e) {
-	    e.printStackTrace();
-	}
-
-	input.close();
-
-	return c;
-    }
-    
-    /**
-     * Load the definition of a class
-     */
-    public void loadDefinition(ClassDeclaration c) {
-	switch (c.getStatus()) {
-	  case CS_UNDEFINED: {
-	    Identifier nm = c.getName();
-	    Package pkg;
-	    try {
-		pkg = getPackage(nm.getQualifier());
-	    } catch (IOException e) {
-	    	throw new IllegalArgumentException(
-                    "Error: I/O Exception - " + e.getMessage());
-	    }
-	    ClassFile binfile = pkg.getBinaryFile(nm.getName());
-	    if (binfile == null) {
-		throw new IllegalArgumentException(
-                    "Error: No binary file '" + nm.getName() + "'");
-	    }
-
-	    BinaryClass bc = null;
-	    try {
-		bc = loadFile(binfile);
-	    } catch (IOException e) {
-	    	throw new IllegalArgumentException(
-                    "Error: I/O Exception - " + e.getMessage() + 
-                    " in " + binfile);
-	    }
-	    if (bc == null) {
-		throw new IllegalArgumentException(
-                    "Error: Class not found in '" + binfile + "'");
-	    }
-	    if (!bc.getName().equals(nm)) {
-		throw new IllegalArgumentException(
-                    "Error: Binary file '" + nm.getName() + 
-                    "'  contains " + bc.getName());
-	    }
-
-	    c.setDefinition(bc, CS_BINARY);
-	    bc.loadNested(this, loadFileFlags());
-	    return;
-	  }
-	    
-	  case CS_UNDECIDED: 
-	  case CS_SOURCE: 
-	  default: {
-	    throw new IllegalArgumentException("Error: No binary file");
-	  }
-	}
-    }
-
-    /**
-     * Constructor the binary path from the class path strings
-     */
-    void setPath(String classPathString, 
-                 String sysClassPathString, 
-                 String extDirsString) {
-        StringBuffer binaryPathBuffer = new StringBuffer();
-
-        if (classPathString == null) {
-            classPathString = System.getProperty("env.class.path");
-            if (classPathString == null) {
-                classPathString = ".";
-            }
-        }
-        if (sysClassPathString == null) {
-            sysClassPathString = System.getProperty("sun.boot.class.path");
-            if (sysClassPathString == null) {
-                sysClassPathString = "";
-            }
-        }
-        appendPath(binaryPathBuffer, sysClassPathString);
-
-        if (extDirsString == null) {
-            extDirsString = System.getProperty("java.ext.dirs");
-        }
-        if (extDirsString != null) {
-            StringTokenizer st = new StringTokenizer(extDirsString, 
-                                                     File.pathSeparator);
-            while (st.hasMoreTokens()) {
-                String dirName = st.nextToken();
-                File dir = new File(dirName);
-                if (!dirName.endsWith(File.separator)) {
-                    dirName += File.separator;
-                }
-                if (dir.isDirectory()) {
-                    String[] files = dir.list();
-                    for (int i = 0; i < files.length; ++i) {
-                        String name = files[i];
-                        if (name.endsWith(".jar")) {
-                            appendPath(binaryPathBuffer, dirName + name);
-                        }
-                    }
-                }
-            }
-        }
-        
-        appendPath(binaryPathBuffer, classPathString);
-
-        binaryPath = new ClassPath(binaryPathBuffer.toString());
-    }
-
-    private static void appendPath(StringBuffer buf, String str) {
-        if (str.length() > 0) {
-            if (buf.length() > 0) {
-                buf.append(File.pathSeparator);
-            }
-            buf.append(str);
-        }
-    }
-}
--- a/j2se/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java	Fri Jun 22 00:46:43 2007 +0000
@@ -36,7 +36,7 @@
 import java.util.ResourceBundle;
 import java.util.ResourceBundle.Control;
 
-/*
+/**
  * This is a convenient class for loading some of internal resources faster
  * if they are built with Resources.gmk defined in J2SE workspace. Also,
  * they have to be in class file format.
@@ -62,7 +62,7 @@
 	excludedJDKLocales = Arrays.asList(#LOCALE_LIST#);
     }
 
-    /*
+    /**
      * This method is to provide a customized ResourceBundle.Control to speed
      * up the search of resources in JDK.
      *
@@ -71,8 +71,27 @@
     public static CoreResourceBundleControl getRBControlInstance() {
 	return resourceBundleControlInstance;
     }
+
+    /**
+     * This method is to provide a customized ResourceBundle.Control to speed
+     * up the search of resources in JDK, with the bundle's package name check.
+     *
+     * @param bundleName bundle name to check
+     * @return the instance of resource bundle control if the bundle is JDK's,
+     *    otherwise returns null.
+     */
+    public static CoreResourceBundleControl getRBControlInstance(String bundleName) {
+        if (bundleName.startsWith("com.sun.") ||
+            bundleName.startsWith("java.") ||
+            bundleName.startsWith("javax.") ||
+            bundleName.startsWith("sun.")) {
+	    return resourceBundleControlInstance;
+	} else {
+            return null;
+	}
+    }
  
-    /*
+    /**
      * @returns a list of candidate locales to search from.
      * @exception NullPointerException if baseName or locale is null.
      */
@@ -83,7 +102,7 @@
 	return candidates;
     }
 
-    /*
+    /**
      * @ returns TTL_DONT_CACHE so that ResourceBundle instance won't be cached.
      * User of this CoreResourceBundleControl should probably maintain a hard reference
      * to the ResourceBundle object themselves.
--- a/j2se/src/share/classes/sun/util/resources/LocaleNames.properties	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/LocaleNames.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -310,6 +310,7 @@
 GD=Grenada
 GE=Georgia
 GF=French Guiana
+GG=Guernsey
 GH=Ghana
 GI=Gibraltar
 GL=Greenland
@@ -332,12 +333,14 @@
 ID=Indonesia
 IE=Ireland
 IL=Israel
+IM=Isle Of Man
 IN=India
 IO=British Indian Ocean Territory
 IQ=Iraq
 IR=Iran
 IS=Iceland
 IT=Italy
+JE=Jersey
 JM=Jamaica
 JO=Jordan
 JP=Japan
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "Central Daylight Time", "CDT"};
 	String CTT[] = new String[] {"China Standard Time", "CST",
 				     "China Daylight Time", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"Central Standard Time (Northern Territory)", "CST",
 					"Central Summer Time (Northern Territory)", "CST"};
 	String DUBLIN[] = new String[] {"Greenwich Mean Time", "GMT",
@@ -161,6 +163,8 @@
 					  "Eastern Summer Time (Tasmania)", "EST"};
 	String TMT[] = new String[] {"Turkmenistan Time", "TMT",
 				     "Turkmenistan Summer Time", "TMST"};
+	String TRUT[] = new String[] {"Truk Time", "TRUT",
+				      "Truk Summer Time", "TRUST"};
 	String ULAT[]= new String[] {"Ulaanbaatar Time", "ULAT",
 				     "Ulaanbaatar Summer Time", "ULAST"};
 	String WAT[] = new String[] {"Western African Time", "WAT",
@@ -185,41 +189,40 @@
 				     "Uzbekistan Summer Time", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"Central Standard Time (Northern Territory)", "CST",
-				  "Central Daylight Time (Northern Territory)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -343,7 +346,7 @@
 						"Ecuador Summer Time", "ECST"}},
 	    {"America/Guyana", new String[] {"Guyana Time", "GYT",
 					     "Guyana Summer Time", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -359,7 +362,7 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
+	    {"America/Knox_IN", CST},
 	    {"America/La_Paz", new String[] {"Bolivia Time", "BOT",
 					     "Bolivia Summer Time", "BOST"}},
 	    {"America/Lima", new String[] {"Peru Time", "PET",
@@ -401,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -548,7 +552,7 @@
 	    {"Asia/Vladivostok", new String[] {"Vladivostok Time", "VLAT",
 					       "Vladivostok Summer Time", "VLAST"}},
 	    {"Asia/Yakutsk", new String[] {"Yakutsk Time", "YAKT",
-					   "Yaktsk Summer Time", "YAKST"}},
+					   "Yakutsk Summer Time", "YAKST"}},
 	    {"Asia/Yekaterinburg", new String[] {"Yekaterinburg Time", "YEKT",
 						 "Yekaterinburg Summer Time", "YEKST"}},
 	    {"Asia/Yerevan", ARMT},
@@ -612,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -782,14 +786,12 @@
 					     "Gilbert Is. Summer Time", "GILST"}},
 	    {"Pacific/Tongatapu", new String[] {"Tonga Time", "TOT",
 						"Tonga Summer Time", "TOST"}},
-	    {"Pacific/Truk", new String[] {"Truk Time", "TRUT",
-					   "Truk Summer Time", "TRUST"}},
+	    {"Pacific/Truk", TRUT},
 	    {"Pacific/Wake", new String[] {"Wake Time", "WAKT",
 					   "Wake Summer Time", "WAKST"}},
 	    {"Pacific/Wallis", new String[] {"Wallis & Futuna Time", "WFT",
 					     "Wallis & Futuna Summer Time", "WFST"}},
-	    {"Pacific/Yap", new String[] {"Yap Time", "YAPT",
-					  "Yap Summer Time", "YAPST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -818,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_de.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_de.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "Zentrale Sommerzeit", "CDT"};
 	String CTT[] = new String[] {"Chinesische Normalzeit", "CST",
 				     "Chinesische Sommerzeit", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"Zentrale Normalzeit (Northern Territory)", "CST",
 					"Zentrale Sommerzeit (Northern Territory)", "CST"};
 	String DUBLIN[] = new String[] {"Greenwich Zeit", "GMT",
@@ -161,6 +163,8 @@
 					  "\u00d6stliche Sommerzeit (Tasmanien)", "EST"};
 	String TMT[] = new String[] {"Turkmenische Zeit", "TMT",
 				     "Turkmenische Sommerzeit", "TMST"};
+	String TRUT[] = new String[] {"Truk Zeit", "TRUT",
+				      "Truk Sommerzeit", "TRUST"};
 	String ULAT[]= new String[] {"Ulaanbaatar Zeit", "ULAT",
 				     "Ulaanbaatar Sommerzeit", "ULAST"};
 	String WAT[] = new String[] {"Westafrikanische Zeit", "WAT",
@@ -185,41 +189,40 @@
 				     "Usbekistan Sommerzeit", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"Zentrale Normalzeit (N\u00f6rdliches Territorium Australien)", "CST", 
-				  "Zentrale Sommerzeit (N\u00f6rdliches Territorium Australien)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -227,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -290,7 +294,8 @@
 	    {"America/Argentina/Tucuman", AGT},
 	    {"America/Argentina/Ushuaia", AGT},
 	    {"America/Aruba", AST},
-	    {"America/Asuncion", new String[] {"Paraguay Zeit", "PYT", "Paraguay Sommerzeit", "PYST"}},
+	    {"America/Asuncion", new String[] {"Paraguay Zeit", "PYT",
+					       "Paraguay Sommerzeit", "PYST"}},
             {"America/Atikokan", EST},
 	    {"America/Atka", HAST},
             {"America/Bahia", BRT},
@@ -299,15 +304,18 @@
 	    {"America/Belize", CST},
             {"America/Blanc-Sablon", AST},
 	    {"America/Boa_Vista", AMT},
-	    {"America/Bogota", new String[] {"Kolumbianische Zeit", "COT", "Kolumbianische Sommerzeit", "COST"}},
+	    {"America/Bogota", new String[] {"Kolumbianische Zeit", "COT",
+					     "Kolumbianische Sommerzeit", "COST"}},
 	    {"America/Boise", MST},
 	    {"America/Buenos_Aires", AGT},
 	    {"America/Cambridge_Bay", MST},
             {"America/Campo_Grande", AMT},
 	    {"America/Cancun", CST},
-	    {"America/Caracas", new String[] {"Venezuelanische Zeit", "VET", "Venezuelanische Sommerzeit", "VEST"}},
+	    {"America/Caracas", new String[] {"Venezuelanische Zeit", "VET",
+					      "Venezuelanische Sommerzeit", "VEST"}},
 	    {"America/Catamarca", AGT},
-	    {"America/Cayenne", new String[] {"Franz\u00f6sisch-Guiana Zeit", "GFT", "Franz\u00f6sisch-Guiana Sommerzeit", "GFST"}},
+	    {"America/Cayenne", new String[] {"Franz\u00f6sisch-Guiana Zeit", "GFT",
+					      "Franz\u00f6sisch-Guiana Sommerzeit", "GFST"}},
 	    {"America/Cayman", EST},
 	    {"America/Chihuahua", MST},
 	    {"America/Coral_Harbour", EST}, 
@@ -327,15 +335,18 @@
 	    {"America/Fort_Wayne", EST},
 	    {"America/Fortaleza", BRT},
 	    {"America/Glace_Bay", AST},
-	    {"America/Godthab", new String[] {"Westgr\u00f6nl\u00e4ndische Zeit", "WGT", "Westgr\u00f6nl\u00e4ndische Sommerzeit", "WGST"}},
+	    {"America/Godthab", new String[] {"Westgr\u00f6nl\u00e4ndische Zeit", "WGT",
+					      "Westgr\u00f6nl\u00e4ndische Sommerzeit", "WGST"}},
 	    {"America/Goose_Bay", AST},
 	    {"America/Grand_Turk", EST},
 	    {"America/Grenada", AST},
 	    {"America/Guadeloupe", AST},
 	    {"America/Guatemala", CST},
-	    {"America/Guayaquil", new String[] {"Ecuadorianische Zeit", "ECT", "Ecuadorianische Sommerzeit", "ECST"}},
-	    {"America/Guyana", new String[] {"Guyanische Zeit", "GYT", "Guyanische Sommerzeit", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Guayaquil", new String[] {"Ecuadorianische Zeit", "ECT",
+					        "Ecuadorianische Sommerzeit", "ECST"}},
+	    {"America/Guyana", new String[] {"Guyanische Zeit", "GYT",
+					     "Guyanische Sommerzeit", "GYST"}},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -343,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -350,9 +362,11 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
-	    {"America/La_Paz", new String[] {"Bolivianische Zeit", "BOT", "Bolivianische Sommerzeit", "BOST"}},
-	    {"America/Lima", new String[] {"Peruanische Zeit", "PET", "Peruanische Sommerzeit", "PEST"}},
+	    {"America/Knox_IN", CST},
+	    {"America/La_Paz", new String[] {"Bolivianische Zeit", "BOT",
+					     "Bolivianische Sommerzeit", "BOST"}},
+	    {"America/Lima", new String[] {"Peruanische Zeit", "PET",
+					   "Peruanische Sommerzeit", "PEST"}},
 	    {"America/Louisville", EST},
 	    {"America/Maceio", BRT},
 	    {"America/Managua", CST},
@@ -363,9 +377,11 @@
 	    {"America/Menominee", CST},
 	    {"America/Merida", CST},
 	    {"America/Mexico_City", CST},
-	    {"America/Miquelon", new String[] {"Pierre & Miquelon Normalzeit", "PMST", "Pierre & Miquelon Sommerzeit", "PMDT"}},
+	    {"America/Miquelon", new String[] {"Pierre & Miquelon Normalzeit", "PMST",
+					       "Pierre & Miquelon Sommerzeit", "PMDT"}},
 	    {"America/Moncton", AST},
-	    {"America/Montevideo", new String[] {"Uruguayische Zeit", "UYT", "Uruguayische Sommerzeit", "UYST"}},
+	    {"America/Montevideo", new String[] {"Uruguayische Zeit", "UYT",
+						 "Uruguayische Sommerzeit", "UYST"}},
 	    {"America/Monterrey", CST},
 	    {"America/Montreal", EST},
 	    {"America/Montserrat", AST},
@@ -377,7 +393,8 @@
 	    {"America/North_Dakota/New_Salem", CST},
 	    {"America/Panama", EST},
 	    {"America/Pangnirtung", EST},
-	    {"America/Paramaribo", new String[] {"Suriname Zeit", "SRT", "Suriname Sommerzeit", "SRST"}},
+	    {"America/Paramaribo", new String[] {"Suriname Zeit", "SRT",
+						 "Suriname Sommerzeit", "SRST"}},
 	    {"America/Port-au-Prince", EST},
 	    {"America/Port_of_Spain", AST},
 	    {"America/Porto_Acre", ACT},
@@ -387,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -412,33 +430,47 @@
 	    {"America/Yakutat", AKST},
 	    {"America/Yellowknife", MST},
 	    {"Antarctica/Casey", WST_AUS},
-	    {"Antarctica/Davis", new String[] {"Davis Zeit", "DAVT", "Davis Sommerzeit", "DAVST"}},
-	    {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Zeit", "DDUT", "Dumont-d'Urville Sommerzeit", "DDUST"}},
-	    {"Antarctica/Mawson", new String[] {"Mawson Zeit", "MAWT", "Mawson Sommerzeit", "MAWST"}},
+	    {"Antarctica/Davis", new String[] {"Davis Zeit", "DAVT",
+					       "Davis Sommerzeit", "DAVST"}},
+	    {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Zeit", "DDUT",
+							"Dumont-d'Urville Sommerzeit", "DDUST"}},
+	    {"Antarctica/Mawson", new String[] {"Mawson Zeit", "MAWT",
+						"Mawson Sommerzeit", "MAWST"}},
 	    {"Antarctica/McMurdo", NZST},
 	    {"Antarctica/Palmer", CLT},
-	    {"Antarctica/Rothera", new String[] {"Rothera Zeit", "ROTT", "Rothera Sommerzeit", "ROTST"}},
+	    {"Antarctica/Rothera", new String[] {"Rothera Zeit", "ROTT",
+						 "Rothera Sommerzeit", "ROTST"}},
 	    {"Antarctica/South_Pole", NZST},
-	    {"Antarctica/Syowa", new String[] {"Syowa Zeit", "SYOT", "Syowa Sommerzeit", "SYOST"}},
-	    {"Antarctica/Vostok", new String[] {"Vostok Zeit", "VOST", "Vostok Sommerzeit", "VOSST"}},
+	    {"Antarctica/Syowa", new String[] {"Syowa Zeit", "SYOT",
+					       "Syowa Sommerzeit", "SYOST"}},
+	    {"Antarctica/Vostok", new String[] {"Vostok Zeit", "VOST",
+						"Vostok Sommerzeit", "VOSST"}},
 	    {"Arctic/Longyearbyen", CET},
 	    {"Asia/Aden", ARAST},
-	    {"Asia/Almaty", new String[] {"Alma Ata Zeit", "ALMT", "Alma-Ata Sommerzeit", "ALMST"}},
+	    {"Asia/Almaty", new String[] {"Alma Ata Zeit", "ALMT",
+					  "Alma-Ata Sommerzeit", "ALMST"}},
 	    {"Asia/Amman", EET},
-	    {"Asia/Anadyr", new String[] {"Anadyr Zeit", "ANAT", "Anadyr Sommerzeit", "ANAST"}},
-	    {"Asia/Aqtau", new String[] {"Aqtau Zeit", "AQTT", "Aqtau Sommerzeit", "AQTST"}},
-	    {"Asia/Aqtobe", new String[] {"Aqtobe Zeit", "AQTT", "Aqtobe Sommerzeit", "AQTST"}},
+	    {"Asia/Anadyr", new String[] {"Anadyr Zeit", "ANAT",
+					  "Anadyr Sommerzeit", "ANAST"}},
+	    {"Asia/Aqtau", new String[] {"Aqtau Zeit", "AQTT",
+					 "Aqtau Sommerzeit", "AQTST"}},
+	    {"Asia/Aqtobe", new String[] {"Aqtobe Zeit", "AQTT",
+					  "Aqtobe Sommerzeit", "AQTST"}},
 	    {"Asia/Ashgabat", TMT},
 	    {"Asia/Ashkhabad", TMT},
 	    {"Asia/Baghdad", ARAST},
 	    {"Asia/Bahrain", ARAST},
-	    {"Asia/Baku", new String[] {"Aserbaidschanische Zeit", "AZT", "Aserbaidschanische Sommerzeit", "AZST"}},
+	    {"Asia/Baku", new String[] {"Aserbaidschanische Zeit", "AZT",
+					"Aserbaidschanische Sommerzeit", "AZST"}},
 	    {"Asia/Bangkok", ICT},
 	    {"Asia/Beirut", EET},
-	    {"Asia/Bishkek", new String[] {"Kirgisische Zeit", "KGT", "Kirgisische Sommerzeit", "KGST"}},
-	    {"Asia/Brunei", new String[] {"Brunei Zeit", "BNT", "Brunei Sommerzeit", "BNST"}},
+	    {"Asia/Bishkek", new String[] {"Kirgisische Zeit", "KGT",
+					   "Kirgisische Sommerzeit", "KGST"}},
+	    {"Asia/Brunei", new String[] {"Brunei Zeit", "BNT",
+					  "Brunei Sommerzeit", "BNST"}},
 	    {"Asia/Calcutta", IST},
-	    {"Asia/Choibalsan", new String[] {"Choibalsan Zeit", "CHOT", "Choibalsan Sommerzeit", "CHOST"}},
+	    {"Asia/Choibalsan", new String[] {"Choibalsan Zeit", "CHOT",
+					      "Choibalsan Sommerzeit", "CHOST"}},
 	    {"Asia/Chongqing", CTT},
 	    {"Asia/Chungking", CTT},
 	    {"Asia/Colombo", IST},
@@ -448,50 +480,67 @@
 					"Timor-Leste Sommerzeit", "TLST"}},
 	    {"Asia/Damascus", EET},
 	    {"Asia/Dubai", GST},
-	    {"Asia/Dushanbe", new String[] {"Tadschikische Zeit", "TJT", "Tadschikische Sommerzeit", "TJST"}},
+	    {"Asia/Dushanbe", new String[] {"Tadschikische Zeit", "TJT",
+					    "Tadschikische Sommerzeit", "TJST"}},
 	    {"Asia/Gaza", EET},
 	    {"Asia/Harbin", CTT},
 	    {"Asia/Hong_Kong", HKT},
-	    {"Asia/Hovd", new String[] {"Hovd Zeit", "HOVT", "Hovd Sommerzeit", "HOVST"}},
-	    {"Asia/Irkutsk", new String[] {"Irkutsk Zeit", "IRKT", "Irkutsk Sommerzeit", "IRKST"}},
+	    {"Asia/Hovd", new String[] {"Hovd Zeit", "HOVT",
+					"Hovd Sommerzeit", "HOVST"}},
+	    {"Asia/Irkutsk", new String[] {"Irkutsk Zeit", "IRKT",
+					   "Irkutsk Sommerzeit", "IRKST"}},
 	    {"Asia/Istanbul", EET},
 	    {"Asia/Jakarta", WIT},
-	    {"Asia/Jayapura", new String[] {"Ostindonesische Zeit", "EIT", "Ostindonesische Sommerzeit", "EIST"}},
-	    {"Asia/Kabul", new String[] {"Afghanistanische Zeit", "AFT", "Afghanistanische Sommerzeit", "AFST"}},
-	    {"Asia/Kamchatka", new String[] {"Petropawlowsk-Kamtschatkische Zeit", "PETT", "Petropawlowsk-Kamtschatkische Sommerzeit", "PETST"}},
+	    {"Asia/Jayapura", new String[] {"Ostindonesische Zeit", "EIT",
+					    "Ostindonesische Sommerzeit", "EIST"}},
+	    {"Asia/Kabul", new String[] {"Afghanistanische Zeit", "AFT",
+					 "Afghanistanische Sommerzeit", "AFST"}},
+	    {"Asia/Kamchatka", new String[] {"Petropawlowsk-Kamtschatkische Zeit", "PETT",
+					     "Petropawlowsk-Kamtschatkische Sommerzeit", "PETST"}},
 	    {"Asia/Karachi", PKT},
 	    {"Asia/Kashgar", CTT},
-	    {"Asia/Katmandu", new String[] {"Nepalesische Zeit", "NPT", "Nepalesische Sommerzeit", "NPST"}},
-	    {"Asia/Krasnoyarsk", new String[] {"Krasnojarsker Zeit", "KRAT", "Krasnojarsker Sommerzeit", "KRAST"}},
+	    {"Asia/Katmandu", new String[] {"Nepalesische Zeit", "NPT",
+					    "Nepalesische Sommerzeit", "NPST"}},
+	    {"Asia/Krasnoyarsk", new String[] {"Krasnojarsker Zeit", "KRAT",
+					       "Krasnojarsker Sommerzeit", "KRAST"}},
 	    {"Asia/Kuala_Lumpur", MYT},
 	    {"Asia/Kuching", MYT},
 	    {"Asia/Kuwait", ARAST},
 	    {"Asia/Macao", CTT},
 	    {"Asia/Macau", CTT},
-	    {"Asia/Magadan", new String[] {"Magadanische Zeit", "MAGT", "Magadanische Sommerzeit", "MAGST"}},
+	    {"Asia/Magadan", new String[] {"Magadanische Zeit", "MAGT",
+					   "Magadanische Sommerzeit", "MAGST"}},
 	    {"Asia/Makassar", CIT},
-	    {"Asia/Manila", new String[] {"Philippinische Zeit", "PHT", "Philippinische Sommerzeit", "PHST"}},
+	    {"Asia/Manila", new String[] {"Philippinische Zeit", "PHT",
+					  "Philippinische Sommerzeit", "PHST"}},
 	    {"Asia/Muscat", GST},
 	    {"Asia/Nicosia", EET},
-	    {"Asia/Novosibirsk", new String[] {"Nowosibirsker Zeit", "NOVT", "Nowosibirsker Sommerzeit", "NOVST"}},
-	    {"Asia/Oral", new String[] {"Oral Zeit", "ORAT", "Oral Sommerzeit", "ORAST"}},
-	    {"Asia/Omsk", new String[] {"Omsk Zeit", "OMST", "Omsk Sommerzeit", "OMSST"}},
+	    {"Asia/Novosibirsk", new String[] {"Nowosibirsker Zeit", "NOVT",
+					       "Nowosibirsker Sommerzeit", "NOVST"}},
+	    {"Asia/Oral", new String[] {"Oral Zeit", "ORAT",
+					"Oral Sommerzeit", "ORAST"}},
+	    {"Asia/Omsk", new String[] {"Omsk Zeit", "OMST",
+					"Omsk Sommerzeit", "OMSST"}},
 	    {"Asia/Phnom_Penh", ICT},
 	    {"Asia/Pontianak", WIT},
 	    {"Asia/Pyongyang", KST},
 	    {"Asia/Qatar", ARAST},
-	    {"Asia/Qyzylorda", new String[] {"Qyzylorda Zeit", "QYZT", "Qyzylorda Sommerzeit", "QYZST"}},
-	    {"Asia/Rangoon", new String[] {"Myanmar Zeit", "MMT", "Myanmar Sommerzeit", "MMST"}},
+	    {"Asia/Qyzylorda", new String[] {"Qyzylorda Zeit", "QYZT",
+					     "Qyzylorda Sommerzeit", "QYZST"}},
+	    {"Asia/Rangoon", new String[] {"Myanmar Zeit", "MMT",
+					   "Myanmar Sommerzeit", "MMST"}},
 	    {"Asia/Riyadh", ARAST},
 	    {"Asia/Saigon", ICT},
-	    {"Asia/Sakhalin", new String[] {"Sakhalin Zeit", "SAKT", "Sakhalin Sommerzeit", "SAKST"}},
+	    {"Asia/Sakhalin", new String[] {"Sakhalin Zeit", "SAKT",
+					    "Sakhalin Sommerzeit", "SAKST"}},
 	    {"Asia/Samarkand", UZT},
 	    {"Asia/Seoul", KST},
 	    {"Asia/Singapore", SGT},
 	    {"Asia/Taipei", CTT},
 	    {"Asia/Tel_Aviv", ISRAEL},
 	    {"Asia/Tashkent", UZT},
-	    {"Asia/Tbilisi", new String[] {"Georgische Zeit", "GET", "Georgische Sommerzeit", "GEST"}},
+	    {"Asia/Tbilisi", new String[] {"Georgische Zeit", "GET",
+					   "Georgische Sommerzeit", "GEST"}},
 	    {"Asia/Tehran", IRT},
 	    {"Asia/Thimbu", BTT},
 	    {"Asia/Thimphu", BTT},
@@ -500,21 +549,29 @@
 	    {"Asia/Ulan_Bator", ULAT},
 	    {"Asia/Urumqi", CTT},
 	    {"Asia/Vientiane", ICT},
-	    {"Asia/Vladivostok", new String[] {"Wladiwostok Zeit", "VLAT", "Wladiwostok Sommerzeit", "VLAST"}},
-	    {"Asia/Yakutsk", new String[] {"Jakutsk Zeit", "YAKT", "Jakutsk Sommerzeit", "YAKST"}},
-	    {"Asia/Yekaterinburg", new String[] {"Jekaterinburger Zeit", "YEKT", "Jekaterinburger Sommerzeit", "YEKST"}},
+	    {"Asia/Vladivostok", new String[] {"Wladiwostok Zeit", "VLAT",
+					       "Wladiwostok Sommerzeit", "VLAST"}},
+	    {"Asia/Yakutsk", new String[] {"Jakutsk Zeit", "YAKT",
+					   "Jakutsk Sommerzeit", "YAKST"}},
+	    {"Asia/Yekaterinburg", new String[] {"Jekaterinburger Zeit", "YEKT",
+						 "Jekaterinburger Sommerzeit", "YEKST"}},
 	    {"Asia/Yerevan", ARMT},
-	    {"Atlantic/Azores", new String[] {"Azoren Zeit", "AZOT", "Azoren Sommerzeit", "AZOST"}},
+	    {"Atlantic/Azores", new String[] {"Azoren Zeit", "AZOT",
+					      "Azoren Sommerzeit", "AZOST"}},
 	    {"Atlantic/Bermuda", AST},
 	    {"Atlantic/Canary", WET},
-	    {"Atlantic/Cape_Verde", new String[] {"Kap Verde Zeit", "CVT", "Kap Verde Sommerzeit", "CVST"}},
+	    {"Atlantic/Cape_Verde", new String[] {"Kap Verde Zeit", "CVT",
+						  "Kap Verde Sommerzeit", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
-	    {"Atlantic/South_Georgia", new String[] {"South Georgia Normalzeit", "GST", "South Georgia Sommerzeit", "GDT"}},
+	    {"Atlantic/South_Georgia", new String[] {"South Georgia Normalzeit", "GST",
+						     "South Georgia Sommerzeit", "GDT"}},
 	    {"Atlantic/St_Helena", GMT},
-	    {"Atlantic/Stanley", new String[] {"Falkland Inseln Zeit", "FKT", "Falkland Inseln Sommerzeit", "FKST"}},
+	    {"Atlantic/Stanley", new String[] {"Falkland Inseln Zeit", "FKT",
+					       "Falkland Inseln Sommerzeit", "FKST"}},
 	    {"Australia/ACT", EST_NSW},
 	    {"Australia/Adelaide", ADELAIDE},
 	    {"Australia/Brisbane", BRISBANE},
@@ -522,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -557,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -600,10 +659,12 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
-	    {"Europe/Samara", new String[] {"Samarische Zeit", "SAMT", "Samarische Sommerzeit", "SAMST"}},
+	    {"Europe/Samara", new String[] {"Samarische Zeit", "SAMT",
+					    "Samarische Sommerzeit", "SAMST"}},
 	    {"Europe/San_Marino", CET},
 	    {"Europe/Sarajevo", CET},
 	    {"Europe/Simferopol", EET},
@@ -632,22 +693,31 @@
 	    {"Iran", IRT},
 	    {"IST", IST},
 	    {"Indian/Antananarivo", EAT},
-	    {"Indian/Chagos", new String[] {"Indischer Ozean Territorium Zeit", "IOT", "Indischer Ozean Territorium Sommerzeit", "IOST"}},
-	    {"Indian/Christmas", new String[] {"Christmas Island Zeit", "CXT", "Christmas Island Sommerzeit", "CXST"}},
-	    {"Indian/Cocos", new String[] {"Cocos Islands Zeit", "CCT", "Cocos Islands Sommerzeit", "CCST"}},
+	    {"Indian/Chagos", new String[] {"Indischer Ozean Territorium Zeit", "IOT",
+					    "Indischer Ozean Territorium Sommerzeit", "IOST"}},
+	    {"Indian/Christmas", new String[] {"Christmas Island Zeit", "CXT",
+					       "Christmas Island Sommerzeit", "CXST"}},
+	    {"Indian/Cocos", new String[] {"Cocos Islands Zeit", "CCT",
+					   "Cocos Islands Sommerzeit", "CCST"}},
 	    {"Indian/Comoro", EAT},
-	    {"Indian/Kerguelen", new String[] {"Franz\u00f6sisch S\u00fcd- u. Antarktische Landzeit", "TFT", "Franz\u00f6sisch S\u00fcd- u. Antarktische Landsommerzeit", "TFST"}},
-	    {"Indian/Mahe", new String[] {"Seychellen Zeit", "SCT", "Seychellen Sommerzeit", "SCST"}},
-	    {"Indian/Maldives", new String[] {"Maledivische Zeit", "MVT", "Maledivische Sommerzeit", "MVST"}},
-	    {"Indian/Mauritius", new String[] {"Mauritius Zeit", "MUT", "Mauritius Sommerzeit", "MUST"}},
+	    {"Indian/Kerguelen", new String[] {"Franz\u00f6sisch S\u00fcd- u. Antarktische Landzeit", "TFT",
+					       "Franz\u00f6sisch S\u00fcd- u. Antarktische Landsommerzeit", "TFST"}},
+	    {"Indian/Mahe", new String[] {"Seychellen Zeit", "SCT",
+					  "Seychellen Sommerzeit", "SCST"}},
+	    {"Indian/Maldives", new String[] {"Maledivische Zeit", "MVT",
+					      "Maledivische Sommerzeit", "MVST"}},
+	    {"Indian/Mauritius", new String[] {"Mauritius Zeit", "MUT",
+					       "Mauritius Sommerzeit", "MUST"}},
 	    {"Indian/Mayotte", EAT},
-	    {"Indian/Reunion", new String[] {"Reunion Zeit", "RET", "Reunion Sommerzeit", "REST"}},
+	    {"Indian/Reunion", new String[] {"Reunion Zeit", "RET",
+					     "Reunion Sommerzeit", "REST"}},
 	    {"Israel", ISRAEL},
 	    {"Jamaica", EST},
 	    {"Japan", JST},
 	    {"Kwajalein", MHT},
 	    {"Libya", EET},
-	    {"MET", new String[] {"Zentraleurop\u00e4ische Zeit", "MET", "Zentraleurop\u00e4ische Sommerzeit", "MEST"}},
+	    {"MET", new String[] {"Zentraleurop\u00e4ische Zeit", "MET",
+				  "Zentraleurop\u00e4ische Sommerzeit", "MEST"}},
 	    {"Mexico/BajaNorte", PST},
 	    {"Mexico/BajaSur", MST},
 	    {"Mexico/General", CST},
@@ -665,42 +735,63 @@
 	    {"Pacific/Auckland", NZST},
 	    {"Pacific/Chatham", CHAST},
 	    {"Pacific/Easter", EASTER},
-	    {"Pacific/Efate", new String[] {"Vanuatu Zeit", "VUT", "Vanuatu Sommerzeit", "VUST"}},
-	    {"Pacific/Enderbury", new String[] {"Phoenix Inseln Zeit", "PHOT", "Phoenix Inseln Sommerzeit", "PHOST"}},
-	    {"Pacific/Fakaofo", new String[] {"Tokelau Zeit", "TKT", "Tokelau Sommerzeit", "TKST"}},
-	    {"Pacific/Fiji", new String[] {"Fidschi Zeit", "FJT", "Fidschi Sommerzeit", "FJST"}},
-	    {"Pacific/Funafuti", new String[] {"Tuvalu Zeit", "TVT", "Tuvalu Sommerzeit", "TVST"}},
-	    {"Pacific/Galapagos", new String[] {"Galapagos Zeit", "GALT", "Galapagos Sommerzeit", "GALST"}},
+	    {"Pacific/Efate", new String[] {"Vanuatu Zeit", "VUT",
+					    "Vanuatu Sommerzeit", "VUST"}},
+	    {"Pacific/Enderbury", new String[] {"Phoenix Inseln Zeit", "PHOT",
+						"Phoenix Inseln Sommerzeit", "PHOST"}},
+	    {"Pacific/Fakaofo", new String[] {"Tokelau Zeit", "TKT",
+					      "Tokelau Sommerzeit", "TKST"}},
+	    {"Pacific/Fiji", new String[] {"Fidschi Zeit", "FJT",
+					   "Fidschi Sommerzeit", "FJST"}},
+	    {"Pacific/Funafuti", new String[] {"Tuvalu Zeit", "TVT",
+					       "Tuvalu Sommerzeit", "TVST"}},
+	    {"Pacific/Galapagos", new String[] {"Galapagos Zeit", "GALT",
+						"Galapagos Sommerzeit", "GALST"}},
 	    {"Pacific/Gambier", GAMBIER},
 	    {"Pacific/Guadalcanal", SBT},
 	    {"Pacific/Guam", ChST},
 	    {"Pacific/Johnston", HST},
-	    {"Pacific/Kiritimati", new String[] {"Line Inseln Zeit", "LINT", "Line Inseln Sommerzeit", "LINST"}},
-	    {"Pacific/Kosrae", new String[] {"Kosrae Zeit", "KOST", "Kosrae Sommerzeit", "KOSST"}},
+	    {"Pacific/Kiritimati", new String[] {"Line Inseln Zeit", "LINT",
+						 "Line Inseln Sommerzeit", "LINST"}},
+	    {"Pacific/Kosrae", new String[] {"Kosrae Zeit", "KOST",
+					     "Kosrae Sommerzeit", "KOSST"}},
 	    {"Pacific/Kwajalein", MHT},
 	    {"Pacific/Majuro", MHT},
-	    {"Pacific/Marquesas", new String[] {"Marquesas Zeit", "MART", "Marquesas Sommerzeit", "MARST"}},
+	    {"Pacific/Marquesas", new String[] {"Marquesas Zeit", "MART",
+						"Marquesas Sommerzeit", "MARST"}},
 	    {"Pacific/Midway", SAMOA},
-	    {"Pacific/Nauru", new String[] {"Nauru Zeit", "NRT", "Nauru Sommerzeit", "NRST"}},
-	    {"Pacific/Niue", new String[] {"Niue Zeit", "NUT", "Niue Sommerzeit", "NUST"}},
-	    {"Pacific/Norfolk", new String[] {"Norfolk Zeit", "NFT", "Norfolk Sommerzeit", "NFST"}},
-	    {"Pacific/Noumea", new String[] {"Neukaledonische Zeit", "NCT", "Neukaledonische Sommerzeit", "NCST"}},
+	    {"Pacific/Nauru", new String[] {"Nauru Zeit", "NRT",
+					    "Nauru Sommerzeit", "NRST"}},
+	    {"Pacific/Niue", new String[] {"Niue Zeit", "NUT",
+					   "Niue Sommerzeit", "NUST"}},
+	    {"Pacific/Norfolk", new String[] {"Norfolk Zeit", "NFT",
+					      "Norfolk Sommerzeit", "NFST"}},
+	    {"Pacific/Noumea", new String[] {"Neukaledonische Zeit", "NCT",
+					     "Neukaledonische Sommerzeit", "NCST"}},
 	    {"Pacific/Pago_Pago", SAMOA},
-	    {"Pacific/Palau", new String[] {"Palau Zeit", "PWT", "Palau Sommerzeit", "PWST"}},
+	    {"Pacific/Palau", new String[] {"Palau Zeit", "PWT",
+					    "Palau Sommerzeit", "PWST"}},
 	    {"Pacific/Pitcairn", PITCAIRN},
-	    {"Pacific/Ponape", new String[] {"Ponape Zeit", "PONT", "Ponape Sommerzeit", "PONST"}},
-	    {"Pacific/Port_Moresby", new String[] {"Papua-Neuguinea Zeit", "PGT", "Papua-Neuguinea Sommerzeit", "PGST"}},
+	    {"Pacific/Ponape", new String[] {"Ponape Zeit", "PONT",
+					     "Ponape Sommerzeit", "PONST"}},
+	    {"Pacific/Port_Moresby", new String[] {"Papua-Neuguinea Zeit", "PGT",
+						   "Papua-Neuguinea Sommerzeit", "PGST"}},
 	    {"Pacific/Rarotonga", new String[] {"Cook-Inseln Zeit", "CKT", 
 						"Cook-Inseln Sommerzeit", "CKHST"}},
 	    {"Pacific/Saipan", ChST},
 	    {"Pacific/Samoa", SAMOA},
-	    {"Pacific/Tahiti", new String[] {"Tahiti Zeit", "TAHT", "Tahiti Sommerzeit", "TAHST"}},
-	    {"Pacific/Tarawa", new String[] {"Gilbert-Inseln Zeit", "GILT", "Gilbert-Inseln Sommerzeit", "GILST"}},
-	    {"Pacific/Tongatapu", new String[] {"Tonga Zeit", "TOT", "Tonga Sommerzeit", "TOST"}},
-	    {"Pacific/Truk", new String[] {"Truk Zeit", "TRUT", "Truk Sommerzeit", "TRUST"}},
-	    {"Pacific/Wake", new String[] {"Wake Zeit", "WAKT", "Wake Sommerzeit", "WAKST"}},
-	    {"Pacific/Wallis", new String[] {"Wallis u. Futuna Zeit", "WFT", "Wallis u. Futuna Sommerzeit", "WFST"}},
-	    {"Pacific/Yap", new String[] {"Yap Zeit", "YAPT", "Yap Sommerzeit", "YAPST"}},
+	    {"Pacific/Tahiti", new String[] {"Tahiti Zeit", "TAHT",
+					     "Tahiti Sommerzeit", "TAHST"}},
+	    {"Pacific/Tarawa", new String[] {"Gilbert-Inseln Zeit", "GILT",
+					     "Gilbert-Inseln Sommerzeit", "GILST"}},
+	    {"Pacific/Tongatapu", new String[] {"Tonga Zeit", "TOT",
+						"Tonga Sommerzeit", "TOST"}},
+	    {"Pacific/Truk", TRUT},
+	    {"Pacific/Wake", new String[] {"Wake Zeit", "WAKT",
+					   "Wake Sommerzeit", "WAKST"}},
+	    {"Pacific/Wallis", new String[] {"Wallis u. Futuna Zeit", "WFT",
+					     "Wallis u. Futuna Sommerzeit", "WFST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -729,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_en_CA.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_en_CA.java	Fri Jun 22 00:46:43 2007 +0000
@@ -44,45 +44,6 @@
 
     protected final Object[][] getContents() {
         return new Object[][] {
-	    {"PST", new String[] {/*--America/Los_Angeles--*/ "Pacific Standard Time", "PST",
-				  "Pacific Daylight Time", "PDT" /*San Francisco*/}},
-	    {"MST", new String[] {/*--America/Denver--*/ "Mountain Standard Time", "MST",
-				  "Mountain Daylight Time", "MDT" /*Denver*/}},
-	    {"PNT", new String[] {/*--America/Phoenix--*/ "Mountain Standard Time", "MST",
-				  "Mountain Standard Time", "MST" /*Phoenix*/}},
-	    {"CST", new String[] {/*--America/Chicago--*/ "Central Standard Time", "CST",
-				  "Central Daylight Time", "CDT" /*Chicago*/}},
-	    {"EST", new String[] {/*--America/New_York--*/ "Eastern Standard Time", "EST",
-				  "Eastern Daylight Time", "EDT" /*New York*/}},
-	    {"IET", new String[] {/*--America/Indianapolis--*/ "Eastern Standard Time", "EST",
-				  "Eastern Standard Time", "EST" /*Indianapolis*/}},
-	    {"HST", new String[] {/*--Pacific/Honolulu--*/ "Hawaii Standard Time", "HST",
-				  "Hawaii Standard Time", "HST" /*Honolulu*/}},
-	    {"AST", new String[] {/*--America/Anchorage--*/ "Alaska Standard Time", "AKST",
-				  "Alaska Daylight Time", "AKDT" /*Anchorage*/}},
-	    {"CNT", new String[] {/*--America/St_Johns--*/ "Newfoundland Standard Time",
-				  "NST", "Newfoundland Daylight Time", "NDT" /*St. John's*/}},
-            
-	    {"America/Los_Angeles", new String[] {"Pacific Standard Time", "PST",
-						  "Pacific Daylight Time", "PDT" /*San Francisco*/}},
-	    {"America/Denver", new String[] {"Mountain Standard Time", "MST",
-					     "Mountain Daylight Time", "MDT" /*Denver*/}},
-	    {"America/Phoenix", new String[] {"Mountain Standard Time", "MST",
-					      "Mountain Standard Time", "MST" /*Phoenix*/}},
-	    {"America/Chicago", new String[] {"Central Standard Time", "CST",
-					      "Central Daylight Time", "CDT" /*Chicago*/}},
-	    {"America/New_York", new String[] {"Eastern Standard Time", "EST",
-					       "Eastern Daylight Time", "EDT" /*New York*/}},
-	    {"America/Indianapolis", new String[] {"Eastern Standard Time", "EST",
-						   "Eastern Standard Time", "EST" /*Indianapolis*/}},
-	    {"Pacific/Honolulu", new String[] {"Hawaii Standard Time", "HST",
-					       "Hawaii Standard Time", "HST" /*Honolulu*/}},
-	    {"America/Anchorage", new String[] {"Alaska Standard Time", "AKST",
-						"Alaska Daylight Time", "AKDT" /*Anchorage*/}},
-	    {"America/Halifax", new String[] {"Atlantic Standard Time", "AST",
-					      "Atlantic Daylight Time", "ADT" /*Halifax*/}},
-	    {"America/St_Johns", new String[] {"Newfoundland Standard Time",
-					       "NST", "Newfoundland Daylight Time", "NDT" /*St. John's*/}},
         };
     }
 }
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_es.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_es.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "Hora de verano Central", "CDT"};
 	String CTT[] = new String[] {"Hora est\u00e1ndar de China", "CST",
 				     "Hora de verano de China", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"Hora est\u00e1ndar Central (territorio del Norte)", "CST",
 					"Hora de verano Central (territorio del Norte)", "CST"};
 	String DUBLIN[] = new String[] {"Hora del Meridiano de Greenwich", "GMT",
@@ -161,6 +163,8 @@
 					  "Hora de verano del Este (Tasmania)", "EST"};
 	String TMT[] = new String[] {"Hora de Turkmenist\u00e1n", "TMT",
 				     "Hora de verano de Turkmenist\u00e1n", "TMST"};
+	String TRUT[] =new String[] {"Hora de Truk", "TRUT",
+				     "Hora de verano de Truk", "TRUST"};
 	String ULAT[]= new String[] {"Hora de Ulan Bator", "ULAT",
 				     "Hora de verano de Ulan Bator", "ULAST"};
 	String WAT[] = new String[] {"Hora de \u00c1frica Occidental", "WAT",
@@ -185,40 +189,40 @@
 				     "Hora de verano de Uzbekist\u00e1n", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"Hora est\u00e1ndar Central (Territorio del Norte)", "CST", "Hora de verano central (Territorio del Norte)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -226,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -289,7 +294,8 @@
 	    {"America/Argentina/Tucuman", AGT},
 	    {"America/Argentina/Ushuaia", AGT},
 	    {"America/Aruba", AST},
-	    {"America/Asuncion", new String[] {"Hora de Paraguay", "PYT", "Hora de verano de Paraguay", "PYST"}},
+	    {"America/Asuncion", new String[] {"Hora de Paraguay", "PYT",
+					       "Hora de verano de Paraguay", "PYST"}},
             {"America/Atikokan", EST},
 	    {"America/Atka", HAST},
 	    {"America/Bahia", BRT},
@@ -298,15 +304,18 @@
 	    {"America/Belize", CST},
             {"America/Blanc-Sablon", AST}, 
 	    {"America/Boa_Vista", AMT},
-	    {"America/Bogota", new String[] {"Hora de Colombia", "COT", "Hora de verano de Colombia", "COST"}},
+	    {"America/Bogota", new String[] {"Hora de Colombia", "COT",
+					     "Hora de verano de Colombia", "COST"}},
 	    {"America/Boise", MST},
 	    {"America/Buenos_Aires", AGT},
 	    {"America/Cambridge_Bay", MST},
 	    {"America/Campo_Grande", AMT},
 	    {"America/Cancun", CST},
-	    {"America/Caracas", new String[] {"Hora de Venezuela", "VET", "Hora de verano de Venezuela", "VEST"}},
+	    {"America/Caracas", new String[] {"Hora de Venezuela", "VET",
+					      "Hora de verano de Venezuela", "VEST"}},
 	    {"America/Catamarca", AGT},
-	    {"America/Cayenne", new String[] {"Hora de la Guayana Francesa", "GFT", "Hora de verano de la Guayana Francesa", "GFST"}},
+	    {"America/Cayenne", new String[] {"Hora de la Guayana Francesa", "GFT",
+					      "Hora de verano de la Guayana Francesa", "GFST"}},
 	    {"America/Cayman", EST},
 	    {"America/Chihuahua", MST},
 	    {"America/Coral_Harbour", EST},
@@ -326,15 +335,18 @@
 	    {"America/Fort_Wayne", EST},
 	    {"America/Fortaleza", BRT},
 	    {"America/Glace_Bay", AST},
-	    {"America/Godthab", new String[] {"Hora de Groenlandia Occidental", "WGT", "Hora de verano de Groenlandia Occidental", "WGST"}},
+	    {"America/Godthab", new String[] {"Hora de Groenlandia Occidental", "WGT",
+					      "Hora de verano de Groenlandia Occidental", "WGST"}},
 	    {"America/Goose_Bay", AST},
 	    {"America/Grand_Turk", EST},
 	    {"America/Grenada", AST},
 	    {"America/Guadeloupe", AST},
 	    {"America/Guatemala", CST},
-	    {"America/Guayaquil", new String[] {"Hora de Ecuador", "ECT", "Hora de verano de Ecuador", "ECST"}},
-	    {"America/Guyana", new String[] {"Hora de Guyana", "GYT", "Hora de verano de Guyana", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Guayaquil", new String[] {"Hora de Ecuador", "ECT",
+						"Hora de verano de Ecuador", "ECST"}},
+	    {"America/Guyana", new String[] {"Hora de Guyana", "GYT",
+					     "Hora de verano de Guyana", "GYST"}},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -342,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -349,9 +362,11 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
-	    {"America/La_Paz", new String[] {"Hora de Bolivia", "BOT", "Hora de verano de Bolivia", "BOST"}},
-	    {"America/Lima", new String[] {"Hora de Per\u00fa", "PET", "Hora de verano de Per\u00fa", "PEST"}},
+	    {"America/Knox_IN", CST},
+	    {"America/La_Paz", new String[] {"Hora de Bolivia", "BOT",
+					     "Hora de verano de Bolivia", "BOST"}},
+	    {"America/Lima", new String[] {"Hora de Per\u00fa", "PET",
+					   "Hora de verano de Per\u00fa", "PEST"}},
 	    {"America/Louisville", EST},
 	    {"America/Maceio", BRT},
 	    {"America/Managua", CST},
@@ -362,9 +377,11 @@
 	    {"America/Menominee", CST},
 	    {"America/Merida", CST},
 	    {"America/Mexico_City", CST},
-	    {"America/Miquelon", new String[] {"Hora est\u00e1ndar de Pierre & Miquelon", "PMST", "Hora de verano de Pierre & Miquelon", "PMDT"}},
+	    {"America/Miquelon", new String[] {"Hora est\u00e1ndar de Pierre & Miquelon", "PMST",
+					       "Hora de verano de Pierre & Miquelon", "PMDT"}},
 	    {"America/Moncton", AST},
-	    {"America/Montevideo", new String[] {"Hora de Uruguay", "UYT", "Hora de verano de Uruguay", "UYST"}},
+	    {"America/Montevideo", new String[] {"Hora de Uruguay", "UYT",
+						 "Hora de verano de Uruguay", "UYST"}},
 	    {"America/Monterrey", CST},
 	    {"America/Montreal", EST},
 	    {"America/Montserrat", AST},
@@ -376,7 +393,8 @@
 	    {"America/North_Dakota/New_Salem", CST},
 	    {"America/Panama", EST},
 	    {"America/Pangnirtung", EST},
-	    {"America/Paramaribo", new String[] {"Hora de Surinam", "SRT", "Hora de verano de Surinam", "SRST"}},
+	    {"America/Paramaribo", new String[] {"Hora de Surinam", "SRT",
+						 "Hora de verano de Surinam", "SRST"}},
 	    {"America/Port-au-Prince", EST},
 	    {"America/Port_of_Spain", AST},
 	    {"America/Porto_Acre", ACT},
@@ -386,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -411,33 +430,47 @@
 	    {"America/Yakutat", AKST},
 	    {"America/Yellowknife", MST},
 	    {"Antarctica/Casey", WST_AUS},
-	    {"Antarctica/Davis", new String[] {"Hora de Davis", "DAVT", "Hora de verano de Davis", "DAVST"}},
-	    {"Antarctica/DumontDUrville", new String[] {"Hora de Dumont-d'Urville", "DDUT", "Hora de verano de Dumont-d'Urville", "DDUST"}},
-	    {"Antarctica/Mawson", new String[] {"Hora de Mawson", "MAWT", "Hora de verano de Mawson", "MAWST"}},
+	    {"Antarctica/Davis", new String[] {"Hora de Davis", "DAVT",
+					       "Hora de verano de Davis", "DAVST"}},
+	    {"Antarctica/DumontDUrville", new String[] {"Hora de Dumont-d'Urville", "DDUT",
+							"Hora de verano de Dumont-d'Urville", "DDUST"}},
+	    {"Antarctica/Mawson", new String[] {"Hora de Mawson", "MAWT",
+						"Hora de verano de Mawson", "MAWST"}},
 	    {"Antarctica/McMurdo", NZST},
 	    {"Antarctica/Palmer", CLT},
-	    {"Antarctica/Rothera", new String[] {"Hora de Rothera", "ROTT", "Hora de verano de Rothera", "ROTST"}},
+	    {"Antarctica/Rothera", new String[] {"Hora de Rothera", "ROTT",
+						 "Hora de verano de Rothera", "ROTST"}},
 	    {"Antarctica/South_Pole", NZST},
-	    {"Antarctica/Syowa", new String[] {"Hora de Syowa", "SYOT", "Hora de verano de Syowa", "SYOST"}},
-	    {"Antarctica/Vostok", new String[] {"Hora de Vostok", "VOST", "Hora de verano de Vostok", "VOSST"}},
+	    {"Antarctica/Syowa", new String[] {"Hora de Syowa", "SYOT",
+					       "Hora de verano de Syowa", "SYOST"}},
+	    {"Antarctica/Vostok", new String[] {"Hora de Vostok", "VOST",
+						"Hora de verano de Vostok", "VOSST"}},
 	    {"Arctic/Longyearbyen", CET},
 	    {"Asia/Aden", ARAST},
-	    {"Asia/Almaty", new String[] {"Hora de Alma-Ata", "ALMT", "Hora de verano de Alma-Ata", "ALMST"}},
+	    {"Asia/Almaty", new String[] {"Hora de Alma-Ata", "ALMT",
+					  "Hora de verano de Alma-Ata", "ALMST"}},
 	    {"Asia/Amman", EET},
-	    {"Asia/Anadyr", new String[] {"Hora de Anadyr", "ANAT", "Hora de verano de Anadyr", "ANAST"}},
-	    {"Asia/Aqtau", new String[] {"Hora de Aqtau", "AQTT", "Hora de verano de Aqtau", "AQTST"}},
-	    {"Asia/Aqtobe", new String[] {"Hora de Aqtobe", "AQTT", "Hora de verano de Aqtobe", "AQTST"}},
+	    {"Asia/Anadyr", new String[] {"Hora de Anadyr", "ANAT",
+					  "Hora de verano de Anadyr", "ANAST"}},
+	    {"Asia/Aqtau", new String[] {"Hora de Aqtau", "AQTT",
+					 "Hora de verano de Aqtau", "AQTST"}},
+	    {"Asia/Aqtobe", new String[] {"Hora de Aqtobe", "AQTT",
+					  "Hora de verano de Aqtobe", "AQTST"}},
 	    {"Asia/Ashgabat", TMT},
 	    {"Asia/Ashkhabad", TMT},
 	    {"Asia/Baghdad", ARAST},
 	    {"Asia/Bahrain", ARAST},
-	    {"Asia/Baku", new String[] {"Hora de Azerbaiy\u00e1n", "AZT", "Hora de verano de Azerbaiy\u00e1n", "AZST"}},
+	    {"Asia/Baku", new String[] {"Hora de Azerbaiy\u00e1n", "AZT",
+					"Hora de verano de Azerbaiy\u00e1n", "AZST"}},
 	    {"Asia/Bangkok", ICT},
 	    {"Asia/Beirut", EET},
-	    {"Asia/Bishkek", new String[] {"Hora de Kirguizist\u00e1n", "KGT", "Hora de verano de Kirguizist\u00e1n", "KGST"}},
-	    {"Asia/Brunei", new String[] {"Hora de Brunei", "BNT", "Hora de verano de Brunei", "BNST"}},
+	    {"Asia/Bishkek", new String[] {"Hora de Kirguizist\u00e1n", "KGT",
+					   "Hora de verano de Kirguizist\u00e1n", "KGST"}},
+	    {"Asia/Brunei", new String[] {"Hora de Brunei", "BNT",
+					  "Hora de verano de Brunei", "BNST"}},
 	    {"Asia/Calcutta", IST},
-	    {"Asia/Choibalsan", new String[] {"Hora de Choibalsan", "CHOT", "Hora de verano de Choibalsan", "CHOST"}},
+	    {"Asia/Choibalsan", new String[] {"Hora de Choibalsan", "CHOT",
+					      "Hora de verano de Choibalsan", "CHOST"}},
 	    {"Asia/Chongqing", CTT},
 	    {"Asia/Chungking", CTT},
 	    {"Asia/Colombo", IST},
@@ -447,50 +480,67 @@
 					"Hora de verano de Timor Leste", "TLST"}},
 	    {"Asia/Damascus", EET},
 	    {"Asia/Dubai", GST},
-	    {"Asia/Dushanbe", new String[] {"Hora de Tajikist\u00e1n", "TJT", "Hora de verano de Tajikist\u00e1n", "TJST"}},
+	    {"Asia/Dushanbe", new String[] {"Hora de Tajikist\u00e1n", "TJT",
+					    "Hora de verano de Tajikist\u00e1n", "TJST"}},
 	    {"Asia/Gaza", EET},
 	    {"Asia/Harbin", CTT},
 	    {"Asia/Hong_Kong", HKT},
-	    {"Asia/Hovd", new String[] {"Hora de Hovd", "HOVT", "Hora de verano de Hovd", "HOVST"}},
-	    {"Asia/Irkutsk", new String[] {"Hora de Irkutsk", "IRKT", "Hora de verano de Irkutsk", "IRKST"}},
+	    {"Asia/Hovd", new String[] {"Hora de Hovd", "HOVT",
+					"Hora de verano de Hovd", "HOVST"}},
+	    {"Asia/Irkutsk", new String[] {"Hora de Irkutsk", "IRKT",
+					   "Hora de verano de Irkutsk", "IRKST"}},
 	    {"Asia/Istanbul", EET},
 	    {"Asia/Jakarta", WIT},
-	    {"Asia/Jayapura", new String[] {"Hora de Indonesia Oriental", "EIT", "Hora de verano de Indonesia Oriental", "EIST"}},
-	    {"Asia/Kabul", new String[] {"Hora de Afganist\u00e1n", "AFT", "Hora de verano de Afganist\u00e1n", "AFST"}},
-	    {"Asia/Kamchatka", new String[] {"Hora de Petropavlovsk-Kamchatski", "PETT", "Hora de verano de Petropavlovsk-Kamchatski", "PETST"}},
+	    {"Asia/Jayapura", new String[] {"Hora de Indonesia Oriental", "EIT",
+					    "Hora de verano de Indonesia Oriental", "EIST"}},
+	    {"Asia/Kabul", new String[] {"Hora de Afganist\u00e1n", "AFT",
+					 "Hora de verano de Afganist\u00e1n", "AFST"}},
+	    {"Asia/Kamchatka", new String[] {"Hora de Petropavlovsk-Kamchatski", "PETT",
+					     "Hora de verano de Petropavlovsk-Kamchatski", "PETST"}},
 	    {"Asia/Karachi", PKT},
 	    {"Asia/Kashgar", CTT},
-	    {"Asia/Katmandu", new String[] {"Hora de Nepal", "NPT", "Hora de verano de Nepal", "NPST"}},
-	    {"Asia/Krasnoyarsk", new String[] {"Hora de Krasnoyarsk", "KRAT", "Hora de verano de Krasnoyarsk", "KRAST"}},
+	    {"Asia/Katmandu", new String[] {"Hora de Nepal", "NPT",
+					    "Hora de verano de Nepal", "NPST"}},
+	    {"Asia/Krasnoyarsk", new String[] {"Hora de Krasnoyarsk", "KRAT",
+					       "Hora de verano de Krasnoyarsk", "KRAST"}},
 	    {"Asia/Kuala_Lumpur", MYT},
 	    {"Asia/Kuching", MYT},
 	    {"Asia/Kuwait", ARAST},
 	    {"Asia/Macao", CTT},
 	    {"Asia/Macau", CTT},
-	    {"Asia/Magadan", new String[] {"Hora de Magad\u00e1n", "MAGT", "Hora de verano de Magad\u00e1n", "MAGST"}},
+	    {"Asia/Magadan", new String[] {"Hora de Magad\u00e1n", "MAGT",
+					   "Hora de verano de Magad\u00e1n", "MAGST"}},
 	    {"Asia/Makassar", CIT},
-	    {"Asia/Manila", new String[] {"Hora de Filipinas", "PHT", "Hora de verano de Filipinas", "PHST"}},
+	    {"Asia/Manila", new String[] {"Hora de Filipinas", "PHT",
+					  "Hora de verano de Filipinas", "PHST"}},
 	    {"Asia/Muscat", GST},
 	    {"Asia/Nicosia", EET},
-	    {"Asia/Novosibirsk", new String[] {"Hora de Novosibirsk", "NOVT", "Hora de verano de Novosibirsk", "NOVST"}},
-	    {"Asia/Oral", new String[] {"Hora de Uralsk", "ORAT", "Hora de verano de Uralsk", "ORAST"}},
-	    {"Asia/Omsk", new String[] {"Hora de Omsk", "OMST", "Hora de verano de Omsk", "OMSST"}},
+	    {"Asia/Novosibirsk", new String[] {"Hora de Novosibirsk", "NOVT",
+					       "Hora de verano de Novosibirsk", "NOVST"}},
+	    {"Asia/Oral", new String[] {"Hora de Uralsk", "ORAT",
+					"Hora de verano de Uralsk", "ORAST"}},
+	    {"Asia/Omsk", new String[] {"Hora de Omsk", "OMST",
+					"Hora de verano de Omsk", "OMSST"}},
 	    {"Asia/Phnom_Penh", ICT},
 	    {"Asia/Pontianak", WIT},
 	    {"Asia/Pyongyang", KST},
 	    {"Asia/Qatar", ARAST},
-	    {"Asia/Qyzylorda", new String[] {"Hora de Qyzylorda", "QYZT", "Hora de verano de Qyzylorda", "QYZST"}},
-	    {"Asia/Rangoon", new String[] {"Hora de Myanmar", "MMT", "Hora de verano de Myanmar", "MMST"}},
+	    {"Asia/Qyzylorda", new String[] {"Hora de Qyzylorda", "QYZT",
+					     "Hora de verano de Qyzylorda", "QYZST"}},
+	    {"Asia/Rangoon", new String[] {"Hora de Myanmar", "MMT",
+					   "Hora de verano de Myanmar", "MMST"}},
 	    {"Asia/Riyadh", ARAST},
 	    {"Asia/Saigon", ICT},
-	    {"Asia/Sakhalin", new String[] {"Hora de Sajalin", "SAKT", "Hora de verano de Sajalin", "SAKST"}},
+	    {"Asia/Sakhalin", new String[] {"Hora de Sajalin", "SAKT",
+					    "Hora de verano de Sajalin", "SAKST"}},
 	    {"Asia/Samarkand", UZT},
 	    {"Asia/Seoul", KST},
 	    {"Asia/Singapore", SGT},
 	    {"Asia/Taipei", CTT},
 	    {"Asia/Tel_Aviv", ISRAEL},
 	    {"Asia/Tashkent", UZT},
-	    {"Asia/Tbilisi", new String[] {"Hora de Georgia", "GET", "Hora de verano de Georgia", "GEST"}},
+	    {"Asia/Tbilisi", new String[] {"Hora de Georgia", "GET",
+					   "Hora de verano de Georgia", "GEST"}},
 	    {"Asia/Tehran", IRT},
 	    {"Asia/Thimbu", BTT},
 	    {"Asia/Thimphu", BTT},
@@ -499,21 +549,29 @@
 	    {"Asia/Ulan_Bator", ULAT},
 	    {"Asia/Urumqi", CTT},
 	    {"Asia/Vientiane", ICT},
-	    {"Asia/Vladivostok", new String[] {"Hora de Vladivostok", "VLAT", "Hora de verano de Vladivostok", "VLAST"}},
-	    {"Asia/Yakutsk", new String[] {"Hora de Yakutsk", "YAKT", "Hora de verano de Yakutsk", "YAKST"}},
-	    {"Asia/Yekaterinburg", new String[] {"Hora de Ekaterinburgo", "YEKT", "Hora de verano de Ekaterinburgo", "YEKST"}},
+	    {"Asia/Vladivostok", new String[] {"Hora de Vladivostok", "VLAT",
+					       "Hora de verano de Vladivostok", "VLAST"}},
+	    {"Asia/Yakutsk", new String[] {"Hora de Yakutsk", "YAKT",
+					   "Hora de verano de Yakutsk", "YAKST"}},
+	    {"Asia/Yekaterinburg", new String[] {"Hora de Ekaterinburgo", "YEKT",
+						 "Hora de verano de Ekaterinburgo", "YEKST"}},
 	    {"Asia/Yerevan", ARMT},
-	    {"Atlantic/Azores", new String[] {"Hora de Azores", "AZOT", "Hora de verano de Azores", "AZOST"}},
+	    {"Atlantic/Azores", new String[] {"Hora de Azores", "AZOT",
+					      "Hora de verano de Azores", "AZOST"}},
 	    {"Atlantic/Bermuda", AST},
 	    {"Atlantic/Canary", WET},
-	    {"Atlantic/Cape_Verde", new String[] {"Hora de Cabo Verde", "CVT", "Hora de verano de Cabo Verde", "CVST"}},
+	    {"Atlantic/Cape_Verde", new String[] {"Hora de Cabo Verde", "CVT",
+						  "Hora de verano de Cabo Verde", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
-	    {"Atlantic/South_Georgia", new String[] {"Hora est\u00e1ndar de Georgia del Sur", "GST", "Hora de verano de Georgia del Sur", "GDT"}},
+	    {"Atlantic/South_Georgia", new String[] {"Hora est\u00e1ndar de Georgia del Sur", "GST",
+						     "Hora de verano de Georgia del Sur", "GDT"}},
 	    {"Atlantic/St_Helena", GMT},
-	    {"Atlantic/Stanley", new String[] {"Hora de las islas Malvinas", "FKT", "Hora de verano de las islas Malvinas", "FKST"}},
+	    {"Atlantic/Stanley", new String[] {"Hora de las islas Malvinas", "FKT",
+					       "Hora de verano de las islas Malvinas", "FKST"}},
 	    {"Australia/ACT", EST_NSW},
 	    {"Australia/Adelaide", ADELAIDE},
 	    {"Australia/Brisbane", BRISBANE},
@@ -521,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -556,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -599,10 +659,12 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
-	    {"Europe/Samara", new String[] {"Hora de Samara", "SAMT", "Hora de verano de Samara", "SAMST"}},
+	    {"Europe/Samara", new String[] {"Hora de Samara", "SAMT",
+					    "Hora de verano de Samara", "SAMST"}},
 	    {"Europe/San_Marino", CET},
 	    {"Europe/Sarajevo", CET},
 	    {"Europe/Simferopol", EET},
@@ -631,22 +693,31 @@
 	    {"Iran", IRT},
 	    {"IST", IST},
 	    {"Indian/Antananarivo", EAT},
-	    {"Indian/Chagos", new String[] {"Hora del Territorio del Oc\u00e9ano \u00cdndico", "IOT", "Hora de verano del Territorio del Oc\u00e9ano \u00cdndico", "IOST"}},
-	    {"Indian/Christmas", new String[] {"Hora de la isla de Christmas", "CXT", "Hora de verano de la isla de Christmas", "CXST"}},
-	    {"Indian/Cocos", new String[] {"Hora de las islas Cocos", "CCT", "Hora de verano de las islas Cocos", "CCST"}},
+	    {"Indian/Chagos", new String[] {"Hora del Territorio del Oc\u00e9ano \u00cdndico", "IOT",
+					    "Hora de verano del Territorio del Oc\u00e9ano \u00cdndico", "IOST"}},
+	    {"Indian/Christmas", new String[] {"Hora de la isla de Christmas", "CXT",
+					       "Hora de verano de la isla de Christmas", "CXST"}},
+	    {"Indian/Cocos", new String[] {"Hora de las islas Cocos", "CCT",
+					   "Hora de verano de las islas Cocos", "CCST"}},
 	    {"Indian/Comoro", EAT},
-	    {"Indian/Kerguelen", new String[] {"Hora de los Territorios Franceses del Sur y de la Ant\u00e1rtida", "TFT", "Hora de verano de los Territorios Franceses del Sur y de la Ant\u00e1rtida", "TFST"}},
-	    {"Indian/Mahe", new String[] {"Hora de Seychelles", "SCT", "Hora de verano de Seychelles", "SCST"}},
-	    {"Indian/Maldives", new String[] {"Hora de Maldivas", "MVT", "Hora de verano de Maldivas", "MVST"}},
-	    {"Indian/Mauritius", new String[] {"Hora de Mauricio", "MUT", "Hora de verano de Mauricio", "MUST"}},
+	    {"Indian/Kerguelen", new String[] {"Hora de los Territorios Franceses del Sur y de la Ant\u00e1rtida", "TFT",
+					       "Hora de verano de los Territorios Franceses del Sur y de la Ant\u00e1rtida", "TFST"}},
+	    {"Indian/Mahe", new String[] {"Hora de Seychelles", "SCT",
+					  "Hora de verano de Seychelles", "SCST"}},
+	    {"Indian/Maldives", new String[] {"Hora de Maldivas", "MVT",
+					      "Hora de verano de Maldivas", "MVST"}},
+	    {"Indian/Mauritius", new String[] {"Hora de Mauricio", "MUT",
+					       "Hora de verano de Mauricio", "MUST"}},
 	    {"Indian/Mayotte", EAT},
-	    {"Indian/Reunion", new String[] {"Hora de Reuni\u00f3n", "RET", "Hora de verano de Reuni\u00f3n", "REST"}},
+	    {"Indian/Reunion", new String[] {"Hora de Reuni\u00f3n", "RET",
+					     "Hora de verano de Reuni\u00f3n", "REST"}},
 	    {"Israel", ISRAEL},
 	    {"Jamaica", EST},
 	    {"Japan", JST},
 	    {"Kwajalein", MHT},
 	    {"Libya", EET},
-	    {"MET", new String[] {"Hora de Europa Central", "MET", "Hora de verano de Europa Central", "MEST"}},
+	    {"MET", new String[] {"Hora de Europa Central", "MET",
+				  "Hora de verano de Europa Central", "MEST"}},
 	    {"Mexico/BajaNorte", PST},
 	    {"Mexico/BajaSur", MST},
 	    {"Mexico/General", CST},
@@ -664,42 +735,63 @@
 	    {"Pacific/Auckland", NZST},
 	    {"Pacific/Chatham", CHAST},
 	    {"Pacific/Easter", EASTER},
-	    {"Pacific/Efate", new String[] {"Hora de Vanuatu", "VUT", "Hora de verano de Vanuatu", "VUST"}},
-	    {"Pacific/Enderbury", new String[] {"Hora de la isla Phoenix", "PHOT", "Hora de verano de la isla Phoenix", "PHOST"}},
-	    {"Pacific/Fakaofo", new String[] {"Hora de Tokelau", "TKT", "Hora de verano de Tokelau", "TKST"}},
-	    {"Pacific/Fiji", new String[] {"Hora de Fiji", "FJT", "Hora de verano de Fiji", "FJST"}},
-	    {"Pacific/Funafuti", new String[] {"Hora de Tuvalu", "TVT", "Hora de verano de Tuvalu", "TVST"}},
-	    {"Pacific/Galapagos", new String[] {"Hora de Gal\u00e1pagos", "GALT", "Hora de verano de Gal\u00e1pagos", "GALST"}},
+	    {"Pacific/Efate", new String[] {"Hora de Vanuatu", "VUT",
+					    "Hora de verano de Vanuatu", "VUST"}},
+	    {"Pacific/Enderbury", new String[] {"Hora de la isla Phoenix", "PHOT",
+						"Hora de verano de la isla Phoenix", "PHOST"}},
+	    {"Pacific/Fakaofo", new String[] {"Hora de Tokelau", "TKT",
+					      "Hora de verano de Tokelau", "TKST"}},
+	    {"Pacific/Fiji", new String[] {"Hora de Fiji", "FJT",
+					   "Hora de verano de Fiji", "FJST"}},
+	    {"Pacific/Funafuti", new String[] {"Hora de Tuvalu", "TVT",
+					       "Hora de verano de Tuvalu", "TVST"}},
+	    {"Pacific/Galapagos", new String[] {"Hora de Gal\u00e1pagos", "GALT",
+						"Hora de verano de Gal\u00e1pagos", "GALST"}},
 	    {"Pacific/Gambier", GAMBIER},
 	    {"Pacific/Guadalcanal", SBT},
 	    {"Pacific/Guam", ChST},
 	    {"Pacific/Johnston", HST},
-	    {"Pacific/Kiritimati", new String[] {"Hora de las islas Line", "LINT", "Hora de verano de las islas Line", "LINST"}},
-	    {"Pacific/Kosrae", new String[] {"Hora de Kosrae", "KOST", "Hora de verano de Kosrae", "KOSST"}},
+	    {"Pacific/Kiritimati", new String[] {"Hora de las islas Line", "LINT",
+						 "Hora de verano de las islas Line", "LINST"}},
+	    {"Pacific/Kosrae", new String[] {"Hora de Kosrae", "KOST",
+					     "Hora de verano de Kosrae", "KOSST"}},
 	    {"Pacific/Kwajalein", MHT},
 	    {"Pacific/Majuro", MHT},
-	    {"Pacific/Marquesas", new String[] {"Hora de Marquesas", "MART", "Hora de verano de Marquesas", "MARST"}},
+	    {"Pacific/Marquesas", new String[] {"Hora de Marquesas", "MART",
+					        "Hora de verano de Marquesas", "MARST"}},
 	    {"Pacific/Midway", SAMOA},
-	    {"Pacific/Nauru", new String[] {"Hora de Nauru", "NRT", "Hora de verano de Nauru", "NRST"}},
-	    {"Pacific/Niue", new String[] {"Hora de Niue", "NUT", "Hora de verano de Niue", "NUST"}},
-	    {"Pacific/Norfolk", new String[] {"Hora de Norfolk", "NFT", "Hora de verano de Norfolk", "NFST"}},
-	    {"Pacific/Noumea", new String[] {"Hora de Nueva Caledonia", "NCT", "Hora de verano de Nueva Caledonia", "NCST"}},
+	    {"Pacific/Nauru", new String[] {"Hora de Nauru", "NRT",
+					    "Hora de verano de Nauru", "NRST"}},
+	    {"Pacific/Niue", new String[] {"Hora de Niue", "NUT",
+					   "Hora de verano de Niue", "NUST"}},
+	    {"Pacific/Norfolk", new String[] {"Hora de Norfolk", "NFT",
+					      "Hora de verano de Norfolk", "NFST"}},
+	    {"Pacific/Noumea", new String[] {"Hora de Nueva Caledonia", "NCT",
+					     "Hora de verano de Nueva Caledonia", "NCST"}},
 	    {"Pacific/Pago_Pago", SAMOA},
-	    {"Pacific/Palau", new String[] {"Hora de Palau", "PWT", "Hora de verano de Palau", "PWST"}},
+	    {"Pacific/Palau", new String[] {"Hora de Palau", "PWT",
+					    "Hora de verano de Palau", "PWST"}},
 	    {"Pacific/Pitcairn", PITCAIRN},
-	    {"Pacific/Ponape", new String[] {"Hora de Ponape", "PONT", "Hora de verano de Ponape", "PONST"}},
-	    {"Pacific/Port_Moresby", new String[] {"Hora de Pap\u00faa-Nueva Guinea", "PGT", "Hora de verano de Pap\u00faa-Nueva Guinea", "PGST"}},
+	    {"Pacific/Ponape", new String[] {"Hora de Ponape", "PONT",
+					     "Hora de verano de Ponape", "PONST"}},
+	    {"Pacific/Port_Moresby", new String[] {"Hora de Pap\u00faa-Nueva Guinea", "PGT",
+						   "Hora de verano de Pap\u00faa-Nueva Guinea", "PGST"}},
 	    {"Pacific/Rarotonga", new String[] {"Hora de las islas Cook", "CKT",
 						"Hora de verano de las islas Cook", "CKHST"}},
 	    {"Pacific/Saipan", ChST},
 	    {"Pacific/Samoa", SAMOA},
-	    {"Pacific/Tahiti", new String[] {"Hora de Tahit\u00ed", "TAHT", "Hora de verano de Tahit\u00ed", "TAHST"}},
-	    {"Pacific/Tarawa", new String[] {"Hora de las islas Gilbert", "GILT", "Hora de verano de las islas Gilbert", "GILST"}},
-	    {"Pacific/Tongatapu", new String[] {"Hora de Tonga", "TOT", "Hora de verano de Tonga", "TOST"}},
-	    {"Pacific/Truk", new String[] {"Hora de Truk", "TRUT", "Hora de verano de Truk", "TRUST"}},
-	    {"Pacific/Wake", new String[] {"Hora de Wake", "WAKT", "Hora de verano de Wake", "WAKST"}},
-	    {"Pacific/Wallis", new String[] {"Hora de Wallis y Futuna", "WFT", "Hora de verano de Wallis y Futuna", "WFST"}},
-	    {"Pacific/Yap", new String[] {"Hora de Yap", "YAPT", "Hora de verano de Yap", "YAPST"}},
+	    {"Pacific/Tahiti", new String[] {"Hora de Tahit\u00ed", "TAHT",
+					     "Hora de verano de Tahit\u00ed", "TAHST"}},
+	    {"Pacific/Tarawa", new String[] {"Hora de las islas Gilbert", "GILT",
+					     "Hora de verano de las islas Gilbert", "GILST"}},
+	    {"Pacific/Tongatapu", new String[] {"Hora de Tonga", "TOT",
+					        "Hora de verano de Tonga", "TOST"}},
+	    {"Pacific/Truk", TRUT},
+	    {"Pacific/Wake", new String[] {"Hora de Wake", "WAKT",
+					   "Hora de verano de Wake", "WAKST"}},
+	    {"Pacific/Wallis", new String[] {"Hora de Wallis y Futuna", "WFT",
+					     "Hora de verano de Wallis y Futuna", "WFST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -728,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_fr.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_fr.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "Heure avanc\u00e9e du Centre", "CDT"} ;
 	String CTT[] = new String[] {"Heure normale de Chine", "CST",
 				     "Heure avanc\u00e9e de Chine", "CDT"} ;
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"Heure standard d'Australie centrale (Territoire du Nord)", "CST",
 					"Heure d'\u00e9t\u00e9 d'Australie centrale (Territoire du Nord)", "CST"};
 	String DUBLIN[] = new String[] {"Heure du m\u00e9ridien de Greenwich", "GMT",
@@ -161,6 +163,8 @@
 					  "Heure d'\u00e9t\u00e9 d'Australie orientale (Tasmanie)", "EST"};
 	String TMT[] = new String[] {"Heure du Turkm\u00e9nistan", "TMT",
 				     "Heure d'\u00e9t\u00e9 du Turkm\u00e9nistan", "TMST"} ;
+	String TRUT[] = new String[] {"Heure de Truk", "TRUT",
+				      "Heure d'\u00e9t\u00e9 de Truk", "TRUST"};
 	String ULAT[]= new String[] {"Heure de l'Ulaanbaatar", "ULAT",
 				     "Heure d'\u00e9t\u00e9 de l'Ulaanbaatar", "ULAST"} ;
 	String WAT[] = new String[] {"Heure d'Afrique de l'Ouest", "WAT",
@@ -185,40 +189,40 @@
 				     "Heure d'\u00e9t\u00e9 de l'Ouzb\u00e9kistan", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"Heure normale du Centre (Territoire du Nord)", "CST", "Heure avanc\u00e9e du Centre (Territoire du Nord)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -226,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -289,7 +294,8 @@
 	    {"America/Argentina/Tucuman", AGT},
 	    {"America/Argentina/Ushuaia", AGT},
 	    {"America/Aruba", AST},
-	    {"America/Asuncion", new String[] {"Heure du Paraguay", "PYT", "Heure d'\u00e9t\u00e9 du Paraguay", "PYST"}},
+	    {"America/Asuncion", new String[] {"Heure du Paraguay", "PYT",
+					       "Heure d'\u00e9t\u00e9 du Paraguay", "PYST"}},
 	    {"America/Atikokan", EST},
             {"America/Atka", HAST},
             {"America/Bahia", BRT},
@@ -298,15 +304,18 @@
 	    {"America/Belize", CST},
             {"America/Blanc-Sablon", AST},
 	    {"America/Boa_Vista", AMT},
-	    {"America/Bogota", new String[] {"Heure de Colombie", "COT", "Heure d'\u00e9t\u00e9 de Colombie", "COST"}},
+	    {"America/Bogota", new String[] {"Heure de Colombie", "COT",
+					     "Heure d'\u00e9t\u00e9 de Colombie", "COST"}},
 	    {"America/Boise", MST},
 	    {"America/Buenos_Aires", AGT},
 	    {"America/Cambridge_Bay", MST},
             {"America/Campo_Grande", AMT},
 	    {"America/Cancun", CST},
-	    {"America/Caracas", new String[] {"Heure du Venezuela", "VET", "Heure d'\u00e9t\u00e9 du Venezuela", "VEST"}},
+	    {"America/Caracas", new String[] {"Heure du Venezuela", "VET",
+					      "Heure d'\u00e9t\u00e9 du Venezuela", "VEST"}},
 	    {"America/Catamarca", AGT},
-	    {"America/Cayenne", new String[] {"Heure de Guyane fran\u00e7aise", "GFT", "Heure d'\u00e9t\u00e9 de Guyane fran\u00e7aise", "GFST"}},
+	    {"America/Cayenne", new String[] {"Heure de Guyane fran\u00e7aise", "GFT",
+					      "Heure d'\u00e9t\u00e9 de Guyane fran\u00e7aise", "GFST"}},
 	    {"America/Cayman", EST},
 	    {"America/Chihuahua", MST},
 	    {"America/Coral_Harbour", EST},
@@ -326,15 +335,18 @@
 	    {"America/Fort_Wayne", EST},
 	    {"America/Fortaleza", BRT},
 	    {"America/Glace_Bay", AST},
-	    {"America/Godthab", new String[] {"Heure du Groenland de l'Ouest", "WGT", "Heure d'\u00e9t\u00e9 du Groenland de l'Ouest", "WGST"}},
+	    {"America/Godthab", new String[] {"Heure du Groenland de l'Ouest", "WGT",
+					      "Heure d'\u00e9t\u00e9 du Groenland de l'Ouest", "WGST"}},
 	    {"America/Goose_Bay", AST},
 	    {"America/Grand_Turk", EST},
 	    {"America/Grenada", AST},
 	    {"America/Guadeloupe", AST},
 	    {"America/Guatemala", CST},
-	    {"America/Guayaquil", new String[] {"Heure de l'\u00c9quateur", "ECT", "Heure d'\u00e9t\u00e9 de l'\u00c9quateur", "ECST"}},
-	    {"America/Guyana", new String[] {"Heure de Guyana", "GYT", "Heure d'\u00e9t\u00e9 de Guyana", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Guayaquil", new String[] {"Heure de l'\u00c9quateur", "ECT",
+						"Heure d'\u00e9t\u00e9 de l'\u00c9quateur", "ECST"}},
+	    {"America/Guyana", new String[] {"Heure de Guyana", "GYT",
+					     "Heure d'\u00e9t\u00e9 de Guyana", "GYST"}},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -342,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -349,9 +362,11 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
-	    {"America/La_Paz", new String[] {"Heure de Bolivie", "BOT", "Heure d'\u00e9t\u00e9 de Bolivie", "BOST"}},
-	    {"America/Lima", new String[] {"Heure du P\u00e9rou", "PET", "Heure d'\u00e9t\u00e9 du P\u00e9rou", "PEST"}},
+	    {"America/Knox_IN", CST},
+	    {"America/La_Paz", new String[] {"Heure de Bolivie", "BOT",
+					     "Heure d'\u00e9t\u00e9 de Bolivie", "BOST"}},
+	    {"America/Lima", new String[] {"Heure du P\u00e9rou", "PET",
+					   "Heure d'\u00e9t\u00e9 du P\u00e9rou", "PEST"}},
 	    {"America/Louisville", EST},
 	    {"America/Maceio", BRT},
 	    {"America/Managua", CST},
@@ -362,9 +377,11 @@
 	    {"America/Menominee", CST},
 	    {"America/Merida", CST},
 	    {"America/Mexico_City", CST},
-	    {"America/Miquelon", new String[] {"Heure normale de Saint-Pierre et Miquelon", "PMST", "Heure avanc\u00e9e de Saint-Pierre et Miquelon", "PMDT"}},
+	    {"America/Miquelon", new String[] {"Heure normale de Saint-Pierre et Miquelon", "PMST",
+					       "Heure avanc\u00e9e de Saint-Pierre et Miquelon", "PMDT"}},
 	    {"America/Moncton", AST},
-	    {"America/Montevideo", new String[] {"Heure de l'Uruguay", "UYT", "Heure d'\u00e9t\u00e9 de l'Uruguay", "UYST"}},
+	    {"America/Montevideo", new String[] {"Heure de l'Uruguay", "UYT",
+						 "Heure d'\u00e9t\u00e9 de l'Uruguay", "UYST"}},
 	    {"America/Monterrey", CST},
 	    {"America/Montreal", EST},
 	    {"America/Montserrat", AST},
@@ -376,7 +393,8 @@
 	    {"America/North_Dakota/New_Salem", CST},
 	    {"America/Panama", EST},
 	    {"America/Pangnirtung", EST},
-	    {"America/Paramaribo", new String[] {"Heure du Surinam", "SRT", "Heure d'\u00e9t\u00e9 du Surinam", "SRST"}},
+	    {"America/Paramaribo", new String[] {"Heure du Surinam", "SRT",
+						 "Heure d'\u00e9t\u00e9 du Surinam", "SRST"}},
 	    {"America/Port-au-Prince", EST},
 	    {"America/Port_of_Spain", AST},
 	    {"America/Porto_Acre", ACT},
@@ -386,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -411,33 +430,47 @@
 	    {"America/Yakutat", AKST},
 	    {"America/Yellowknife", MST},
 	    {"Antarctica/Casey", WST_AUS},
-	    {"Antarctica/Davis", new String[] {"Heure de Davis", "DAVT", "Heure d'\u00e9t\u00e9 de Davis", "DAVST"}},
-	    {"Antarctica/DumontDUrville", new String[] {"Heure de Dumont-d'Urville", "DDUT", "Heure d'\u00e9t\u00e9 de Dumont-d'Urville", "DDUST"}},
-	    {"Antarctica/Mawson", new String[] {"Heure de Mawson", "MAWT", "Heure d'\u00e9t\u00e9 de Mawson", "MAWST"}},
+	    {"Antarctica/Davis", new String[] {"Heure de Davis", "DAVT",
+					       "Heure d'\u00e9t\u00e9 de Davis", "DAVST"}},
+	    {"Antarctica/DumontDUrville", new String[] {"Heure de Dumont-d'Urville", "DDUT",
+							"Heure d'\u00e9t\u00e9 de Dumont-d'Urville", "DDUST"}},
+	    {"Antarctica/Mawson", new String[] {"Heure de Mawson", "MAWT",
+						"Heure d'\u00e9t\u00e9 de Mawson", "MAWST"}},
 	    {"Antarctica/McMurdo", NZST},
 	    {"Antarctica/Palmer", CLT},
-	    {"Antarctica/Rothera", new String[] {"Heure de Rothera", "ROTT", "Heure d'\u00e9t\u00e9 de Rothera", "ROTST"}},
+	    {"Antarctica/Rothera", new String[] {"Heure de Rothera", "ROTT",
+						 "Heure d'\u00e9t\u00e9 de Rothera", "ROTST"}},
 	    {"Antarctica/South_Pole", NZST},
-	    {"Antarctica/Syowa", new String[] {"Heure de Syowa", "SYOT", "Heure d'\u00e9t\u00e9 de Syowa", "SYOST"}},
-	    {"Antarctica/Vostok", new String[] {"Heure de Vostok", "VOST", "Heure d'\u00e9t\u00e9 de Vostok", "VOSST"}},
+	    {"Antarctica/Syowa", new String[] {"Heure de Syowa", "SYOT",
+					       "Heure d'\u00e9t\u00e9 de Syowa", "SYOST"}},
+	    {"Antarctica/Vostok", new String[] {"Heure de Vostok", "VOST",
+						"Heure d'\u00e9t\u00e9 de Vostok", "VOSST"}},
 	    {"Arctic/Longyearbyen", CET},
 	    {"Asia/Aden", ARAST},
-	    {"Asia/Almaty", new String[] {"Heure d'Alma-Ata", "ALMT", "Heure d'\u00e9t\u00e9 d'Alma-Ata", "ALMST"}},
+	    {"Asia/Almaty", new String[] {"Heure d'Alma-Ata", "ALMT",
+					  "Heure d'\u00e9t\u00e9 d'Alma-Ata", "ALMST"}},
 	    {"Asia/Amman", EET},
-	    {"Asia/Anadyr", new String[] {"Heure d'Anadyr", "ANAT", "Heure d'\u00e9t\u00e9 d'Anadyr", "ANAST"}},
-	    {"Asia/Aqtau", new String[] {"Heure d'Aqtau", "AQTT", "Heure d'\u00e9t\u00e9 d'Aqtau", "AQTST"}},
-	    {"Asia/Aqtobe", new String[] {"Heure d'Aqtobe", "AQTT", "Heure d'\u00e9t\u00e9 d'Aqtobe", "AQTST"}},
+	    {"Asia/Anadyr", new String[] {"Heure d'Anadyr", "ANAT",
+					  "Heure d'\u00e9t\u00e9 d'Anadyr", "ANAST"}},
+	    {"Asia/Aqtau", new String[] {"Heure d'Aqtau", "AQTT",
+					 "Heure d'\u00e9t\u00e9 d'Aqtau", "AQTST"}},
+	    {"Asia/Aqtobe", new String[] {"Heure d'Aqtobe", "AQTT",
+					  "Heure d'\u00e9t\u00e9 d'Aqtobe", "AQTST"}},
 	    {"Asia/Ashgabat", TMT},
 	    {"Asia/Ashkhabad", TMT},
 	    {"Asia/Baghdad", ARAST},
 	    {"Asia/Bahrain", ARAST},
-	    {"Asia/Baku", new String[] {"Heure d'Azerba\u00efdjan", "AZT", "Heure d'\u00e9t\u00e9 d'Azerba\u00efdjan", "AZST"}},
+	    {"Asia/Baku", new String[] {"Heure d'Azerba\u00efdjan", "AZT",
+					"Heure d'\u00e9t\u00e9 d'Azerba\u00efdjan", "AZST"}},
 	    {"Asia/Bangkok", ICT},
 	    {"Asia/Beirut", EET},
-	    {"Asia/Bishkek", new String[] {"Heure du Kirghizistan", "KGT", "Heure d'\u00e9t\u00e9 du Kirghizistan", "KGST"}},
-	    {"Asia/Brunei", new String[] {"Heure du Brunei", "BNT", "Heure d'\u00e9t\u00e9 du Brunei", "BNST"}},
+	    {"Asia/Bishkek", new String[] {"Heure du Kirghizistan", "KGT",
+					   "Heure d'\u00e9t\u00e9 du Kirghizistan", "KGST"}},
+	    {"Asia/Brunei", new String[] {"Heure du Brunei", "BNT",
+					  "Heure d'\u00e9t\u00e9 du Brunei", "BNST"}},
 	    {"Asia/Calcutta", IST},
-	    {"Asia/Choibalsan", new String[] {"Heure de Choibalsan", "CHOT", "Heure d'\u00e9t\u00e9 de Choibalsan", "CHOST"}},
+	    {"Asia/Choibalsan", new String[] {"Heure de Choibalsan", "CHOT",
+					      "Heure d'\u00e9t\u00e9 de Choibalsan", "CHOST"}},
 	    {"Asia/Chongqing", CTT},
 	    {"Asia/Chungking", CTT},
 	    {"Asia/Colombo", IST},
@@ -447,50 +480,67 @@
 					"Heure d'\u00e9t\u00e9 de Timor-Leste", "TLST"}},
 	    {"Asia/Damascus", EET},
 	    {"Asia/Dubai", GST},
-	    {"Asia/Dushanbe", new String[] {"Heure du Tadjikistan", "TJT", "Heure d'\u00e9t\u00e9 du Tadjikistan", "TJST"}},
+	    {"Asia/Dushanbe", new String[] {"Heure du Tadjikistan", "TJT",
+					    "Heure d'\u00e9t\u00e9 du Tadjikistan", "TJST"}},
 	    {"Asia/Gaza", EET},
 	    {"Asia/Harbin", CTT},
 	    {"Asia/Hong_Kong", HKT},
-	    {"Asia/Hovd", new String[] {"Heure de Hovd", "HOVT", "Heure d'\u00e9t\u00e9 de Hovd", "HOVST"}},
-	    {"Asia/Irkutsk", new String[] {"Heure d'Irkutsk", "IRKT", "Heure d'\u00e9t\u00e9 d'Irkutsk", "IRKST"}},
+	    {"Asia/Hovd", new String[] {"Heure de Hovd", "HOVT",
+					"Heure d'\u00e9t\u00e9 de Hovd", "HOVST"}},
+	    {"Asia/Irkutsk", new String[] {"Heure d'Irkutsk", "IRKT",
+					   "Heure d'\u00e9t\u00e9 d'Irkutsk", "IRKST"}},
 	    {"Asia/Istanbul", EET},
             {"Asia/Jakarta", WIT},
-            {"Asia/Jayapura", new String[] {"Heure d'Indon\u00e9sie orientale", "EIT", "Heure d'\u00e9t\u00e9 d'Indon\u00e9sie orientale", "EIST"}},
-	    {"Asia/Kabul", new String[] {"Heure d'Afghanistan", "AFT", "Heure d'\u00e9t\u00e9 d'Afghanistan", "AFST"}},
-	    {"Asia/Kamchatka", new String[] {"Heure de Petropavlovsk-Kamchatski", "PETT", "Heure d'\u00e9t\u00e9 de Petropavlovsk-Kamchatski", "PETST"}},
+            {"Asia/Jayapura", new String[] {"Heure d'Indon\u00e9sie orientale", "EIT",
+					    "Heure d'\u00e9t\u00e9 d'Indon\u00e9sie orientale", "EIST"}},
+	    {"Asia/Kabul", new String[] {"Heure d'Afghanistan", "AFT",
+					 "Heure d'\u00e9t\u00e9 d'Afghanistan", "AFST"}},
+	    {"Asia/Kamchatka", new String[] {"Heure de Petropavlovsk-Kamchatski", "PETT",
+					     "Heure d'\u00e9t\u00e9 de Petropavlovsk-Kamchatski", "PETST"}},
 	    {"Asia/Karachi", PKT},
 	    {"Asia/Kashgar", CTT},
-	    {"Asia/Katmandu", new String[] {"Heure du N\u00e9pal", "NPT", "Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"}},
-	    {"Asia/Krasnoyarsk", new String[] {"Heure de Krasno\u00efarsk", "KRAT", "Heure d'\u00e9t\u00e9 de Krasno\u00efarsk", "KRAST"}},
+	    {"Asia/Katmandu", new String[] {"Heure du N\u00e9pal", "NPT",
+					    "Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"}},
+	    {"Asia/Krasnoyarsk", new String[] {"Heure de Krasno\u00efarsk", "KRAT",
+					       "Heure d'\u00e9t\u00e9 de Krasno\u00efarsk", "KRAST"}},
 	    {"Asia/Kuala_Lumpur", MYT},
 	    {"Asia/Kuching", MYT},
 	    {"Asia/Kuwait", ARAST},
 	    {"Asia/Macao", CTT},
 	    {"Asia/Macau", CTT},
-	    {"Asia/Magadan", new String[] {"Heure de Magadan", "MAGT", "Heure d'\u00e9t\u00e9 de Magadan", "MAGST"}},
+	    {"Asia/Magadan", new String[] {"Heure de Magadan", "MAGT",
+					   "Heure d'\u00e9t\u00e9 de Magadan", "MAGST"}},
 	    {"Asia/Makassar", CIT},
-	    {"Asia/Manila", new String[] {"Heure des Philippines", "PHT", "Heure d'\u00e9t\u00e9 des Philippines", "PHST"}},
+	    {"Asia/Manila", new String[] {"Heure des Philippines", "PHT",
+					  "Heure d'\u00e9t\u00e9 des Philippines", "PHST"}},
 	    {"Asia/Muscat", GST},
 	    {"Asia/Nicosia", EET},
-	    {"Asia/Novosibirsk", new String[] {"Heure de Novossibirsk", "NOVT", "Heure d'\u00e9t\u00e9 de Novossibirsk", "NOVST"}},
-	    {"Asia/Oral", new String[] {"Heure d'Oral", "ORAT", "Heure d'\u00e9t\u00e9 d'Oral", "ORAST"}},
-	    {"Asia/Omsk", new String[] {"Heure d'Omsk", "OMST", "Heure d'\u00e9t\u00e9 d'Omsk", "OMSST"}},
+	    {"Asia/Novosibirsk", new String[] {"Heure de Novossibirsk", "NOVT",
+					       "Heure d'\u00e9t\u00e9 de Novossibirsk", "NOVST"}},
+	    {"Asia/Oral", new String[] {"Heure d'Oral", "ORAT",
+					"Heure d'\u00e9t\u00e9 d'Oral", "ORAST"}},
+	    {"Asia/Omsk", new String[] {"Heure d'Omsk", "OMST",
+					"Heure d'\u00e9t\u00e9 d'Omsk", "OMSST"}},
 	    {"Asia/Phnom_Penh", ICT},
 	    {"Asia/Pontianak", WIT},
 	    {"Asia/Pyongyang", KST},
 	    {"Asia/Qatar", ARAST},
-	    {"Asia/Qyzylorda", new String[] {"Heure de Kyzylorda", "QYZT", "Heure d'\u00e9t\u00e9 de Kyzylorda", "QYZST"}},
-	    {"Asia/Rangoon", new String[] {"Heure de Myanmar", "MMT", "Heure d'\u00e9t\u00e9 de Myanmar", "MMST"}},
+	    {"Asia/Qyzylorda", new String[] {"Heure de Kyzylorda", "QYZT",
+					     "Heure d'\u00e9t\u00e9 de Kyzylorda", "QYZST"}},
+	    {"Asia/Rangoon", new String[] {"Heure de Myanmar", "MMT",
+					   "Heure d'\u00e9t\u00e9 de Myanmar", "MMST"}},
 	    {"Asia/Riyadh", ARAST},
 	    {"Asia/Saigon", ICT},
-	    {"Asia/Sakhalin", new String[] {"Heure de Sakhalin", "SAKT", "Heure d'\u00e9t\u00e9 de Sakhalin", "SAKST"}},
+	    {"Asia/Sakhalin", new String[] {"Heure de Sakhalin", "SAKT",
+					    "Heure d'\u00e9t\u00e9 de Sakhalin", "SAKST"}},
 	    {"Asia/Samarkand", UZT},
 	    {"Asia/Seoul", KST},
 	    {"Asia/Singapore", SGT},
 	    {"Asia/Taipei", CTT},
 	    {"Asia/Tel_Aviv", ISRAEL},
 	    {"Asia/Tashkent", UZT},
-	    {"Asia/Tbilisi", new String[] {"Heure de G\u00e9orgie", "GET", "Heure d'\u00e9t\u00e9 de G\u00e9orgie", "GEST"}},
+	    {"Asia/Tbilisi", new String[] {"Heure de G\u00e9orgie", "GET",
+					   "Heure d'\u00e9t\u00e9 de G\u00e9orgie", "GEST"}},
 	    {"Asia/Tehran", IRT},
 	    {"Asia/Thimbu", BTT},
 	    {"Asia/Thimphu", BTT},
@@ -499,21 +549,29 @@
 	    {"Asia/Ulan_Bator", ULAT},
 	    {"Asia/Urumqi", CTT},
 	    {"Asia/Vientiane", ICT},
-	    {"Asia/Vladivostok", new String[] {"Heure de Vladivostok", "VLAT", "Heure d'\u00e9t\u00e9 de Vladivostok", "VLAST"}},
-	    {"Asia/Yakutsk", new String[] {"Heure du Iakoutsk", "YAKT", "Heure d'\u00e9t\u00e9 du Iakoutsk", "YAKST"}},
-	    {"Asia/Yekaterinburg", new String[] {"Heure de Yekaterinburg", "YEKT", "Heure d'\u00e9t\u00e9 de Yekaterinburg", "YEKST"}},
+	    {"Asia/Vladivostok", new String[] {"Heure de Vladivostok", "VLAT",
+					       "Heure d'\u00e9t\u00e9 de Vladivostok", "VLAST"}},
+	    {"Asia/Yakutsk", new String[] {"Heure du Iakoutsk", "YAKT",
+					   "Heure d'\u00e9t\u00e9 du Iakoutsk", "YAKST"}},
+	    {"Asia/Yekaterinburg", new String[] {"Heure de Yekaterinburg", "YEKT",
+						 "Heure d'\u00e9t\u00e9 de Yekaterinburg", "YEKST"}},
 	    {"Asia/Yerevan", ARMT},
-	    {"Atlantic/Azores", new String[] {"Heure des A\u00e7ores", "AZOT", "Heure d'\u00e9t\u00e9 des A\u00e7ores", "AZOST"}},
+	    {"Atlantic/Azores", new String[] {"Heure des A\u00e7ores", "AZOT",
+					      "Heure d'\u00e9t\u00e9 des A\u00e7ores", "AZOST"}},
 	    {"Atlantic/Bermuda", AST},
 	    {"Atlantic/Canary", WET},
-	    {"Atlantic/Cape_Verde", new String[] {"Heure de Cap-Vert", "CVT", "Heure d'\u00e9t\u00e9 de Cap-Vert", "CVST"}},
+	    {"Atlantic/Cape_Verde", new String[] {"Heure de Cap-Vert", "CVT",
+						  "Heure d'\u00e9t\u00e9 de Cap-Vert", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
-	    {"Atlantic/South_Georgia", new String[] {"Heure normale de G\u00e9orgie du Sud", "GST", "Heure avanc\u00e9e de G\u00e9orgie du Sud", "GDT"}},
+	    {"Atlantic/South_Georgia", new String[] {"Heure normale de G\u00e9orgie du Sud", "GST",
+						     "Heure avanc\u00e9e de G\u00e9orgie du Sud", "GDT"}},
 	    {"Atlantic/St_Helena", GMT},
-	    {"Atlantic/Stanley", new String[] {"Heure des \u00eeles Falkland", "FKT", "Heure d'\u00e9t\u00e9 des \u00eeles Falkland", "FKST"}},
+	    {"Atlantic/Stanley", new String[] {"Heure des \u00eeles Falkland", "FKT",
+					       "Heure d'\u00e9t\u00e9 des \u00eeles Falkland", "FKST"}},
 	    {"Australia/ACT", EST_NSW},
 	    {"Australia/Adelaide", ADELAIDE},
 	    {"Australia/Brisbane", BRISBANE},
@@ -521,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -556,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -599,10 +659,12 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
-	    {"Europe/Samara", new String[] {"Heure normale de Samara", "SAMT", "Heure d'\u00e9t\u00e9 de Samara", "SAMST"}},
+	    {"Europe/Samara", new String[] {"Heure normale de Samara", "SAMT",
+					    "Heure d'\u00e9t\u00e9 de Samara", "SAMST"}},
 	    {"Europe/San_Marino", CET},
 	    {"Europe/Sarajevo", CET},
 	    {"Europe/Simferopol", EET},
@@ -631,22 +693,31 @@
 	    {"Iran", IRT},
 	    {"IST", IST},
 	    {"Indian/Antananarivo", EAT},
-	    {"Indian/Chagos", new String[] {"Heure de l'oc\u00e9an Indien", "IOT", "Heure d'\u00e9t\u00e9 de l'oc\u00e9an Indien", "IOST"}},
-	    {"Indian/Christmas", new String[] {"Heure de l'\u00cele Christmas", "CXT", "Heure d'\u00e9t\u00e9 de l'\u00cele Christmas", "CXST"}},
-	    {"Indian/Cocos", new String[] {"Heure des \u00celes Cocos", "CCT", "Heure d'\u00e9t\u00e9 des \u00celes Cocos", "CCST"}},
+	    {"Indian/Chagos", new String[] {"Heure de l'oc\u00e9an Indien", "IOT",
+					    "Heure d'\u00e9t\u00e9 de l'oc\u00e9an Indien", "IOST"}},
+	    {"Indian/Christmas", new String[] {"Heure de l'\u00cele Christmas", "CXT",
+					       "Heure d'\u00e9t\u00e9 de l'\u00cele Christmas", "CXST"}},
+	    {"Indian/Cocos", new String[] {"Heure des \u00celes Cocos", "CCT",
+					   "Heure d'\u00e9t\u00e9 des \u00celes Cocos", "CCST"}},
 	    {"Indian/Comoro", EAT},
-	    {"Indian/Kerguelen", new String[] {"Heure des Terres australes antartiques fran\u00e7aises", "TFT", "Heure d'\u00e9t\u00e9 des Terres australes antartiques fran\u00e7aises", "TFST"}},
-	    {"Indian/Mahe", new String[] {"Heure des Seychelles", "SCT", "Heure d'\u00e9t\u00e9 des Seychelles", "SCST"}},
-	    {"Indian/Maldives", new String[] {"Heure des Maldives", "MVT", "Heure d'\u00e9t\u00e9 des Maldives", "MVST"}},
-	    {"Indian/Mauritius", new String[] {"Heure de Maurice", "MUT", "Heure d'\u00e9t\u00e9 de Maurice", "MUST"}},
+	    {"Indian/Kerguelen", new String[] {"Heure des Terres australes antartiques fran\u00e7aises", "TFT",
+					       "Heure d'\u00e9t\u00e9 des Terres australes antartiques fran\u00e7aises", "TFST"}},
+	    {"Indian/Mahe", new String[] {"Heure des Seychelles", "SCT",
+					  "Heure d'\u00e9t\u00e9 des Seychelles", "SCST"}},
+	    {"Indian/Maldives", new String[] {"Heure des Maldives", "MVT",
+					      "Heure d'\u00e9t\u00e9 des Maldives", "MVST"}},
+	    {"Indian/Mauritius", new String[] {"Heure de Maurice", "MUT",
+					       "Heure d'\u00e9t\u00e9 de Maurice", "MUST"}},
 	    {"Indian/Mayotte", EAT},
-	    {"Indian/Reunion", new String[] {"Heure de la R\u00e9union", "RET", "Heure d'\u00e9t\u00e9 de la R\u00e9union", "REST"}},
+	    {"Indian/Reunion", new String[] {"Heure de la R\u00e9union", "RET",
+					     "Heure d'\u00e9t\u00e9 de la R\u00e9union", "REST"}},
 	    {"Israel", ISRAEL},
 	    {"Jamaica", EST},
 	    {"Japan", JST},
 	    {"Kwajalein", MHT},
 	    {"Libya", EET},
-	    {"MET", new String[] {"Heure de l'Europe centrale", "MET", "Heure d'\u00e9t\u00e9 de l'Europe centrale", "MEST"}},
+	    {"MET", new String[] {"Heure de l'Europe centrale", "MET",
+				  "Heure d'\u00e9t\u00e9 de l'Europe centrale", "MEST"}},
 	    {"Mexico/BajaNorte", PST},
 	    {"Mexico/BajaSur", MST},
 	    {"Mexico/General", CST},
@@ -664,42 +735,63 @@
 	    {"Pacific/Auckland", NZST},
 	    {"Pacific/Chatham", CHAST},
 	    {"Pacific/Easter", EASTER},
-	    {"Pacific/Efate", new String[] {"Heure du Vanuatu", "VUT", "Heure d'\u00e9t\u00e9 du Vanuatu", "VUST"}},
-	    {"Pacific/Enderbury", new String[] {"Heure de l'\u00cele de Phoenix", "PHOT", "Heure d'\u00e9t\u00e9 de l'\u00cele de Phoenix", "PHOST"}},
-	    {"Pacific/Fakaofo", new String[] {"Heure de Tokelau", "TKT", "Heure d'\u00e9t\u00e9 de Tokelau", "TKST"}},
-	    {"Pacific/Fiji", new String[] {"Heure de Fidji", "FJT", "Heure d'\u00e9t\u00e9 de Fidji", "FJST"}},
-	    {"Pacific/Funafuti", new String[] {"Heure de Tuvalu", "TVT", "Heure d'\u00e9t\u00e9 de Tuvalu", "TVST"}},
-	    {"Pacific/Galapagos", new String[] {"Heure des Galapagos", "GALT", "Heure d'\u00e9t\u00e9 des Galapagos", "GALST"}},
+	    {"Pacific/Efate", new String[] {"Heure du Vanuatu", "VUT",
+					    "Heure d'\u00e9t\u00e9 du Vanuatu", "VUST"}},
+	    {"Pacific/Enderbury", new String[] {"Heure de l'\u00cele de Phoenix", "PHOT",
+					        "Heure d'\u00e9t\u00e9 de l'\u00cele de Phoenix", "PHOST"}},
+	    {"Pacific/Fakaofo", new String[] {"Heure de Tokelau", "TKT",
+					      "Heure d'\u00e9t\u00e9 de Tokelau", "TKST"}},
+	    {"Pacific/Fiji", new String[] {"Heure de Fidji", "FJT",
+					   "Heure d'\u00e9t\u00e9 de Fidji", "FJST"}},
+	    {"Pacific/Funafuti", new String[] {"Heure de Tuvalu", "TVT",
+					       "Heure d'\u00e9t\u00e9 de Tuvalu", "TVST"}},
+	    {"Pacific/Galapagos", new String[] {"Heure des Galapagos", "GALT",
+						"Heure d'\u00e9t\u00e9 des Galapagos", "GALST"}},
 	    {"Pacific/Gambier", GAMBIER},
 	    {"Pacific/Guadalcanal", SBT},
 	    {"Pacific/Guam", ChST},
 	    {"Pacific/Johnston", HST},
-	    {"Pacific/Kiritimati", new String[] {"Heure de l'\u00cele de Line", "LINT", "Heure d'\u00e9t\u00e9 de l'\u00cele de Line", "LINST"}},
-	    {"Pacific/Kosrae", new String[] {"Heure de Kusaie", "KOST", "Heure d'\u00e9t\u00e9 de Kusaie", "KOSST"}},
+	    {"Pacific/Kiritimati", new String[] {"Heure de l'\u00cele de Line", "LINT",
+						 "Heure d'\u00e9t\u00e9 de l'\u00cele de Line", "LINST"}},
+	    {"Pacific/Kosrae", new String[] {"Heure de Kusaie", "KOST",
+					     "Heure d'\u00e9t\u00e9 de Kusaie", "KOSST"}},
 	    {"Pacific/Kwajalein", MHT},
 	    {"Pacific/Majuro", MHT},
-	    {"Pacific/Marquesas", new String[] {"Heure des Marquises", "MART", "Heure d'\u00e9t\u00e9 des Marquises", "MARST"}},
+	    {"Pacific/Marquesas", new String[] {"Heure des Marquises", "MART",
+						"Heure d'\u00e9t\u00e9 des Marquises", "MARST"}},
 	    {"Pacific/Midway", SAMOA},
-	    {"Pacific/Nauru", new String[] {"Heure de Nauru", "NRT", "Heure d'\u00e9t\u00e9 de Nauru", "NRST"}},
-	    {"Pacific/Niue", new String[] {"Heure de Niue", "NUT", "Heure d'\u00e9t\u00e9 de Niue", "NUST"}},
-	    {"Pacific/Norfolk", new String[] {"Heure de Norfolk", "NFT", "Heure d'\u00e9t\u00e9 de Norfolk", "NFST"}},
-	    {"Pacific/Noumea", new String[] {"Heure de Nouvelle-Cal\u00e9donie", "NCT", "Heure d'\u00e9t\u00e9 de Nouvelle-Cal\u00e9donie", "NCST"}},
+	    {"Pacific/Nauru", new String[] {"Heure de Nauru", "NRT",
+					    "Heure d'\u00e9t\u00e9 de Nauru", "NRST"}},
+	    {"Pacific/Niue", new String[] {"Heure de Niue", "NUT",
+					   "Heure d'\u00e9t\u00e9 de Niue", "NUST"}},
+	    {"Pacific/Norfolk", new String[] {"Heure de Norfolk", "NFT",
+					      "Heure d'\u00e9t\u00e9 de Norfolk", "NFST"}},
+	    {"Pacific/Noumea", new String[] {"Heure de Nouvelle-Cal\u00e9donie", "NCT",
+					     "Heure d'\u00e9t\u00e9 de Nouvelle-Cal\u00e9donie", "NCST"}},
 	    {"Pacific/Pago_Pago", SAMOA},
-	    {"Pacific/Palau", new String[] {"Heure de Palaos", "PWT", "Heure d'\u00e9t\u00e9 de Palaos", "PWST"}},
+	    {"Pacific/Palau", new String[] {"Heure de Palaos", "PWT",
+					    "Heure d'\u00e9t\u00e9 de Palaos", "PWST"}},
 	    {"Pacific/Pitcairn", PITCAIRN},
-	    {"Pacific/Ponape", new String[] {"Heure de Ponap\u00e9", "PONT", "Heure d'\u00e9t\u00e9 de Ponap\u00e9", "PONST"}},
-	    {"Pacific/Port_Moresby", new String[] {"Heure de Papouasie-Nouvelle-Guin\u00e9e", "PGT", "Heure d'\u00e9t\u00e9 de de Papouasie-Nouvelle-Guin\u00e9e", "PGST"}},
+	    {"Pacific/Ponape", new String[] {"Heure de Ponap\u00e9", "PONT",
+					     "Heure d'\u00e9t\u00e9 de Ponap\u00e9", "PONST"}},
+	    {"Pacific/Port_Moresby", new String[] {"Heure de Papouasie-Nouvelle-Guin\u00e9e", "PGT",
+						   "Heure d'\u00e9t\u00e9 de de Papouasie-Nouvelle-Guin\u00e9e", "PGST"}},
 	    {"Pacific/Rarotonga", new String[] {"Heure des \u00celes Cook", "CKT",
 				 		"Heure d'\u00e9t\u00e9 des \u00celes Cook", "CKHST"}},
             {"Pacific/Saipan", ChST},
 	    {"Pacific/Samoa", SAMOA},
-            {"Pacific/Tahiti", new String[] {"Heure de Tahiti", "TAHT", "Heure d'\u00e9t\u00e9 de Tahiti", "TAHST"}},
-	    {"Pacific/Tarawa", new String[] {"Heure de Kiribati", "GILT", "Heure d'\u00e9t\u00e9 de Kiribati", "GILST"}},
-	    {"Pacific/Tongatapu", new String[] {"Heure de Tonga", "TOT", "Heure d'\u00e9t\u00e9 de Tonga", "TOST"}},
-	    {"Pacific/Truk", new String[] {"Heure de Truk", "TRUT", "Heure d'\u00e9t\u00e9 de Truk", "TRUST"}},
-	    {"Pacific/Wake", new String[] {"Heure de Wake", "WAKT", "Heure d'\u00e9t\u00e9 de Wake", "WAKST"}},
-	    {"Pacific/Wallis", new String[] {"Heure de Wallis et Futuna", "WFT", "Heure d'\u00e9t\u00e9 de Wallis et Futuna", "WFST"}},
-	    {"Pacific/Yap", new String[] {"Heure de Yap", "YAPT", "Heure d'\u00e9t\u00e9 de Yap", "YAPST"}},
+            {"Pacific/Tahiti", new String[] {"Heure de Tahiti", "TAHT",
+					     "Heure d'\u00e9t\u00e9 de Tahiti", "TAHST"}},
+	    {"Pacific/Tarawa", new String[] {"Heure de Kiribati", "GILT",
+					     "Heure d'\u00e9t\u00e9 de Kiribati", "GILST"}},
+	    {"Pacific/Tongatapu", new String[] {"Heure de Tonga", "TOT",
+						"Heure d'\u00e9t\u00e9 de Tonga", "TOST"}},
+	    {"Pacific/Truk", TRUT},
+	    {"Pacific/Wake", new String[] {"Heure de Wake", "WAKT",
+					   "Heure d'\u00e9t\u00e9 de Wake", "WAKST"}},
+	    {"Pacific/Wallis", new String[] {"Heure de Wallis et Futuna", "WFT",
+					     "Heure d'\u00e9t\u00e9 de Wallis et Futuna", "WFST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -728,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
@@ -743,7 +835,3 @@
         };
     }
 }
-
-
-
-
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_it.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_it.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "Ora legale USA centrale", "CDT"};
 	String CTT[] = new String[] {"Ora solare della Cina", "CST",
 				     "Ora legale della Cina", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"Ora centrale standard (Territori del Nord)", "CST",
 					"Ora estiva centrale (Territori del Nord)", "CST"};
 	String DUBLIN[] = new String[] {"Ora media di Greenwich", "GMT",
@@ -161,6 +163,8 @@
 					  "Ora estiva orientale (Tasmania)", "EST"};
 	String TMT[] = new String[] {"Ora del Turkmenistan", "TMT",
 				     "Ora estiva del Turkmenistan", "TMST"};
+	String TRUT[] = new String[] {"Ora di Truk", "TRUT",
+				      "Ora estiva di Truk", "TRUST"};
 	String ULAT[]= new String[] {"Ora di Ulaanbaatar", "ULAT",
 				     "Ora estiva di Ulaanbaatar", "ULAST"};
 	String WAT[] = new String[] {"Ora dell'Africa occidentale", "WAT",
@@ -185,40 +189,40 @@
 				     "Ora estiva dell'Uzbekistan", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"Ora solare dell'Australia centrale (Territorio del Nord)", "CST", "Ora legale dell'Australia centrale (Territorio del Nord)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -226,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -289,7 +294,8 @@
 	    {"America/Argentina/Tucuman", AGT},
 	    {"America/Argentina/Ushuaia", AGT},
 	    {"America/Aruba", AST},
-	    {"America/Asuncion", new String[] {"Ora del Paraguay", "PYT", "Ora estiva del Paraguay", "PYST"}},
+	    {"America/Asuncion", new String[] {"Ora del Paraguay", "PYT",
+					       "Ora estiva del Paraguay", "PYST"}},
 	    {"America/Atikokan", EST},
             {"America/Atka", HAST},
 	    {"America/Bahia", BRT},
@@ -298,15 +304,18 @@
 	    {"America/Belize", CST},
             {"America/Blanc-Sablon", AST},
 	    {"America/Boa_Vista", AMT},
-	    {"America/Bogota", new String[] {"Ora della Colombia", "COT", "Ora estiva della Colombia", "COST"}},
+	    {"America/Bogota", new String[] {"Ora della Colombia", "COT",
+					     "Ora estiva della Colombia", "COST"}},
 	    {"America/Boise", MST},
 	    {"America/Buenos_Aires", AGT},
 	    {"America/Cambridge_Bay", MST},
 	    {"America/Campo_Grande", AMT},
 	    {"America/Cancun", CST},
-	    {"America/Caracas", new String[] {"Ora del Venezuela", "VET", "Ora estiva del Venezuela", "VEST"}},
+	    {"America/Caracas", new String[] {"Ora del Venezuela", "VET",
+					      "Ora estiva del Venezuela", "VEST"}},
 	    {"America/Catamarca", AGT},
-	    {"America/Cayenne", new String[] {"Ora della Guyana Francese", "GFT", "Ora estiva della Guyana Francese", "GFST"}},
+	    {"America/Cayenne", new String[] {"Ora della Guyana Francese", "GFT",
+					      "Ora estiva della Guyana Francese", "GFST"}},
 	    {"America/Cayman", EST},
 	    {"America/Chihuahua", MST},
 	    {"America/Coral_Harbour", EST},
@@ -326,15 +335,18 @@
 	    {"America/Fort_Wayne", EST},
 	    {"America/Fortaleza", BRT},
 	    {"America/Glace_Bay", AST},
-	    {"America/Godthab", new String[] {"Ora della Groenlandia occidentale", "WGT", "Ora estiva della Groenlandia occidentale", "WGST"}},
+	    {"America/Godthab", new String[] {"Ora della Groenlandia occidentale", "WGT",
+					      "Ora estiva della Groenlandia occidentale", "WGST"}},
 	    {"America/Goose_Bay", AST},
 	    {"America/Grand_Turk", EST},
 	    {"America/Grenada", AST},
 	    {"America/Guadeloupe", AST},
 	    {"America/Guatemala", CST},
-	    {"America/Guayaquil", new String[] {"Ora dell'Ecuador", "ECT", "Ora estiva dell'Ecuador", "ECST"}},
-	    {"America/Guyana", new String[] {"Ora della Guyana", "GYT", "Ora estiva della Guyana", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Guayaquil", new String[] {"Ora dell'Ecuador", "ECT",
+						"Ora estiva dell'Ecuador", "ECST"}},
+	    {"America/Guyana", new String[] {"Ora della Guyana", "GYT",
+					     "Ora estiva della Guyana", "GYST"}},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -342,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -349,9 +362,11 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
-	    {"America/La_Paz", new String[] {"Ora della Bolivia", "BOT", "Ora estiva della Bolivia", "BOST"}},
-	    {"America/Lima", new String[] {"Ora del Per\u00f9", "PET", "Ora estiva del Per\u00f9", "PEST"}},
+	    {"America/Knox_IN", CST},
+	    {"America/La_Paz", new String[] {"Ora della Bolivia", "BOT",
+					     "Ora estiva della Bolivia", "BOST"}},
+	    {"America/Lima", new String[] {"Ora del Per\u00f9", "PET",
+					   "Ora estiva del Per\u00f9", "PEST"}},
 	    {"America/Louisville", EST},
 	    {"America/Maceio", BRT},
 	    {"America/Managua", CST},
@@ -362,9 +377,11 @@
 	    {"America/Menominee", CST},
 	    {"America/Merida", CST},
 	    {"America/Mexico_City", CST},
-	    {"America/Miquelon", new String[] {"Ora solare di Saint-Pierre e Miquelon", "PMST", "Ora legale di Saint-Pierre e Miquelon", "PMDT"}},
+	    {"America/Miquelon", new String[] {"Ora solare di Saint-Pierre e Miquelon", "PMST",
+					       "Ora legale di Saint-Pierre e Miquelon", "PMDT"}},
 	    {"America/Moncton", AST},
-	    {"America/Montevideo", new String[] {"Ora dell'Uruguay", "UYT", "Ora estiva dell'Uruguay", "UYST"}},
+	    {"America/Montevideo", new String[] {"Ora dell'Uruguay", "UYT",
+						 "Ora estiva dell'Uruguay", "UYST"}},
 	    {"America/Monterrey", CST},
 	    {"America/Montreal", EST},
 	    {"America/Montserrat", AST},
@@ -376,7 +393,8 @@
 	    {"America/North_Dakota/New_Salem", CST},
 	    {"America/Panama", EST},
 	    {"America/Pangnirtung", EST},
-	    {"America/Paramaribo", new String[] {"Ora di Suriname", "SRT", "Ora estiva di Suriname", "SRST"}},
+	    {"America/Paramaribo", new String[] {"Ora di Suriname", "SRT",
+						 "Ora estiva di Suriname", "SRST"}},
 	    {"America/Port-au-Prince", EST},
 	    {"America/Port_of_Spain", AST},
 	    {"America/Porto_Acre", ACT},
@@ -386,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -411,33 +430,47 @@
 	    {"America/Yakutat", AKST},
 	    {"America/Yellowknife", MST},
 	    {"Antarctica/Casey", WST_AUS},
-	    {"Antarctica/Davis", new String[] {"Ora di Davis", "DAVT", "Ora estiva di Davis", "DAVST"}},
-	    {"Antarctica/DumontDUrville", new String[] {"Ora di Dumont-d'Urville", "DDUT", "Ora estiva di Dumont-d'Urville", "DDUST"}},
-	    {"Antarctica/Mawson", new String[] {"Ora di Mawson", "MAWT", "Ora estiva di Mawson", "MAWST"}},
+	    {"Antarctica/Davis", new String[] {"Ora di Davis", "DAVT",
+					       "Ora estiva di Davis", "DAVST"}},
+	    {"Antarctica/DumontDUrville", new String[] {"Ora di Dumont-d'Urville", "DDUT",
+							"Ora estiva di Dumont-d'Urville", "DDUST"}},
+	    {"Antarctica/Mawson", new String[] {"Ora di Mawson", "MAWT",
+						"Ora estiva di Mawson", "MAWST"}},
 	    {"Antarctica/McMurdo", NZST},
 	    {"Antarctica/Palmer", CLT},
-	    {"Antarctica/Rothera", new String[] {"Ora di Rothera", "ROTT", "Ora estiva di Rothera", "ROTST"}},
+	    {"Antarctica/Rothera", new String[] {"Ora di Rothera", "ROTT",
+						 "Ora estiva di Rothera", "ROTST"}},
 	    {"Antarctica/South_Pole", NZST},
-	    {"Antarctica/Syowa", new String[] {"Ora di Syowa", "SYOT", "Ora estiva di Syowa", "SYOST"}},
-	    {"Antarctica/Vostok", new String[] {"Ora di Vostok", "VOST", "Ora estiva di Vostok", "VOSST"}},
+	    {"Antarctica/Syowa", new String[] {"Ora di Syowa", "SYOT",
+					       "Ora estiva di Syowa", "SYOST"}},
+	    {"Antarctica/Vostok", new String[] {"Ora di Vostok", "VOST",
+						"Ora estiva di Vostok", "VOSST"}},
 	    {"Arctic/Longyearbyen", CET},
 	    {"Asia/Aden", ARAST},
-	    {"Asia/Almaty", new String[] {"Ora di Alma-Ata", "ALMT", "Ora estiva di Alma-Ata", "ALMST"}},
+	    {"Asia/Almaty", new String[] {"Ora di Alma-Ata", "ALMT",
+					  "Ora estiva di Alma-Ata", "ALMST"}},
 	    {"Asia/Amman", EET},
-	    {"Asia/Anadyr", new String[] {"Ora di Anadyr", "ANAT", "Ora estiva di Anadyr", "ANAST"}},
-	    {"Asia/Aqtau", new String[] {"Ora di Aqtau", "AQTT", "Ora estiva di Aqtau", "AQTST"}},
-	    {"Asia/Aqtobe", new String[] {"Ora di Aqtobe", "AQTT", "Ora estiva di Aqtobe", "AQTST"}},
+	    {"Asia/Anadyr", new String[] {"Ora di Anadyr", "ANAT",
+					  "Ora estiva di Anadyr", "ANAST"}},
+	    {"Asia/Aqtau", new String[] {"Ora di Aqtau", "AQTT",
+					 "Ora estiva di Aqtau", "AQTST"}},
+	    {"Asia/Aqtobe", new String[] {"Ora di Aqtobe", "AQTT",
+					  "Ora estiva di Aqtobe", "AQTST"}},
 	    {"Asia/Ashgabat", TMT},
 	    {"Asia/Ashkhabad", TMT},
 	    {"Asia/Baghdad", ARAST},
 	    {"Asia/Bahrain", ARAST},
-	    {"Asia/Baku", new String[] {"Ora dell'Azerbaigian", "AZT", "Ora estiva dell'Azerbaigian", "AZST"}},
+	    {"Asia/Baku", new String[] {"Ora dell'Azerbaigian", "AZT",
+					"Ora estiva dell'Azerbaigian", "AZST"}},
 	    {"Asia/Bangkok", ICT},
 	    {"Asia/Beirut", EET},
-	    {"Asia/Bishkek", new String[] {"Ora del Kirghizistan", "KGT", "Ora estiva del Kirghizistan", "KGST"}},
-	    {"Asia/Brunei", new String[] {"Ora del Brunei", "BNT", "Ora estiva del Brunei", "BNST"}},
+	    {"Asia/Bishkek", new String[] {"Ora del Kirghizistan", "KGT",
+					   "Ora estiva del Kirghizistan", "KGST"}},
+	    {"Asia/Brunei", new String[] {"Ora del Brunei", "BNT",
+					  "Ora estiva del Brunei", "BNST"}},
 	    {"Asia/Calcutta", IST},
-	    {"Asia/Choibalsan", new String[] {"Ora di Choibalsan", "CHOT", "Ora estiva di Choibalsan", "CHOST"}},
+	    {"Asia/Choibalsan", new String[] {"Ora di Choibalsan", "CHOT",
+					      "Ora estiva di Choibalsan", "CHOST"}},
 	    {"Asia/Chongqing", CTT},
 	    {"Asia/Chungking", CTT},
 	    {"Asia/Colombo", IST},
@@ -447,50 +480,67 @@
 					"Ora estiva di Timor Leste", "TLST"}},
 	    {"Asia/Damascus", EET},
 	    {"Asia/Dubai", GST},
-	    {"Asia/Dushanbe", new String[] {"Ora del Tagikistan", "TJT", "Ora estiva del Tagikistan", "TJST"}},
+	    {"Asia/Dushanbe", new String[] {"Ora del Tagikistan", "TJT",
+					    "Ora estiva del Tagikistan", "TJST"}},
 	    {"Asia/Gaza", EET},
 	    {"Asia/Harbin", CTT},
 	    {"Asia/Hong_Kong", HKT},
-	    {"Asia/Hovd", new String[] {"Ora di Hovd", "HOVT", "Ora estiva di Hovd", "HOVST"}},
-	    {"Asia/Irkutsk", new String[] {"Ora di Irkutsk", "IRKT", "Ora estiva di Irkutsk", "IRKST"}},
+	    {"Asia/Hovd", new String[] {"Ora di Hovd", "HOVT",
+					"Ora estiva di Hovd", "HOVST"}},
+	    {"Asia/Irkutsk", new String[] {"Ora di Irkutsk", "IRKT",
+					   "Ora estiva di Irkutsk", "IRKST"}},
 	    {"Asia/Istanbul", EET},
 	    {"Asia/Jakarta", WIT},
-	    {"Asia/Jayapura", new String[] {"Ora dell'Indonesia orientale", "EIT", "Ora estiva dell'Indonesia orientale", "EIST"}},
-	    {"Asia/Kabul", new String[] {"Ora dell'Afghanistan", "AFT", "Ora estiva dell'Afghanistan", "AFST"}},
-	    {"Asia/Kamchatka", new String[] {"Ora di Petropavlovsk-Kamchatski", "PETT", "Ora estiva di Petropavlovsk-Kamchatski", "PETST"}},
+	    {"Asia/Jayapura", new String[] {"Ora dell'Indonesia orientale", "EIT",
+					    "Ora estiva dell'Indonesia orientale", "EIST"}},
+	    {"Asia/Kabul", new String[] {"Ora dell'Afghanistan", "AFT",
+					 "Ora estiva dell'Afghanistan", "AFST"}},
+	    {"Asia/Kamchatka", new String[] {"Ora di Petropavlovsk-Kamchatski", "PETT",
+					     "Ora estiva di Petropavlovsk-Kamchatski", "PETST"}},
 	    {"Asia/Karachi", PKT},
 	    {"Asia/Kashgar", CTT},
-	    {"Asia/Katmandu", new String[] {"Ora del Nepal", "NPT", "Ora estiva del Nepal", "NPST"}},
-	    {"Asia/Krasnoyarsk", new String[] {"Ora di Krasnojarsk", "KRAT", "Ora estiva di Krasnojarsk", "KRAST"}},
+	    {"Asia/Katmandu", new String[] {"Ora del Nepal", "NPT",
+					    "Ora estiva del Nepal", "NPST"}},
+	    {"Asia/Krasnoyarsk", new String[] {"Ora di Krasnojarsk", "KRAT",
+					       "Ora estiva di Krasnojarsk", "KRAST"}},
 	    {"Asia/Kuala_Lumpur", MYT},
 	    {"Asia/Kuching", MYT},
 	    {"Asia/Kuwait", ARAST},
 	    {"Asia/Macao", CTT},
 	    {"Asia/Macau", CTT},
-	    {"Asia/Magadan", new String[] {"Ora di Magadan", "MAGT", "Ora estiva di Magadan", "MAGST"}},
+	    {"Asia/Magadan", new String[] {"Ora di Magadan", "MAGT",
+					   "Ora estiva di Magadan", "MAGST"}},
 	    {"Asia/Makassar", CIT},
-	    {"Asia/Manila", new String[] {"Ora delle Filippine", "PHT", "Ora estiva delle Filippine", "PHST"}},
+	    {"Asia/Manila", new String[] {"Ora delle Filippine", "PHT",
+					  "Ora estiva delle Filippine", "PHST"}},
 	    {"Asia/Muscat", GST},
 	    {"Asia/Nicosia", EET},
-	    {"Asia/Novosibirsk", new String[] {"Ora di Novosibirsk", "NOVT", "Ora estiva di Novosibirsk", "NOVST"}},
-	    {"Asia/Oral", new String[] {"Ora di Oral", "ORAT", "Ora estiva di Oral", "ORAST"}},
-	    {"Asia/Omsk", new String[] {"Ora di Omsk", "OMST", "Ora estiva di Omsk", "OMSST"}},
+	    {"Asia/Novosibirsk", new String[] {"Ora di Novosibirsk", "NOVT",
+					       "Ora estiva di Novosibirsk", "NOVST"}},
+	    {"Asia/Oral", new String[] {"Ora di Oral", "ORAT",
+					"Ora estiva di Oral", "ORAST"}},
+	    {"Asia/Omsk", new String[] {"Ora di Omsk", "OMST",
+					"Ora estiva di Omsk", "OMSST"}},
 	    {"Asia/Phnom_Penh", ICT},
 	    {"Asia/Pontianak", WIT},
 	    {"Asia/Pyongyang", KST},
 	    {"Asia/Qatar", ARAST},
-	    {"Asia/Qyzylorda", new String[] {"Ora di Qyzylorda", "QYZT", "Ora estiva di Qyzylorda", "QYZST"}},
-	    {"Asia/Rangoon", new String[] {"Ora della Birmania/Myanmar", "MMT", "Ora estiva della Birmania/Myanmar", "MMST"}},
+	    {"Asia/Qyzylorda", new String[] {"Ora di Qyzylorda", "QYZT",
+					     "Ora estiva di Qyzylorda", "QYZST"}},
+	    {"Asia/Rangoon", new String[] {"Ora della Birmania/Myanmar", "MMT",
+					   "Ora estiva della Birmania/Myanmar", "MMST"}},
 	    {"Asia/Riyadh", ARAST},
 	    {"Asia/Saigon", ICT},
-	    {"Asia/Sakhalin", new String[] {"Ora di Sakhalin", "SAKT", "Ora estiva di Sakhalin", "SAKST"}},
+	    {"Asia/Sakhalin", new String[] {"Ora di Sakhalin", "SAKT",
+					    "Ora estiva di Sakhalin", "SAKST"}},
 	    {"Asia/Samarkand", UZT},
 	    {"Asia/Seoul", KST},
 	    {"Asia/Singapore", SGT},
 	    {"Asia/Taipei", CTT},
 	    {"Asia/Tel_Aviv", ISRAEL},
 	    {"Asia/Tashkent", UZT},
-	    {"Asia/Tbilisi", new String[] {"Ora della Georgia", "GET", "Ora estiva della Georgia", "GEST"}},
+	    {"Asia/Tbilisi", new String[] {"Ora della Georgia", "GET",
+					   "Ora estiva della Georgia", "GEST"}},
 	    {"Asia/Tehran", IRT},
 	    {"Asia/Thimbu", BTT},
 	    {"Asia/Thimphu", BTT},
@@ -499,21 +549,29 @@
 	    {"Asia/Ulan_Bator", ULAT},
 	    {"Asia/Urumqi", CTT},
 	    {"Asia/Vientiane", ICT},
-	    {"Asia/Vladivostok", new String[] {"Ora di Vladivostok", "VLAT", "Ora estiva di Vladivostok", "VLAST"}},
-	    {"Asia/Yakutsk", new String[] {"Ora di Jakutsk", "YAKT", "Ora estiva di Jakutsk", "YAKST"}},
-	    {"Asia/Yekaterinburg", new String[] {"Ora di Ekaterinburg", "YEKT", "Ora estiva di Ekaterinburg", "YEKST"}},
+	    {"Asia/Vladivostok", new String[] {"Ora di Vladivostok", "VLAT",
+					       "Ora estiva di Vladivostok", "VLAST"}},
+	    {"Asia/Yakutsk", new String[] {"Ora di Jakutsk", "YAKT",
+					   "Ora estiva di Jakutsk", "YAKST"}},
+	    {"Asia/Yekaterinburg", new String[] {"Ora di Ekaterinburg", "YEKT",
+						 "Ora estiva di Ekaterinburg", "YEKST"}},
 	    {"Asia/Yerevan", ARMT},
-	    {"Atlantic/Azores", new String[] {"Ora delle Azzorre", "AZOT", "Ora estiva delle Azzorre", "AZOST"}},
+	    {"Atlantic/Azores", new String[] {"Ora delle Azzorre", "AZOT",
+					      "Ora estiva delle Azzorre", "AZOST"}},
 	    {"Atlantic/Bermuda", AST},
 	    {"Atlantic/Canary", WET},
-	    {"Atlantic/Cape_Verde", new String[] {"Ora di Capo Verde", "CVT", "Ora estiva di Capo Verde", "CVST"}},
+	    {"Atlantic/Cape_Verde", new String[] {"Ora di Capo Verde", "CVT",
+						  "Ora estiva di Capo Verde", "CVST"}},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Faeroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
-	    {"Atlantic/South_Georgia", new String[] {"Ora solare della Georgia Australe", "GST", "Ora legale della Georgia Australe", "GDT"}},
+	    {"Atlantic/South_Georgia", new String[] {"Ora solare della Georgia Australe", "GST",
+						     "Ora legale della Georgia Australe", "GDT"}},
 	    {"Atlantic/St_Helena", GMT},
-	    {"Atlantic/Stanley", new String[] {"Ora delle Falkland", "FKT", "Ora estiva delle Falkland", "FKST"}},
+	    {"Atlantic/Stanley", new String[] {"Ora delle Falkland", "FKT",
+					       "Ora estiva delle Falkland", "FKST"}},
 	    {"Australia/ACT", EST_NSW},
 	    {"Australia/Adelaide", ADELAIDE},
 	    {"Australia/Brisbane", BRISBANE},
@@ -521,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -556,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -599,10 +659,12 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
-	    {"Europe/Samara", new String[] {"Ora di Samara", "SAMT", "Ora estiva di Samara", "SAMST"}},
+	    {"Europe/Samara", new String[] {"Ora di Samara", "SAMT",
+					    "Ora estiva di Samara", "SAMST"}},
 	    {"Europe/San_Marino", CET},
 	    {"Europe/Sarajevo", CET},
 	    {"Europe/Simferopol", EET},
@@ -631,22 +693,31 @@
 	    {"Iran", IRT},
 	    {"IST", IST},
 	    {"Indian/Antananarivo", EAT},
-	    {"Indian/Chagos", new String[] {"Ora del Terr. Britannico dell'Oceano Indiano", "IOT", "Ora estiva del Terr. Britannico dell'Oceano Indiano", "IOST"}},
-	    {"Indian/Christmas", new String[] {"Ora dell'Isola Christmas", "CXT", "Ora estiva dell'Isola Christmas", "CXST"}},
-	    {"Indian/Cocos", new String[] {"Ora delle Isole Cocos", "CCT", "Ora estiva delle Isole Cocos", "CCST"}},
+	    {"Indian/Chagos", new String[] {"Ora del Terr. Britannico dell'Oceano Indiano", "IOT",
+					    "Ora estiva del Terr. Britannico dell'Oceano Indiano", "IOST"}},
+	    {"Indian/Christmas", new String[] {"Ora dell'Isola Christmas", "CXT",
+					       "Ora estiva dell'Isola Christmas", "CXST"}},
+	    {"Indian/Cocos", new String[] {"Ora delle Isole Cocos", "CCT",
+					   "Ora estiva delle Isole Cocos", "CCST"}},
 	    {"Indian/Comoro", EAT},
-	    {"Indian/Kerguelen", new String[] {"Ora delle Terre Australi e Antartiche Francesi", "TFT", "Ora estiva delle Terre Australi Antartiche Francesi", "TFST"}},
-	    {"Indian/Mahe", new String[] {"Ora delle Seychelles", "SCT", "Ora estiva delle Seychelles", "SCST"}},
-	    {"Indian/Maldives", new String[] {"Ora delle Maldive", "MVT", "Ora estiva delle Maldive", "MVST"}},
-	    {"Indian/Mauritius", new String[] {"Ora di Mauritius", "MUT", "Ora estiva di Mauritius", "MUST"}},
+	    {"Indian/Kerguelen", new String[] {"Ora delle Terre Australi e Antartiche Francesi", "TFT",
+					       "Ora estiva delle Terre Australi Antartiche Francesi", "TFST"}},
+	    {"Indian/Mahe", new String[] {"Ora delle Seychelles", "SCT",
+					  "Ora estiva delle Seychelles", "SCST"}},
+	    {"Indian/Maldives", new String[] {"Ora delle Maldive", "MVT",
+					      "Ora estiva delle Maldive", "MVST"}},
+	    {"Indian/Mauritius", new String[] {"Ora di Mauritius", "MUT",
+					       "Ora estiva di Mauritius", "MUST"}},
 	    {"Indian/Mayotte", EAT},
-	    {"Indian/Reunion", new String[] {"Ora di Reunion", "RET", "Ora estiva di Reunion", "REST"}},
+	    {"Indian/Reunion", new String[] {"Ora di Reunion", "RET",
+					     "Ora estiva di Reunion", "REST"}},
 	    {"Israel", ISRAEL},
 	    {"Jamaica", EST},
 	    {"Japan", JST},
 	    {"Kwajalein", MHT},
 	    {"Libya", EET},
-	    {"MET", new String[] {"Ora dell'Europa centrale", "MET", "Ora estiva dell'Europa centrale", "MEST"}},
+	    {"MET", new String[] {"Ora dell'Europa centrale", "MET",
+				  "Ora estiva dell'Europa centrale", "MEST"}},
 	    {"Mexico/BajaNorte", PST},
 	    {"Mexico/BajaSur", MST},
 	    {"Mexico/General", CST},
@@ -664,42 +735,63 @@
 	    {"Pacific/Auckland", NZST},
 	    {"Pacific/Chatham", CHAST},
 	    {"Pacific/Easter", EASTER},
-	    {"Pacific/Efate", new String[] {"Ora di Vanuatu", "VUT", "Ora estiva di Vanuatu", "VUST"}},
-	    {"Pacific/Enderbury", new String[] {"Ora dell'Isola della Fenice", "PHOT", "Ora estiva dell'Isola della Fenice", "PHOST"}},
-	    {"Pacific/Fakaofo", new String[] {"Ora di Tokelau", "TKT", "Ora estiva di Tokelau", "TKST"}},
-	    {"Pacific/Fiji", new String[] {"Ora di Figi", "FJT", "Ora estiva di Figi", "FJST"}},
-	    {"Pacific/Funafuti", new String[] {"Ora di Tuvalu", "TVT", "Ora estiva di Tuvalu", "TVST"}},
-	    {"Pacific/Galapagos", new String[] {"Ora delle Galapagos", "GALT", "Ora estiva delle Galapagos", "GALST"}},
+	    {"Pacific/Efate", new String[] {"Ora di Vanuatu", "VUT",
+					    "Ora estiva di Vanuatu", "VUST"}},
+	    {"Pacific/Enderbury", new String[] {"Ora dell'Isola della Fenice", "PHOT",
+					        "Ora estiva dell'Isola della Fenice", "PHOST"}},
+	    {"Pacific/Fakaofo", new String[] {"Ora di Tokelau", "TKT",
+					      "Ora estiva di Tokelau", "TKST"}},
+	    {"Pacific/Fiji", new String[] {"Ora di Figi", "FJT",
+					   "Ora estiva di Figi", "FJST"}},
+	    {"Pacific/Funafuti", new String[] {"Ora di Tuvalu", "TVT",
+					       "Ora estiva di Tuvalu", "TVST"}},
+	    {"Pacific/Galapagos", new String[] {"Ora delle Galapagos", "GALT",
+					        "Ora estiva delle Galapagos", "GALST"}},
 	    {"Pacific/Gambier", GAMBIER},
 	    {"Pacific/Guadalcanal", SBT},
 	    {"Pacific/Guam", ChST},
 	    {"Pacific/Johnston", HST},
-	    {"Pacific/Kiritimati", new String[] {"Ora delle Line Islands", "LINT", "Ora estiva delle Line Islands", "LINST"}},
-	    {"Pacific/Kosrae", new String[] {"Ora di Kosrae", "KOST", "Ora estiva di Kosrae", "KOSST"}},
+	    {"Pacific/Kiritimati", new String[] {"Ora delle Line Islands", "LINT",
+					         "Ora estiva delle Line Islands", "LINST"}},
+	    {"Pacific/Kosrae", new String[] {"Ora di Kosrae", "KOST",
+					     "Ora estiva di Kosrae", "KOSST"}},
 	    {"Pacific/Kwajalein", MHT},
 	    {"Pacific/Majuro", MHT},
-	    {"Pacific/Marquesas", new String[] {"Ora delle Isole Marchesi", "MART", "Ora estiva delle Isole Marchesi", "MARST"}},
+	    {"Pacific/Marquesas", new String[] {"Ora delle Isole Marchesi", "MART",
+						"Ora estiva delle Isole Marchesi", "MARST"}},
 	    {"Pacific/Midway", SAMOA},
-	    {"Pacific/Nauru", new String[] {"Ora di Nauru", "NRT", "Ora estiva di Nauru", "NRST"}},
-	    {"Pacific/Niue", new String[] {"Ora di Niue", "NUT", "Ora estiva di Niue", "NUST"}},
-	    {"Pacific/Norfolk", new String[] {"Ora di Norfolk", "NFT", "Ora estiva di Norfolk", "NFST"}},
-	    {"Pacific/Noumea", new String[] {"Ora della Nuova Caledonia", "NCT", "Ora estiva della Nuova Caledonia", "NCST"}},
+	    {"Pacific/Nauru", new String[] {"Ora di Nauru", "NRT",
+					    "Ora estiva di Nauru", "NRST"}},
+	    {"Pacific/Niue", new String[] {"Ora di Niue", "NUT",
+					   "Ora estiva di Niue", "NUST"}},
+	    {"Pacific/Norfolk", new String[] {"Ora di Norfolk", "NFT",
+					      "Ora estiva di Norfolk", "NFST"}},
+	    {"Pacific/Noumea", new String[] {"Ora della Nuova Caledonia", "NCT",
+					     "Ora estiva della Nuova Caledonia", "NCST"}},
 	    {"Pacific/Pago_Pago", SAMOA},
-	    {"Pacific/Palau", new String[] {"Ora di Palau", "PWT", "Ora estiva di Palau", "PWST"}},
+	    {"Pacific/Palau", new String[] {"Ora di Palau", "PWT",
+					    "Ora estiva di Palau", "PWST"}},
 	    {"Pacific/Pitcairn", PITCAIRN},
-	    {"Pacific/Ponape", new String[] {"Ora di Ponape", "PONT", "Ora estiva di Ponape", "PONST"}},
-	    {"Pacific/Port_Moresby", new String[] {"Ora di Papua Nuova Guinea", "PGT", "Ora estiva di Papua Nuova Guinea", "PGST"}},
+	    {"Pacific/Ponape", new String[] {"Ora di Ponape", "PONT",
+					     "Ora estiva di Ponape", "PONST"}},
+	    {"Pacific/Port_Moresby", new String[] {"Ora di Papua Nuova Guinea", "PGT",
+						   "Ora estiva di Papua Nuova Guinea", "PGST"}},
 	    {"Pacific/Rarotonga", new String[] {"Ora delle Isole Cook", "CKT",
 						"Ora estiva delle Isole Cook", "CKHST"}},
 	    {"Pacific/Saipan", ChST},
 	    {"Pacific/Samoa", SAMOA},
-	    {"Pacific/Tahiti", new String[] {"Ora di Tahiti", "TAHT", "Ora estiva di Tahiti", "TAHST"}},
-	    {"Pacific/Tarawa", new String[] {"Ora delle Isole Gilbert", "GILT", "Ora estiva delle Isole Gilbert", "GILST"}},
-	    {"Pacific/Tongatapu", new String[] {"Ora di Tonga", "TOT", "Ora estiva di Tonga", "TOST"}},
-	    {"Pacific/Truk", new String[] {"Ora di Truk", "TRUT", "Ora estiva di Truk", "TRUST"}},
-	    {"Pacific/Wake", new String[] {"Ora di Wake", "WAKT", "Ora estiva di Wake", "WAKST"}},
-	    {"Pacific/Wallis", new String[] {"Ora di Wallis e Futuna", "WFT", "Ora estiva di Wallis e Futuna", "WFST"}},
-	    {"Pacific/Yap", new String[] {"Ora di Yap", "YAPT", "Ora estiva di Yap", "YAPST"}},
+	    {"Pacific/Tahiti", new String[] {"Ora di Tahiti", "TAHT",
+					     "Ora estiva di Tahiti", "TAHST"}},
+	    {"Pacific/Tarawa", new String[] {"Ora delle Isole Gilbert", "GILT",
+					     "Ora estiva delle Isole Gilbert", "GILST"}},
+	    {"Pacific/Tongatapu", new String[] {"Ora di Tonga", "TOT",
+						"Ora estiva di Tonga", "TOST"}},
+	    {"Pacific/Truk", TRUT},
+	    {"Pacific/Wake", new String[] {"Ora di Wake", "WAKT",
+					   "Ora estiva di Wake", "WAKST"}},
+	    {"Pacific/Wallis", new String[] {"Ora di Wallis e Futuna", "WFT",
+					     "Ora estiva di Wallis e Futuna", "WFST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -728,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_ja.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_ja.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "\u4e2d\u90e8\u590f\u6642\u9593", "CDT"};
 	String CTT[] = new String[] {"\u4e2d\u56fd\u6a19\u6e96\u6642", "CST",
 				     "\u4e2d\u56fd\u590f\u6642\u9593", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"\u4e2d\u90e8\u6a19\u6e96\u6642 (\u30ce\u30fc\u30b6\u30f3\u30c6\u30ea\u30c8\u30ea\u30fc)", "CST",
 					"\u4e2d\u90e8\u590f\u6642\u9593 (\u30ce\u30fc\u30b6\u30f3\u30c6\u30ea\u30c8\u30ea\u30fc)", "CST"};
 	String DUBLIN[] = new String[] {"\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642", "GMT",
@@ -161,6 +163,8 @@
 					  "\u6771\u90e8\u590f\u6642\u9593 (\u30bf\u30b9\u30de\u30cb\u30a2)", "EST"};
 	String TMT[] = new String[] {"\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3\u6642\u9593", "TMT",
 				     "\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3\u590f\u6642\u9593", "TMST"};
+	String TRUT[] = new String[] {"\u30c8\u30e9\u30c3\u30af\u6642\u9593", "TRUT",
+				      "\u30c8\u30e9\u30c3\u30af\u590f\u6642\u9593", "TRUST"};
 	String ULAT[]= new String[] {"\u30a6\u30e9\u30fc\u30f3\u30d0\u30fc\u30c8\u30eb\u6642\u9593", "ULAT",
 				     "\u30a6\u30e9\u30fc\u30f3\u30d0\u30fc\u30c8\u30eb\u590f\u6642\u9593", "ULAST"};
 	String WAT[] = new String[] {"\u897f\u30a2\u30d5\u30ea\u30ab\u6642\u9593", "WAT",
@@ -185,41 +189,40 @@
 				     "\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3\u590f\u6642\u9593", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"\u4e2d\u90e8\u6a19\u6e96\u6642 (\u30ce\u30fc\u30b6\u30f3\u30c6\u30ea\u30c8\u30ea\u30fc)", "CST",
-				  "\u4e2d\u90e8\u590f\u6642\u9593 (\u30ce\u30fc\u30b6\u30f3\u30c6\u30ea\u30c8\u30ea\u30fc)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -227,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -342,7 +346,7 @@
 						"\u30a8\u30af\u30a2\u30c9\u30eb\u590f\u6642\u9593", "ECST"}},
 	    {"America/Guyana", new String[] {"\u30ac\u30a4\u30a2\u30ca\u6642\u9593", "GYT",
 					     "\u30ac\u30a4\u30a2\u30ca\u590f\u6642\u9593", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -350,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -357,7 +362,7 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
+	    {"America/Knox_IN", CST},
 	    {"America/La_Paz", new String[] {"\u30dc\u30ea\u30d3\u30a2\u6642\u9593", "BOT",
 					     "\u30dc\u30ea\u30d3\u30a2\u590f\u6642\u9593", "BOST"}},
 	    {"America/Lima", new String[] {"\u30da\u30eb\u30fc\u6642\u9593", "PET",
@@ -399,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -557,6 +563,7 @@
 	    {"Atlantic/Cape_Verde", new String[] {"\u30ab\u30fc\u30dc\u30d9\u30eb\u30c7\u6642\u9593", "CVT",
 						  "\u30ab\u30fc\u30dc\u30d9\u30eb\u30c7\u590f\u6642\u9593", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
@@ -572,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -607,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -650,6 +659,7 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
@@ -776,14 +786,12 @@
 					     "\u30ae\u30eb\u30d0\u30fc\u30c8\u8af8\u5cf6\u590f\u6642\u9593", "GILST"}},
 	    {"Pacific/Tongatapu", new String[] {"\u30c8\u30f3\u30ac\u6642\u9593", "TOT",
 						"\u30c8\u30f3\u30ac\u590f\u6642\u9593", "TOST"}},
-	    {"Pacific/Truk", new String[] {"\u30c8\u30e9\u30c3\u30af\u6642\u9593", "TRUT",
-					   "\u30c8\u30e9\u30c3\u30af\u590f\u6642\u9593", "TRUST"}},
+	    {"Pacific/Truk", TRUT},
 	    {"Pacific/Wake", new String[] {"\u30a6\u30a7\u30fc\u30af\u6642\u9593", "WAKT",
 					   "\u30a6\u30a7\u30fc\u30af\u590f\u6642\u9593", "WAKST"}},
 	    {"Pacific/Wallis", new String[] {"\u30ef\u30ea\u30b9\u53ca\u3073\u30d5\u30c4\u30ca\u6642\u9593", "WFT",
 					     "\u30ef\u30ea\u30b9\u53ca\u3073\u30d5\u30c4\u30ca\u590f\u6642\u9593", "WFST"}},
-	    {"Pacific/Yap", new String[] {"\u30e4\u30c3\u30d7\u6642\u9593", "YAPT",
-					  "\u30e4\u30c3\u30d7\u590f\u6642\u9593", "YAPST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -812,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_ko.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_ko.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "\uc911\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"};
 	String CTT[] = new String[] {"\uc911\uad6d \ud45c\uc900\uc2dc", "CST",
 				     "\uc911\uad6d \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"\uc911\ubd80 \ud45c\uc900\uc2dc(\ub178\ub358 \uc9c0\uc5ed)", "CST",
 					"\uc911\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04(\ub178\ub358 \uc9c0\uc5ed)", "CST"};
 	String DUBLIN[] = new String[] {"\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc", "GMT",
@@ -161,6 +163,8 @@
 					  "\ub3d9\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04(\ud0dc\uc988\uba54\uc774\ub2c8\uc544)", "EST"};
 	String TMT[] = new String[] {"\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4 \uc2dc\uac04", "TMT",
 				     "\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "TMST"};
+	String TRUT[] = new String[] {"\ud2b8\ub8e8\ud06c \uc2dc\uac04", "TRUT",
+				      "\ud2b8\ub8e8\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "TRUST"};
 	String ULAT[]= new String[] {"\uc6b8\ub780\ubc14\ud0c0\ub974 \uc2dc\uac04", "ULAT",
 				     "\uc6b8\ub780\ubc14\ud0c0\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ULAST"};
 	String WAT[] = new String[] {"\uc11c\ubd80 \uc544\ud504\ub9ac\uce74 \uc2dc\uac04", "WAT",
@@ -185,41 +189,40 @@
 				     "\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"\uc911\ubd80 \ud45c\uc900\uc2dc(\ubd81\ubd80 \uc9c0\uc5ed)", "CST",
-				  "\uc911\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04(\ubd81\ubd80 \uc9c0\uc5ed)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -227,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -342,7 +346,7 @@
 						"\uc5d0\ucfe0\uc544\ub3c4\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ECST"}},
 	    {"America/Guyana", new String[] {"\uac00\uc774\uc544\ub098 \uc2dc\uac04", "GYT",
 					     "\uac00\uc774\uc544\ub098 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -350,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -357,7 +362,7 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
+	    {"America/Knox_IN", CST},
 	    {"America/La_Paz", new String[] {"\ubcfc\ub9ac\ube44\uc544 \uc2dc\uac04", "BOT",
 					    "\ubcfc\ub9ac\ube44\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "BOST"}},
 	    {"America/Lima", new String[] {"\ud398\ub8e8 \uc2dc\uac04", "PET",
@@ -399,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -511,14 +517,16 @@
 	    {"Asia/Nicosia", EET},
 	    {"Asia/Novosibirsk", new String[] {"\ub178\ube0c\uc2dc\ube4c\uc2a4\ud06c \uc2dc\uac04", "NOVT",
 					       "\ub178\ube0c\uc2dc\ube4c\uc2a4\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NOVST"}},
-	    {"Asia/Oral", new String[] {"Oral \ud45c\uc900\uc2dc", "ORAT","Oral \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ORAST"}},
+	    {"Asia/Oral", new String[] {"Oral \ud45c\uc900\uc2dc", "ORAT",
+				        "Oral \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ORAST"}},
 	    {"Asia/Omsk", new String[] {"Omsk \uc2dc\uac04", "OMST",
 					"Omsk \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "OMSST"}},
 	    {"Asia/Phnom_Penh", ICT},
 	    {"Asia/Pontianak", WIT},
 	    {"Asia/Pyongyang", KST},
 	    {"Asia/Qatar", ARAST},
-	    {"Asia/Qyzylorda", new String[] {"Qyzylorda \ud45c\uc900\uc2dc", "QYZT", "Qyzylorda \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "QYZST"}},
+	    {"Asia/Qyzylorda", new String[] {"Qyzylorda \ud45c\uc900\uc2dc", "QYZT",
+					     "Qyzylorda \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "QYZST"}},
 	    {"Asia/Rangoon", new String[] {"\ubbf8\uc580\ub9c8 \uc2dc\uac04", "MMT",
 					   "\ubbf8\uc580\ub9c8 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "MMST"}},
 	    {"Asia/Riyadh", ARAST},
@@ -537,6 +545,7 @@
 	    {"Asia/Thimbu", BTT},
 	    {"Asia/Thimphu", BTT},
 	    {"Asia/Ujung_Pandang", CIT},
+	    {"Asia/Ulaanbaatar", ULAT},
 	    {"Asia/Ulan_Bator", ULAT},
 	    {"Asia/Urumqi", CTT},
 	    {"Asia/Vientiane", ICT},
@@ -554,6 +563,7 @@
 	    {"Atlantic/Cape_Verde", new String[] {"\uae4c\ubf40\ubca0\ub974\ub370 \uc2dc\uac04", "CVT",
 						  "\uae4c\ubf40\ubca0\ub974\ub370 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
@@ -569,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -604,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -647,6 +659,7 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
@@ -773,14 +786,12 @@
 					     "\uae38\ubc84\ud2b8 \uad70\ub3c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "GILST"}},
 	    {"Pacific/Tongatapu", new String[] {"\ud1b5\uac00 \uc2dc\uac04", "TOT",
 						"\ud1b5\uac00 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "TOST"}},
-	    {"Pacific/Truk", new String[] {"\ud2b8\ub8e8\ud06c \uc2dc\uac04", "TRUT",
-					   "\ud2b8\ub8e8\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "TRUST"}},
+	    {"Pacific/Truk", TRUT},
 	    {"Pacific/Wake", new String[] {"\uc6e8\uc774\ud06c \uc2dc\uac04", "WAKT",
 					   "\uc6e8\uc774\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WAKST"}},
 	    {"Pacific/Wallis", new String[] {"\uc6d4\ub9ac\uc2a4 \ud6c4\ud22c\ub098 \uc2dc\uac04", "WFT",
 					     "\uc6d4\ub9ac\uc2a4 \ud6c4\ud2b8\ub098 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WFST"}},
-	    {"Pacific/Yap", new String[] {"Yap \uc2dc\uac04", "YAPT",
-					  "Yap \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "YAPST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -809,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_sv.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_sv.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "Central sommartid", "CDT"};
 	String CTT[] = new String[] {"Kina, normaltid", "CST",
 				     "Kina, sommartid", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"Central Standard Time (Nordterritoriet)", "CST",
 					"Central Summer Time (Nordterritoriet)", "CST"};
 	String DUBLIN[] = new String[] {"Greenwichtid", "GMT",
@@ -161,6 +163,8 @@
 					  "Eastern Summer Time (Tasmanien)", "EST"};
 	String TMT[] = new String[] {"Turkmenistan, normaltid", "TMT",
 				     "Turkmenistan, sommartid", "TMST"};
+	String TRUT[] = new String[] {"Truk, normaltid", "TRUT",
+				      "Truk, sommartid", "TRUST"};
 	String ULAT[]= new String[] {"Ulaanbaatar, normaltid", "ULAT",
 				     "Ulaanbaatar, sommartid", "ULAST"};
 	String WAT[] = new String[] {"V\u00e4stafrikansk tid", "WAT",
@@ -185,41 +189,40 @@
 				     "Uzbekistan, sommartid", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"Central Standard Time (Nordterritoriet)", "CST",
-				  "Central Daylight Time (Nordterritoriet)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -227,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -342,7 +346,7 @@
 						"Ecuador, sommartid", "ECST"}},
 	    {"America/Guyana", new String[] {"Guyana, normaltid", "GYT",
 					     "Guyana, sommartid", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -350,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -357,7 +362,7 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
+	    {"America/Knox_IN", CST},
 	    {"America/La_Paz", new String[] {"Bolivia, normaltid", "BOT",
 					     "Bolivia, sommartid", "BOST"}},
 	    {"America/Lima", new String[] {"Peru, normaltid", "PET",
@@ -399,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -557,6 +563,7 @@
 	    {"Atlantic/Cape_Verde", new String[] {"Kap Verde, normaltid", "CVT",
 						  "Kap Verde, sommartid", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
@@ -572,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -607,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -650,6 +659,7 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
@@ -776,14 +786,12 @@
 					     "Gilbert\u00f6arna, sommartid", "GILST"}},
 	    {"Pacific/Tongatapu", new String[] {"Tonga, normaltid", "TOT",
 						"Tonga, sommartid", "TOST"}},
-	    {"Pacific/Truk", new String[] {"Truk, normaltid", "TRUT",
-					   "Truk, sommartid", "TRUST"}},
+	    {"Pacific/Truk", TRUT},
 	    {"Pacific/Wake", new String[] {"Wake, normaltid", "WAKT",
 					   "Wake, sommartid", "WAKST"}},
 	    {"Pacific/Wallis", new String[] {"Wallis & Futuna, normaltid", "WFT",
 					     "Wallis & Futuna, sommartid", "WFST"}},
-	    {"Pacific/Yap", new String[] {"Yap, normaltid", "YAPT",
-					  "Yap, sommartid", "YAPST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -812,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "\u4e2d\u592e\u590f\u4ee4\u65f6", "CDT"};
 	String CTT[] = new String[] {"\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4", "CST",
 				     "\u4e2d\u56fd\u590f\u4ee4\u65f6", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"\u4e2d\u592e\u6807\u51c6\u65f6\u95f4\uff08\u5317\u9886\u5730\uff09", "CST",
 					"\u4e2d\u592e\u590f\u4ee4\u65f6\uff08\u5317\u9886\u5730\uff09", "CST"};
 	String DUBLIN[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u65f6\u95f4", "GMT",
@@ -161,6 +163,8 @@
 					  "\u4e1c\u90e8\u590f\u4ee4\u65f6\uff08\u5854\u65af\u9a6c\u5c3c\u4e9a\uff09", "EST"};
 	String TMT[] = new String[] {"\u571f\u5e93\u66fc\u65f6\u95f4", "TMT",
 				     "\u571f\u5e93\u66fc\u590f\u4ee4\u65f6", "TMST"};
+	String TRUT[] = new String[] {"\u7279\u9c81\u514b\u65f6\u95f4", "TRUT",
+				      "\u7279\u9c81\u514b\u590f\u4ee4\u65f6", "TRUST"};
 	String ULAT[]= new String[] {"\u5e93\u4f26\u65f6\u95f4", "ULAT",
 				     "\u5e93\u4f26\u590f\u4ee4\u65f6", "ULAST"};
 	String WAT[] = new String[] {"\u897f\u975e\u65f6\u95f4", "WAT",
@@ -185,41 +189,40 @@
 				     "\u4e4c\u5179\u522b\u514b\u65af\u5766\u590f\u4ee4\u65f6", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
 	    {"Asia/Jerusalem", ISRAEL},
+	    {"Asia/Tokyo", JST},
 	    {"JST", JST},
-	    {"Asia/Tokyo", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"\u4e2d\u592e\u6807\u51c6\u65f6\u95f4\uff08\u5317\u9886\u5730\uff09", "CST",
-				  "\u4e2d\u592e\u590f\u4ee4\u65f6\uff08\u5317\u9886\u5730\uff09", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -227,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -342,7 +346,7 @@
 						"\u5384\u74dc\u591a\u5c14\u590f\u4ee4\u65f6", "ECST"}},
 	    {"America/Guyana", new String[] {"\u572d\u4e9a\u90a3\u65f6\u95f4", "GYT",
 					     "\u572d\u4e9a\u90a3\u590f\u4ee4\u65f6", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -350,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -357,7 +362,7 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
+	    {"America/Knox_IN", CST},
 	    {"America/La_Paz", new String[] {"\u73bb\u5229\u7ef4\u4e9a\u65f6\u95f4", "BOT",
 					     "\u73bb\u5229\u7ef4\u4e9a\u590f\u4ee4\u65f6", "BOST"}},
 	    {"America/Lima", new String[] {"\u79d8\u9c81\u65f6\u95f4", "PET",
@@ -399,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -557,6 +563,7 @@
 	    {"Atlantic/Cape_Verde", new String[] {"\u4f5b\u5fb7\u89d2\u65f6\u95f4", "CVT",
 						  "\u4f5b\u5fb7\u89d2\u590f\u4ee4\u65f6", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
@@ -572,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -607,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -650,6 +659,7 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
@@ -776,14 +786,12 @@
 					     "\u5409\u4f2f\u7279\u7fa4\u5c9b\u590f\u4ee4\u65f6", "GILST"}},
 	    {"Pacific/Tongatapu", new String[] {"\u4e1c\u52a0\u65f6\u95f4", "TOT",
 						"\u4e1c\u52a0\u590f\u4ee4\u65f6", "TOST"}},
-	    {"Pacific/Truk", new String[] {"\u7279\u9c81\u514b\u65f6\u95f4", "TRUT",
-					   "\u7279\u9c81\u514b\u590f\u4ee4\u65f6", "TRUST"}},
+	    {"Pacific/Truk", TRUT},
 	    {"Pacific/Wake", new String[] {"\u5a01\u514b\u65f6\u95f4", "WAKT",
 					   "\u5a01\u514b\u590f\u4ee4\u65f6", "WAKST"}},
 	    {"Pacific/Wallis", new String[] {"\u74e6\u5229\u65af\u53ca\u798f\u675c\u7eb3\u7fa4\u5c9b\u65f6\u95f4", "WFT",
 					     "\u74e6\u5229\u65af\u53ca\u798f\u675c\u7eb3\u7fa4\u5c9b\u590f\u4ee4\u65f6", "WFST"}},
-	    {"Pacific/Yap", new String[] {"\u96c5\u6d66\u65f6\u95f4", "YAPT",
-					  "\u96c5\u6d66\u590f\u4ee4\u65f6", "YAPST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -812,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java	Fri Jun 22 00:46:43 2007 +0000
@@ -83,6 +83,8 @@
 				     "\u4e2d\u592e\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"};
 	String CTT[] = new String[] {"\u4e2d\u570b\u6a19\u6e96\u6642\u9593", "CST",
 				     "\u4e2d\u570b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"};
+	String CUBA[] = new String[] {"Cuba Standard Time", "CST",
+				      "Cuba Daylight Time", "CDT"};
 	String DARWIN[] = new String[] {"\u4e2d\u90e8\u6a19\u6e96\u6642\u9593 (\u5317\u90e8\u5404\u5730\u5340)", "CST",
 					"\u4e2d\u90e8\u590f\u4ee4\u6642\u9593 (\u5317\u90e8\u5404\u5730\u5340)", "CST"};
 	String DUBLIN[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u5e73\u5747\u6642\u9593", "GMT",
@@ -161,6 +163,8 @@
 					  "\u6771\u90e8\u590f\u4ee4\u6642\u9593 (\u5854\u65af\u6885\u5c3c\u4e9e\u5cf6)", "EST"};
 	String TMT[] = new String[] {"\u571f\u5eab\u66fc\u6642\u9593", "TMT",
 				     "\u571f\u5eab\u66fc\u590f\u4ee4\u6642\u9593", "TMST"};
+	String TRUT[] = new String[] {"\u7279\u9b6f\u514b\u6642\u9593", "TRUT",
+				      "\u7279\u9b6f\u514b\u590f\u4ee4\u6642\u9593", "TRUST"};
 	String ULAT[]= new String[] {"\u5eab\u502b\u6642\u9593", "ULAT",
 				     "\u5eab\u502b\u590f\u4ee4\u6642\u9593", "ULAST"};
 	String WAT[] = new String[] {"\u897f\u975e\u6642\u9593", "WAT",
@@ -185,42 +189,40 @@
 				     "\u70cf\u8332\u5225\u514b\u65af\u5766\u590f\u4ee4\u6642\u9593", "UZST"};
 
 	return new Object[][] {
+	    {"America/Los_Angeles", PST},
 	    {"PST", PST},
-	    {"America/Los_Angeles", PST},
+	    {"America/Denver", MST},
 	    {"MST", MST},
-	    {"America/Denver", MST},
+	    {"America/Phoenix", MST},
 	    {"PNT", MST},
-	    {"America/Phoenix", MST},
+	    {"America/Chicago", CST},
 	    {"CST", CST},
-	    {"America/Chicago", CST},
+	    {"America/New_York", EST},
 	    {"EST", EST},
-	    {"America/New_York", EST},
+	    {"America/Indianapolis", EST},
 	    {"IET", EST},
-	    {"America/Indianapolis", EST},
+	    {"Pacific/Honolulu", HST},
 	    {"HST", HST},
-	    {"Pacific/Honolulu", HST},
-	    {"AST", AKST},
 	    {"America/Anchorage", AKST},
+	    {"AST", AKST},
 	    {"America/Halifax", AST},
-	    {"CNT", NST},
 	    {"America/St_Johns", NST},
+	    {"CNT", NST},
+	    {"Europe/Paris", CET},
 	    {"ECT", CET},
-	    {"Europe/Paris", CET},
 	    {"GMT", GMT},
 	    {"Africa/Casablanca", WET},
-	    {"Asia/Jerusalem", new String[] {"\u4ee5\u8272\u5217\u6a19\u6e96\u6642\u9593", "IST",
-					     "\u4ee5\u8272\u5217\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "IDT"}},
-	    {"JST", JST},
+	    {"Asia/Jerusalem", ISRAEL},
 	    {"Asia/Tokyo", JST},
+	    {"JST", JST},
 	    {"Europe/Bucharest", EET},
+	    {"Asia/Shanghai", CTT},
 	    {"CTT", CTT},
-	    {"Asia/Shanghai", CTT},
 	    /* Don't change the order of the above zones
 	     * to keep compatibility with the previous version.
 	     */
 
-	    {"ACT", new String[] {"\u4e2d\u592e\u6a19\u6e96\u6642\u9593 (\u5317\u7f8e\u6d32)", "CST",
-				  "\u4e2d\u592e\u65e5\u5149\u7bc0\u7d04\u6642\u9593 (\u5317\u7f8e\u6d32)", "CDT"}},
+	    {"ACT", DARWIN},
 	    {"AET", EST_NSW},
 	    {"AGT", AGT},
 	    {"ART", EET},
@@ -228,6 +230,7 @@
 	    {"Africa/Accra", GHMT},
 	    {"Africa/Addis_Ababa", EAT},
 	    {"Africa/Algiers", CET},
+	    {"Africa/Asmara", EAT},
 	    {"Africa/Asmera", EAT},
 	    {"Africa/Bamako", GMT},
 	    {"Africa/Bangui", WAT},
@@ -343,7 +346,7 @@
 						"\u5384\u74dc\u591a\u723e\u590f\u4ee4\u6642\u9593", "ECST"}},
 	    {"America/Guyana", new String[] {"\u84cb\u4e9e\u90a3\u6642\u9593", "GYT",
 					     "\u84cb\u4e9e\u90a3\u590f\u4ee4\u6642\u9593", "GYST"}},
-	    {"America/Havana", CST},
+	    {"America/Havana", CUBA},
 	    {"America/Hermosillo", MST},
 	    {"America/Indiana/Indianapolis", EST},
 	    {"America/Indiana/Knox", CST},
@@ -351,6 +354,7 @@
 	    {"America/Indiana/Petersburg", CST},
 	    {"America/Indiana/Vevay", EST},
 	    {"America/Indiana/Vincennes", CST},
+	    {"America/Indiana/Winamac", EST},
 	    {"America/Inuvik", MST},
 	    {"America/Iqaluit", EST},
 	    {"America/Jamaica", EST},
@@ -358,7 +362,7 @@
 	    {"America/Juneau", AKST},
 	    {"America/Kentucky/Louisville", EST},
 	    {"America/Kentucky/Monticello", EST},
-	    {"America/Knox_IN", EST},
+	    {"America/Knox_IN", CST},
 	    {"America/La_Paz", new String[] {"\u73bb\u5229\u7dad\u4e9e\u6642\u9593", "BOT",
 					     "\u73bb\u5229\u7dad\u4e9e\u590f\u4ee4\u6642\u9593", "BOST"}},
 	    {"America/Lima", new String[] {"\u7955\u9b6f\u6642\u9593", "PET",
@@ -400,6 +404,7 @@
 	    {"America/Rankin_Inlet", CST},
 	    {"America/Recife", BRT},
 	    {"America/Regina", CST},
+	    {"America/Resolute", EST},
 	    {"America/Rio_Branco", ACT},
 	    {"America/Rosario", AGT},
 	    {"America/Santiago", CLT},
@@ -558,6 +563,7 @@
 	    {"Atlantic/Cape_Verde", new String[] {"\u4f5b\u5fb7\u89d2\u6642\u9593", "CVT",
 						  "\u4f5b\u5fb7\u89d2\u590f\u4ee4\u6642\u9593", "CVST"}},
 	    {"Atlantic/Faeroe", WET},
+	    {"Atlantic/Faroe", WET},
 	    {"Atlantic/Jan_Mayen", CET},
 	    {"Atlantic/Madeira", WET},
 	    {"Atlantic/Reykjavik", GMT},
@@ -573,6 +579,8 @@
 	    {"Australia/Canberra", EST_NSW},
 	    {"Australia/Currie", EST_NSW},
 	    {"Australia/Darwin", DARWIN},
+	    {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
+					      "Central Western Summer Time (Australia)", "CWST"}},
 	    {"Australia/Hobart", TASMANIA},
 	    {"Australia/LHI", LORD_HOWE},
 	    {"Australia/Lindeman", BRISBANE},
@@ -608,7 +616,7 @@
 	    {"Chile/Continental", CLT},
 	    {"Chile/EasterIsland", EASTER},
 	    {"CST6CDT", CST},
-	    {"Cuba", CST},
+	    {"Cuba", CUBA},
 	    {"EAT", EAT},
 	    {"EET", EET},
 	    {"Egypt", EET},
@@ -651,6 +659,7 @@
 	    {"Europe/Moscow", MSK},
 	    {"Europe/Nicosia", EET},
 	    {"Europe/Oslo", CET},
+	    {"Europe/Podgorica", CET},
 	    {"Europe/Prague", CET},
 	    {"Europe/Riga", EET},
 	    {"Europe/Rome", CET},
@@ -777,14 +786,12 @@
 					     "\u5409\u4f2f\u7279\u7fa4\u5cf6\u590f\u4ee4\u6642\u9593", "GILST"}},
 	    {"Pacific/Tongatapu", new String[] {"\u6771\u52a0\u6642\u9593", "TOT",
 						"\u6771\u52a0\u590f\u4ee4\u6642\u9593", "TOST"}},
-	    {"Pacific/Truk", new String[] {"\u7279\u9b6f\u514b\u6642\u9593", "TRUT",
-					   "\u7279\u9b6f\u514b\u590f\u4ee4\u6642\u9593", "TRUST"}},
+	    {"Pacific/Truk", TRUT},
 	    {"Pacific/Wake", new String[] {"\u5a01\u514b\u6642\u9593", "WAKT",
 					   "\u5a01\u514b\u590f\u4ee4\u6642\u9593", "WAKST"}},
 	    {"Pacific/Wallis", new String[] {"\u74e6\u5229\u65af\u53ca\u798f\u675c\u7d0d\u7fa4\u5cf6\u6642\u9593", "WFT",
 					     "\u74e6\u5229\u65af\u53ca\u798f\u675c\u7d0d\u7fa4\u5cf6\u590f\u4ee4\u6642\u9593", "WFST"}},
-	    {"Pacific/Yap", new String[] {"\u96c5\u6d66\u5cf6\u6642\u9593", "YAPT",
-					  "\u96c5\u6d66\u5cf6\u590f\u4ee4\u6642\u9593", "YAPST"}},
+	    {"Pacific/Yap", TRUT},
 	    {"Poland", CET},
 	    {"PRC", CTT},
 	    {"PST8PDT", PST},
@@ -813,7 +820,7 @@
 	    {"US/Central", CST},
 	    {"US/Eastern", EST},
 	    {"US/Hawaii", HST},
-	    {"US/Indiana-Starke", EST},
+	    {"US/Indiana-Starke", CST},
 	    {"US/East-Indiana", EST},
 	    {"US/Michigan", EST},
 	    {"US/Mountain", MST},
--- a/j2se/src/share/demo/java2d/J2DBench/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -49,6 +49,7 @@
 	$(CLASSES)/j2dbench/ui/CompactLayout.class \
 	$(CLASSES)/j2dbench/tests/ImageTests.class \
 	$(CLASSES)/j2dbench/tests/RenderTests.class \
+	$(CLASSES)/j2dbench/tests/PixelTests.class \
 	$(CLASSES)/j2dbench/tests/MiscTests.class \
 	$(CLASSES)/j2dbench/tests/iio/IIOTests.class \
 	$(CLASSES)/j2dbench/tests/iio/InputTests.class \
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Destinations.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Destinations.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -57,15 +57,17 @@
 	new OffScreen();
 
 	if (GraphicsTests.hasGraphics2D) {
-	    compatimgdestroot =
-		new Group.EnableSet(destroot, "compatimg",
-				    "Compatible Image Destinations");
-	    compatimgdestroot.setHorizontal();
+            if (ImageTests.hasCompatImage) {
+                compatimgdestroot =
+                    new Group.EnableSet(destroot, "compatimg",
+                                        "Compatible Image Destinations");
+                compatimgdestroot.setHorizontal();
 
-	    new CompatImg();
-	    new CompatImg(Transparency.OPAQUE);
-	    new CompatImg(Transparency.BITMASK);
-	    new CompatImg(Transparency.TRANSLUCENT);
+                new CompatImg();
+                new CompatImg(Transparency.OPAQUE);
+                new CompatImg(Transparency.BITMASK);
+                new CompatImg(Transparency.TRANSLUCENT);
+            }
 
 	    if (ImageTests.hasVolatileImage) {
 		new VolatileImg();
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Group.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Group.java	Fri Jun 22 00:46:43 2007 +0000
@@ -50,9 +50,10 @@
     private boolean hidden;
     private boolean horizontal;
     private Boolean bordered;
+    private int tabPlacement;
 
     private Group() {
-	setTabbed();
+	setTabbed(JTabbedPane.LEFT);
     }
 
     public Group(String nodeName, String description) {
@@ -110,11 +111,16 @@
     }
 
     public void setBordered(boolean b) {
-        bordered = Boolean.valueOf(b);
+        bordered = b ? Boolean.TRUE : Boolean.FALSE;
     }
 
     public void setTabbed() {
-	tabbed = true;
+        setTabbed(JTabbedPane.TOP);
+    }
+
+    public void setTabbed(int tabPlacement) {
+        this.tabbed = true;
+        this.tabPlacement = tabPlacement;
     }
 
     public void setHidden() {
@@ -159,7 +165,7 @@
 	if (isHidden()) {
 	    return null;
 	} else if (isTabbed()) {
-	    JTabbedPane jtp = new JTabbedPane();
+	    JTabbedPane jtp = new JTabbedPane(tabPlacement);
 	    for (Node node = children; node != null; node = node.getNext()) {
 		JComponent comp = node.getJComponent();
 		if (comp != null) {
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/J2DBench.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/J2DBench.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -58,6 +58,7 @@
 import j2dbench.tests.ImageTests;
 import j2dbench.tests.MiscTests;
 import j2dbench.tests.RenderTests;
+import j2dbench.tests.PixelTests;
 import j2dbench.tests.iio.IIOTests;
 import j2dbench.tests.text.TextConstructionTests;
 import j2dbench.tests.text.TextMeasureTests;
@@ -178,6 +179,7 @@
 	Destinations.init();
 	GraphicsTests.init();
 	RenderTests.init();
+        PixelTests.init();
 	ImageTests.init();
         MiscTests.init();
 	TextTests.init();
@@ -682,8 +684,8 @@
 	final JFrame f = new JFrame("J2DBench") {
 	    public Dimension getPreferredSize() {
 		Dimension pref = super.getPreferredSize();
-		pref.width = Math.max(pref.width, 640);
-		pref.height = Math.max(pref.height, 480);
+		pref.width = Math.max(pref.width, 800);
+		pref.height = Math.max(pref.height, 600);
 		return pref;
 	    }
 	};
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Option.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Option.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -419,6 +419,7 @@
 	int enabled;
 	JPanel jp;
 	JList jlist;
+        int numrows;
 
 	public ObjectList(Group parent, String nodeName, String description,
 			  String optionnames[],
@@ -498,18 +499,22 @@
 	    return new SwitchIterator(optionvalues, enabled);
 	}
 
+        public void setNumRows(int numrows) {
+            this.numrows = numrows;
+        }
+
 	public JComponent getJComponent() {
 	    if (jp == null) {
 		jp = new JPanel();
 		jp.setLayout(new BorderLayout());
 		jp.add(new JLabel(getDescription()), BorderLayout.WEST);
 		jlist = new JList(descnames);
-		if (size > 4) {
+		if (numrows > 0) {
 		    try {
 			jlist.setLayoutOrientation(JList.VERTICAL_WRAP);
 		    } catch (NoSuchMethodError e) {
 		    }
-		    jlist.setVisibleRowCount(4);
+		    jlist.setVisibleRowCount(numrows);
 		}
 		jlist.setBorder(new LineBorder(Color.black, 2));
 		updateGUI();
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Test.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -31,7 +31,6 @@
 
 package j2dbench;
 
-
 public abstract class Test extends Option.Enable {
     private DependentLink dependencies;
 
@@ -92,6 +91,9 @@
 		}
 		env.record(result);
 	    }
+            ctx = null;
+            result = null;
+            env.idle();  // Also done after this method returns...
 	}
     }
 
@@ -117,17 +119,14 @@
 	    }
 
 	    env.sync();
-	    long startTime = System.currentTimeMillis();
+            env.startTiming();
 	    runTest(ctx, numReps);
 	    env.sync();
-	    long endTime = System.currentTimeMillis();
-	    result.addTime(endTime - startTime);
+            env.stopTiming();
+	    result.addTime(env.getTimeMillis());
 
 	    env.flushToScreen();
 	}
-
-	env.idle();
-	env.idle();
     }
 
     public int calibrate(TestEnvironment env, Object ctx) {
@@ -270,6 +269,7 @@
 		    mod.modifyTest(env, val);
 		    if (next == null) {
 			test.runOneTest(env);
+                        env.idle();  // One more time outside of runOneTest()
 		    } else {
 			next.recurseAndRun(env, test);
 		    }
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/TestEnvironment.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/TestEnvironment.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -97,10 +97,28 @@
     boolean stopped;
     ResultSet results;
     Hashtable modifiers;
+    Timer timer;
 
     public TestEnvironment() {
 	results = new ResultSet();
 	modifiers = new Hashtable();
+        timer = Timer.getImpl();
+    }
+
+    public void startTiming() {
+        timer.start();
+    }
+
+    public void stopTiming() {
+        timer.stop();
+    }
+
+    public long getTimeMillis() {
+        return timer.getTimeMillis();
+    }
+
+    public long getTimeNanos() {
+        return timer.getTimeNanos();
     }
 
     public Canvas getCanvas() {
@@ -138,15 +156,21 @@
 
     public void erase() {
 	Graphics g = getGraphics();
-	g.setColor(Color.white);
-	g.fillRect(0, 0, getWidth(), getHeight());
-	g.dispose();
+        if (g != null) {
+            g.setColor(Color.white);
+            g.fillRect(0, 0, getWidth(), getHeight());
+            g.dispose();
+        }
     }
 
     public Graphics getGraphics() {
-	return ((testImage != null)
-		? testImage.getGraphics()
-		: comp.getGraphics());
+        if (testImage != null) {
+            return testImage.getGraphics();
+        }
+        if (comp != null) {
+            return comp.getGraphics();
+        }
+        return null;
     }
 
     public int getWidth() {
@@ -235,4 +259,60 @@
     public void summarize() {
 	results.summarize();
     }
+
+    private abstract static class Timer {
+        public static Timer getImpl() {
+            try {
+                System.nanoTime();
+                return new Nanos();
+            } catch (NoSuchMethodError e) {
+                return new Millis();
+            }
+        }
+
+        public abstract void start();
+        public abstract void stop();
+        public abstract long getTimeMillis();
+        public abstract long getTimeNanos();
+
+        private static class Millis extends Timer {
+            private long millis;
+
+            public void start() {
+                millis = System.currentTimeMillis();
+            }
+
+            public void stop() {
+                millis = System.currentTimeMillis() - millis;
+            }
+
+            public long getTimeMillis() {
+                return millis;
+            }
+
+            public long getTimeNanos() {
+                return millis * 1000 * 1000;
+            }
+        }
+
+        private static class Nanos extends Timer {
+            private long nanos;
+
+            public void start() {
+                nanos = System.nanoTime();
+            }
+
+            public void stop() {
+                nanos = System.nanoTime() - nanos;
+            }
+
+            public long getTimeMillis() {
+                return (nanos + (500 * 1000)) / (1000 * 1000);
+            }
+
+            public long getTimeNanos() {
+                return nanos;
+            }
+        }
+    }
 }
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/report/J2DAnalyzer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/report/J2DAnalyzer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -83,6 +83,12 @@
     public static void main(String argv[]) {
 	boolean gavehelp = false;
         boolean graph = false;
+        if (argv.length > 0 && argv[0].equalsIgnoreCase("-html")) {
+            String newargs[] = new String[argv.length-1];
+            System.arraycopy(argv, 1, newargs, 0, newargs.length);
+            HTMLSeriesReporter.main(newargs);
+            return;
+        }
 	for (int i = 0; i < argv.length; i++) {
 	    String arg = argv[i];
 	    if (arg.regionMatches(true, 0, "-Group:", 0, 7)) {
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/GraphicsTests.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/GraphicsTests.java	Fri Jun 22 00:46:43 2007 +0000
@@ -166,6 +166,7 @@
 				      "AlphaComposite Rule",
 				      j, rulenames, rules, rulenames,
 				      ruledescs, (1 << defrule));
+            ((Option.ObjectList) compRules).setNumRows(4);
 	    doExtraAlpha =
 		new Option.Toggle(groptroot, "extraalpha",
 				  "Render with an \"extra alpha\" of 0.125",
@@ -287,6 +288,6 @@
     public void cleanupTest(TestEnvironment env, Object ctx) {
 	Graphics graphics = ((Context) ctx).graphics;
 	graphics.dispose();
-	graphics = null;
+	((Context) ctx).graphics = null;
     }
 }
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/ImageTests.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/ImageTests.java	Fri Jun 22 00:46:43 2007 +0000
@@ -65,12 +65,18 @@
 
 public abstract class ImageTests extends GraphicsTests {
     public static boolean hasVolatileImage;
+    public static boolean hasCompatImage;
 
     static {
 	try {
 	    hasVolatileImage = (VolatileImage.class != null);
 	} catch (NoClassDefFoundError e) {
 	}
+        try {
+            new Canvas().getGraphicsConfiguration();
+            hasCompatImage = true;
+        } catch (NoSuchMethodError e) {
+        }
     }
 
     static Group imageroot;
@@ -109,9 +115,11 @@
 	new OffScreen();
 
 	if (hasGraphics2D) {
-	    new CompatImg(Transparency.OPAQUE);
-	    new CompatImg(Transparency.BITMASK);
-	    new CompatImg(Transparency.TRANSLUCENT);
+            if (hasCompatImage) {
+                new CompatImg(Transparency.OPAQUE);
+                new CompatImg(Transparency.BITMASK);
+                new CompatImg(Transparency.TRANSLUCENT);
+            }
 
 	    if (hasVolatileImage) {
 		new VolatileImg();
@@ -168,6 +176,7 @@
                                       opStrArr, opStrArr,
                                       opStrArr, opDescArr,
                                       0x1);
+            ((Option.ObjectList) opList).setNumRows(4);
 
             new DrawImageOp();
             new BufImgOpFilter(false);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/PixelTests.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,390 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Sun Microsystems nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package j2dbench.tests;
+
+import j2dbench.Destinations;
+import j2dbench.Group;
+import j2dbench.Modifier;
+import j2dbench.Option;
+import j2dbench.Test;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import java.awt.Graphics2D;
+import java.awt.Color;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.image.VolatileImage;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.DataBufferShort;
+import java.awt.image.DataBufferInt;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+import java.awt.image.IndexColorModel;
+
+public abstract class PixelTests extends Test {
+    static Group pixelroot;
+
+    static Group pixeloptroot;
+    static Group.EnableSet bufimgsrcroot;
+
+    static Option doRenderTo;
+    static Option doRenderFrom;
+
+    static Group bufimgtestroot;
+    static Group rastertestroot;
+    static Group dbtestroot;
+
+    public static void init() {
+	pixelroot = new Group("pixel", "Pixel Access Benchmarks");
+
+        pixeloptroot = new Group(pixelroot, "opts", "Pixel Access Options");
+        doRenderTo = new Option.Toggle(pixeloptroot, "renderto",
+                                       "Render to Image before test",
+                                       Option.Toggle.Off);
+        doRenderFrom = new Option.Toggle(pixeloptroot, "renderfrom",
+                                         "Render from Image before test",
+                                         Option.Toggle.Off);
+
+        // BufferedImage Sources
+        bufimgsrcroot = new Group.EnableSet(pixelroot, "src",
+                                            "BufferedImage Sources");
+        new BufImg(BufferedImage.TYPE_BYTE_BINARY, 1);
+        new BufImg(BufferedImage.TYPE_BYTE_BINARY, 2);
+        new BufImg(BufferedImage.TYPE_BYTE_BINARY, 4);
+        new BufImg(BufferedImage.TYPE_BYTE_INDEXED);
+        new BufImg(BufferedImage.TYPE_BYTE_GRAY);
+        new BufImg(BufferedImage.TYPE_USHORT_555_RGB);
+        new BufImg(BufferedImage.TYPE_USHORT_565_RGB);
+        new BufImg(BufferedImage.TYPE_USHORT_GRAY);
+        new BufImg(BufferedImage.TYPE_3BYTE_BGR);
+        new BufImg(BufferedImage.TYPE_4BYTE_ABGR);
+        new BufImg(BufferedImage.TYPE_INT_RGB);
+        new BufImg(BufferedImage.TYPE_INT_BGR);
+        new BufImg(BufferedImage.TYPE_INT_ARGB);
+
+        // BufferedImage Tests
+        bufimgtestroot = new Group(pixelroot, "bimgtests",
+                                   "BufferedImage Tests");
+        new BufImgTest.GetRGB();
+        new BufImgTest.SetRGB();
+
+        // Raster Tests
+        rastertestroot = new Group(pixelroot, "rastests",
+                                   "Raster Tests");
+        new RasTest.GetDataElements();
+        new RasTest.SetDataElements();
+        new RasTest.GetPixel();
+        new RasTest.SetPixel();
+
+        // DataBuffer Tests
+        dbtestroot = new Group(pixelroot, "dbtests",
+                               "DataBuffer Tests");
+        new DataBufTest.GetElem();
+        new DataBufTest.SetElem();
+    }
+
+    public PixelTests(Group root, String nodeName, String description) {
+        super(root, nodeName, description);
+        addDependency(bufimgsrcroot);
+        addDependencies(pixeloptroot, false);
+    }
+
+    public static class Context {
+        BufferedImage bimg;
+        WritableRaster ras;
+        DataBuffer db;
+        int pixeldata[];
+        Object elemdata;
+    }
+
+    public Object initTest(TestEnvironment env, Result result) {
+        Context ctx = new Context();
+        ctx.bimg = ((BufImg) env.getModifier(bufimgsrcroot)).getImage();
+        if (env.isEnabled(doRenderTo)) {
+            Graphics2D g2d = ctx.bimg.createGraphics();
+            g2d.setColor(Color.white);
+            g2d.fillRect(3, 0, 1, 1);
+            g2d.dispose();
+        }
+        if (env.isEnabled(doRenderFrom)) {
+            GraphicsConfiguration cfg =
+                GraphicsEnvironment
+                .getLocalGraphicsEnvironment()
+                .getDefaultScreenDevice()
+                .getDefaultConfiguration();
+            VolatileImage vimg = cfg.createCompatibleVolatileImage(8, 1);
+            vimg.validate(cfg);
+            Graphics2D g2d = vimg.createGraphics();
+            for (int i = 0; i < 100; i++) {
+                g2d.drawImage(ctx.bimg, 0, 0, null);
+            }
+            g2d.dispose();
+            vimg.flush();
+        }
+        result.setUnits(1);
+        result.setUnitName(getUnitName());
+        return ctx;
+    }
+
+    public abstract String getUnitName();
+
+    public void cleanupTest(TestEnvironment env, Object context) {
+    }
+
+    public static class BufImg extends Option.Enable {
+        public static int rgbvals[] = {
+            0x00000000,
+            0xff0000ff,
+            0x8000ff00,
+            0xffffffff
+        };
+
+        static int cmap[] = {
+            0xff000000,  // 0: opaque black
+            0xffffffff,  // 1: opaque white
+
+            0x00000000,  // 2: transparent black
+            0x80ffffff,  // 3: translucent white
+
+            0x00ffffff,  // 4: transparent white
+            0x80000000,  // 5: translucent black
+            0xff333333,  // 6: opaque dark gray
+            0xff666666,  // 7: opaque medium gray
+            0xff999999,  // 8: opaque gray
+            0xffcccccc,  // 9: opaque light gray
+            0xff0000ff,  // A: opaque blue
+            0xff00ff00,  // B: opaque green
+            0xff00ffff,  // C: opaque cyan
+            0xffff0000,  // D: opaque red
+            0xffff00ff,  // E: opaque magenta
+            0xffffff00,  // F: opaque yellow
+        };
+                
+        int type;
+        int nbits;
+
+        public BufImg(int type) {
+            super(bufimgsrcroot,
+		  Destinations.BufImg.ShortNames[type],
+		  Destinations.BufImg.Descriptions[type], false);
+            this.type = type;
+            this.nbits = 0;
+        }
+
+        public BufImg(int type, int nbits) {
+            super(bufimgsrcroot,
+                  nbits+"BitBinary",
+                  nbits+"-bit Binary Image", false);
+            this.type = type;
+            this.nbits = nbits;
+        }
+
+	public String getModifierValueName(Object val) {
+	    return "BufImg("+getNodeName()+")";
+	}
+
+        public BufferedImage getImage() {
+            BufferedImage bimg;
+            if (nbits == 0) {
+                bimg = new BufferedImage(8, 1, type);
+            } else {
+                IndexColorModel icm =
+                    new IndexColorModel(nbits, (1 << nbits),
+                                        cmap, 0, (nbits > 1), -1,
+                                        DataBuffer.TYPE_BYTE);
+                // Note that this constructor has bugs pre 1.4...
+                // bimg = new BufferedImage(64/nbits, 1, type, icm);
+                WritableRaster wr =
+                    icm.createCompatibleWritableRaster(64/nbits, 1);
+                bimg = new BufferedImage(icm, wr, false, null);
+            }
+            for (int i = 0; i < bimg.getWidth(); i++) {
+                bimg.setRGB(i, 0, rgbvals[i&3]);
+            }
+            return bimg;
+        }
+    }
+
+    public static abstract class BufImgTest extends PixelTests {
+        public BufImgTest(String nodeName, String description) {
+            super(bufimgtestroot, nodeName, description);
+        }
+
+        public String getUnitName() {
+            return "pixel";
+        }
+
+        public static class GetRGB extends BufImgTest {
+            public GetRGB() {
+                super("getrgb", "BufferedImage.getRGB(x, y)");
+            }
+
+            public void runTest(Object context, int numReps) {
+                BufferedImage bimg = ((Context) context).bimg;
+                do {
+                    bimg.getRGB(numReps&7, 0);
+		} while (--numReps > 0);
+            }
+        }
+
+        public static class SetRGB extends BufImgTest {
+            public SetRGB() {
+                super("setrgb", "BufferedImage.setRGB(x, y, rgb)");
+            }
+
+            public void runTest(Object context, int numReps) {
+                BufferedImage bimg = ((Context) context).bimg;
+                do {
+                    bimg.setRGB(numReps&7, 0, BufImg.rgbvals[numReps&3]);
+		} while (--numReps > 0);
+            }
+        }
+    }
+
+    public static abstract class RasTest extends PixelTests {
+        public RasTest(String nodeName, String description) {
+            super(rastertestroot, nodeName, description);
+        }
+
+        public String getUnitName() {
+            return "pixel";
+        }
+
+        public Object initTest(TestEnvironment env, Result result) {
+            Context ctx = (Context) super.initTest(env, result);
+            ctx.ras = ctx.bimg.getRaster();
+            ctx.pixeldata = ctx.ras.getPixel(0, 0, (int[]) null);
+            ctx.elemdata = ctx.ras.getDataElements(0, 0, null);
+            return ctx;
+        }
+
+        public static class GetDataElements extends RasTest {
+            public GetDataElements() {
+                super("getdataelem", "Raster.getDataElements(x, y, o)");
+            }
+
+            public void runTest(Object context, int numReps) {
+                Raster ras = ((Context) context).ras;
+                Object elemdata = ((Context) context).elemdata;
+                do {
+                    ras.getDataElements(numReps&7, 0, elemdata);
+		} while (--numReps > 0);
+            }
+        }
+
+        public static class SetDataElements extends RasTest {
+            public SetDataElements() {
+                super("setdataelem", "WritableRaster.setDataElements(x, y, o)");
+            }
+
+            public void runTest(Object context, int numReps) {
+                WritableRaster ras = ((Context) context).ras;
+                Object elemdata = ((Context) context).elemdata;
+                do {
+                    ras.setDataElements(numReps&7, 0, elemdata);
+		} while (--numReps > 0);
+            }
+        }
+
+        public static class GetPixel extends RasTest {
+            public GetPixel() {
+                super("getpixel", "Raster.getPixel(x, y, v[])");
+            }
+
+            public void runTest(Object context, int numReps) {
+                Raster ras = ((Context) context).ras;
+                int pixeldata[] = ((Context) context).pixeldata;
+                do {
+                    ras.getPixel(numReps&7, 0, pixeldata);
+		} while (--numReps > 0);
+            }
+        }
+
+        public static class SetPixel extends RasTest {
+            public SetPixel() {
+                super("setpixel", "WritableRaster.setPixel(x, y, v[])");
+            }
+
+            public void runTest(Object context, int numReps) {
+                WritableRaster ras = ((Context) context).ras;
+                int pixeldata[] = ((Context) context).pixeldata;
+                do {
+                    ras.setPixel(numReps&7, 0, pixeldata);
+		} while (--numReps > 0);
+            }
+        }
+    }
+
+    public static abstract class DataBufTest extends PixelTests {
+        public DataBufTest(String nodeName, String description) {
+            super(dbtestroot, nodeName, description);
+        }
+
+        public String getUnitName() {
+            return "element";
+        }
+
+        public Object initTest(TestEnvironment env, Result result) {
+            Context ctx = (Context) super.initTest(env, result);
+            ctx.db = ctx.bimg.getRaster().getDataBuffer();
+            return ctx;
+        }
+
+        public static class GetElem extends DataBufTest {
+            public GetElem() {
+                super("getelem", "DataBuffer.getElem(i)");
+            }
+
+            public void runTest(Object context, int numReps) {
+                DataBuffer db = ((Context) context).db;
+                do {
+                    db.getElem(numReps&7);
+		} while (--numReps > 0);
+            }
+        }
+
+        public static class SetElem extends DataBufTest {
+            public SetElem() {
+                super("setelem", "DataBuffer.setElem(i, v)");
+            }
+
+            public void runTest(Object context, int numReps) {
+                DataBuffer db = ((Context) context).db;
+                do {
+                    db.setElem(numReps&7, 0);
+		} while (--numReps > 0);
+            }
+        }
+    }
+}
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/RenderTests.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/RenderTests.java	Fri Jun 22 00:46:43 2007 +0000
@@ -36,6 +36,8 @@
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.AlphaComposite;
+import java.awt.Stroke;
+import java.awt.BasicStroke;
 import java.awt.GradientPaint;
 import java.awt.LinearGradientPaint;
 import java.awt.MultipleGradientPaint;
@@ -68,6 +70,7 @@
     static Option doAntialias;
     static Option doAlphaColors;
     static Option sizeList;
+    static Option strokeList;
 
     static final int NUM_RANDOMCOLORS = 4096;
     static final int NUM_RANDOMCOLORMASK = (NUM_RANDOMCOLORS - 1);
@@ -134,6 +137,7 @@
                                   paintStrArr, paintStrArr,
                                   paintStrArr, paintDescArr,
                                   0x1);
+        ((Option.ObjectList) paintList).setNumRows(5);
 
         // add special RandomColorOpt for backwards compatibility with
         // older options files
@@ -148,6 +152,51 @@
 		new Option.Toggle(renderoptroot, "antialias",
 				  "Render shapes antialiased",
 				  Option.Toggle.Off);
+            String strokeStrings[] = {
+                "width0",
+                "width1",
+                "width5",
+                "width20",
+                "dash0_5",
+                "dash1_5",
+                "dash5_20",
+                "dash20_50",
+            };
+            String strokeDescriptions[] = {
+                "Solid Thin lines",
+                "Solid Width 1 lines",
+                "Solid Width 5 lines",
+                "Solid Width 20 lines",
+                "Dashed Thin lines",
+                "Dashed Width 1 lines",
+                "Dashed Width 5 lines",
+                "Dashed Width 20 lines",
+            };
+            BasicStroke strokeObjects[] = {
+                new BasicStroke(0f),
+                new BasicStroke(1f),
+                new BasicStroke(5f),
+                new BasicStroke(20f),
+                new BasicStroke(0f, BasicStroke.CAP_SQUARE,
+                                BasicStroke.JOIN_MITER, 10f,
+                                new float[] { 5f, 5f }, 0f),
+                new BasicStroke(1f, BasicStroke.CAP_SQUARE,
+                                BasicStroke.JOIN_MITER, 10f,
+                                new float[] { 5f, 5f }, 0f),
+                new BasicStroke(5f, BasicStroke.CAP_SQUARE,
+                                BasicStroke.JOIN_MITER, 10f,
+                                new float[] { 20f, 20f }, 0f),
+                new BasicStroke(20f, BasicStroke.CAP_SQUARE,
+                                BasicStroke.JOIN_MITER, 10f,
+                                new float[] { 50f, 50f }, 0f),
+            };
+            strokeList =
+                new Option.ObjectList(renderoptroot,
+                                      "stroke", "Stroke Type",
+                                      strokeStrings, strokeObjects,
+                                      strokeStrings, strokeDescriptions,
+                                      0x2);
+            ((Option.ObjectList) strokeList).setNumRows(4);
 	}
 
         new DrawDiagonalLines();
@@ -232,12 +281,13 @@
 	boolean alphacolor;
 
 	if (hasGraphics2D) {
+            Graphics2D g2d = (Graphics2D) rctx.graphics;
 	    if (env.isEnabled(doAntialias)) {
-		Graphics2D g2d = (Graphics2D) rctx.graphics;
 		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
 				     RenderingHints.VALUE_ANTIALIAS_ON);
 	    }
 	    alphacolor = env.isEnabled(doAlphaColors);
+            g2d.setStroke((Stroke) env.getModifier(strokeList));
 	} else {
 	    alphacolor = false;
 	}
@@ -412,7 +462,7 @@
                     if (rCArray != null) {
                         g.setColor(rCArray[ci++ & NUM_RANDOMCOLORMASK]);
                     }
-                    g.drawLine(x, y, x, y + size);
+                    g.drawLine(x, y, x + size, y);
                 } while (--numReps > 0);
             }
             rctx.colorindex = ci;
@@ -457,7 +507,7 @@
                     if (rCArray != null) {
                         g.setColor(rCArray[ci++ & NUM_RANDOMCOLORMASK]);
                     }
-                    g.drawLine(x, y, x + size, y);
+                    g.drawLine(x, y, x, y + size);
                 } while (--numReps > 0);
             }
             rctx.colorindex = ci;
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/iio/IIOTests.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/iio/IIOTests.java	Fri Jun 22 00:46:43 2007 +0000
@@ -95,6 +95,7 @@
 	sizeList = new Option.IntList(iioOptRoot,
                                       "size", "Image Size",
                                       sizes, sizeStrs, sizeDescs, 0x4);
+        ((Option.ObjectList) sizeList).setNumRows(5);
 
         String[] contentStrs = new String[] {
             CONTENT_BLANK, CONTENT_RANDOM, CONTENT_VECTOR, CONTENT_PHOTO,
--- a/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/text/TextTests.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/java2d/J2DBench/src/j2dbench/tests/text/TextTests.java	Fri Jun 22 00:46:43 2007 +0000
@@ -375,6 +375,7 @@
                                         intStringList(tlengths),
                                         intStringList(tlengths, " chars"),
                                         0x10);
+        ((Option.ObjectList) tlengthList).setNumRows(5);
 
         tscriptList = new Option.ObjectList(txoptdataroot, "tscript",
                                             "Text Script",
@@ -383,7 +384,7 @@
                                             tscripts,
                                             tscripts,
                                             0x1);
-
+        ((Option.ObjectList) tscriptList).setNumRows(4);
 
         txoptfontroot = new Group(txoptroot, "font", "Font");
 
@@ -410,6 +411,7 @@
                                           floatStringList(fsl),
                                           floatStringList(fsl, "pt"),
                                           0x40);
+        ((Option.ObjectList) fsizeList).setNumRows(5);
         
         if (hasGraphics2D) {
             ftxList = new Option.ObjectList(txoptfontroot, "ftx",
@@ -419,6 +421,7 @@
                                             txNames,
                                             txDescNames,
                                             0x1);
+            ((Option.ObjectList) ftxList).setNumRows(6);
                                         
             txoptgraphicsroot = new Group(txoptroot, "graphics", "Graphics");
 
@@ -451,6 +454,7 @@
                                             taaNames, taaHints,
                                             taaNames, taaNames,
                                             0x1);
+            ((Option.ObjectList) taaList).setNumRows(2);
             // add special TextAAOpt for backwards compatibility with
             // older options files
             new TextAAOpt();
@@ -467,6 +471,7 @@
                                             txNames,
                                             txDescNames,
                                             0x1);
+            ((Option.ObjectList) gtxList).setNumRows(6);
 
             advoptsroot = new Group(txoptroot, "advopts", "Advanced Options");
             gvstyList = new Option.IntList(advoptsroot, "gvstyle", "Style",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/demo/java2d/SampleRenderPlug/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,67 @@
+#
+# Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun in the LICENSE file that accompanied this code.
+#
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+TOP_DIR=../../../../..
+
+include $(TOP_DIR)/make/common/shared/Platform.gmk
+
+SRC_DIR=./src
+CLASS_DIR=./classes
+BUILD_DIR=$(TOP_DIR)/build/$(PLATFORM)-$(ARCH)
+
+DEMO_SRC_DIR=$(SRC_DIR)/sun/java2d/demo
+DEMO_CLASS_DIR=$(CLASS_DIR)/sun/java2d/demo
+SERVICE_DIR=$(CLASS_DIR)/META-INF/services
+
+JAVAC=$(BUILD_DIR)/bin/javac
+JAR=$(BUILD_DIR)/bin/jar
+
+JAR_FILE=RegionRE.jar
+
+CLASSES = \
+	$(DEMO_CLASS_DIR)/RegionRenderingEngine.class \
+	$(DEMO_CLASS_DIR)/RegionTileGenerator.class \
+
+SERVICE = $(SERVICE_DIR)/sun.java2d.pipe.RenderingEngine
+
+$(JAR_FILE): $(CLASSES) $(SERVICE)
+	rm -rf $@
+	$(JAR) cvf $@ -C $(CLASS_DIR) .
+
+$(CLASS_DIR):
+	mkdir -p $(CLASS_DIR)
+
+$(DEMO_CLASS_DIR)/%.class: $(DEMO_SRC_DIR)/%.java $(CLASS_DIR)
+	$(JAVAC) -cp $(SRC_DIR) -d $(CLASS_DIR) $<
+
+$(SERVICE):
+	mkdir -p $(SERVICE_DIR)
+	rm -rf $@
+	echo '# Example Region-based Rendering Engine module' > $@
+	echo 'sun.java2d.demo.RegionRenderingEngine' >> $@
+
+clean:
+	rm -rf $(CLASS_DIR)
+	rm -rf $(JAR_FILE)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/demo/java2d/SampleRenderPlug/README	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,65 @@
+#
+# Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun in the LICENSE file that accompanied this code.
+#
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+This demo directory contains a simple quick and dirty implementation
+of the sun.java2d.pipe.RenderingEngine interface.  This example is not
+meant to be a viable replacement for the closed source Ductus code
+in the OpenJDK, but simply serves as an example of how to build and
+use an alternate RenderingEngine implementation.
+
+The sources for this sample are in the src/sun/java2d/demo subdirectory.
+A quick perusal of the sources there should uncover that this sample
+RenderingEngine is not completely standalone (yet?) in that it relies
+on delegation to an instance of DuctusRenderingEngine to satisfy the
+requirements for 2 of the 3 methods in the RenderingEngine interface.
+Some more work would be needed to create quick and dirty replacements
+for those other 2 methods, but this sample is only used to demonstrate
+building and runtime practices.  Hopefully a more fully featured and
+faster open source alternative will be built using this guide.
+
+To build the sample RenderingEngine, the JDK should be built in the
+normal manner and then the supplied Makefile in this directory can
+build this sample RenderingEngine for use with that JDK:
+
+    % cd <toplevel>/make
+    % gnumake
+    # entire JDK builds
+    % cd <toplevel>/src/share/demo/java2d/SampleRenderPlug
+    % gnumake
+    # builds RegionRE.jar
+
+Once the RenderingEngine jar file is built, it can be used with the
+following Java command line:
+
+    % java -Xbootclasspath/a:RegionRE.jar \
+        -Dsun.java2d.renderer=sun.java2d.demo.RegionRenderingEngine \
+        <mainclassname> [<optional arguments>]
+
+To run with tracing enabled, use the following Java command line:
+
+    % java -Xbootclasspath/a:RegionRE.jar \
+        -Dsun.java2d.renderer=sun.java2d.demo.RegionRenderingEngine \
+        -Dsun.java2d.renderer.trace=t \
+        <mainclassname> [<optional arguments>]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/demo/java2d/SampleRenderPlug/src/sun/java2d/demo/RegionRenderingEngine.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.demo;
+
+import java.awt.Shape;
+import java.awt.BasicStroke;
+import java.awt.geom.AffineTransform;
+
+import sun.java2d.pipe.RenderingEngine;
+import sun.java2d.pipe.AATileGenerator;
+import sun.java2d.pipe.Region;
+import sun.awt.geom.PathConsumer2D;
+import sun.dc.DuctusRenderingEngine;
+
+/**
+ * This class implements the RenderingEngine API and constructs a
+ * RegionTileGenerator to generate AA tiles for antialiasing operations.
+ * This class does not implement the createStrokedShape or strokeTo
+ * methods of the RenderingEngine class, but rather delegates those
+ * operations to an instance of DuctusRenderingEngine.
+ * A quick and dirty line widening algorithm could replace those
+ * usages to completely wean this class off of the Ductus code, but
+ * this class mainly serves as an example of how to get an alternate
+ * implementation of RenderingEngine built and used by the OpenJDK.
+ */
+public class RegionRenderingEngine extends RenderingEngine {
+    RenderingEngine stub = new DuctusRenderingEngine();
+
+    @Override
+    public Shape createStrokedShape(Shape src,
+                                    float width,
+                                    int caps,
+                                    int join,
+                                    float miterlimit,
+                                    float dashes[],
+                                    float dashphase)
+    {
+        return stub.createStrokedShape(src, width, caps, join, miterlimit,
+                                       dashes, dashphase);
+    }
+
+    @Override
+    public void strokeTo(Shape src,
+                         AffineTransform at,
+                         BasicStroke bs,
+                         boolean thin,
+                         boolean normalize,
+                         boolean antialias,
+                         PathConsumer2D consumer)
+    {
+        stub.strokeTo(src, at, bs, thin, normalize, antialias, consumer);
+    }
+
+    public AATileGenerator getAATileGenerator(Shape s,
+                                              AffineTransform at,
+                                              Region clip,
+                                              BasicStroke bs,
+                                              boolean thin,
+                                              boolean normalize,
+                                              int bbox[])
+    {
+        return new RegionTileGenerator(this, s, at, clip, bs,
+                                       thin, normalize, bbox);
+    }
+
+    public float getMinimumAAPenSize() {
+        return 1.0f / RegionTileGenerator.OVERSAMPLING;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/demo/java2d/SampleRenderPlug/src/sun/java2d/demo/RegionTileGenerator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.demo;
+
+import java.awt.Shape;
+import java.awt.BasicStroke;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.PathIterator;
+
+import sun.java2d.pipe.Region;
+import sun.java2d.pipe.RegionIterator;
+import sun.java2d.pipe.AATileGenerator;
+import sun.java2d.pipe.ShapeSpanIterator;
+
+/**
+ * This class is used to convert raw geometry into 8-bit alpha tiles
+ * using oversampled rendering of the shape into a Region object.
+ * The Region object is then sampled a tile at a time per the contract
+ * of the AATileGenerator interface.
+ * The quality is configurable by changing the setting for OVERSAMPLING.
+ * The default setting supplied here of 16 is a reasonable match for
+ * the subsampling quality of the closed source Ductus renderer, but
+ * does not perform nearly as well.  Lower values could be used to
+ * improve performance at the cost of quality.
+ */
+public class RegionTileGenerator
+    implements AATileGenerator
+{
+    public static final int OVERSAMPLING = 16;
+    public static final int TILE_SIZE = 32;
+
+    Region region;
+    int lox, loy, hix, hiy;
+    int curx, cury;
+
+    public RegionTileGenerator(RegionRenderingEngine rre,
+                               Shape s,
+                               AffineTransform at,
+                               Region clip,
+                               BasicStroke bs,
+                               boolean thin,
+                               boolean normalize,
+                               int bbox[])
+    {
+        AffineTransform ataa =
+            AffineTransform.getScaleInstance(OVERSAMPLING, OVERSAMPLING);
+        ataa.concatenate(at);
+        ShapeSpanIterator sr = new ShapeSpanIterator(null, false);
+        try {
+            sr.setOutputAreaXYXY(clip.getLoX() * OVERSAMPLING,
+                                 clip.getLoY() * OVERSAMPLING,
+                                 clip.getHiX() * OVERSAMPLING,
+                                 clip.getHiY() * OVERSAMPLING);
+            if (bs == null) {
+                sr.appendPath(s.getPathIterator(ataa));
+            } else {
+                sr.setRule(PathIterator.WIND_NON_ZERO);
+                rre.strokeTo(s, ataa, bs, thin, normalize, true, sr);
+            }
+            sr.getPathBox(bbox);
+            region = Region.getInstance(bbox);
+            region.appendSpans(sr);
+        } finally {
+            sr.dispose();
+        }
+
+        if (region.isEmpty()) {
+            lox = loy = hix = hiy = 0;
+        } else {
+            region.getBounds(bbox);
+            lox = bbox[0] / OVERSAMPLING;
+            loy = bbox[1] / OVERSAMPLING;
+            hix = (bbox[2] + OVERSAMPLING-1) / OVERSAMPLING;
+            hiy = (bbox[3] + OVERSAMPLING-1) / OVERSAMPLING;
+        }
+        bbox[0] = lox;
+        bbox[1] = loy;
+        bbox[2] = hix;
+        bbox[3] = hiy;
+        curx = lox;
+        cury = loy;
+    }
+
+    @Override
+    public int getTileWidth() {
+        return TILE_SIZE;
+    }
+
+    @Override
+    public int getTileHeight() {
+        return TILE_SIZE;
+    }
+
+    @Override
+    public int getTypicalAlpha() {
+        return 0x80;
+    }
+
+    @Override
+    public void nextTile() {
+        if ((curx += TILE_SIZE) >= hix) {
+            cury += TILE_SIZE;
+            curx = lox;
+        }
+    }
+
+    static byte countToAlpha[];
+
+    static {
+        countToAlpha = new byte[OVERSAMPLING * OVERSAMPLING + 1];
+        for (int i = 0; i < countToAlpha.length; i++) {
+            countToAlpha[i] = (byte) (i * 255 / (OVERSAMPLING * OVERSAMPLING));
+        }
+    }
+
+    @Override
+    public void getAlpha(byte tile[], int offset, int rowstride) {
+        int atmp[] = new int[TILE_SIZE * TILE_SIZE];
+        int dx0 = curx;
+        int dy0 = cury;
+        int dx1 = Math.min(hix, dx0 + TILE_SIZE);
+        int dy1 = Math.min(hiy, dy0 + TILE_SIZE);
+        Region r = this.region;
+
+        RegionIterator rowiter = r.getIterator();
+        int spanx0 = dx0 * OVERSAMPLING;
+        int spany0 = dy0 * OVERSAMPLING;
+        int spanx1 = dx1 * OVERSAMPLING;
+        int spany1 = dy1 * OVERSAMPLING;
+        int span[] = { spanx0, spany0, spanx0, spany0 };
+        if (r.isRectangular()) {
+            r.getBounds(span);
+            if (span[0] < spanx0) span[0] = spanx0;
+            if (span[1] < spany0) span[1] = spany0;
+            if (span[2] > spanx1) span[2] = spanx1;
+            if (span[3] > spany1) span[3] = spany1;
+        }
+        java.util.Arrays.fill(atmp, 0);
+        while (true) {
+            if (span[1] >= span[3]) {
+                if (!rowiter.nextYRange(span) || span[1] >= spany1) break;
+                if (span[1] < spany0) span[1] = spany0;
+                if (span[3] > spany1) span[3] = spany1;
+                span[0] = span[2] = spanx0;
+                continue;
+            }
+            if (span[0] >= span[2]) {
+                if (!rowiter.nextXBand(span) || span[0] >= spanx1) {
+                    span[1] = span[3];
+                    continue;
+                }
+                if (span[0] < spanx0) span[0] = spanx0;
+                if (span[2] > spanx1) span[2] = spanx1;
+                continue;
+            }
+            int y = span[1];
+            while (y < span[3]) {
+                int row = (y / OVERSAMPLING);
+                int dy = (row+1) * OVERSAMPLING;
+                if (dy > span[3]) dy = span[3];
+                dy -= y;
+                row = offset + (row - dy0) * rowstride;
+                int x = span[0];
+                int col = (x / OVERSAMPLING);
+                int dx = (col+1) * OVERSAMPLING;
+                if (dx > span[2]) dx = span[2];
+                dx -= x;
+                col = col - dx0;
+                atmp[row + col] += dx * dy;
+                x += dx;
+                col++;
+                while (x + OVERSAMPLING <= span[2]) {
+                    atmp[row + col] += dy * OVERSAMPLING;
+                    x += OVERSAMPLING;
+                    col++;
+                }
+                if (x < span[2]) {
+                    atmp[row + col] += (span[2]-x) * dy;
+                }
+                y += dy;
+            }
+            span[0] = span[2];
+        }
+
+        for (int i = 0; i < atmp.length; i++) {
+            tile[i] = countToAlpha[atmp[i]];
+        }
+        nextTile();
+    }
+
+    @Override
+    public void dispose() {}
+}
--- a/j2se/src/share/demo/jvmti/hprof/README.txt	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/jvmti/hprof/README.txt	Fri Jun 22 00:46:43 2007 +0000
@@ -29,10 +29,6 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-/*
- * @(#)README.txt	1.23 07/05/05
- */
-
 README
 ------
 
--- a/j2se/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c	Fri Jun 22 00:46:43 2007 +0000
@@ -42,8 +42,6 @@
  *     It's up to the user of this interface if it wants to use this
  *     feature.
  *
- * Example Usage: See file test_crw.c.
- *
  */
 
 #include <stdio.h>
--- a/j2se/src/share/demo/jvmti/java_crw_demo/test_crw.c	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-/*
- * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- *   - Neither the name of Sun Microsystems nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include "java_crw_demo.h"
-
-static int error_code = 0;
-
-#define ERROR(message) error(message, __FILE__, __LINE__)
-
-static void
-error(const char *message, const char *file, int line)
-{
-    error_code = 1;
-    (void)fprintf(stderr, "ERROR: %s\n", message);
-    exit(error_code);
-}
-
-static void
-file_error(char *filename, char *message)
-{
-    error_code = 1;
-    (void)fprintf(stderr, "ERROR: \"%s\": %s\n", filename, message);
-    exit(error_code);
-}
-
-static void *
-allocate(int size)
-{
-    return calloc(1, size);
-}
-
-static void
-deallocate(void *ptr)
-{
-    free(ptr);
-}
-
-static void
-mnums(unsigned cnum, const char **names, const char **descrs, int count)
-{
-    int i;
-    
-    (void)printf("Methods in class number 0x%08x:\n", cnum);
-    for ( i = 0; i < count ; i++ ) {
-	int j;
-
-	(void)printf("\t0x%08x: name=%s, signature=%s\n", i, names[i], descrs[i]);
-    }
-
-}
-
-int
-main(int argc, char **argv)
-{
-    int i;
-    unsigned class_number = 0x0FEED000;
-    int obj_watch;
-    int call_sites;
-    int ret_sites;
-
-    obj_watch = 0;
-    call_sites = 0;
-    ret_sites = 0;
-
-    if ( argc < 3 ) {
-        char buf[256];
-        (void)snprintf(buf, sizeof(buf), "Usage: %s input_file output_file", argv[0]);
-        ERROR(buf);
-    }
-    
-    for(i=1; i<argc; i++) {
-        FILE *fin;
-        FILE *fout;
-        const unsigned char *file_image;
-        int file_len;
-        unsigned char *new_file_image;
-        long new_file_len;
-        
-	if ( strcmp(argv[i],"-n")==0 ) {
-	    obj_watch = 1;
-            continue;
-        } else if ( strcmp(argv[i], "-c")==0 ) {
-	    call_sites = 1;
-            continue;
-        } else if ( strcmp(argv[i], "-r")==0 ) {
-	    ret_sites = 1;
-            continue;
-        }
-
-        fin = fopen(argv[i], "r");
-        if ( fin == NULL ) {
-            file_error(argv[i], "Cannot open file");
-        }
-        (void)fseek(fin, 0, SEEK_END);
-        file_len = ftell(fin);
-        if ( file_len<=0 ) {
-            file_error(argv[i], "File has 0 size");
-        }
-        (void)fseek(fin, 0, SEEK_SET);
-        file_image = (const unsigned char *)malloc((size_t)file_len);
-        assert(file_image!=NULL);
-        if ( fread((void*)file_image, 1, (size_t)file_len, fin)!=(size_t)file_len) {
-            file_error(argv[i], "File read failed");
-        }
-        
-        java_crw_demo(class_number++, 
-	    NULL, 
-	    file_image, 
-	    file_len, 
-	    0,
-            "sun/tools/hprof/Tracker",
-            "Lsun/tools/hprof/Tracker;",
-            call_sites?"CallSite":NULL,
-            call_sites?"(II)V":NULL,
-            ret_sites?"ReturnSite":NULL,
-            ret_sites?"(II)V":NULL,
-            obj_watch?"ObjectInit":NULL,
-            obj_watch?"(Ljava/lang/Object;)V":NULL,
-            obj_watch?"NewArray":NULL,
-            obj_watch?"(Ljava/lang/Object;)V":NULL,
-	    &new_file_image,
-	    &new_file_len,
-            &error, 
-	    &mnums);
-        
-        fout = fopen(argv[i+1], "w");
-        if ( fout == NULL ) {
-            file_error(argv[i+1], "Cannot create file");
-        }
-        if ( new_file_len > 0 ) {
-            if ( fwrite(new_file_image, 1, (size_t)new_file_len, fout)!=(size_t)new_file_len ) {
-                file_error(argv[i+1], "File write failed");
-            }
-            (void)printf("Processed file %s to %s\n", argv[i], argv[i+1]);
-        } else {
-            if ( fwrite(file_image, 1, file_len, fout)!=(size_t)file_len ) {
-                file_error(argv[i+1], "File write failed");
-            }
-            (void)printf("Duplicated file %s to %s (no injections)\n", argv[i], argv[i+1]);
-        }
-
-        (void)fclose(fout);
-
-        free((void*)file_image);
-	if ( new_file_image != NULL ) {
-	    free(new_file_image);
-	}
-
-        i++;
-    }
-    return error_code;
-}
-
--- a/j2se/src/share/demo/jvmti/java_crw_demo/test_sources/CrwTest1.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- *   - Neither the name of Sun Microsystems nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-public class CrwTest1 {
-	
-	static int f1;
-	private int s(int i) {
-	   int j;
-	   System.out.println("in s()");
-	   f1 = i;
-	   System.out.println("in s()"); /* DON"T SHOW THIS */
-	   j = g(i);
-	   return j;
-	}
-
-	private int g(int i) {
-	   System.out.println("in g()");
-	   return i;
-	}
-
-	public static void main(String[] args) {
-	        CrwTest1 temp = new CrwTest1();	
-		int i = temp.s(1);
-		System.out.println("Hello world1");
-		System.out.println("Hello world2");
-		System.out.println("Hello world3");
-		System.out.println("Hello world4");
-		System.out.println("Hello world5");
-		System.out.println("Hello world6");
-		System.out.println("Hello world7");
-	}
-}
--- a/j2se/src/share/demo/jvmti/java_crw_demo/test_sources/CrwTest2.java	Fri May 25 00:49:14 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- *   - Neither the name of Sun Microsystems nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-class CrwTest2 {
-}
--- a/j2se/src/share/native/sun/font/AccelGlyphCache.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/font/AccelGlyphCache.c	Fri Jun 22 00:46:43 2007 +0000
@@ -47,7 +47,9 @@
  * memory surface that will contain the individual glyph images.
  */
 GlyphCacheInfo *
-AccelGlyphCache_Init(jint width, jint height, jint cellWidth, jint cellHeight)
+AccelGlyphCache_Init(jint width, jint height,
+                     jint cellWidth, jint cellHeight,
+                     FlushFunc *func)
 {
     GlyphCacheInfo *gcinfo;
 
@@ -67,6 +69,7 @@
     gcinfo->cellWidth = cellWidth;
     gcinfo->cellHeight = cellHeight;
     gcinfo->isFull = JNI_FALSE;
+    gcinfo->Flush = func;
 
     return gcinfo;
 }
@@ -201,6 +204,12 @@
         } while (cellinfo == NULL);
 
         if (cellinfo->glyphInfo != NULL) {
+            // flush in case any pending vertices are depending on the
+            // glyph that is about to be kicked out
+            if (cache->Flush != NULL) {
+                cache->Flush();
+            }
+
             // if the cell is occupied, notify the base glyph that its
             // cached version is about to be kicked out
             cellinfo->glyphInfo->cellInfo = NULL;
@@ -232,6 +241,12 @@
         return;
     }
 
+    // flush any pending vertices that may be depending on the current
+    // glyph cache layout
+    if (cache->Flush != NULL) {
+        cache->Flush();
+    }
+
     cellinfo = cache->head;
     while (cellinfo != NULL) {
         if (cellinfo->glyphInfo != NULL) {
--- a/j2se/src/share/native/sun/font/AccelGlyphCache.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/font/AccelGlyphCache.h	Fri Jun 22 00:46:43 2007 +0000
@@ -29,6 +29,8 @@
 #include "jni.h"
 #include "fontscalerdefs.h"
 
+typedef void (FlushFunc)();
+
 typedef struct _CacheCellInfo CacheCellInfo;
 
 typedef struct {
@@ -40,6 +42,7 @@
     jint          cellWidth;
     jint          cellHeight;
     jboolean      isFull;
+    FlushFunc     *Flush;
 } GlyphCacheInfo;
 
 struct _CacheCellInfo {
@@ -57,7 +60,8 @@
 
 GlyphCacheInfo *
 AccelGlyphCache_Init(jint width, jint height,
-                     jint cellWidth, jint cellHeight);
+                     jint cellWidth, jint cellHeight,
+                     FlushFunc *func);
 void
 AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, struct GlyphInfo *glyph);
 void
--- a/j2se/src/share/native/sun/font/layout/LayoutEngine.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/font/layout/LayoutEngine.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -49,6 +49,7 @@
 
 #include "OpenTypeUtilities.h"
 #include "GlyphSubstitutionTables.h"
+#include "GlyphDefinitionTables.h"
 #include "MorphTables.h"
 
 #include "DefaultCharMapper.h"
@@ -181,6 +182,37 @@
     fGlyphStorage->getGlyphs(glyphs, success);
 }
 
+class CanonMarkFilter : public LEGlyphFilter
+{
+private:
+    const GlyphClassDefinitionTable *classDefTable;
+
+    CanonMarkFilter(const CanonMarkFilter &other); // forbid copying of this class
+    CanonMarkFilter &operator=(const CanonMarkFilter &other); // forbid copying of this class
+
+public:
+    CanonMarkFilter(const GlyphDefinitionTableHeader *gdefTable);
+    virtual ~CanonMarkFilter();
+
+    virtual le_bool accept(LEGlyphID glyph) const;
+};
+
+CanonMarkFilter::CanonMarkFilter(const GlyphDefinitionTableHeader *gdefTable)
+{
+    classDefTable = gdefTable->getMarkAttachClassDefinitionTable();
+}
+
+CanonMarkFilter::~CanonMarkFilter()
+{
+    // nothing to do?
+}
+
+le_bool CanonMarkFilter::accept(LEGlyphID glyph) const
+{
+    le_int32 glyphClass = classDefTable->getGlyphClass(glyph);
+
+    return glyphClass != 0;
+}
 
 void LayoutEngine::getGlyphPositions(float positions[], LEErrorCode &success) const
 {
@@ -339,7 +371,7 @@
 }
 
 void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, 
-    le_int32 count, le_bool /*reverse*/,
+    le_int32 count, le_bool reverse,
     LEGlyphStorage &glyphStorage, LEErrorCode &success)
 {
     if (LE_FAILURE(success)) {
@@ -351,6 +383,11 @@
         return;
     }
 
+    GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable;
+    CanonMarkFilter filter(gdefTable);
+
+    adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
+
     if (fTypoFlags & 0x1) { /* kerning enabled */
       static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG;
 
--- a/j2se/src/share/native/sun/java2d/opengl/OGLBufImgOps.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLBufImgOps.c	Fri Jun 22 00:46:43 2007 +0000
@@ -65,31 +65,33 @@
     "const int MAX_KERNEL_SIZE = %s;"
     // image to be convolved
     "uniform sampler%s baseImage;"
-    // upper-left limit; anything less will be treated as edge case
-    "uniform vec2 imgMin;"
-    // lower-right limit; anything greater will be treated as edge case
-    "uniform vec2 imgMax;"
-    // array of offsets for accessing the base image
-    "uniform vec2 offsets[MAX_KERNEL_SIZE];"
-    // value for each location in the convolution kernel
-    "uniform float kernelVals[MAX_KERNEL_SIZE];"
+    // image edge limits:
+    //   imgEdge.xy = imgMin.xy (anything < will be treated as edge case)
+    //   imgEdge.zw = imgMax.xy (anything > will be treated as edge case)
+    "uniform vec4 imgEdge;"
+    // value for each location in the convolution kernel:
+    //   kernelVals[i].x = offsetX[i]
+    //   kernelVals[i].y = offsetY[i]
+    //   kernelVals[i].z = kernel[i]
+    "uniform vec3 kernelVals[MAX_KERNEL_SIZE];"
     ""
     "void main(void)"
     "{"
     "    int i;"
     "    vec4 sum;"
     ""
-    "    if (any(lessThan(gl_TexCoord[0].st, imgMin)) ||"
-    "        any(greaterThan(gl_TexCoord[0].st, imgMax)))"
+    "    if (any(lessThan(gl_TexCoord[0].st, imgEdge.xy)) ||"
+    "        any(greaterThan(gl_TexCoord[0].st, imgEdge.zw)))"
     "    {"
              // (placeholder for edge condition code)
     "        %s"
     "    } else {"
     "        sum = vec4(0.0);"
     "        for (i = 0; i < MAX_KERNEL_SIZE; i++) {"
-    "            vec4 tmp = texture%s(baseImage,"
-    "                                 gl_TexCoord[0].st + offsets[i]);"
-    "            sum += tmp * kernelVals[i];"
+    "            sum +="
+    "                kernelVals[i].z *"
+    "                texture%s(baseImage,"
+    "                          gl_TexCoord[0].st + kernelVals[i].xy);"
     "        }"
     "    }"
     ""
@@ -114,6 +116,11 @@
 static GLhandleARB convolvePrograms[8];
 
 /**
+ * The maximum kernel size supported by the ConvolveOp shader.
+ */
+#define MAX_KERNEL_SIZE 25
+
+/**
  * Compiles and links the ConvolveOp shader program.  If successful, this
  * function returns a handle to the newly created shader program; otherwise
  * returns 0.
@@ -170,15 +177,15 @@
 OGLBufImgOps_EnableConvolveOp(OGLContext *oglc, jlong pSrcOps,
                               jboolean edgeZeroFill,
                               jint kernelWidth, jint kernelHeight,
-                              unsigned char *kernelVals)
+                              unsigned char *kernel)
 {
     OGLSDOps *srcOps = (OGLSDOps *)jlong_to_ptr(pSrcOps);
     jint kernelSize = kernelWidth * kernelHeight;
     GLhandleARB convolveProgram;
     GLfloat xoff, yoff;
     GLfloat edgeX, edgeY, minX, minY, maxX, maxY;
-    jint i, j, offIndex;
-    char offsetString[20];
+    GLfloat kernelVals[MAX_KERNEL_SIZE*3];
+    jint i, j, kIndex;
     GLint loc;
     jint flags = 0;
 
@@ -188,6 +195,7 @@
 
     RETURN_IF_NULL(oglc);
     RETURN_IF_NULL(srcOps);
+    RESET_PREVIOUS_OP();
 
     if (srcOps->textureTarget == GL_TEXTURE_RECTANGLE_ARB) {
         flags |= CONVOLVE_RECT;
@@ -238,25 +246,21 @@
         maxX = (((GLfloat)srcOps->width) / srcOps->textureWidth) - edgeX;
         maxY = (((GLfloat)srcOps->height) / srcOps->textureHeight) - edgeY;
     }
-    loc = j2d_glGetUniformLocationARB(convolveProgram, "imgMin");
-    j2d_glUniform2fARB(loc, minX, minY);
-    loc = j2d_glGetUniformLocationARB(convolveProgram, "imgMax");
-    j2d_glUniform2fARB(loc, maxX, maxY);
+    loc = j2d_glGetUniformLocationARB(convolveProgram, "imgEdge");
+    j2d_glUniform4fARB(loc, minX, minY, maxX, maxY);
 
-    // update the "uniform" kernel offsets
-    offIndex = 0;
+    // update the "uniform" kernel offsets and values
+    loc = j2d_glGetUniformLocationARB(convolveProgram, "kernelVals");
+    kIndex = 0;
     for (i = -kernelHeight/2; i < kernelHeight/2+1; i++) {
         for (j = -kernelWidth/2; j < kernelWidth/2+1; j++) {
-            sprintf(offsetString, "offsets[%d]", offIndex);
-            loc = j2d_glGetUniformLocationARB(convolveProgram, offsetString);
-            j2d_glUniform2fARB(loc, j*xoff, i*yoff);
-            offIndex++;
+            kernelVals[kIndex+0] = j*xoff;
+            kernelVals[kIndex+1] = i*yoff;
+            kernelVals[kIndex+2] = NEXT_FLOAT(kernel);
+            kIndex += 3;
         }
     }
-
-    // update the "uniform" kernel values
-    loc = j2d_glGetUniformLocationARB(convolveProgram, "kernelVals");
-    j2d_glUniform1fvARB(loc, kernelSize, (const GLfloat *)kernelVals);
+    j2d_glUniform3fvARB(loc, kernelSize, kernelVals);
 }
 
 void
@@ -394,6 +398,7 @@
 
     RETURN_IF_NULL(oglc);
     RETURN_IF_NULL(srcOps);
+    RESET_PREVIOUS_OP();
 
     // choose the appropriate shader, depending on the source texture target
     if (srcOps->textureTarget == GL_TEXTURE_RECTANGLE_ARB) {
@@ -633,6 +638,7 @@
 
     RETURN_IF_NULL(oglc);
     RETURN_IF_NULL(srcOps);
+    RESET_PREVIOUS_OP();
 
     // choose the appropriate shader, depending on the source texture target
     // and the number of bands involved
--- a/j2se/src/share/native/sun/java2d/opengl/OGLContext.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLContext.c	Fri Jun 22 00:46:43 2007 +0000
@@ -507,94 +507,6 @@
 }
 
 /**
- * Initializes the OpenGL color state.  The extra alpha value may be
- * conditionally applied if the current composite is an AlphaComposite.
- * Likewise, the XOR pixel value may be applied if the current composite is
- * an XORComposite.
- */
-void
-OGLContext_SetColor(OGLContext *oglc, jint pixel)
-{
-    J2dTraceLn1(J2D_TRACE_INFO, "OGLContext_SetColor: pixel=%08x", pixel);
-
-    RETURN_IF_NULL(oglc);
-
-    // glColor*() is allowed within glBegin()/glEnd() pairs, so
-    // no need to call CHECK_PREVIOUS_OP(OGL_STATE_CHANGE) here...
-
-    if (oglc->compState != sun_java2d_SunGraphics2D_COMP_XOR) {
-        J2dTraceLn1(J2D_TRACE_VERBOSE,
-                    "  updating color: argb=%08x", pixel);
-
-        j2d_glColor4ub((GLubyte)(pixel >> 16),
-                       (GLubyte)(pixel >>  8),
-                       (GLubyte)(pixel >>  0),
-                       (GLubyte)(pixel >> 24));
-    } else {
-        pixel ^= oglc->xorPixel;
-
-        J2dTraceLn4(J2D_TRACE_VERBOSE,
-                    "  updating xor color: r=%02x g=%02x b=%02x xorpixel=%08x",
-                    pixel >> 16, pixel >> 8, pixel, oglc->xorPixel);
-
-        j2d_glColor3ub((GLubyte)(pixel >> 16),
-                       (GLubyte)(pixel >>  8),
-                       (GLubyte)(pixel >>  0));
-    }
-}
-
-/**
- * Initializes a small texture tile for use with tiled mask operations (see
- * OGLMaskFill.c for a usage example).  The texture ID for the tile is stored
- * in the given OGLContext.  The tile is initially filled with garbage values,
- * but the tile is updated as needed (via glTexSubImage2D()) with real alpha
- * values used in masking situations.  The internal format for the texture is
- * GL_INTENSITY8, which when combined with the GL_MODULATE texture enviornment
- * flag, will effectively multiply the alpha and color components of the
- * source fragment with the alpha value stored in the corresponding location
- * in the mask texture.
- */
-jboolean
-OGLContext_InitMaskTileTexture(OGLContext *oglc)
-{
-    GLint sp, sr, rl, align;
-    GLclampf priority = 1.0f;
-
-    J2dTraceLn(J2D_TRACE_INFO, "OGLContext_InitMaskTileTexture");
-
-    j2d_glGenTextures(1, &oglc->maskTextureID);
-    j2d_glBindTexture(GL_TEXTURE_2D, oglc->maskTextureID);
-    j2d_glPrioritizeTextures(1, &oglc->maskTextureID, &priority);
-    j2d_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-    j2d_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
-    // save pixel store parameters (since this method could be invoked after
-    // the caller has already set up its pixel store parameters)
-    j2d_glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &sp);
-    j2d_glGetIntegerv(GL_UNPACK_SKIP_ROWS, &sr);
-    j2d_glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rl);
-    j2d_glGetIntegerv(GL_UNPACK_ALIGNMENT, &align);
-
-    // set pixel store parameters to default values
-    j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
-    j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
-    j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
-    j2d_glTexImage2D(GL_TEXTURE_2D, 0, GL_INTENSITY8,
-                     OGLC_MASK_TILE_SIZE, OGLC_MASK_TILE_SIZE, 0,
-                     GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
-
-    // restore pixel store parameters
-    j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, sp);
-    j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, sr);
-    j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, rl);
-    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, align);
-
-    return JNI_TRUE;
-}
-
-/**
  * Creates a 2D texture of the given format and dimensions and returns the
  * texture object identifier.  This method is typically used to create a
  * temporary texture for intermediate work, such as in the
@@ -680,10 +592,6 @@
         free(oglc->xformMatrix);
     }
 
-    if (oglc->maskTextureID != 0) {
-        j2d_glDeleteTextures(1, &oglc->maskTextureID);
-    }
-
     if (oglc->blitTextureID != 0) {
         j2d_glDeleteTextures(1, &oglc->blitTextureID);
     }
--- a/j2se/src/share/native/sun/java2d/opengl/OGLContext.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLContext.h	Fri Jun 22 00:46:43 2007 +0000
@@ -26,8 +26,10 @@
 #ifndef OGLContext_h_Included
 #define OGLContext_h_Included
 
+#include "sun_java2d_pipe_BufferedContext.h"
 #include "sun_java2d_opengl_OGLContext.h"
 
+#include "j2d_md.h"
 #include "J2D_GL/gl.h"
 #include "OGLSurfaceData.h"
 
@@ -71,30 +73,27 @@
     jint       compState;
     jfloat     extraAlpha;
     jint       xorPixel;
+    jint       pixel;
+    jubyte     r;
+    jubyte     g;
+    jubyte     b;
+    jubyte     a;
+    jint       paintState;
+    jboolean   useMask;
     GLdouble   *xformMatrix;
-    GLuint     maskTextureID;
     GLuint     blitTextureID;
     GLint      textureFunction;
 } OGLContext;
 
 /**
- * The following flags help the internals of OGLContext.validate() determine
- * the appropriate (meaning correct, or optimal) code path when setting up
- * the current context.  The flags can be bitwise OR'd together as needed.
- *
- *     OGLC_NO_CONTEXT_FLAGS
- * Indicates that no flags are needed; take all default code paths.
- *
- *     OGLC_SRC_IS_OPAQUE
- * Indicates that the source surface (or pixel value, if it is a simple
- * rendering operation) is opaque (has an alpha value of 1.0).  If this flag
- * is present, it allows us to disable blending in certain situations in
- * order to improve performance.
+ * See BufferedContext.java for more on these flags...
  */
 #define OGLC_NO_CONTEXT_FLAGS \
-    sun_java2d_opengl_OGLContext_NO_CONTEXT_FLAGS
+    sun_java2d_pipe_BufferedContext_NO_CONTEXT_FLAGS
 #define OGLC_SRC_IS_OPAQUE    \
-    sun_java2d_opengl_OGLContext_SRC_IS_OPAQUE
+    sun_java2d_pipe_BufferedContext_SRC_IS_OPAQUE
+#define OGLC_USE_MASK         \
+    sun_java2d_pipe_BufferedContext_USE_MASK
 
 /**
  * Evaluates to true if the given capability bitmask is present for the
@@ -106,12 +105,11 @@
     (((oglc)->caps & (sun_java2d_opengl_OGLContext_##cap)) != 0)
 
 /**
- * These two constants determine the size of the shared tile textures used
- * by a number of image rendering methods.  For example, the mask tile texture
- * will have dimensions with width OGLC_MASK_TILE_SIZE and height
- * OGLC_MASK_TILE_SIZE (the tile will always be square).
+ * This constant determines the size of the shared tile texture used
+ * by a number of image rendering methods.  For example, the blit tile texture
+ * will have dimensions with width OGLC_BLIT_TILE_SIZE and height
+ * OGLC_BLIT_TILE_SIZE (the tile will always be square).
  */
-#define OGLC_MASK_TILE_SIZE 32
 #define OGLC_BLIT_TILE_SIZE 32
 
 /**
@@ -155,9 +153,7 @@
                              jdouble m00, jdouble m10,
                              jdouble m01, jdouble m11,
                              jdouble m02, jdouble m12);
-void OGLContext_SetColor(OGLContext *oglc, jint pixel);
 
-jboolean OGLContext_InitMaskTileTexture(OGLContext *oglc);
 jboolean OGLContext_InitBlitTileTexture(OGLContext *oglc);
 GLuint OGLContext_CreateBlitTexture(GLenum internalFormat, GLenum pixelFormat,
                                     GLuint width, GLuint height);
--- a/j2se/src/share/native/sun/java2d/opengl/OGLFuncs.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLFuncs.h	Fri Jun 22 00:46:43 2007 +0000
@@ -55,14 +55,18 @@
 typedef void (GLAPIENTRY *glColor4fType)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
 typedef void (GLAPIENTRY *glColor4ubType)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
 typedef void (GLAPIENTRY *glColorMaskType)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GLAPIENTRY *glColorPointerType)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
 typedef void (GLAPIENTRY *glCopyPixelsType)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
 typedef void (GLAPIENTRY *glCopyTexSubImage2DType)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
 typedef void (GLAPIENTRY *glDeleteTexturesType)(GLsizei n, const GLuint *textures);
 typedef void (GLAPIENTRY *glDepthFuncType)(GLenum func);
 typedef void (GLAPIENTRY *glDisableType)(GLenum cap);
+typedef void (GLAPIENTRY *glDisableClientStateType)(GLenum array);
+typedef void (GLAPIENTRY *glDrawArraysType)(GLenum mode, GLint first, GLsizei count);
 typedef void (GLAPIENTRY *glDrawBufferType)(GLenum mode);
 typedef void (GLAPIENTRY *glDrawPixelsType)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
 typedef void (GLAPIENTRY *glEnableType)(GLenum cap);
+typedef void (GLAPIENTRY *glEnableClientStateType)(GLenum array);
 typedef void (GLAPIENTRY *glEndType)(void);
 typedef void (GLAPIENTRY *glFinishType)(void);
 typedef void (GLAPIENTRY *glFlushType)(void);
@@ -75,6 +79,7 @@
 typedef const GLubyte * (GLAPIENTRY *glGetStringType)(GLenum name);
 typedef void (GLAPIENTRY *glGetTexLevelParameterivType)(GLenum target, GLint level, GLenum pname, GLint *params);
 typedef void (GLAPIENTRY *glHintType)(GLenum target, GLenum mode);
+typedef void (GLAPIENTRY *glInterleavedArraysType)(GLenum format, GLsizei stride, const GLvoid *pointer);
 typedef GLboolean (GLAPIENTRY *glIsEnabledType)(GLenum cap);
 typedef GLboolean (GLAPIENTRY *glIsTextureType)(GLuint texture);
 typedef void (GLAPIENTRY *glLoadIdentityType)(void);
@@ -97,6 +102,7 @@
 typedef void (GLAPIENTRY *glScissorType)(GLint x, GLint y, GLsizei width, GLsizei height);
 typedef void (GLAPIENTRY *glTexCoord2dType)(GLdouble s, GLdouble t);
 typedef void (GLAPIENTRY *glTexCoord2fType)(GLfloat s, GLfloat t);
+typedef void (GLAPIENTRY *glTexCoordPointerType)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
 typedef void (GLAPIENTRY *glTexEnviType)(GLenum target, GLenum pname, GLint param);
 typedef void (GLAPIENTRY *glTexGeniType)(GLenum coord, GLenum pname, GLint param);
 typedef void (GLAPIENTRY *glTexGendvType)(GLenum coord, GLenum pname, const GLdouble *params);
@@ -109,6 +115,7 @@
 typedef void (GLAPIENTRY *glVertex2dType)(GLdouble x, GLdouble y);
 typedef void (GLAPIENTRY *glVertex2fType)(GLfloat x, GLfloat y);
 typedef void (GLAPIENTRY *glVertex2iType)(GLint x, GLint y);
+typedef void (GLAPIENTRY *glVertexPointerType)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
 typedef void (GLAPIENTRY *glViewportType)(GLint x, GLint y, GLsizei width, GLsizei height);
 
 /**
@@ -146,6 +153,7 @@
 typedef void (GLAPIENTRY *glUniform1fvARBType)(GLint, GLsizei, const GLfloat *);
 typedef void (GLAPIENTRY *glUniform2fARBType)(GLint, GLfloat, GLfloat);
 typedef void (GLAPIENTRY *glUniform3fARBType)(GLint, GLfloat, GLfloat, GLfloat);
+typedef void (GLAPIENTRY *glUniform3fvARBType)(GLint, GLsizei, const GLfloat *);
 typedef void (GLAPIENTRY *glUniform4fARBType)(GLint, GLfloat, GLfloat, GLfloat, GLfloat);
 typedef GLint (GLAPIENTRY *glGetUniformLocationARBType)(GLhandleARB, const GLcharARB *);
 typedef void (GLAPIENTRY *glGetInfoLogARBType)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *);
@@ -199,14 +207,18 @@
     OGL_##action##_FUNC(glColor4f); \
     OGL_##action##_FUNC(glColor4ub); \
     OGL_##action##_FUNC(glColorMask); \
+    OGL_##action##_FUNC(glColorPointer); \
     OGL_##action##_FUNC(glCopyPixels); \
     OGL_##action##_FUNC(glCopyTexSubImage2D); \
     OGL_##action##_FUNC(glDeleteTextures); \
     OGL_##action##_FUNC(glDepthFunc); \
     OGL_##action##_FUNC(glDisable); \
+    OGL_##action##_FUNC(glDisableClientState); \
+    OGL_##action##_FUNC(glDrawArrays); \
     OGL_##action##_FUNC(glDrawBuffer); \
     OGL_##action##_FUNC(glDrawPixels); \
     OGL_##action##_FUNC(glEnable); \
+    OGL_##action##_FUNC(glEnableClientState); \
     OGL_##action##_FUNC(glEnd); \
     OGL_##action##_FUNC(glFinish); \
     OGL_##action##_FUNC(glFlush); \
@@ -219,6 +231,7 @@
     OGL_##action##_FUNC(glGetString); \
     OGL_##action##_FUNC(glGetTexLevelParameteriv); \
     OGL_##action##_FUNC(glHint); \
+    OGL_##action##_FUNC(glInterleavedArrays); \
     OGL_##action##_FUNC(glIsEnabled); \
     OGL_##action##_FUNC(glIsTexture); \
     OGL_##action##_FUNC(glLoadIdentity); \
@@ -241,6 +254,7 @@
     OGL_##action##_FUNC(glScissor); \
     OGL_##action##_FUNC(glTexCoord2d); \
     OGL_##action##_FUNC(glTexCoord2f); \
+    OGL_##action##_FUNC(glTexCoordPointer); \
     OGL_##action##_FUNC(glTexEnvi); \
     OGL_##action##_FUNC(glTexGeni); \
     OGL_##action##_FUNC(glTexGendv); \
@@ -253,6 +267,7 @@
     OGL_##action##_FUNC(glVertex2d); \
     OGL_##action##_FUNC(glVertex2f); \
     OGL_##action##_FUNC(glVertex2i); \
+    OGL_##action##_FUNC(glVertexPointer); \
     OGL_##action##_FUNC(glViewport);
 
 #define OGL_EXPRESS_EXT_FUNCS(action) \
@@ -281,6 +296,7 @@
     OGL_##action##_EXT_FUNC(glUniform1fvARB); \
     OGL_##action##_EXT_FUNC(glUniform2fARB); \
     OGL_##action##_EXT_FUNC(glUniform3fARB); \
+    OGL_##action##_EXT_FUNC(glUniform3fvARB); \
     OGL_##action##_EXT_FUNC(glUniform4fARB); \
     OGL_##action##_EXT_FUNC(glGetUniformLocationARB); \
     OGL_##action##_EXT_FUNC(glGetInfoLogARB); \
--- a/j2se/src/share/native/sun/java2d/opengl/OGLMaskFill.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLMaskFill.c	Fri Jun 22 00:46:43 2007 +0000
@@ -29,13 +29,14 @@
 
 #include "OGLMaskFill.h"
 #include "OGLRenderQueue.h"
+#include "OGLVertexCache.h"
 
 /**
  * This implementation first copies the alpha tile into a texture and then
  * maps that texture to the destination surface.  This approach appears to
  * offer the best performance despite being a two-step process.
  *
- * When isColor is set to JNI_TRUE, we can simply use the GL_MODULATE
+ * When the source paint is a Color, we can simply use the GL_MODULATE
  * function to multiply the current color (already premultiplied with the
  * extra alpha value from the AlphaComposite) with the alpha value from
  * the mask texture tile.  In picture form, this process looks like:
@@ -51,42 +52,39 @@
  *     Cx = coverage value from mask tile
  *     Rx = resulting color/alpha component
  *
- * When isColor is set to JNI_FALSE, it means that we are rendering with
+ * When the source paint is not a Color, it means that we are rendering with
  * a complex paint (e.g. GradientPaint, TexturePaint).  In this case, we
  * rely on the GL_ARB_multitexture extension to effectively multiply the
- * paint fragments (autogenerated on texture unit 0, see the
- * OGLRenderer_Enable{Gradient,Texture}Paint() methods for more details)
+ * paint fragments (autogenerated on texture unit 1, see the
+ * OGLPaints_Set{Gradient,Texture,etc}Paint() methods for more details)
  * with the coverage values from the mask texture tile (provided on texture
- * unit 1), all of which is multiplied with the current color value (which
+ * unit 0), all of which is multiplied with the current color value (which
  * contains the extra alpha value).  In picture form:
  *
  *                        A     R    G     B
  *     primary color      Ea    Ea   Ea    Ea    (modulated with...)
- *     texture unit 0     Pa    Pr   Pg    Pb    (modulated with...)
- *     texture unit 1     Ca    Ca   Ca    Ca
+ *     texture unit 0     Ca    Ca   Ca    Ca    (modulated with...)
+ *     texture unit 1     Pa    Pr   Pg    Pb
  *     ---------------------------------------
  *     resulting color    Ra    Rr   Rg    Rb
  *
  * where:
  *     Ea = extra alpha
+ *     Cx = coverage value from mask tile
  *     Px = gradient/texture paint color (generated for each fragment)
- *     Cx = coverage value from mask tile
  *     Rx = resulting color/alpha component
  *
  * Here are some descriptions of the many variables used in this method:
  *   x,y     - upper left corner of the tile destination
  *   w,h     - width/height of the mask tile
  *   x0      - placekeeper for the original destination x location
- *   tx1,ty1 - upper left corner of the texture tile source region (always 0)
- *   tx2,ty2 - lower right corner of the texture tile source region
- *             in the range [0.0,1.0]
  *   tw,th   - width/height of the actual texture tile in pixels
  *   sx1,sy1 - upper left corner of the mask tile source region
  *   sx2,sy2 - lower left corner of the mask tile source region
  *   sx,sy   - "current" upper left corner of the mask tile region of interest
  */
 void
-OGLMaskFill_MaskFill(OGLContext *oglc, jboolean isColor,
+OGLMaskFill_MaskFill(OGLContext *oglc,
                      jint x, jint y, jint w, jint h,
                      jint maskoff, jint maskscan, jint masklen,
                      unsigned char *pMask)
@@ -94,58 +92,25 @@
     J2dTraceLn(J2D_TRACE_INFO, "OGLMaskFill_MaskFill");
 
     RETURN_IF_NULL(oglc);
-    RETURN_IF_NULL(pMask);
-    if (isColor) {
-        // enable GL_TEXTURE_2D for texture unit 0, if it isn't already
-        CHECK_PREVIOUS_OP(GL_TEXTURE_2D);
-    } else {
-        // GL_TEXTURE_1D/2D has already been enabled for texture unit 0
-        // by the OGLRenderer_Enable{Gradient,Texture}Paint() method, so no
-        // need to call CHECK_PREVIOUS_OP() here
-    }
+    CHECK_PREVIOUS_OP(OGL_STATE_MASK_OP);
 
     J2dTraceLn4(J2D_TRACE_VERBOSE, "  x=%d y=%d w=%d h=%d", x, y, w, h);
     J2dTraceLn2(J2D_TRACE_VERBOSE, "  maskoff=%d maskscan=%d",
                 maskoff, maskscan);
 
-    if (masklen > 0) {
-        GLfloat tx1, ty1, tx2, ty2;
+    {
         jint tw, th, x0;
         jint sx1, sy1, sx2, sy2;
         jint sx, sy, sw, sh;
 
-        if (oglc->maskTextureID == 0) {
-            if (!OGLContext_InitMaskTileTexture(oglc)) {
-                return;
-            }
-        }
-
         x0 = x;
-        tx1 = 0.0f;
-        ty1 = 0.0f;
-        tw = OGLC_MASK_TILE_SIZE;
-        th = OGLC_MASK_TILE_SIZE;
+        tw = OGLVC_MASK_CACHE_TILE_WIDTH;
+        th = OGLVC_MASK_CACHE_TILE_HEIGHT;
         sx1 = maskoff % maskscan;
         sy1 = maskoff / maskscan;
         sx2 = sx1 + w;
         sy2 = sy1 + h;
 
-        if (isColor) {
-            // bind mask texture to texture unit 0
-            j2d_glBindTexture(GL_TEXTURE_2D, oglc->maskTextureID);
-            OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
-        } else {
-            // enable texturing for texture unit 1 and bind mask texture
-            // to texture unit 1
-            j2d_glActiveTextureARB(GL_TEXTURE1_ARB);
-            j2d_glEnable(GL_TEXTURE_2D);
-            j2d_glBindTexture(GL_TEXTURE_2D, oglc->maskTextureID);
-            j2d_glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-        }
-
-        j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, maskscan);
-        j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
         for (sy = sy1; sy < sy2; sy += th, y += th) {
             x = x0;
             sh = ((sy + th) > sy2) ? (sy2 - sy) : th;
@@ -153,58 +118,18 @@
             for (sx = sx1; sx < sx2; sx += tw, x += tw) {
                 sw = ((sx + tw) > sx2) ? (sx2 - sx) : tw;
 
-                // update the source pointer offsets
-                j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
-                j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
-
-                // copy alpha mask into texture tile
-                j2d_glTexSubImage2D(GL_TEXTURE_2D, 0,
-                                    0, 0, sw, sh,
-                                    GL_LUMINANCE, GL_UNSIGNED_BYTE, pMask);
-
-                // update the lower right texture coordinates
-                tx2 = ((GLfloat)sw) / tw;
-                ty2 = ((GLfloat)sh) / th;
-
-                // render texture tile to the destination surface
-                j2d_glBegin(GL_QUADS);
-                if (isColor) {
-                    j2d_glTexCoord2f(tx1, ty1); j2d_glVertex2i(x, y);
-                    j2d_glTexCoord2f(tx2, ty1); j2d_glVertex2i(x + sw, y);
-                    j2d_glTexCoord2f(tx2, ty2); j2d_glVertex2i(x + sw, y + sh);
-                    j2d_glTexCoord2f(tx1, ty2); j2d_glVertex2i(x, y + sh);
-                } else {
-                    j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, tx1, ty1);
-                    j2d_glVertex2i(x, y);
-                    j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, tx2, ty1);
-                    j2d_glVertex2i(x + sw, y);
-                    j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, tx2, ty2);
-                    j2d_glVertex2i(x + sw, y + sh);
-                    j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, tx1, ty2);
-                    j2d_glVertex2i(x, y + sh);
-                }
-                j2d_glEnd();
+                OGLVertexCache_AddMaskQuad(oglc,
+                                           sx, sy, x, y, sw, sh,
+                                           maskscan, pMask);
             }
         }
-
-        if (!isColor) {
-            // disable texturing for texture unit 1 and then restore
-            // texture unit 0 as the active unit
-            j2d_glDisable(GL_TEXTURE_2D);
-            j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
-        }
-
-        j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-        j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
-        j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
-        j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
     }
 }
 
 JNIEXPORT void JNICALL
 Java_sun_java2d_opengl_OGLMaskFill_maskFill
     (JNIEnv *env, jobject self,
-     jboolean isColor, jint x, jint y, jint w, jint h,
+     jint x, jint y, jint w, jint h,
      jint maskoff, jint maskscan, jint masklen,
      jbyteArray maskArray)
 {
@@ -213,13 +138,14 @@
 
     J2dTraceLn(J2D_TRACE_ERROR, "OGLMaskFill_maskFill");
 
-    mask = (unsigned char *)
-        (*env)->GetPrimitiveArrayCritical(env, maskArray, NULL);
-    if (mask == NULL) {
-        return;
+    if (maskArray != NULL) {
+        mask = (unsigned char *)
+            (*env)->GetPrimitiveArrayCritical(env, maskArray, NULL);
+    } else {
+        mask = NULL;
     }
 
-    OGLMaskFill_MaskFill(oglc, isColor,
+    OGLMaskFill_MaskFill(oglc,
                          x, y, w, h,
                          maskoff, maskscan, masklen, mask);
 
@@ -229,7 +155,9 @@
         j2d_glFlush();
     }
 
-    (*env)->ReleasePrimitiveArrayCritical(env, maskArray, mask, JNI_ABORT);
+    if (mask != NULL) {
+        (*env)->ReleasePrimitiveArrayCritical(env, maskArray, mask, JNI_ABORT);
+    }
 }
 
 #endif /* !HEADLESS */
--- a/j2se/src/share/native/sun/java2d/opengl/OGLMaskFill.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLMaskFill.h	Fri Jun 22 00:46:43 2007 +0000
@@ -28,7 +28,7 @@
 
 #include "OGLContext.h"
 
-void OGLMaskFill_MaskFill(OGLContext *oglc, jboolean isColor,
+void OGLMaskFill_MaskFill(OGLContext *oglc,
                           jint x, jint y, jint w, jint h,
                           jint maskoff, jint maskscan, jint masklen,
                           unsigned char *pMask);
--- a/j2se/src/share/native/sun/java2d/opengl/OGLPaints.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLPaints.c	Fri Jun 22 00:46:43 2007 +0000
@@ -23,22 +23,131 @@
  * have any questions.
  */
 
-/*
- * @(#)OGLPaints.c	1.5 07/05/05
- */
-
 #ifndef HEADLESS
 
 #include <jlong.h>
 #include <string.h>
 
-#include "sun_java2d_opengl_OGLPaints_MultiGradient.h"
+#include "sun_java2d_SunGraphics2D.h"
+#include "sun_java2d_pipe_BufferedPaints.h"
 
 #include "OGLPaints.h"
 #include "OGLContext.h"
 #include "OGLRenderQueue.h"
 #include "OGLSurfaceData.h"
 
+void
+OGLPaints_ResetPaint(OGLContext *oglc)
+{
+    jubyte ea;
+
+    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_ResetPaint");
+
+    RETURN_IF_NULL(oglc);
+    J2dTraceLn1(J2D_TRACE_VERBOSE, "  state=%d", oglc->paintState);
+    RESET_PREVIOUS_OP();
+
+    if (oglc->useMask) {
+        // switch to texture unit 1, where paint state is currently enabled
+        j2d_glActiveTextureARB(GL_TEXTURE1_ARB);
+    }
+
+    switch (oglc->paintState) {
+    case sun_java2d_SunGraphics2D_PAINT_GRADIENT:
+        j2d_glDisable(GL_TEXTURE_1D);
+        j2d_glDisable(GL_TEXTURE_GEN_S);
+        break;
+
+    case sun_java2d_SunGraphics2D_PAINT_TEXTURE:
+        // Note: The texture object used in SetTexturePaint() will
+        // still be bound at this point, so it is safe to call the following.
+        OGLSD_RESET_TEXTURE_WRAP(GL_TEXTURE_2D);
+        j2d_glDisable(GL_TEXTURE_2D);
+        j2d_glDisable(GL_TEXTURE_GEN_S);
+        j2d_glDisable(GL_TEXTURE_GEN_T);
+        break;
+
+    case sun_java2d_SunGraphics2D_PAINT_LIN_GRADIENT:
+    case sun_java2d_SunGraphics2D_PAINT_RAD_GRADIENT:
+        j2d_glUseProgramObjectARB(0);
+        j2d_glDisable(GL_TEXTURE_1D);
+        break;
+
+    case sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR:
+    default:
+        break;
+    }
+
+    if (oglc->useMask) {
+        // restore control to texture unit 0
+        j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
+    }
+
+    // set each component of the current color state to the extra alpha 
+    // value, which will effectively apply the extra alpha to each fragment
+    // in paint/texturing operations
+    ea = (jubyte)(oglc->extraAlpha * 0xff + 0.5f);
+    j2d_glColor4ub(ea, ea, ea, ea);
+    oglc->pixel = (ea << 24) | (ea << 16) | (ea << 8) | (ea << 0);
+    oglc->r = ea;
+    oglc->g = ea;
+    oglc->b = ea;
+    oglc->a = ea;
+    oglc->useMask = JNI_FALSE;
+    oglc->paintState = -1;
+}
+
+void
+OGLPaints_SetColor(OGLContext *oglc, jint pixel)
+{
+    jubyte r, g, b, a;
+
+    J2dTraceLn1(J2D_TRACE_INFO, "OGLPaints_SetColor: pixel=%08x", pixel);
+
+    RETURN_IF_NULL(oglc);
+
+    // glColor*() is allowed within glBegin()/glEnd() pairs, so
+    // no need to reset the current op state here unless the paint
+    // state really needs to be changed
+    if (oglc->paintState > sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR) {
+        OGLPaints_ResetPaint(oglc);
+    }
+
+    // store the raw (unmodified) pixel value, which may be used for
+    // special operations later
+    oglc->pixel = pixel;
+
+    if (oglc->compState != sun_java2d_SunGraphics2D_COMP_XOR) {
+        r = (jubyte)(pixel >> 16);
+        g = (jubyte)(pixel >>  8);
+        b = (jubyte)(pixel >>  0);
+        a = (jubyte)(pixel >> 24);
+
+        J2dTraceLn4(J2D_TRACE_VERBOSE,
+                    "  updating color: r=%02x g=%02x b=%02x a=%02x",
+                    r, g, b, a);
+    } else {
+        pixel ^= oglc->xorPixel;
+
+        r = (jubyte)(pixel >> 16);
+        g = (jubyte)(pixel >>  8);
+        b = (jubyte)(pixel >>  0);
+        a = 0xff;
+
+        J2dTraceLn4(J2D_TRACE_VERBOSE,
+                    "  updating xor color: r=%02x g=%02x b=%02x xorpixel=%08x",
+                    r, g, b, oglc->xorPixel);
+    }
+
+    j2d_glColor4ub(r, g, b, a);
+    oglc->r = r;
+    oglc->g = g;
+    oglc->b = b;
+    oglc->a = a;
+    oglc->useMask = JNI_FALSE;
+    oglc->paintState = sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR;
+}
+
 /************************* GradientPaint support ****************************/
 
 static GLuint gradientTexID = 0;
@@ -57,21 +166,22 @@
     j2d_glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     j2d_glTexImage1D(GL_TEXTURE_1D, 0,
                      GL_RGBA8, 2, 0,
-                     GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
+                     GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
 }
 
 void
-OGLPaints_EnableGradientPaint(OGLContext *oglc, jboolean cyclic,
-                              jdouble p0, jdouble p1, jdouble p3,
-                              jint pixel1, jint pixel2)
+OGLPaints_SetGradientPaint(OGLContext *oglc,
+                           jboolean useMask, jboolean cyclic,
+                           jdouble p0, jdouble p1, jdouble p3,
+                           jint pixel1, jint pixel2)
 {
     GLdouble texParams[4];
     GLuint pixels[2];
 
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_EnableGradientPaint");
+    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_SetGradientPaint");
 
     RETURN_IF_NULL(oglc);
-    RESET_PREVIOUS_OP();
+    OGLPaints_ResetPaint(oglc);
 
     texParams[0] = p0;
     texParams[1] = p1;
@@ -81,6 +191,15 @@
     pixels[0] = pixel1;
     pixels[1] = pixel2;
 
+    if (useMask) {
+        // set up the paint on texture unit 1 (instead of the usual unit 0)
+        j2d_glActiveTextureARB(GL_TEXTURE1_ARB);
+        j2d_glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+    } else {
+        // texture unit 0 is already active; we can use the helper macro here
+        OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
+    }
+
     if (gradientTexID == 0) {
         OGLPaints_InitGradientTexture();
     }
@@ -88,46 +207,43 @@
     j2d_glEnable(GL_TEXTURE_1D);
     j2d_glEnable(GL_TEXTURE_GEN_S);
     j2d_glBindTexture(GL_TEXTURE_1D, gradientTexID);
-    OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
     j2d_glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S,
                         cyclic ? GL_REPEAT : GL_CLAMP_TO_EDGE);
     j2d_glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
     j2d_glTexGendv(GL_S, GL_OBJECT_PLANE, texParams);
 
     j2d_glTexSubImage1D(GL_TEXTURE_1D, 0,
-                        0, 2, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels);
-}
+                        0, 2, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
 
-void
-OGLPaints_DisableGradientPaint(OGLContext *oglc)
-{
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_DisableGradientPaint");
+    if (useMask) {
+        // restore control to texture unit 0
+        j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
+    }
 
-    RETURN_IF_NULL(oglc);
-    RESET_PREVIOUS_OP();
-
-    j2d_glDisable(GL_TEXTURE_1D);
-    j2d_glDisable(GL_TEXTURE_GEN_S);
+    // oglc->pixel has been set appropriately in OGLPaints_ResetPaint()
+    oglc->useMask = useMask;
+    oglc->paintState = sun_java2d_SunGraphics2D_PAINT_GRADIENT;
 }
 
 /************************** TexturePaint support ****************************/
 
 void
-OGLPaints_EnableTexturePaint(OGLContext *oglc,
-                             jlong pSrcOps, jboolean filter,
-                             jdouble xp0, jdouble xp1, jdouble xp3,
-                             jdouble yp0, jdouble yp1, jdouble yp3)
+OGLPaints_SetTexturePaint(OGLContext *oglc,
+                          jboolean useMask,
+                          jlong pSrcOps, jboolean filter,
+                          jdouble xp0, jdouble xp1, jdouble xp3,
+                          jdouble yp0, jdouble yp1, jdouble yp3)
 {
     OGLSDOps *srcOps = (OGLSDOps *)jlong_to_ptr(pSrcOps);
     GLdouble xParams[4];
     GLdouble yParams[4];
     GLint hint = (filter ? GL_LINEAR : GL_NEAREST);
 
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_EnableTexturePaint");
+    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_SetTexturePaint");
 
     RETURN_IF_NULL(srcOps);
     RETURN_IF_NULL(oglc);
-    RESET_PREVIOUS_OP();
+    OGLPaints_ResetPaint(oglc);
 
     xParams[0] = xp0;
     xParams[1] = xp1;
@@ -148,34 +264,34 @@
      * GL_TEXTURE_2D targets.
      */
 
+    if (useMask) {
+        // set up the paint on texture unit 1 (instead of the usual unit 0)
+        j2d_glActiveTextureARB(GL_TEXTURE1_ARB);
+        j2d_glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+    } else {
+        // texture unit 0 is already active; we can use the helper macro here
+        OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
+    }
+
     j2d_glEnable(GL_TEXTURE_2D);
     j2d_glEnable(GL_TEXTURE_GEN_S);
     j2d_glEnable(GL_TEXTURE_GEN_T);
     j2d_glBindTexture(GL_TEXTURE_2D, srcOps->textureID);
-    OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
     OGLSD_UPDATE_TEXTURE_FILTER(srcOps, hint);
     OGLSD_UPDATE_TEXTURE_WRAP(GL_TEXTURE_2D, GL_REPEAT);
     j2d_glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
     j2d_glTexGendv(GL_S, GL_OBJECT_PLANE, xParams);
     j2d_glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
     j2d_glTexGendv(GL_T, GL_OBJECT_PLANE, yParams);
-}
-
-void
-OGLPaints_DisableTexturePaint(OGLContext *oglc)
-{
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_DisableTexturePaint");
 
-    RETURN_IF_NULL(oglc);
-    RESET_PREVIOUS_OP();
+    if (useMask) {
+        // restore control to texture unit 0
+        j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
+    }
 
-    // Note: The texture object used in EnableTexturePaint() above will
-    // still be bound at this point, so it is safe to call the following.
-    OGLSD_RESET_TEXTURE_WRAP(GL_TEXTURE_2D);
-
-    j2d_glDisable(GL_TEXTURE_2D);
-    j2d_glDisable(GL_TEXTURE_GEN_S);
-    j2d_glDisable(GL_TEXTURE_GEN_T);
+    // oglc->pixel has been set appropriately in OGLPaints_ResetPaint()
+    oglc->useMask = useMask;
+    oglc->paintState = sun_java2d_SunGraphics2D_PAINT_TEXTURE;
 }
 
 /****************** Shared MultipleGradientPaint support ********************/
@@ -203,7 +319,7 @@
  *     the MAX_FRACTIONS_SMALL/LARGE constants below for more details.
  *
  *   MULTI_USE_MASK
- *     If set, apply the alpha mask value from texture unit 1 to the
+ *     If set, apply the alpha mask value from texture unit 0 to the
  *     final color result (only used in the MaskFill case).
  *
  *   MULTI_LINEAR_RGB
@@ -247,7 +363,7 @@
  * supports only a few fractions/colors, and then another, less optimal
  * shader that supports more stops.
  */
-#define MAX_FRACTIONS sun_java2d_opengl_OGLPaints_MultiGradient_MAX_FRACTIONS
+#define MAX_FRACTIONS sun_java2d_pipe_BufferedPaints_MULTI_MAX_FRACTIONS
 #define MAX_FRACTIONS_LARGE MAX_FRACTIONS
 #define MAX_FRACTIONS_SMALL 4
 
@@ -398,7 +514,7 @@
     j2d_glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     j2d_glTexImage1D(GL_TEXTURE_1D, 0,
                      GL_RGBA8, MAX_COLORS, 0,
-                     GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
+                     GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
 }
 
 /**
@@ -427,11 +543,11 @@
         /*
          * This code modulates the calculated result color with the
          * corresponding alpha value from the alpha mask texture active
-         * on texture unit 1.  Only needed when useMask is true (i.e., only
+         * on texture unit 0.  Only needed when useMask is true (i.e., only
          * for MaskFill operations).
          */
         maskVars = "uniform sampler2D mask;";
-        maskCode = "result *= texture2D(mask, gl_TexCoord[1].st);";
+        maskCode = "result *= texture2D(mask, gl_TexCoord[0].st);";
     } else {
         /*
          * REMIND: This is really wacky, but the gradient shaders will
@@ -486,11 +602,14 @@
     j2d_glUseProgramObjectARB(multiGradProgram);
 
     // set the "uniform" texture unit bindings
-    loc = j2d_glGetUniformLocationARB(multiGradProgram, "colors");
-    j2d_glUniform1iARB(loc, 0); // texture unit 0
     if (IS_SET(MULTI_USE_MASK)) {
         loc = j2d_glGetUniformLocationARB(multiGradProgram, "mask");
+        j2d_glUniform1iARB(loc, 0); // texture unit 0
+        loc = j2d_glGetUniformLocationARB(multiGradProgram, "colors");
         j2d_glUniform1iARB(loc, 1); // texture unit 1
+    } else {
+        loc = j2d_glGetUniformLocationARB(multiGradProgram, "colors");
+        j2d_glUniform1iARB(loc, 0); // texture unit 0
     }
 
     // "unuse" the program object; it will be re-bound later as needed
@@ -504,13 +623,13 @@
 }
 
 /**
- * Called from the OGLPaints_EnableLinear/RadialGradientPaint() methods
+ * Called from the OGLPaints_SetLinear/RadialGradientPaint() methods
  * in order to setup the fraction/color values that are common to both.
  */
 static void
-OGLPaints_EnableMultiGradientPaint(GLhandleARB multiGradProgram,
-                                   jint numStops,
-                                   void *pFractions, void *pPixels)
+OGLPaints_SetMultiGradientPaint(GLhandleARB multiGradProgram,
+                                jint numStops,
+                                void *pFractions, void *pPixels)
 {
     jint maxFractions = (numStops > MAX_FRACTIONS_SMALL) ?
         MAX_FRACTIONS_LARGE : MAX_FRACTIONS_SMALL;
@@ -551,7 +670,7 @@
     j2d_glBindTexture(GL_TEXTURE_1D, multiGradientTexID);
     j2d_glTexSubImage1D(GL_TEXTURE_1D, 0,
                         0, numStops,
-                        GL_RGBA, GL_UNSIGNED_INT_8_8_8_8,
+                        GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
                         pixels);
     if (numStops < MAX_COLORS) {
         // when we don't have enough colors to fill the entire color gradient,
@@ -559,7 +678,7 @@
         // the NO_CYCLE case where the texcoord is sometimes forced to 1.0
         j2d_glTexSubImage1D(GL_TEXTURE_1D, 0,
                             MAX_COLORS-1, 1,
-                            GL_RGBA, GL_UNSIGNED_INT_8_8_8_8,
+                            GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
                             pixels+(numStops-1));
     }
 }
@@ -613,25 +732,31 @@
 }
 
 void
-OGLPaints_EnableLinearGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
-                                    jboolean useMask, jboolean linear,
-                                    jint cycleMethod, jint numStops,
-                                    jfloat p0, jfloat p1, jfloat p3,
-                                    void *fractions, void *pixels)
+OGLPaints_SetLinearGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
+                                 jboolean useMask, jboolean linear,
+                                 jint cycleMethod, jint numStops,
+                                 jfloat p0, jfloat p1, jfloat p3,
+                                 void *fractions, void *pixels)
 {
     GLhandleARB linearGradProgram;
     GLint loc;
     jboolean large = (numStops > MAX_FRACTIONS_SMALL);
     jint flags = 0;
 
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_EnableLinearGradientPaint");
+    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_SetLinearGradientPaint");
 
     RETURN_IF_NULL(oglc);
     RETURN_IF_NULL(dstOps);
-    RESET_PREVIOUS_OP();
+    OGLPaints_ResetPaint(oglc);
 
     COMPOSE_FLAGS(flags, cycleMethod, large, useMask, linear);
 
+    if (useMask) {
+        // set up the paint on texture unit 1 (instead of the usual unit 0)
+        j2d_glActiveTextureARB(GL_TEXTURE1_ARB);
+    }
+    // no need to set GL_MODULATE here (it is ignored when shader is enabled)
+
     // locate/initialize the shader program for the given flags
     if (linearGradPrograms[flags] == 0) {
         linearGradPrograms[flags] = OGLPaints_CreateLinearGradProgram(flags);
@@ -643,28 +768,23 @@
     linearGradProgram = linearGradPrograms[flags];
 
     // update the common "uniform" values (fractions and colors)
-    OGLPaints_EnableMultiGradientPaint(linearGradProgram,
-                                       numStops, fractions, pixels);
+    OGLPaints_SetMultiGradientPaint(linearGradProgram,
+                                    numStops, fractions, pixels);
 
     // update the other "uniform" values
     loc = j2d_glGetUniformLocationARB(linearGradProgram, "params");
     j2d_glUniform3fARB(loc, p0, p1, p3);
     loc = j2d_glGetUniformLocationARB(linearGradProgram, "yoff");
     j2d_glUniform1fARB(loc, (GLfloat)(dstOps->yOffset + dstOps->height));
-}
-
-void
-OGLPaints_DisableLinearGradientPaint(OGLContext *oglc)
-{
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_DisableLinearGradientPaint");
 
-    RETURN_IF_NULL(oglc);
-    RESET_PREVIOUS_OP();
+    if (useMask) {
+        // restore control to texture unit 0
+        j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
+    }
 
-    // disable the LinearGradientPaint shader
-    j2d_glUseProgramObjectARB(0);
-
-    j2d_glDisable(GL_TEXTURE_1D);
+    // oglc->pixel has been set appropriately in OGLPaints_ResetPaint()
+    oglc->useMask = useMask;
+    oglc->paintState = sun_java2d_SunGraphics2D_PAINT_LIN_GRADIENT;
 }
 
 /********************** RadialGradientPaint support *************************/
@@ -719,7 +839,7 @@
      * The following code is derived from Daniel Rice's whitepaper on
      * radial gradient performance (attached to the bug report for 6521533).
      * Refer to that document as well as the setup code in the Java-level
-     * OGLPaints.RadialGradient.enablePaint() method for more details.
+     * BufferedPaints.setRadialGradientPaint() method for more details.
      */
     distCode =
         // note that gl_FragCoord is in window space relative to the
@@ -735,13 +855,13 @@
 }
 
 void
-OGLPaints_EnableRadialGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
-                                    jboolean useMask, jboolean linear,
-                                    jint cycleMethod, jint numStops,
-                                    jfloat m00, jfloat m01, jfloat m02,
-                                    jfloat m10, jfloat m11, jfloat m12,
-                                    jfloat focusX,
-                                    void *fractions, void *pixels)
+OGLPaints_SetRadialGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
+                                 jboolean useMask, jboolean linear,
+                                 jint cycleMethod, jint numStops,
+                                 jfloat m00, jfloat m01, jfloat m02,
+                                 jfloat m10, jfloat m11, jfloat m12,
+                                 jfloat focusX,
+                                 void *fractions, void *pixels)
 {
     GLhandleARB radialGradProgram;
     GLint loc;
@@ -749,14 +869,20 @@
     jboolean large = (numStops > MAX_FRACTIONS_SMALL);
     jint flags = 0;
 
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_EnableRadialGradientPaint");
+    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_SetRadialGradientPaint");
 
     RETURN_IF_NULL(oglc);
     RETURN_IF_NULL(dstOps);
-    RESET_PREVIOUS_OP();
+    OGLPaints_ResetPaint(oglc);
 
     COMPOSE_FLAGS(flags, cycleMethod, large, useMask, linear);
 
+    if (useMask) {
+        // set up the paint on texture unit 1 (instead of the usual unit 0)
+        j2d_glActiveTextureARB(GL_TEXTURE1_ARB);
+    }
+    // no need to set GL_MODULATE here (it is ignored when shader is enabled)
+
     // locate/initialize the shader program for the given flags
     if (radialGradPrograms[flags] == 0) {
         radialGradPrograms[flags] = OGLPaints_CreateRadialGradProgram(flags);
@@ -768,8 +894,8 @@
     radialGradProgram = radialGradPrograms[flags];
 
     // update the common "uniform" values (fractions and colors)
-    OGLPaints_EnableMultiGradientPaint(radialGradProgram,
-                                       numStops, fractions, pixels);
+    OGLPaints_SetMultiGradientPaint(radialGradProgram,
+                                    numStops, fractions, pixels);
 
     // update the other "uniform" values
     loc = j2d_glGetUniformLocationARB(radialGradProgram, "m0");
@@ -783,20 +909,15 @@
     inv_denom = 1.0f / denom;
     loc = j2d_glGetUniformLocationARB(radialGradProgram, "precalc");
     j2d_glUniform4fARB(loc, focusX, yoff, denom, inv_denom);
-}
-
-void
-OGLPaints_DisableRadialGradientPaint(OGLContext *oglc)
-{
-    J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_DisableRadialGradientPaint");
 
-    RETURN_IF_NULL(oglc);
-    RESET_PREVIOUS_OP();
+    if (useMask) {
+        // restore control to texture unit 0
+        j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
+    }
 
-    // disable the RadialGradientPaint shader
-    j2d_glUseProgramObjectARB(0);
-
-    j2d_glDisable(GL_TEXTURE_1D);
+    // oglc->pixel has been set appropriately in OGLPaints_ResetPaint()
+    oglc->useMask = useMask;
+    oglc->paintState = sun_java2d_SunGraphics2D_PAINT_RAD_GRADIENT;
 }
 
 #endif /* !HEADLESS */
--- a/j2se/src/share/native/sun/java2d/opengl/OGLPaints.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLPaints.h	Fri Jun 22 00:46:43 2007 +0000
@@ -24,7 +24,7 @@
  */
 
 /*
- * @(#)OGLPaints.h	1.4 07/05/05
+ * @(#)OGLPaints.h	1.5 07/05/11
  */
 
 #ifndef OGLPaints_h_Included
@@ -32,32 +32,33 @@
 
 #include "OGLContext.h"
 
-void OGLPaints_EnableGradientPaint(OGLContext *oglc,
-                                   jboolean cyclic,
-                                   jdouble p0, jdouble p1, jdouble p3,
-                                   jint pixel1, jint pixel2);
-void OGLPaints_DisableGradientPaint(OGLContext *oglc);
+void OGLPaints_ResetPaint(OGLContext *oglc);
+
+void OGLPaints_SetColor(OGLContext *oglc, jint pixel);
 
-void OGLPaints_EnableLinearGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
-                                         jboolean useMask, jboolean linear,
-                                         jint cycleMethod, jint numStops,
-                                         jfloat p0, jfloat p1, jfloat p3,
-                                         void *fractions, void *pixels);
-void OGLPaints_DisableLinearGradientPaint(OGLContext *oglc);
+void OGLPaints_SetGradientPaint(OGLContext *oglc,
+                                jboolean useMask, jboolean cyclic,
+                                jdouble p0, jdouble p1, jdouble p3,
+                                jint pixel1, jint pixel2);
 
-void OGLPaints_EnableRadialGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
-                                         jboolean useMask, jboolean linear,
-                                         jint cycleMethod, jint numStops,
-                                         jfloat m00, jfloat m01, jfloat m02,
-                                         jfloat m10, jfloat m11, jfloat m12,
-                                         jfloat focusX,
-                                         void *fractions, void *pixels);
-void OGLPaints_DisableRadialGradientPaint(OGLContext *oglc);
+void OGLPaints_SetLinearGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
+                                      jboolean useMask, jboolean linear,
+                                      jint cycleMethod, jint numStops,
+                                      jfloat p0, jfloat p1, jfloat p3,
+                                      void *fractions, void *pixels);
 
-void OGLPaints_EnableTexturePaint(OGLContext *oglc,
-                                  jlong pSrcOps, jboolean filter,
-                                  jdouble xp0, jdouble xp1, jdouble xp3,
-                                  jdouble yp0, jdouble yp1, jdouble yp3);
-void OGLPaints_DisableTexturePaint(OGLContext *oglc);
+void OGLPaints_SetRadialGradientPaint(OGLContext *oglc, OGLSDOps *dstOps,
+                                      jboolean useMask, jboolean linear,
+                                      jint cycleMethod, jint numStops,
+                                      jfloat m00, jfloat m01, jfloat m02,
+                                      jfloat m10, jfloat m11, jfloat m12,
+                                      jfloat focusX,
+                                      void *fractions, void *pixels);
+
+void OGLPaints_SetTexturePaint(OGLContext *oglc,
+                               jboolean useMask,
+                               jlong pSrcOps, jboolean filter,
+                               jdouble xp0, jdouble xp1, jdouble xp3,
+                               jdouble yp0, jdouble yp1, jdouble yp3);
 
 #endif /* OGLPaints_h_Included */
--- a/j2se/src/share/native/sun/java2d/opengl/OGLRenderQueue.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLRenderQueue.c	Fri Jun 22 00:46:43 2007 +0000
@@ -40,6 +40,7 @@
 #include "OGLRenderer.h"
 #include "OGLSurfaceData.h"
 #include "OGLTextRenderer.h"
+#include "OGLVertexCache.h"
 
 /**
  * Used to track whether we are in a series of a simple primitive operations
@@ -267,7 +268,6 @@
             break;
         case sun_java2d_pipe_BufferedOpCodes_MASK_FILL:
             {
-                jboolean isClr= NEXT_BOOLEAN(b);
                 jint x        = NEXT_INT(b);
                 jint y        = NEXT_INT(b);
                 jint w        = NEXT_INT(b);
@@ -275,8 +275,9 @@
                 jint maskoff  = NEXT_INT(b);
                 jint maskscan = NEXT_INT(b);
                 jint masklen  = NEXT_INT(b);
-                OGLMaskFill_MaskFill(oglc, isClr, x, y, w, h,
-                                     maskoff, maskscan, masklen, b);
+                unsigned char *pMask = (masklen > 0) ? b : NULL;
+                OGLMaskFill_MaskFill(oglc, x, y, w, h,
+                                     maskoff, maskscan, masklen, pMask);
                 SKIP_BYTES(b, masklen);
             }
             break;
@@ -301,12 +302,6 @@
             break;
 
         // state-related ops
-        case sun_java2d_pipe_BufferedOpCodes_SET_COLOR:
-            {
-                jint pixel = NEXT_INT(b);
-                OGLContext_SetColor(oglc, pixel);
-            }
-            break;
         case sun_java2d_pipe_BufferedOpCodes_SET_RECT_CLIP:
             {
                 jint x1 = NEXT_INT(b);
@@ -472,25 +467,32 @@
             break;
 
         // paint-related ops
-        case sun_java2d_pipe_BufferedOpCodes_ENABLE_GRADIENT_PAINT:
+        case sun_java2d_pipe_BufferedOpCodes_RESET_PAINT:
+            {
+                OGLPaints_ResetPaint(oglc);
+            }
+            break;
+        case sun_java2d_pipe_BufferedOpCodes_SET_COLOR:
             {
+                jint pixel = NEXT_INT(b);
+                OGLPaints_SetColor(oglc, pixel);
+            }
+            break;
+        case sun_java2d_pipe_BufferedOpCodes_SET_GRADIENT_PAINT:
+            {
+                jboolean useMask= NEXT_BOOLEAN(b);
                 jboolean cyclic = NEXT_BOOLEAN(b);
                 jdouble p0      = NEXT_DOUBLE(b);
                 jdouble p1      = NEXT_DOUBLE(b);
                 jdouble p3      = NEXT_DOUBLE(b);
                 jint pixel1     = NEXT_INT(b);
                 jint pixel2     = NEXT_INT(b);
-                OGLPaints_EnableGradientPaint(oglc, cyclic,
-                                              p0, p1, p3,
-                                              pixel1, pixel2);
+                OGLPaints_SetGradientPaint(oglc, useMask, cyclic,
+                                           p0, p1, p3,
+                                           pixel1, pixel2);
             }
             break;
-        case sun_java2d_pipe_BufferedOpCodes_DISABLE_GRADIENT_PAINT:
-            {
-                OGLPaints_DisableGradientPaint(oglc);
-            }
-            break;
-        case sun_java2d_pipe_BufferedOpCodes_ENABLE_LINEAR_GRADIENT_PAINT:
+        case sun_java2d_pipe_BufferedOpCodes_SET_LINEAR_GRADIENT_PAINT:
             {
                 jboolean useMask = NEXT_BOOLEAN(b);
                 jboolean linear  = NEXT_BOOLEAN(b);
@@ -502,19 +504,14 @@
                 void *fractions, *pixels;
                 fractions = b; SKIP_BYTES(b, numStops * sizeof(jfloat));
                 pixels    = b; SKIP_BYTES(b, numStops * sizeof(jint));
-                OGLPaints_EnableLinearGradientPaint(oglc, dstOps,
-                                                    useMask, linear,
-                                                    cycleMethod, numStops,
-                                                    p0, p1, p3,
-                                                    fractions, pixels);
+                OGLPaints_SetLinearGradientPaint(oglc, dstOps,
+                                                 useMask, linear,
+                                                 cycleMethod, numStops,
+                                                 p0, p1, p3,
+                                                 fractions, pixels);
             }
             break;
-        case sun_java2d_pipe_BufferedOpCodes_DISABLE_LINEAR_GRADIENT_PAINT:
-            {
-                OGLPaints_DisableLinearGradientPaint(oglc);
-            }
-            break;
-        case sun_java2d_pipe_BufferedOpCodes_ENABLE_RADIAL_GRADIENT_PAINT:
+        case sun_java2d_pipe_BufferedOpCodes_SET_RADIAL_GRADIENT_PAINT:
             {
                 jboolean useMask = NEXT_BOOLEAN(b);
                 jboolean linear  = NEXT_BOOLEAN(b);
@@ -530,22 +527,18 @@
                 void *fractions, *pixels;
                 fractions = b; SKIP_BYTES(b, numStops * sizeof(jfloat));
                 pixels    = b; SKIP_BYTES(b, numStops * sizeof(jint));
-                OGLPaints_EnableRadialGradientPaint(oglc, dstOps,
-                                                    useMask, linear,
-                                                    cycleMethod, numStops,
-                                                    m00, m01, m02,
-                                                    m10, m11, m12,
-                                                    focusX,
-                                                    fractions, pixels);
+                OGLPaints_SetRadialGradientPaint(oglc, dstOps,
+                                                 useMask, linear,
+                                                 cycleMethod, numStops,
+                                                 m00, m01, m02,
+                                                 m10, m11, m12,
+                                                 focusX,
+                                                 fractions, pixels);
             }
             break;
-        case sun_java2d_pipe_BufferedOpCodes_DISABLE_RADIAL_GRADIENT_PAINT:
+        case sun_java2d_pipe_BufferedOpCodes_SET_TEXTURE_PAINT:
             {
-                OGLPaints_DisableRadialGradientPaint(oglc);
-            }
-            break;
-        case sun_java2d_pipe_BufferedOpCodes_ENABLE_TEXTURE_PAINT:
-            {
+                jboolean useMask= NEXT_BOOLEAN(b);
                 jboolean filter = NEXT_BOOLEAN(b);
                 jlong pSrc      = NEXT_LONG(b);
                 jdouble xp0     = NEXT_DOUBLE(b);
@@ -554,14 +547,9 @@
                 jdouble yp0     = NEXT_DOUBLE(b);
                 jdouble yp1     = NEXT_DOUBLE(b);
                 jdouble yp3     = NEXT_DOUBLE(b);
-                OGLPaints_EnableTexturePaint(oglc, pSrc, filter,
-                                             xp0, xp1, xp3,
-                                             yp0, yp1, yp3);
-            }
-            break;
-        case sun_java2d_pipe_BufferedOpCodes_DISABLE_TEXTURE_PAINT:
-            {
-                OGLPaints_DisableTexturePaint(oglc);
+                OGLPaints_SetTexturePaint(oglc, useMask, pSrc, filter,
+                                          xp0, xp1, xp3,
+                                          yp0, yp1, yp3);
             }
             break;
 
@@ -677,9 +665,11 @@
  *
  *     OGL_STATE_RESET
  *     OGL_STATE_CHANGE
+ *     OGL_STATE_MASK_OP
+ *     OGL_STATE_GLYPH_OP
  *
  * Note that the above constants are guaranteed to be unique values.  The
- * last two are defined to be negative values to differentiate them from
+ * last few are defined to be negative values to differentiate them from
  * the core GL* constants, which are defined to be non-negative.
  *
  * For simple primitives, this method allows us to batch similar primitives
@@ -693,9 +683,9 @@
  *
  * For operations that involve texturing, this method helps us to avoid
  * calling glEnable(GL_TEXTURE_2D) and glDisable(GL_TEXTURE_2D) around each
- * operation.  For example, if we have an alternating series of MASK_FILL
- * and DRAW_GLYPH_LIST operations (both of which involve texturing), we need
- * only to call glEnable(GL_TEXTURE_2D) before the first MASK_FILL operation.
+ * operation.  For example, if we have an alternating series of ISO_BLIT
+ * and MASK_BLIT operations (both of which involve texturing), we need
+ * only to call glEnable(GL_TEXTURE_2D) before the first ISO_BLIT operation.
  * The glDisable(GL_TEXTURE_2D) call only needs to be issued before an
  * operation that cannot (or should not) happen while texturing is enabled
  * (e.g. a context change, or a simple primitive operation like GL_QUADS).
@@ -729,6 +719,12 @@
             j2d_glBindTexture(previousOp, 0);
         }
         break;
+    case OGL_STATE_MASK_OP:
+        OGLVertexCache_DisableMaskCache(oglc);
+        break;
+    case OGL_STATE_GLYPH_OP:
+        OGLTR_DisableGlyphVertexCache(oglc);
+        break;
     case OGL_STATE_RESET:
     case OGL_STATE_CHANGE:
         // No-op
@@ -750,6 +746,12 @@
         // We are starting a texturing operation, so enable texturing.
         j2d_glEnable(op);
         break;
+    case OGL_STATE_MASK_OP:
+        OGLVertexCache_EnableMaskCache(oglc);
+        break;
+    case OGL_STATE_GLYPH_OP:
+        OGLTR_EnableGlyphVertexCache(oglc);
+        break;
     case OGL_STATE_RESET:
     case OGL_STATE_CHANGE:
         // No-op
--- a/j2se/src/share/native/sun/java2d/opengl/OGLRenderQueue.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLRenderQueue.h	Fri Jun 22 00:46:43 2007 +0000
@@ -76,6 +76,20 @@
 #define OGL_STATE_CHANGE -2
 
 /*
+ * Parameter passed to the CHECK_PREVIOUS_OP() macro to indicate that the
+ * following operation represents an operation that uses an alpha mask,
+ * such as OGLMaskFill and OGLTR_DrawGrayscaleGlyphNoCache().
+ */
+#define OGL_STATE_MASK_OP -3
+
+/*
+ * Parameter passed to the CHECK_PREVIOUS_OP() macro to indicate that the
+ * following operation represents an operation that uses the glyph cache,
+ * such as OGLTR_DrawGrayscaleGlyphViaCache().
+ */
+#define OGL_STATE_GLYPH_OP -4
+
+/*
  * Initializes the "previous operation" state to its default value.
  */
 #define INIT_PREVIOUS_OP() previousOp = OGL_STATE_RESET
--- a/j2se/src/share/native/sun/java2d/opengl/OGLTextRenderer.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLTextRenderer.c	Fri Jun 22 00:46:43 2007 +0000
@@ -36,6 +36,7 @@
 #include "OGLSurfaceData.h"
 #include "OGLRenderQueue.h"
 #include "OGLTextRenderer.h"
+#include "OGLVertexCache.h"
 #include "AccelGlyphCache.h"
 #include "fontscalerdefs.h"
 
@@ -194,11 +195,17 @@
 
     J2dTraceLn(J2D_TRACE_INFO, "OGLTR_InitGlyphCache");
 
+    // init vertex cache (if it hasn't been already)
+    if (!OGLVertexCache_InitVertexCache()) {
+        return JNI_FALSE;
+    }
+
     // init glyph cache data structure
     gcinfo = AccelGlyphCache_Init(OGLTR_CACHE_WIDTH,
                                   OGLTR_CACHE_HEIGHT,
                                   OGLTR_CACHE_CELL_WIDTH,
-                                  OGLTR_CACHE_CELL_HEIGHT);
+                                  OGLTR_CACHE_CELL_HEIGHT,
+                                  OGLVertexCache_FlushVertexCache);
     if (gcinfo == NULL) {
         J2dRlsTraceLn(J2D_TRACE_ERROR,
                       "OGLTR_InitGlyphCache: could not init OGL glyph cache");
@@ -562,6 +569,42 @@
     return JNI_TRUE;
 }
 
+void
+OGLTR_EnableGlyphVertexCache(OGLContext *oglc)
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLTR_EnableGlyphVertexCache");
+
+    if (glyphCache == NULL) {
+        if (!OGLTR_InitGlyphCache(JNI_FALSE)) {
+            return;
+        }
+    }
+
+    j2d_glEnable(GL_TEXTURE_2D);
+    j2d_glBindTexture(GL_TEXTURE_2D, glyphCache->cacheID);
+    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+    // for grayscale/monochrome text, the current OpenGL source color
+    // is modulated with the glyph image as part of the texture
+    // application stage, so we use GL_MODULATE here
+    OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
+}
+
+void
+OGLTR_DisableGlyphVertexCache(OGLContext *oglc)
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLTR_DisableGlyphVertexCache");
+
+    OGLVertexCache_FlushVertexCache();
+    OGLVertexCache_RestoreColorState(oglc);
+
+    j2d_glDisable(GL_TEXTURE_2D);
+    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+    j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+    j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+    j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+}
+
 /**
  * Disables any pending state associated with the current "glyph mode".
  */
@@ -569,16 +612,6 @@
 OGLTR_DisableGlyphModeState()
 {
     switch (glyphMode) {
-    case MODE_NO_CACHE_GRAY:
-        j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
-        j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
-        j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-        break;
-
-    case MODE_USE_CACHE_GRAY:
-        j2d_glEnd();
-        break;
-
     case MODE_NO_CACHE_LCD:
         j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
         j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
@@ -586,6 +619,7 @@
 
     case MODE_USE_CACHE_LCD:
         j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+        j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
         j2d_glUseProgramObjectARB(0);
         j2d_glActiveTextureARB(GL_TEXTURE3_ARB);
         j2d_glDisable(GL_TEXTURE_3D);
@@ -596,6 +630,8 @@
         j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
         break;
 
+    case MODE_NO_CACHE_GRAY:
+    case MODE_USE_CACHE_GRAY:
     case MODE_NOT_INITED:
     default:
         break;
@@ -607,36 +643,18 @@
                                  GlyphInfo *ginfo, jint x, jint y)
 {
     CacheCellInfo *cell;
-    jint x1, y1, x2, y2;
+    jfloat x1, y1, x2, y2;
 
     if (glyphMode != MODE_USE_CACHE_GRAY) {
         OGLTR_DisableGlyphModeState();
-
-        if (glyphCache == NULL) {
-            if (!OGLTR_InitGlyphCache(JNI_FALSE)) {
-                return JNI_FALSE;
-            }
-        }
-
-        // for grayscale/monochrome text, the current OpenGL source color
-        // is modulated with the glyph image as part of the texture
-        // application stage, so we use GL_MODULATE here
-        OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
-
-        j2d_glBindTexture(GL_TEXTURE_2D, glyphCache->cacheID);
-        j2d_glBegin(GL_QUADS);
-
+        CHECK_PREVIOUS_OP(OGL_STATE_GLYPH_OP);
         glyphMode = MODE_USE_CACHE_GRAY;
     }
 
     if (ginfo->cellInfo == NULL) {
-        j2d_glEnd();
-
         // attempt to add glyph to accelerated glyph cache
         OGLTR_AddToGlyphCache(ginfo, JNI_FALSE);
 
-        j2d_glBegin(GL_QUADS);
-
         if (ginfo->cellInfo == NULL) {
             // we'll just no-op in the rare case that the cell is NULL
             return JNI_TRUE;
@@ -646,15 +664,15 @@
     cell = ginfo->cellInfo;
     cell->timesRendered++;
 
-    x1 = x;
-    y1 = y;
+    x1 = (jfloat)x;
+    y1 = (jfloat)y;
     x2 = x1 + ginfo->width;
     y2 = y1 + ginfo->height;
 
-    j2d_glTexCoord2f(cell->tx1, cell->ty1); j2d_glVertex2i(x1, y1);
-    j2d_glTexCoord2f(cell->tx2, cell->ty1); j2d_glVertex2i(x2, y1);
-    j2d_glTexCoord2f(cell->tx2, cell->ty2); j2d_glVertex2i(x2, y2);
-    j2d_glTexCoord2f(cell->tx1, cell->ty2); j2d_glVertex2i(x1, y2);
+    OGLVertexCache_AddGlyphQuad(oglc,
+                                cell->tx1, cell->ty1,
+                                cell->tx2, cell->ty2,
+                                x1, y1, x2, y2);
 
     return JNI_TRUE;
 }
@@ -803,6 +821,8 @@
 
     if (glyphMode != MODE_USE_CACHE_LCD) {
         OGLTR_DisableGlyphModeState();
+        CHECK_PREVIOUS_OP(GL_TEXTURE_2D);
+        j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 
         if (glyphCache == NULL) {
             if (!OGLTR_InitGlyphCache(JNI_TRUE)) {
@@ -887,7 +907,6 @@
 OGLTR_DrawGrayscaleGlyphNoCache(OGLContext *oglc,
                                 GlyphInfo *ginfo, jint x, jint y)
 {
-    GLfloat tx1, ty1, tx2, ty2;
     jint tw, th;
     jint sx, sy, sw, sh;
     jint x0;
@@ -896,28 +915,13 @@
 
     if (glyphMode != MODE_NO_CACHE_GRAY) {
         OGLTR_DisableGlyphModeState();
-
-        if (oglc->maskTextureID == 0) {
-            if (!OGLContext_InitMaskTileTexture(oglc)) {
-                return JNI_FALSE;
-            }
-        }
-        j2d_glBindTexture(GL_TEXTURE_2D, oglc->maskTextureID);
-
-        // for grayscale/monochrome text, the current OpenGL source color
-        // is modulated with the glyph image as part of the texture
-        // application stage, so we use GL_MODULATE here
-        OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
-
+        CHECK_PREVIOUS_OP(OGL_STATE_MASK_OP);
         glyphMode = MODE_NO_CACHE_GRAY;
     }
 
-    j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, w);
     x0 = x;
-    tx1 = 0.0f;
-    ty1 = 0.0f;
-    tw = OGLC_MASK_TILE_SIZE;
-    th = OGLC_MASK_TILE_SIZE;
+    tw = OGLVC_MASK_CACHE_TILE_WIDTH;
+    th = OGLVC_MASK_CACHE_TILE_HEIGHT;
 
     for (sy = 0; sy < h; sy += th, y += th) {
         x = x0;
@@ -926,27 +930,9 @@
         for (sx = 0; sx < w; sx += tw, x += tw) {
             sw = ((sx + tw) > w) ? (w - sx) : tw;
 
-            // update the source pointer offsets
-            j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, sx);
-            j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, sy);
-
-            // copy alpha mask into texture tile
-            j2d_glTexSubImage2D(GL_TEXTURE_2D, 0,
-                                0, 0, sw, sh,
-                                GL_LUMINANCE, GL_UNSIGNED_BYTE,
-                                ginfo->image);
-
-            // update the lower-right texture coordinates
-            tx2 = ((GLfloat)sw) / tw;
-            ty2 = ((GLfloat)sh) / th;
-
-            // render texture tile to the destination surface
-            j2d_glBegin(GL_QUADS);
-            j2d_glTexCoord2f(tx1, ty1); j2d_glVertex2i(x, y);
-            j2d_glTexCoord2f(tx2, ty1); j2d_glVertex2i(x + sw, y);
-            j2d_glTexCoord2f(tx2, ty2); j2d_glVertex2i(x + sw, y + sh);
-            j2d_glTexCoord2f(tx1, ty2); j2d_glVertex2i(x, y + sh);
-            j2d_glEnd();
+            OGLVertexCache_AddMaskQuad(oglc,
+                                       sx, sy, x, y, sw, sh,
+                                       w, ginfo->image);
         }
     }
 
@@ -970,6 +956,8 @@
 
     if (glyphMode != MODE_NO_CACHE_LCD) {
         OGLTR_DisableGlyphModeState();
+        CHECK_PREVIOUS_OP(GL_TEXTURE_2D);
+        j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 
         if (oglc->blitTextureID == 0) {
             if (!OGLContext_InitBlitTileTexture(oglc)) {
@@ -1081,9 +1069,6 @@
         RETURN_IF_NULL(positions);
     }
 
-    CHECK_PREVIOUS_OP(GL_TEXTURE_2D);
-    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
     glyphMode = MODE_NOT_INITED;
     isCachedDestValid = JNI_FALSE;
 
@@ -1167,7 +1152,6 @@
     }
 
     OGLTR_DisableGlyphModeState();
-    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
 }
 
 JNIEXPORT void JNICALL
--- a/j2se/src/share/native/sun/java2d/opengl/OGLTextRenderer.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLTextRenderer.h	Fri Jun 22 00:46:43 2007 +0000
@@ -28,21 +28,24 @@
 
 #include <jni.h>
 #include <jlong.h>
-#include "sun_java2d_opengl_OGLTextRenderer.h"
+#include "sun_java2d_pipe_BufferedTextPipe.h"
 #include "OGLContext.h"
 #include "OGLSurfaceData.h"
 
 #define BYTES_PER_GLYPH_IMAGE \
-    sun_java2d_opengl_OGLTextRenderer_BYTES_PER_GLYPH_IMAGE
+    sun_java2d_pipe_BufferedTextPipe_BYTES_PER_GLYPH_IMAGE
 #define BYTES_PER_GLYPH_POSITION \
-    sun_java2d_opengl_OGLTextRenderer_BYTES_PER_GLYPH_POSITION
+    sun_java2d_pipe_BufferedTextPipe_BYTES_PER_GLYPH_POSITION
 #define BYTES_PER_POSITIONED_GLYPH \
     (BYTES_PER_GLYPH_IMAGE + BYTES_PER_GLYPH_POSITION)
 
-#define OFFSET_CONTRAST  sun_java2d_opengl_OGLTextRenderer_OFFSET_CONTRAST
-#define OFFSET_RGBORDER  sun_java2d_opengl_OGLTextRenderer_OFFSET_RGBORDER
-#define OFFSET_SUBPIXPOS sun_java2d_opengl_OGLTextRenderer_OFFSET_SUBPIXPOS
-#define OFFSET_POSITIONS sun_java2d_opengl_OGLTextRenderer_OFFSET_POSITIONS
+#define OFFSET_CONTRAST  sun_java2d_pipe_BufferedTextPipe_OFFSET_CONTRAST
+#define OFFSET_RGBORDER  sun_java2d_pipe_BufferedTextPipe_OFFSET_RGBORDER
+#define OFFSET_SUBPIXPOS sun_java2d_pipe_BufferedTextPipe_OFFSET_SUBPIXPOS
+#define OFFSET_POSITIONS sun_java2d_pipe_BufferedTextPipe_OFFSET_POSITIONS
+
+void OGLTR_EnableGlyphVertexCache(OGLContext *oglc);
+void OGLTR_DisableGlyphVertexCache(OGLContext *oglc);
 
 void OGLTR_DrawGlyphList(JNIEnv *env, OGLContext *oglc, OGLSDOps *dstOps,
                          jint totalGlyphs, jboolean usePositions,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLVertexCache.c	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#ifndef HEADLESS
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "sun_java2d_SunGraphics2D.h"
+
+#include "OGLPaints.h"
+#include "OGLVertexCache.h"
+
+typedef struct _J2DVertex {
+    jfloat tx, ty;
+    jubyte r, g, b, a;
+    jfloat dx, dy;
+} J2DVertex;
+
+static J2DVertex *vertexCache = NULL;
+static jint vertexCacheIndex = 0;
+
+static GLuint maskCacheTexID = 0;
+static jint maskCacheIndex = 0;
+
+#define OGLVC_ADD_VERTEX(TX, TY, R, G, B, A, DX, DY) \
+    do { \
+        J2DVertex *v = &vertexCache[vertexCacheIndex++]; \
+        v->tx = TX; \
+        v->ty = TY; \
+        v->r  = R;  \
+        v->g  = G;  \
+        v->b  = B;  \
+        v->a  = A;  \
+        v->dx = DX; \
+        v->dy = DY; \
+    } while (0)
+
+#define OGLVC_ADD_QUAD(TX1, TY1, TX2, TY2, DX1, DY1, DX2, DY2, R, G, B, A) \
+    do { \
+        OGLVC_ADD_VERTEX(TX1, TY1, R, G, B, A, DX1, DY1); \
+        OGLVC_ADD_VERTEX(TX2, TY1, R, G, B, A, DX2, DY1); \
+        OGLVC_ADD_VERTEX(TX2, TY2, R, G, B, A, DX2, DY2); \
+        OGLVC_ADD_VERTEX(TX1, TY2, R, G, B, A, DX1, DY2); \
+    } while (0)
+
+jboolean
+OGLVertexCache_InitVertexCache()
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLVertexCache_InitVertexCache");
+
+    if (vertexCache != NULL) {
+        return JNI_TRUE;
+    }
+
+    vertexCache = (J2DVertex *)malloc(OGLVC_MAX_INDEX * sizeof(J2DVertex));
+    if (vertexCache == NULL) {
+        return JNI_FALSE;
+    }
+
+    j2d_glTexCoordPointer(2, GL_FLOAT,
+                          sizeof(J2DVertex), vertexCache);
+    j2d_glColorPointer(4, GL_UNSIGNED_BYTE,
+                       sizeof(J2DVertex), ((jfloat *)vertexCache) + 2);
+    j2d_glVertexPointer(2, GL_FLOAT,
+                        sizeof(J2DVertex), ((jfloat *)vertexCache) + 3);
+
+    j2d_glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    j2d_glEnableClientState(GL_COLOR_ARRAY);
+    j2d_glEnableClientState(GL_VERTEX_ARRAY);
+
+    return JNI_TRUE;
+}
+
+void
+OGLVertexCache_FlushVertexCache()
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLVertexCache_FlushVertexCache");
+
+    if (vertexCacheIndex > 0) {
+        j2d_glDrawArrays(GL_QUADS, 0, vertexCacheIndex);
+    }
+    vertexCacheIndex = 0;
+}
+
+/**
+ * This method is somewhat hacky, but necessary for the foreseeable future.
+ * The problem is the way OpenGL handles color values in vertex arrays.  When
+ * a vertex in a vertex array contains a color, and then the vertex array
+ * is rendered via glDrawArrays(), the global OpenGL color state is actually
+ * modified each time a vertex is rendered.  This means that after all
+ * vertices have been flushed, the global OpenGL color state will be set to
+ * the color of the most recently rendered element in the vertex array.
+ *
+ * The reason this is a problem for us is that we do not want to flush the
+ * vertex array (in the case of mask/glyph operations) or issue a glEnd()
+ * (in the case of non-antialiased primitives) everytime the current color
+ * changes, which would defeat any benefit from batching in the first place.
+ * We handle this in practice by not calling CHECK/RESET_PREVIOUS_OP() when
+ * the simple color state is changing in OGLPaints_SetColor().  This is
+ * problematic for vertex caching because we may end up with the following
+ * situation, for example:
+ *   SET_COLOR (orange)
+ *   MASK_FILL
+ *   MASK_FILL
+ *   SET_COLOR (blue; remember, this won't cause a flush)
+ *   FILL_RECT (this will cause the vertex array to be flushed)
+ *
+ * In this case, we would actually end up rendering an orange FILL_RECT,
+ * not a blue one as intended, because flushing the vertex cache flush would
+ * override the color state from the most recent SET_COLOR call.
+ *
+ * Long story short, the easiest way to resolve this problem is to call
+ * this method just after disabling the mask/glyph cache, which will ensure
+ * that the appropriate color state is restored.
+ */
+void
+OGLVertexCache_RestoreColorState(OGLContext *oglc)
+{
+    if (oglc->paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR) {
+        OGLPaints_SetColor(oglc, oglc->pixel);
+    }
+}
+
+static jboolean
+OGLVertexCache_InitMaskCache()
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLVertexCache_InitMaskCache");
+
+    if (!OGLVertexCache_InitVertexCache()) {
+        return JNI_FALSE;
+    }
+
+    maskCacheTexID =
+        OGLContext_CreateBlitTexture(GL_INTENSITY8, GL_LUMINANCE,
+                                     OGLVC_MASK_CACHE_WIDTH_IN_TEXELS,
+                                     OGLVC_MASK_CACHE_HEIGHT_IN_TEXELS);
+
+    // init special fully opaque tile in the upper-right corner of
+    // the mask cache texture
+    {
+        GLubyte allOnes[OGLVC_MASK_CACHE_TILE_SIZE];
+        memset(allOnes, 0xff, OGLVC_MASK_CACHE_TILE_SIZE);
+        j2d_glTexSubImage2D(GL_TEXTURE_2D, 0,
+                            OGLVC_MASK_CACHE_SPECIAL_TILE_X,
+                            OGLVC_MASK_CACHE_SPECIAL_TILE_Y,
+                            OGLVC_MASK_CACHE_TILE_WIDTH,
+                            OGLVC_MASK_CACHE_TILE_HEIGHT,
+                            GL_LUMINANCE, GL_UNSIGNED_BYTE, allOnes);        
+    }
+
+    return JNI_TRUE;
+}
+
+void
+OGLVertexCache_EnableMaskCache(OGLContext *oglc)
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLVertexCache_EnableMaskCache");
+
+    if (maskCacheTexID == 0) {
+        if (!OGLVertexCache_InitMaskCache()) {
+            return;
+        }
+    }
+
+    j2d_glEnable(GL_TEXTURE_2D);
+    j2d_glBindTexture(GL_TEXTURE_2D, maskCacheTexID);
+    OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE);
+    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+}
+
+void
+OGLVertexCache_DisableMaskCache(OGLContext *oglc)
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLVertexCache_DisableMaskCache");
+
+    OGLVertexCache_FlushVertexCache();
+    OGLVertexCache_RestoreColorState(oglc);
+
+    j2d_glDisable(GL_TEXTURE_2D);
+    j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+    j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+    j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+    j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+
+    maskCacheIndex = 0;
+}
+
+void
+OGLVertexCache_AddMaskQuad(OGLContext *oglc,
+                           jint srcx, jint srcy,
+                           jint dstx, jint dsty,
+                           jint width, jint height,
+                           jint maskscan, void *mask)
+{
+    jfloat tx1, ty1, tx2, ty2;
+    jfloat dx1, dy1, dx2, dy2;
+
+    J2dTraceLn1(J2D_TRACE_INFO, "OGLVertexCache_AddMaskQuad: %d",
+                maskCacheIndex);
+
+    if (maskCacheIndex >= OGLVC_MASK_CACHE_MAX_INDEX ||
+        vertexCacheIndex >= OGLVC_MAX_INDEX)
+    {
+        OGLVertexCache_FlushVertexCache();
+        maskCacheIndex = 0;
+    }
+
+    if (mask != NULL) {
+        jint texx = OGLVC_MASK_CACHE_TILE_WIDTH *
+            (maskCacheIndex % OGLVC_MASK_CACHE_WIDTH_IN_TILES);
+        jint texy = OGLVC_MASK_CACHE_TILE_HEIGHT *
+            (maskCacheIndex / OGLVC_MASK_CACHE_WIDTH_IN_TILES);
+
+        // update the source pointer offsets
+        j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, srcx);
+        j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, srcy);
+        j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, maskscan);
+
+        // copy alpha mask into texture tile
+        j2d_glTexSubImage2D(GL_TEXTURE_2D, 0,
+                            texx, texy, width, height,
+                            GL_LUMINANCE, GL_UNSIGNED_BYTE, mask);
+
+        tx1 = ((jfloat)texx) / OGLVC_MASK_CACHE_WIDTH_IN_TEXELS;
+        ty1 = ((jfloat)texy) / OGLVC_MASK_CACHE_HEIGHT_IN_TEXELS;
+
+        maskCacheIndex++;
+    } else {
+        // use special fully opaque tile
+        tx1 = ((jfloat)OGLVC_MASK_CACHE_SPECIAL_TILE_X) /
+            OGLVC_MASK_CACHE_WIDTH_IN_TEXELS;
+        ty1 = ((jfloat)OGLVC_MASK_CACHE_SPECIAL_TILE_Y) /
+            OGLVC_MASK_CACHE_HEIGHT_IN_TEXELS;
+    }
+
+    tx2 = tx1 + (((jfloat)width) / OGLVC_MASK_CACHE_WIDTH_IN_TEXELS);
+    ty2 = ty1 + (((jfloat)height) / OGLVC_MASK_CACHE_HEIGHT_IN_TEXELS);
+
+    dx1 = (jfloat)dstx;
+    dy1 = (jfloat)dsty;
+    dx2 = dx1 + width;
+    dy2 = dy1 + height;
+
+    OGLVC_ADD_QUAD(tx1, ty1, tx2, ty2,
+                   dx1, dy1, dx2, dy2,
+                   oglc->r, oglc->g, oglc->b, oglc->a);
+}
+
+void
+OGLVertexCache_AddGlyphQuad(OGLContext *oglc,
+                            jfloat tx1, jfloat ty1, jfloat tx2, jfloat ty2,
+                            jfloat dx1, jfloat dy1, jfloat dx2, jfloat dy2)
+{
+    J2dTraceLn(J2D_TRACE_INFO, "OGLVertexCache_AddGlyphQuad");
+
+    if (vertexCacheIndex >= OGLVC_MAX_INDEX) {
+        OGLVertexCache_FlushVertexCache();
+    }
+
+    OGLVC_ADD_QUAD(tx1, ty1, tx2, ty2,
+                   dx1, dy1, dx2, dy2,
+                   oglc->r, oglc->g, oglc->b, oglc->a);
+}
+
+#endif /* !HEADLESS */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/native/sun/java2d/opengl/OGLVertexCache.h	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#ifndef OGLVertexCache_h_Included
+#define OGLVertexCache_h_Included
+
+#include "j2d_md.h"
+#include "OGLContext.h"
+
+/**
+ * Constants that control the size of the vertex cache.
+ */
+#define OGLVC_MAX_INDEX         1024
+
+/**
+ * Constants that control the size of the texture tile cache used for
+ * mask operations.
+ */
+#define OGLVC_MASK_CACHE_TILE_WIDTH       32
+#define OGLVC_MASK_CACHE_TILE_HEIGHT      32
+#define OGLVC_MASK_CACHE_TILE_SIZE \
+   (OGLVC_MASK_CACHE_TILE_WIDTH * OGLVC_MASK_CACHE_TILE_HEIGHT)
+
+#define OGLVC_MASK_CACHE_WIDTH_IN_TILES   8
+#define OGLVC_MASK_CACHE_HEIGHT_IN_TILES  4
+
+#define OGLVC_MASK_CACHE_WIDTH_IN_TEXELS \
+   (OGLVC_MASK_CACHE_TILE_WIDTH * OGLVC_MASK_CACHE_WIDTH_IN_TILES)
+#define OGLVC_MASK_CACHE_HEIGHT_IN_TEXELS \
+   (OGLVC_MASK_CACHE_TILE_HEIGHT * OGLVC_MASK_CACHE_HEIGHT_IN_TILES)
+
+/*
+ * We reserve one (fully opaque) tile in the upper-right corner for
+ * operations where the mask is null.
+ */
+#define OGLVC_MASK_CACHE_MAX_INDEX \
+   ((OGLVC_MASK_CACHE_WIDTH_IN_TILES * OGLVC_MASK_CACHE_HEIGHT_IN_TILES) - 1)
+#define OGLVC_MASK_CACHE_SPECIAL_TILE_X \
+   (OGLVC_MASK_CACHE_WIDTH_IN_TEXELS - OGLVC_MASK_CACHE_TILE_WIDTH)
+#define OGLVC_MASK_CACHE_SPECIAL_TILE_Y \
+   (OGLVC_MASK_CACHE_HEIGHT_IN_TEXELS - OGLVC_MASK_CACHE_TILE_HEIGHT)
+
+/**
+ * Exported methods.
+ */
+jboolean OGLVertexCache_InitVertexCache();
+void OGLVertexCache_FlushVertexCache();
+void OGLVertexCache_RestoreColorState(OGLContext *oglc);
+
+void OGLVertexCache_EnableMaskCache(OGLContext *oglc);
+void OGLVertexCache_DisableMaskCache(OGLContext *oglc);
+void OGLVertexCache_AddMaskQuad(OGLContext *oglc,
+                                jint srcx, jint srcy,
+                                jint dstx, jint dsty,
+                                jint width, jint height,
+                                jint maskscan, void *mask);
+
+void OGLVertexCache_AddGlyphQuad(OGLContext *oglc,
+                                 jfloat tx1, jfloat ty1,
+                                 jfloat tx2, jfloat ty2,
+                                 jfloat dx1, jfloat dy1,
+                                 jfloat dx2, jfloat dy2);
+
+#endif /* OGLVertexCache_h_Included */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/src/share/native/sun/java2d/pipe/PathConsumer2D.h	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#ifndef _Included_PathConsumer2D
+#define _Included_PathConsumer2D
+
+/* For forward referencing - struct defined below. */
+struct _PathConsumerVec;
+
+/*
+ * Note on Error Conditions:
+ * The following functions all return true on an error condition which
+ * precludes any further processing.  The module calling these functions
+ * should cease the operation and invoke its own error handling.
+ * The return value is the only indication of the error, no exceptions
+ * should be thrown by the consumer - the caller is solely responsible
+ * for reporting the error/exception.
+ * The most common cause of failure is an allocation failure so a
+ * true return code could be reported as an "out of memory" error
+ * if so desired.
+ * No cleanup of the native consumer is required upon either a successful
+ * completion of the path or upon an error return.  Such cleanup will
+ * be handled elsewhere via other mechanisms (finalization, try/finally,
+ * etc.)
+ */
+
+/* See GeneralPath.moveTo - returns true on error condition. */
+typedef jboolean (MoveToFunc)(struct _PathConsumerVec *pVec,
+                              jfloat x0, jfloat y0);
+/* See GeneralPath.lineTo - returns true on error condition. */
+typedef jboolean (LineToFunc)(struct _PathConsumerVec *pVec,
+                              jfloat x1, jfloat y1);
+/* See GeneralPath.quadTo - returns true on error condition. */
+typedef jboolean (QuadToFunc)(struct _PathConsumerVec *pVec,
+                              jfloat xm, jfloat ym,
+                              jfloat x1, jfloat y1);
+/* See GeneralPath.curveTo - returns true on error condition. */
+typedef jboolean (CubicToFunc)(struct _PathConsumerVec *pVec,
+                               jfloat xm0, jfloat ym0,
+                               jfloat xm1, jfloat ym1,
+                               jfloat x1, jfloat y1);
+/* See GeneralPath.closePath - returns true on error condition. */
+typedef jboolean (ClosePathFunc)(struct _PathConsumerVec *pVec);
+
+/*
+ * This function must be called after the last segment of the last
+ * subpath is sent to the above methods.  No further calls should
+ * be made to any of the PathConsumerVec functions subsequently.
+ */
+typedef jboolean (PathDoneFunc)(struct _PathConsumerVec *pVec);
+
+/*
+ * This structure defines the list of function pointers for implementations
+ * of the above specified functions.  A pointer to this structure is also
+ * handed to each function as its first parameter.  If the implementation
+ * needs private context-specific data then it can be stored adjacent to
+ * the PathConsumerVec structure in the same allocated storage.
+ */
+typedef struct _PathConsumerVec {
+    MoveToFunc     *moveTo;
+    LineToFunc     *lineTo;
+    QuadToFunc     *quadTo;
+    CubicToFunc    *cubicTo;
+    ClosePathFunc  *closePath;
+    PathDoneFunc   *pathDone;
+} PathConsumerVec;
+
+#endif
--- a/j2se/src/share/native/sun/java2d/pipe/ShapeSpanIterator.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/native/sun/java2d/pipe/ShapeSpanIterator.c	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,8 +33,7 @@
 
 #include "j2d_md.h"
 
-#include "doe.h"
-#include "dcPathConsumer.h"
+#include "PathConsumer2D.h"
 #include "SpanIterator.h"
 
 #include "sun_java2d_pipe_ShapeSpanIterator.h"
@@ -62,7 +61,7 @@
  * the entire span list of a single Shape object.
  */
 typedef struct {
-    dcPathConsumerFace *consumer;	/* Ductus Path Consumer Interface */
+    PathConsumerVec funcs;      /* Native PathConsumer function vector */
 
     char state;			/* Path delivery sequence state */
     char evenodd;		/* non-zero if path has EvenOdd winding rule */
@@ -140,47 +139,12 @@
     ShapeSISkipDownTo
 };
 
-static void DCBeginPath(doeE, dcPathConsumer);
-static void DCBeginSubpath(doeE, dcPathConsumer,
-			   f32 x0, f32 y0);
-static void DCAppendLine(doeE, dcPathConsumer,
-			 f32 x1, f32 y1);
-static void DCAppendQuadratic(doeE, dcPathConsumer,
-			      f32 x1, f32 y1,
-			      f32 x2, f32 y2);
-static void DCAppendCubic(doeE, dcPathConsumer,
-			  f32 x1, f32 y1,
-			  f32 x2, f32 y2,
-			  f32 x3, f32 y3);
-static void DCClosedSubpath(doeE, dcPathConsumer);
-static void DCEndPath(doeE, dcPathConsumer);
-static void DCUseProxy(doeE, dcPathConsumer,
-		       dcFastPathProducer proxy);
-
-static dcPathConsumerFace dcShapeSpanIteratorClass = {
-    {
-	sizeof(dcShapeSpanIteratorClass),
-	
-	/*
-	 * NB: We never use the Ductus "Doe" utilities to maintain our "class"
-	 * so apparently we don't need these functions...
-	 */
-	0, /* className, */
-	0, /* copy, */
-	0, /* _cleanup, */
-	0, /* _enumCoObs, */
-	0 /* doeObject_uproot, */
-    },
-
-    DCBeginPath,
-    DCBeginSubpath,
-    DCAppendLine,
-    DCAppendQuadratic,
-    DCAppendCubic,
-    DCClosedSubpath,
-    DCEndPath,
-    DCUseProxy,
-};
+static LineToFunc PCLineTo;
+static MoveToFunc PCMoveTo;
+static QuadToFunc PCQuadTo;
+static CubicToFunc PCCubicTo;
+static ClosePathFunc PCClosePath;
+static PathDoneFunc PCPathDone;
 
 #define PDBOXPOINT(pd, x, y)					\
     do {							\
@@ -368,8 +332,13 @@
     if (pd == NULL) {
 	JNU_ThrowOutOfMemoryError(env, "private data");
     } else {
-	/* Initialize Ductus object header */
-	pd->consumer = &dcShapeSpanIteratorClass;
+	/* Initialize PathConsumer2D struct header */
+        pd->funcs.moveTo = PCMoveTo;
+        pd->funcs.lineTo = PCLineTo;
+        pd->funcs.quadTo = PCQuadTo;
+        pd->funcs.cubicTo = PCCubicTo;
+        pd->funcs.closePath = PCClosePath;
+        pd->funcs.pathDone = PCPathDone;
 
 	/* Initialize ShapeSpanIterator fields */
 	pd->first = 1;
@@ -587,21 +556,6 @@
     (*env)->SetLongField(env, sr, pSpanDataID, jlong_zero);
 }
 
-JNIEXPORT void JNICALL
-Java_sun_java2d_pipe_ShapeSpanIterator_beginSubpath
-    (JNIEnv *env, jobject sr, jfloat x0, jfloat y0)
-{
-    pathData *pd;
-
-    pd = GetSpanData(env, sr, STATE_HAVE_RULE, STATE_HAVE_RULE);
-    if (pd == NULL) {
-	return;
-    }
-
-    HANDLEMOVETO(pd, x0, y0,
-		 {JNU_ThrowOutOfMemoryError(env, "path segment data");});
-}
-
 #define OUT_XLO 1
 #define OUT_XHI 2
 #define OUT_YLO 4
@@ -715,7 +669,22 @@
 }
 
 JNIEXPORT void JNICALL
-Java_sun_java2d_pipe_ShapeSpanIterator_appendLine
+Java_sun_java2d_pipe_ShapeSpanIterator_moveTo
+    (JNIEnv *env, jobject sr, jfloat x0, jfloat y0)
+{
+    pathData *pd;
+
+    pd = GetSpanData(env, sr, STATE_HAVE_RULE, STATE_HAVE_RULE);
+    if (pd == NULL) {
+	return;
+    }
+
+    HANDLEMOVETO(pd, x0, y0,
+		 {JNU_ThrowOutOfMemoryError(env, "path segment data");});
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_pipe_ShapeSpanIterator_lineTo
     (JNIEnv *env, jobject sr, jfloat x1, jfloat y1)
 {
     pathData *pd;
@@ -730,7 +699,7 @@
 }
 
 JNIEXPORT void JNICALL
-Java_sun_java2d_pipe_ShapeSpanIterator_appendQuadratic
+Java_sun_java2d_pipe_ShapeSpanIterator_quadTo
     (JNIEnv *env, jobject sr,
      jfloat xm, jfloat ym, jfloat x1, jfloat y1)
 {
@@ -746,7 +715,7 @@
 }
 
 JNIEXPORT void JNICALL
-Java_sun_java2d_pipe_ShapeSpanIterator_appendCubic
+Java_sun_java2d_pipe_ShapeSpanIterator_curveTo
     (JNIEnv *env, jobject sr,
      jfloat xm, jfloat ym,
      jfloat xn, jfloat yn,
@@ -764,7 +733,21 @@
 }
 
 JNIEXPORT void JNICALL
-Java_sun_java2d_pipe_ShapeSpanIterator_endPath
+Java_sun_java2d_pipe_ShapeSpanIterator_closePath
+    (JNIEnv *env, jobject sr)
+{
+    pathData *pd;
+
+    pd = GetSpanData(env, sr, STATE_HAVE_RULE, STATE_HAVE_RULE);
+    if (pd == NULL) {
+	return;
+    }
+
+    HANDLECLOSE(pd, {JNU_ThrowOutOfMemoryError(env, "path segment data");});
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_pipe_ShapeSpanIterator_pathDone
     (JNIEnv *env, jobject sr)
 {
     pathData *pd;
@@ -778,83 +761,89 @@
 }
 
 JNIEXPORT jlong JNICALL
-Java_sun_java2d_pipe_ShapeSpanIterator_getCPathConsumer
+Java_sun_java2d_pipe_ShapeSpanIterator_getNativeConsumer
     (JNIEnv *env, jobject sr)
 {
     pathData *pd = GetSpanData(env, sr, STATE_HAVE_RULE, STATE_HAVE_RULE);
-    dcPathConsumer consumer;
 
     if (pd == NULL) {
 	return jlong_zero;
     }
 
-    consumer = &pd->consumer;
-    return ptr_to_jlong(consumer);
+    return ptr_to_jlong(&(pd->funcs));
 }
 
-static void
-DCBeginPath(doeE denv, dcPathConsumer consumer)
-{
-}
-
-static void
-DCBeginSubpath(doeE denv, dcPathConsumer consumer,
-	       f32 x0, f32 y0)
+static jboolean
+PCMoveTo(PathConsumerVec *consumer,
+         jfloat x0, jfloat y0)
 {
     pathData *pd = (pathData *) consumer;
+    jboolean oom = JNI_FALSE;
 
-    HANDLEMOVETO(pd, x0, y0, {doeError_setNoMemory(denv);});
+    HANDLEMOVETO(pd, x0, y0, {oom = JNI_TRUE;});
+
+    return oom;
 }
 
-static void
-DCAppendLine(doeE denv, dcPathConsumer consumer,
-	     f32 x1, f32 y1)
+static jboolean
+PCLineTo(PathConsumerVec *consumer,
+         jfloat x1, jfloat y1)
 {
     pathData *pd = (pathData *) consumer;
+    jboolean oom = JNI_FALSE;
 
-    HANDLELINETO(pd, x1, y1, {doeError_setNoMemory(denv);});
+    HANDLELINETO(pd, x1, y1, {oom = JNI_TRUE;});
+    
+    return oom;
 }
 
-static void
-DCAppendQuadratic(doeE denv, dcPathConsumer consumer,
-		  f32 x1, f32 y1,
-		  f32 x2, f32 y2)
+static jboolean
+PCQuadTo(PathConsumerVec *consumer,
+         jfloat x1, jfloat y1,
+         jfloat x2, jfloat y2)
 {
     pathData *pd = (pathData *) consumer;
+    jboolean oom = JNI_FALSE;
 
-    HANDLEQUADTO(pd, x1, y1, x2, y2, {doeError_setNoMemory(denv);});
+    HANDLEQUADTO(pd, x1, y1, x2, y2, {oom = JNI_TRUE;});
+    
+    return oom;
 }
 
-static void
-DCAppendCubic(doeE denv, dcPathConsumer consumer,
-	      f32 x1, f32 y1,
-	      f32 x2, f32 y2,
-	      f32 x3, f32 y3)
+static jboolean
+PCCubicTo(PathConsumerVec *consumer,
+          jfloat x1, jfloat y1,
+          jfloat x2, jfloat y2,
+          jfloat x3, jfloat y3)
 {
     pathData *pd = (pathData *) consumer;
+    jboolean oom = JNI_FALSE;
 
-    HANDLECUBICTO(pd, x1, y1, x2, y2, x3, y3, {doeError_setNoMemory(denv);});
+    HANDLECUBICTO(pd, x1, y1, x2, y2, x3, y3, {oom = JNI_TRUE;});
+    
+    return oom;
 }
 
-static void
-DCClosedSubpath(doeE denv, dcPathConsumer consumer)
-{
-}
-
-static void
-DCEndPath(doeE denv, dcPathConsumer consumer)
+static jboolean
+PCClosePath(PathConsumerVec *consumer)
 {
     pathData *pd = (pathData *) consumer;
+    jboolean oom = JNI_FALSE;
 
-    HANDLEENDPATH(pd, {doeError_setNoMemory(denv);});
+    HANDLECLOSE(pd, {oom = JNI_TRUE;});
+    
+    return oom;
 }
 
-static void
-DCUseProxy(doeE denv, dcPathConsumer consumer,
-	   dcFastPathProducer proxy)
+static jboolean
+PCPathDone(PathConsumerVec *consumer)
 {
-    /* According to dcPathFiller.c: */
-    /* impossible */
+    pathData *pd = (pathData *) consumer;
+    jboolean oom = JNI_FALSE;
+
+    HANDLEENDPATH(pd, {oom = JNI_TRUE;});
+    
+    return oom;
 }
 
 /*
--- a/j2se/src/share/opensource/javac/Makefile	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/opensource/javac/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -119,9 +119,7 @@
         $(SRC_CLASSES)/com/sun/tools/javac \
 	\( $(SCM_DIRS) -o -name \*-template.\* \) -prune -o -name \*.java -print )
 
-JAVAC_SRCS += $(GENSRCDIR)/com/sun/tools/javac/resources/version.java
-
-JAVAC_RESOURCES = $(shell ls $(SRC_CLASSES)/com/sun/tools/javac/resources/*.properties)
+JAVAC_RESOURCES = $(shell ls $(SRC_CLASSES)/com/sun/tools/javac/resources/*.properties | $(SED) -e 's/-template//' )
 
 
 #--------------------------------------------------------------------------------
@@ -140,12 +138,11 @@
 
 $(DIST_JAVAC)/lib/javac.jar: \
 		$(JAVAC_SRCS) \
+		$(patsubst $(SRC_CLASSES)/%,$(BUILD_BOOTCLASSES)/%,$(JAVAC_RESOURCES)) \
 		$(patsubst $(SRC_CLASSES)/%,$(BUILD_CLASSES)/%,$(JAVAC_RESOURCES)) 
 	@$(ECHO) $(JAVAC_SRCS) > $(BUILD_JAVAC_SRCFILES)
-	$(MKDIR) -p $(BUILD_BOOTCLASSES)
 	$(JAVAC) -d $(BUILD_BOOTCLASSES) -source $(COMPILER_SOURCE_LEVEL) -g:source,lines @$(BUILD_JAVAC_SRCFILES)
-	$(MKDIR) -p $(BUILD_CLASSES)
-	$(JAVA) -cp $(BUILD_BOOTCLASSES):$(SRC_CLASSES) com.sun.tools.javac.Main \
+	$(JAVA) -cp $(BUILD_BOOTCLASSES) com.sun.tools.javac.Main \
 		-d $(BUILD_CLASSES) -g:source,lines @$(BUILD_JAVAC_SRCFILES)
 	( $(ECHO) "Main-Class: com.sun.tools.javac.Main" ; \
 	  $(ECHO) "Built-By: $$USER" ; \
@@ -156,14 +153,20 @@
 
 # javac resources
 
-$(GENSRCDIR)/com/sun/tools/javac/resources/version.java: \
-		$(SRC_CLASSES)/com/sun/tools/javac/resources/version-template.java
+$(BUILD_BOOTCLASSES)/com/sun/tools/javac/resources/version.properties \
+$(BUILD_CLASSES)/com/sun/tools/javac/resources/version.properties: \
+		$(SRC_CLASSES)/com/sun/tools/javac/resources/version-template.properties
 	$(MKDIR) -p $(@D)
 	$(SED) 	-e 's/$$(JDK_VERSION)/$(JDK_VERSION)/'  \
 		-e 's/$$(FULL_VERSION)/$(FULL_VERSION)/' \
 		-e 's/$$(RELEASE)/$(RELEASE)/' \
 		< $< > $@
 
+$(BUILD_BOOTCLASSES)/com/sun/tools/javac/resources/%.properties: \
+		$(SRC_CLASSES)/com/sun/tools/javac/resources/%.properties
+	$(MKDIR) -p $(@D)
+	$(CP) $^ $@
+
 $(BUILD_CLASSES)/com/sun/tools/javac/resources/%.properties: \
 		$(SRC_CLASSES)/com/sun/tools/javac/resources/%.properties
 	$(MKDIR) -p $(@D)
--- a/j2se/src/share/opensource/javac/build.xml	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/share/opensource/javac/build.xml	Fri Jun 22 00:46:43 2007 +0000
@@ -30,7 +30,6 @@
     <property name="build" value ="build"/>
     <property name="build.bootclasses" value="${build}/bootclasses"/>
     <property name="build.classes" value="${build}/classes"/>
-    <property name="build.gensrc" value="${build}/gensrc"/>
     <property name="build.jtreg" value="${build}/jtreg"/>
     <property name="dist" value="dist"/>
     <property name="dist.javac" value="${dist}"/>
@@ -41,9 +40,12 @@
         <include name="javax/tools/**/*.java"/>
         <include name="com/sun/source/**/*.java"/>
         <include name="com/sun/tools/javac/**/*.java"/>
-        <include name="com/sun/tools/javadoc/DocCommentScanner.java"/>
-        <exclude name="**/*-template.java"/>
     </patternset>
+
+    <fileset id="javac.resources" dir="${src.classes}">
+        <include name="com/sun/tools/javac/resources/*.properties"/>
+        <exclude name="**/*-template.*"/>
+    </fileset>
     
     <target name="prep">
         <mkdir dir="${build.bootclasses}"/>
@@ -61,7 +63,6 @@
         <uptodate targetfile="${dist.javac}/lib/javac.jar" property="javac.is.uptodate">
             <srcfiles dir="${src.classes}">
                 <patternset refid="src.javac"/>
-                <include name="${src.classes}/com/sun/tools/javac/resources/version-template.java"/>
                 <include name="${src.classes}/com/sun/tools/javac/resources/*.properties"/>
             </srcfiles>
         </uptodate>
@@ -72,46 +73,40 @@
     <target name="build-lib.javac.jar" depends="check-javac.isuptodate" unless="javac.is.uptodate">
         <!-- to compile javac, set includeAntRuntime=no to prevent javac's 
         own tools.jar incorrectly appearing on the classpath -->
-        <mkdir dir="${build.gensrc}/com/sun/tools/javac"/>
-        <copy file="${src.classes}/com/sun/tools/javac/resources/version-template.java"
-            tofile="${build.gensrc}/com/sun/tools/javac/resources/version.java">
-            <filterset begintoken="$(" endtoken=")">
-                <filter token="JDK_VERSION"  value="${build.jdk.version}"/>
-                <filter token="RELEASE"      value="${build.release}"/>
-                <filter token="FULL_VERSION" value="${build.full.version}"/>
-            </filterset>
-        </copy>
-        <javac srcdir="${src.classes}:${build.gensrc}" destdir="${build.bootclasses}"
+        <javac srcdir="${src.classes}" destdir="${build.bootclasses}"
             source="${compiler.source.level}"  debug="true" debuglevel="source,lines"
             includeAntRuntime="no">
             <patternset refid="src.javac"/>
-            <include name="com/sun/tools/javac/resources/version.java"/>
         </javac>
+        <copy todir="${build.bootclasses}">
+            <fileset refid="javac.resources"/>
+        </copy>
         <echo message="recompiling compiler with itself"/>
         <pathconvert pathsep=" " property="src.javac.files">
             <path>
                 <fileset dir="${src.classes}">
                     <patternset refid="src.javac"/>
                 </fileset>
-                <fileset dir="${build.gensrc}">
-                    <include name="com/sun/tools/javac/resources/version.java"/>
-                </fileset>
             </path>
         </pathconvert>
-        <java fork="true" 
-            classpath="${build.bootclasses};${src.classes}" 
-            classname="com.sun.tools.javac.Main">
+        <java fork="true" classpath="${build.bootclasses}" classname="com.sun.tools.javac.Main">
             <arg value="-sourcepath"/>
-            <arg path="${src.classes}:${build.gensrc}"/>
+            <arg value=""/>
             <arg value="-d"/>
             <arg file="${build.classes}"/>
             <arg value="-g:source,lines"/>
             <arg line="${src.javac.files}"/>
         </java>
         <copy todir="${build.classes}">
-            <fileset dir="${src.classes}">
-                <include name="com/sun/tools/javac/resources/*.properties"/>
-            </fileset>
+            <fileset refid="javac.resources"/>
+        </copy>
+        <copy file="${src.classes}/com/sun/tools/javac/resources/version-template.properties"
+            tofile="${build.classes}/com/sun/tools/javac/resources/version.properties">
+            <filterset begintoken="$(" endtoken=")">
+                <filter token="JDK_VERSION"  value="${build.jdk.version}"/>
+                <filter token="RELEASE"      value="${build.release}"/>
+                <filter token="FULL_VERSION" value="${build.full.version}"/>
+            </filterset>
         </copy>
         <jar destfile="${dist.javac}/lib/javac.jar" basedir="${build.classes}">
             <manifest>
--- a/j2se/src/solaris/back/exec_md.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/back/exec_md.c	Fri Jun 22 00:46:43 2007 +0000
@@ -31,7 +31,11 @@
 #include "util.h"
 
 #ifdef LINUX
-extern int fork1(void);
+  /* Linux */
+  #define FORK() fork()
+#else
+  /* Solaris (make sure we always get the POSIX-specified behavior) */
+  #define FORK() fork1()
 #endif
 
 static char *skipWhitespace(char *p) {
@@ -96,7 +100,7 @@
     }
     argv[i] = NULL;  /* NULL terminate */
 
-    if ((pid = fork1()) == 0) {
+    if ((pid = FORK()) == 0) {
         /* Child process */
         int i;
         long max_fd;
--- a/j2se/src/solaris/classes/sun/awt/X11/XAWTXSettings.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XAWTXSettings.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,7 +35,6 @@
 import java.util.*;
 import java.awt.*;
 import sun.awt.XSettings;
-import sun.awt.*;
 import java.util.logging.*;
 
 
@@ -60,7 +59,7 @@
         if (log.isLoggable(Level.FINE)) log.fine("Initializing XAWT XSettings");
         settings = new XMSelection("_XSETTINGS");
         settings.addSelectionListener(this);
-        updatePerScreenXSettings();
+        initPerScreenXSettings();
     }
 
     public void ownerDeath(int screen, XMSelection sel, long deadOwner) {
@@ -71,13 +70,13 @@
     public void ownerChanged(int screen, XMSelection sel, long newOwner, long data, long timestamp) { 
         if (log.isLoggable(Level.FINE)) log.fine("New Owner "+ newOwner + " for selection = " + sel + " screen " +screen );
     }
-   
+
     public void selectionChanged(int screen, XMSelection sel, long owner , XPropertyEvent event) {
         log.fine("Selection changed on sel " + sel + " screen = " + screen + " owner = " + owner + " event = " + event);
         updateXSettings(screen,owner);
     }
 
-    void updatePerScreenXSettings() {
+    void initPerScreenXSettings() {
         if (log.isLoggable(Level.FINE)) log.fine("Updating Per XSettings changes");
 
         /*
@@ -86,53 +85,65 @@
          * should be "good enough" for most cases.
          */
 
+        Map updatedSettings = null;
         XToolkit.awtLock();
         try {
             long display = XToolkit.getDisplay();    
             int screen = (int) XlibWrapper.DefaultScreen(display);
-            updateXSettings(screen);
+            updatedSettings = getUpdatedSettings(settings.getOwner(screen));
         } finally {
             XToolkit.awtUnlock();
         }
+        // we must not  invoke this under Awt Lock
+        ((XToolkit)Toolkit.getDefaultToolkit()).parseXSettings(0,updatedSettings);
     }
 
-    void updateXSettings(int screen) {
-        long window = settings.getOwner(screen);
-        updateXSettings(screen, window);
+    private void updateXSettings(int screen, long owner) {
+        final Map updatedSettings = getUpdatedSettings(owner);
+        // this method is called under awt lock and usually on toolkit thread
+        // but parseXSettings() causes public code execution, so we need to transfer
+        // this to EDT
+        EventQueue.invokeLater( new Runnable() {
+            public void run() {
+                ((XToolkit) Toolkit.getDefaultToolkit()).parseXSettings( 0, updatedSettings);
+            }
+        });
     }
 
-    void updateXSettings(int screen, long owner) {
-        if (log.isLoggable(Level.FINE)) log.fine("updateXSettings owner =" + owner);
-        if (owner != 0 ) {
+    private Map getUpdatedSettings(final long owner) {
+        if (log.isLoggable(Level.FINE)) log.fine("owner =" + owner);
+        if (0 == owner) {
+            return null;
+        }
 
+        Map settings = null;
+        try {
+            WindowPropertyGetter getter = 
+                new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
+                        false, xSettingsPropertyAtom.getAtom() );
             try {
-                WindowPropertyGetter getter = 
-                    new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
-                            false, xSettingsPropertyAtom.getAtom() );
-                try {
-                    int status = getter.execute(XToolkit.IgnoreBadWindowHandler);
+                int status = getter.execute(XToolkit.IgnoreBadWindowHandler);
 
-                    if (status != XlibWrapper.Success || getter.getData() == 0) {
-                        if (log.isLoggable(Level.FINE)) log.fine("OH OH : getter failed  status = " + status );
-                        return ;
-                    }
+                if (status != XlibWrapper.Success || getter.getData() == 0) {
+                    if (log.isLoggable(Level.FINE)) log.fine("OH OH : getter failed  status = " + status );
+                    settings = null;
+                }
 
-                    long ptr = getter.getData();
+                long ptr = getter.getData();
 
-                    if (log.isLoggable(Level.FINE)) log.fine("noItems = " + getter.getNumberOfItems());
-                    byte array[] = Native.toBytes(ptr,getter.getNumberOfItems());
-                    if (array != null) {
-                        Map updatedSettings = update(array);
-                        ((XToolkit)Toolkit.getDefaultToolkit()).parseXSettings(0,updatedSettings);
-                    }
-                } finally {
-                    getter.dispose();
+                if (log.isLoggable(Level.FINE)) log.fine("noItems = " + getter.getNumberOfItems());
+                byte array[] = Native.toBytes(ptr,getter.getNumberOfItems());
+                if (array != null) {
+                    settings = update(array);
                 }
-            }
-            catch (Exception e) {
-                e.printStackTrace();
+            } finally {
+                getter.dispose();
             }
         }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        return settings;
     }
 
     
--- a/j2se/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Fri Jun 22 00:46:43 2007 +0000
@@ -609,7 +609,7 @@
         }
     }
 
-    public long xGetInputFocus() {
+    public static long xGetInputFocus() {
         XToolkit.awtLock();
         try {
             return XlibWrapper.XGetInputFocus(XToolkit.getDisplay());
--- a/j2se/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -654,9 +654,9 @@
 
     void handleF10JavaKeyEvent(KeyEvent e) {
         if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_F10) {
-            XFramePeer framePeer = XToolkit.getParentFramePeer(target);
-            if (framePeer != null) {
-                XMenuBarPeer mPeer = framePeer.getMenubarPeer();
+            XWindowPeer winPeer = this.getToplevelXWindow(); 
+            if (winPeer instanceof XFramePeer) {
+                XMenuBarPeer mPeer = ((XFramePeer)winPeer).getMenubarPeer();
                 if (mPeer != null) {
                     mPeer.handleF10KeyPress(e);
                 }
--- a/j2se/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -119,6 +119,11 @@
 
     public void updateMinimumSize() {
         super.updateMinimumSize();
+        updateMinSizeHints();
+    }
+
+
+    private void updateMinSizeHints() {
         if (isResizable()) {
             Dimension minimumSize = getTargetMinimumSize();
             if (minimumSize != null) {
@@ -182,9 +187,9 @@
 
     public Graphics getGraphics() {
         return getGraphics(content.surfaceData,
-                           target.getForeground(),
-                           target.getBackground(),
-                           target.getFont());
+                           ComponentAccessor.getForeground(target),
+                           ComponentAccessor.getBackground(target),
+                           ComponentAccessor.getFont_NoClientCode(target));
     }
 
     public void setTitle(String title) {
@@ -357,7 +362,7 @@
                 //Fix for 6318109: PIT: Min Size is not honored properly when a 
                 //smaller size is specified in setSize(), XToolkit
                 //update minimum size hints 
-                updateMinimumSize();
+                updateMinSizeHints();
                 
                 /* 
                  * If this window has been sized by a pack() we need
@@ -930,6 +935,16 @@
         }
     }
 
+    protected void suppressWmTakeFocus(boolean doSuppress) {
+        XAtomList protocols = getWMProtocols();
+        if (doSuppress) {
+            protocols.remove(wm_take_focus);
+        } else {
+            protocols.add(wm_take_focus);
+        }
+        wm_protocols.setAtomListProperty(this, protocols);
+    }
+    
     public void dispose() {
         if (content != null) {
             content.destroy();
@@ -961,14 +976,7 @@
 
     private void handleWmTakeFocus(XClientMessageEvent cl) {
         focusLog.log(Level.FINE, "WM_TAKE_FOCUS on {0}", new Object[]{this});
-        XWindowPeer toFocus = this;
-        while (toFocus.nextTransientFor != null) {
-            toFocus = toFocus.nextTransientFor;
-        }
-        if (toFocus.focusAllowedFor()) {
-            focusLog.log(Level.FINE, "WM_TAKE_FOCUS accepted focus on {0}", new Object[]{toFocus});
-            toFocus.requestXFocus(cl.get_data(1));
-        }
+        requestWindowFocus(cl.get_data(1), true);
     }
 
     /**
@@ -1065,7 +1073,7 @@
         return false;
     }
 
-    public boolean requestWindowFocus() {
+    public boolean requestWindowFocus(long time, boolean timeProvided) {
         focusLog.fine("Request for decorated window focus");
         // If this is Frame or Dialog we can't assure focus request success - but we still can try
         // If this is Window and its owner Frame is active we can be sure request succedded.        
@@ -1076,20 +1084,46 @@
         focusLog.log(Level.FINER, "Current window is: active={0}, focused={1}", 
                      new Object[]{ Boolean.valueOf(win == activeWindow),
                                    Boolean.valueOf(win == focusedWindow)});
-        if (focusAllowedFor()) {
-            if (win == activeWindow && win != focusedWindow) {
-                // Happens when focus is on window child
-                focusLog.fine("Focus is on child window - transfering it back");
-                handleWindowFocusInSync(-1);
+
+        XWindowPeer toFocus = this;
+        while (toFocus.nextTransientFor != null) {
+            toFocus = toFocus.nextTransientFor;
+        }
+
+        if (this == toFocus) {
+            if (focusAllowedFor()) {
+                if (win == activeWindow && win != focusedWindow) {
+                    // Happens when focus is on window child
+                    focusLog.fine("Focus is on child window - transfering it back");
+                    handleWindowFocusInSync(-1);
+                } else {
+                    focusLog.fine("Requesting focus to this window");
+                    if (timeProvided) {
+                        requestXFocus(time);
+                    } else {
+                        requestXFocus();
+                    }
+                }
+                return true;
             } else {
-                focusLog.fine("Requesting focus to this top-level");
-                ((XWindowPeer) ComponentAccessor.getPeer(target)).requestXFocus();
+                return false;
             }
-
         }
-        // This might change when WM will have property to determine focus policy.
-        // Right now, because policy is unknown we can't be sure we succedded
-        return true;
+        else if (toFocus.focusAllowedFor()) {
+            focusLog.fine("Requesting focus to " + toFocus);
+            if (timeProvided) {
+                toFocus.requestXFocus(time);
+            } else {
+                toFocus.requestXFocus();
+            }
+            return false;
+        }
+        else
+        {
+            // This might change when WM will have property to determine focus policy.
+            // Right now, because policy is unknown we can't be sure we succedded
+            return false;
+        }
     }
 
     private XWindowPeer actualFocusedWindow = null;
@@ -1099,9 +1133,11 @@
         }
     }
 
-    boolean requestWindowFocus(XWindowPeer actualFocusedWindow) {
+    boolean requestWindowFocus(XWindowPeer actualFocusedWindow,
+                               long time, boolean timeProvided)
+    {
         setActualFocusedWindow(actualFocusedWindow);
-        return requestWindowFocus();
+        return requestWindowFocus(time, timeProvided);
     }
     public void handleWindowFocusIn(long serial) {
         super.handleWindowFocusIn(serial);
--- a/j2se/src/solaris/classes/sun/awt/X11/XDialogPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XDialogPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,9 @@
 import java.awt.*;
 import java.awt.peer.*;
 import java.awt.event.*;
+import sun.awt.ComponentAccessor;
+
+import sun.awt.*;
 
 class XDialogPeer extends XDecoratedPeer implements DialogPeer {
 
@@ -114,4 +117,49 @@
         }
         return f;
     }
+
+    public void blockWindows(java.util.List<Window> toBlock) {
+        Vector<XWindowPeer> javaToplevels = null;
+        XToolkit.awtLock();
+        try {
+            javaToplevels = XWindowPeer.collectJavaToplevels();
+            for (Window w : toBlock) {
+                XWindowPeer wp = (XWindowPeer)ComponentAccessor.getPeer(w);
+                if (wp != null) {
+                    wp.setModalBlocked((Dialog)target, true, javaToplevels);
+                }
+            }
+        } finally {
+            XToolkit.awtUnlock();
+        }
+    }
+
+    /*
+     * WARNING: don't call client code in this method!
+     *
+     * The check is performed before the dialog is shown.
+     * The focused window can't be blocked at the time it's focused.
+     * Thus we don't have to perform any transitive (a blocker of a blocker) checks.
+     */
+    boolean isFocusedWindowModalBlocker() {
+        Window focusedWindow = XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow();
+        XWindowPeer focusedWindowPeer = null;
+ 
+        if (focusedWindow != null) {
+            focusedWindowPeer = (XWindowPeer)ComponentAccessor.getPeer(focusedWindow);
+        } else {
+            /*
+             * For the case when a potential blocked window is not yet focused
+             * on the Java level (e.g. it's just been mapped) we're asking for the
+             * focused window on the native level.
+             */
+            focusedWindowPeer = getNativeFocusedWindowPeer();
+        }
+        synchronized (getStateLock()) {
+            if (focusedWindowPeer != null && focusedWindowPeer.modalBlocker == target) {
+                return true;
+            }
+        }
+        return super.isFocusedWindowModalBlocker();
+    }
 }
--- a/j2se/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -92,14 +92,14 @@
         return ((EmbeddedFrame)target).supportsXEmbed();
     }
 
-    public boolean requestWindowFocus() {
+    public boolean requestWindowFocus(long time, boolean timeProvided) {
         // Should check for active state of host application
         if (embedder != null && embedder.isActive()) {
             xembedLog.fine("Requesting focus from embedding host");
             return embedder.requestFocus();
         } else {
             xembedLog.fine("Requesting focus from X");
-            return super.requestWindowFocus();
+            return super.requestWindowFocus(time, timeProvided);
         }
     }
 
--- a/j2se/src/solaris/classes/sun/awt/X11/XFramePeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XFramePeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -59,7 +59,7 @@
         super.preInit(params);
         Frame target = (Frame)(this.target);
         // set the window attributes for this Frame
-        winAttr.initialState = target.getState();
+        winAttr.initialState = target.getExtendedState();
         state = 0;
         undecorated = Boolean.valueOf(target.isUndecorated());
         winAttr.nativeDecor = !target.isUndecorated();
--- a/j2se/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,8 +25,6 @@
 package sun.awt.X11;
 
 import java.awt.Component;
-import java.awt.Dialog;
-import java.awt.Frame;
 import java.awt.KeyboardFocusManager;
 import java.awt.Window;
 
@@ -41,7 +39,6 @@
 import java.util.logging.Logger;
 
 import sun.awt.CausedFocusEvent;
-import sun.awt.ComponentAccessor;
 import sun.awt.SunToolkit;
 
 public class XKeyboardFocusManagerPeer implements KeyboardFocusManagerPeer {
@@ -82,10 +79,6 @@
         }
     }
 
-    public void setCurrentFocusedWindow(Window win) {
-        setCurrentNativeFocusedWindow(win);
-    }
-
     public Window getCurrentFocusedWindow() {
         return getCurrentNativeFocusedWindow();
     }
--- a/j2se/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -540,7 +540,7 @@
         final Component currentSource = (Component)getEventSource();
         //This is the only difference from XWindow.handleKeyPress
         //Ancestor's function can invoke handleF10KeyPress here
-        handleKeyEvent(xkey);
+        handleKeyPress(xkey);
     }
 
 } //class XMenuBarPeer
--- a/j2se/src/solaris/classes/sun/awt/X11/XNETProtocol.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XNETProtocol.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -246,6 +246,8 @@
     XAtom XA_NET_WM_STATE_FULLSCREEN = XAtom.get("_NET_WM_STATE_FULLSCREEN");
     XAtom XA_NET_WM_STATE_BELOW = XAtom.get("_NET_WM_STATE_BELOW");
     XAtom XA_NET_WM_STATE_HIDDEN = XAtom.get("_NET_WM_STATE_HIDDEN");
+    XAtom XA_NET_WM_STATE_SKIP_TASKBAR = XAtom.get("_NET_WM_STATE_SKIP_TASKBAR");
+    XAtom XA_NET_WM_STATE_SKIP_PAGER = XAtom.get("_NET_WM_STATE_SKIP_PAGER");
 
     XAtom XA_NET_WM_WINDOW_TYPE = XAtom.get("_NET_WM_WINDOW_TYPE");
     XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG");
--- a/j2se/src/solaris/classes/sun/awt/X11/XPopupMenuPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XPopupMenuPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -389,7 +389,7 @@
             return;
         }
         final Component currentSource = (Component)getEventSource();
-        handleKeyEvent(xkey);
+        handleKeyPress(xkey);
     }
 
 }
--- a/j2se/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -272,48 +272,47 @@
     void scroll(int x, int y, int flag, int type) {
         checkSecurity();
         ScrollPane sp = (ScrollPane)target;
-        if (sp.countComponents() > 0) {
-            int sx, sy;
-            Component c = sp.getComponent(0);
-            Color colors[] = getGUIcolors();
-
-            if (sp.getScrollbarDisplayPolicy() == ScrollPane.SCROLLBARS_NEVER) {
-                sx = -x;
-                sy = -y;
-            } else {
-                Point p = c.location();
-                sx = p.x;
-                sy = p.y;
+        Component c = getScrollChild();
+        if (c == null) {
+            return;
+        }
+        int sx, sy;
+        Color colors[] = getGUIcolors();
 
-                if ((flag & HORIZONTAL) != 0) {
-                    hsb.setValue(Math.min(x, hsb.getMaximum()-hsb.getVisibleAmount()));
-                    ScrollPaneAdjustable hadj = (ScrollPaneAdjustable)sp.getHAdjustable();
-                    setAdjustableValue(hadj, hsb.getValue(), type);
-                    sx = -(hsb.getValue());
-                    Graphics g = getGraphics();
-                    try {
-                        paintHorScrollbar(g, colors, true);
-                    } finally {
-                        g.dispose();
-                    }
-                }
-                if ((flag & VERTICAL) != 0) {
-                    vsb.setValue(Math.min(y, vsb.getMaximum() - vsb.getVisibleAmount()));
-                    ScrollPaneAdjustable vadj = (ScrollPaneAdjustable)sp.getVAdjustable();
-                    setAdjustableValue(vadj, vsb.getValue(), type);
-                    sy = -(vsb.getValue());
-                    Graphics g = getGraphics();
-                    try {
-                        paintVerScrollbar(g, colors, true);
-                    } finally {
-                        g.dispose();
-                    }
+        if (sp.getScrollbarDisplayPolicy() == ScrollPane.SCROLLBARS_NEVER) {
+            sx = -x;
+            sy = -y;
+        } else {
+            Point p = c.location();
+            sx = p.x;
+            sy = p.y;
+
+            if ((flag & HORIZONTAL) != 0) {
+                hsb.setValue(Math.min(x, hsb.getMaximum()-hsb.getVisibleAmount()));
+                ScrollPaneAdjustable hadj = (ScrollPaneAdjustable)sp.getHAdjustable();
+                setAdjustableValue(hadj, hsb.getValue(), type);
+                sx = -(hsb.getValue());
+                Graphics g = getGraphics();
+                try {
+                    paintHorScrollbar(g, colors, true);
+                } finally {
+                    g.dispose();
                 }
             }
-            c.move(sx, sy);
-        } else {
-            throw new NullPointerException("scrollpane child is null");
+            if ((flag & VERTICAL) != 0) {
+                vsb.setValue(Math.min(y, vsb.getMaximum() - vsb.getVisibleAmount()));
+                ScrollPaneAdjustable vadj = (ScrollPaneAdjustable)sp.getVAdjustable();
+                setAdjustableValue(vadj, vsb.getValue(), type);
+                sy = -(vsb.getValue());
+                Graphics g = getGraphics();
+                try {
+                    paintVerScrollbar(g, colors, true);
+                } finally {
+                    g.dispose();
+                }
+            }
         }
+        c.move(sx, sy);
     }
 
     void setAdjustableValue(ScrollPaneAdjustable adj, int value, int type) {
--- a/j2se/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -63,18 +63,17 @@
 import sun.awt.ComponentAccessor;
 
 
-
 class XTextAreaPeer extends XComponentPeer implements TextAreaPeer {
     boolean editable;
 
-    boolean isGrabbedComponent;
-    Component grabbedComponent;
-
     AWTTextPane textPane;
     AWTTextArea jtext;
 
     boolean firstChangeSkipped;
 
+    private final JavaMouseEventHandler javaMouseEventHandler
+        = new JavaMouseEventHandler( this );
+
     /* FIXME  */
 
     public long filterEvents(long mask) {
@@ -104,7 +103,6 @@
         // though init(target) has not been called
         this.target = target;
 
-
         //ComponentAccessor.enableEvents(target,AWTEvent.MOUSE_WHEEL_EVENT_MASK); 
         target.enableInputMethods(true);
 
@@ -198,7 +196,6 @@
             textPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
             textPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
         }
-
     }
 
     /**
@@ -242,7 +239,6 @@
 
         return new Dimension(fm.charWidth('0') * cols + /*2*XMARGIN +*/ vsbwidth,
                              fm.getHeight() * rows + /*2*YMARGIN +*/ hsbheight);
-
     }
 
     public boolean isFocusable() {
@@ -255,7 +251,6 @@
             textPane.setVisible(b);
     }
 
-
     void repaintText() {
         jtext.repaintNow();
     }
@@ -265,16 +260,12 @@
         jtext.forwardFocusGained(e);
     }
 
-
-
     public void focusLost(FocusEvent e) {
         super.focusLost(e);
         jtext.forwardFocusLost(e);
     }
 
 
-
-
     /**
      * Paint the component
      * this method is called when the repaint instruction has been used
@@ -319,7 +310,6 @@
         }
     }
 
-
     void handleJavaKeyEvent(KeyEvent e) {
         ComponentAccessor.processEvent(jtext,e);
     }
@@ -330,123 +320,9 @@
         ComponentAccessor.processEvent(textPane,e);
     }
 
-
     public void handleJavaMouseEvent( MouseEvent e ) {
-        super.handleJavaMouseEvent(e);
-
-        Component comp=null;
-        int id = e.getID();
-        
-        // Fix for bug 6175401
-        // If the mouse action is triggered under the arrow button we should retarget one to the arrow button.
-        // Before this fix we have only dispatching the event to the scrollbar. But the scrollbar listener 
-        // have only Swing track listener. It's not correct for the events is triggered under the arrow button.
-        // If we dispatch this event to the arrow button we have got invoking correct Swing button listener.
-        // See 6175401 for more information
-        
-        JScrollBar scrollBar = textPane.getVerticalScrollBar();
-        comp = getScrollBarComponentUnderMouse(scrollBar, e);
-        
-        if (comp == null){
-            scrollBar =  textPane.getHorizontalScrollBar();
-            comp = getScrollBarComponentUnderMouse(scrollBar, e);
-        }
-        
-        if ((comp == null) && !textPane.getViewport().getBounds().contains(e.getX(), e.getY())) {
-            // probably intersection of two scrollbars
-            pSetCursor(textPane.getCursor()); // Update cursor
-        } else if ((comp == null) && (!isGrabbedComponent)) {
-            // this event is for the text area.
-            pSetCursor(target.getCursor()); // Update cursor 
-            JViewport port = textPane.getViewport();
-            Point p = port.getViewPosition();
-            int x = e.getX()+p.x;
-            int y = e.getY()+p.y;
-            MouseEvent retargeted;
-
-            retargeted = new MouseEvent(jtext,
-                                        id, 
-                                        e.getWhen(), 
-                                        e.getModifiersEx() | e.getModifiers(),
-                                        x, 
-                                        y, 
-                                        e.getXOnScreen(),
-                                        e.getYOnScreen(),
-                                        e.getClickCount(), 
-                                        e.isPopupTrigger(),
-                                        e.getButton());
-
-            if (id == MouseEvent.MOUSE_DRAGGED || id == MouseEvent.MOUSE_MOVED)
-                jtext.processMouseMotionEventPublic(retargeted);
-            else
-                jtext.processMouseEventPublic(retargeted);
-        }
-        else {
-            if (isGrabbedComponent) { // We are in the middle of scrolling 
-                comp = grabbedComponent;
-            }
-            pSetCursor(comp.getCursor()); // Update cursor
-            Point p = comp.getLocation();
-            int x = e.getX()-p.x;
-            int y = e.getY()-p.y;
-            MouseEvent retargeted;
-
-            if (id == MouseEvent.MOUSE_PRESSED) {
-                isGrabbedComponent = true;
-                grabbedComponent = comp;
-            }
-            else if (id == MouseEvent.MOUSE_RELEASED) {
-                isGrabbedComponent = false;
-            }
-
-
-            retargeted = new MouseEvent(comp,
-                                        id, 
-                                        e.getWhen(), 
-                                        e.getModifiersEx() | e.getModifiers(),
-                                        x, 
-                                        y, 
-                                        e.getXOnScreen(),
-                                        e.getYOnScreen(),
-                                        e.getClickCount(), 
-                                        e.isPopupTrigger(),
-                                        e.getButton());
-            ComponentAccessor.processEvent(comp,retargeted); 
-        }
-
-    }
-
-    /*
-     * This method gets the component which contains mouse pointer.
-     * The acceptable components are the scrollBar, the increase arrow button, the decrease arrow button.
-     */
-    Component getScrollBarComponentUnderMouse(JScrollBar scrollBar, MouseEvent e){
-        if (scrollBar == null){
-            return null;
-        }
-        // Added only for performance
-        Rectangle rectScrollBar = scrollBar.getBounds();
-        if (!rectScrollBar.contains(e.getX(),e.getY())){
-            return null;
-        }
-        XAWTScrollBarUI scrollBarUI = (XAWTScrollBarUI)scrollBar.getUI();
-        JButton buttonIncr = scrollBarUI.getIncreaseButton();
-        JButton buttonDecr = scrollBarUI.getDecreaseButton();
-        
-        Rectangle rectButtonIncr = buttonIncr.getBounds();
-        Rectangle rectButtonDecr = buttonDecr.getBounds();
-        
-        // translate the location of the buttons relative to scrollbar location into the absolute location
-        rectButtonIncr.setLocation(rectButtonIncr.x+rectScrollBar.x, rectButtonIncr.y+rectScrollBar.y);
-        rectButtonDecr.setLocation(rectButtonDecr.x+rectScrollBar.x, rectButtonDecr.y+rectScrollBar.y);
-        
-        if (rectButtonIncr.contains(e.getX(),e.getY())){
-            return buttonIncr;
-        }else if (rectButtonDecr.contains(e.getX(),e.getY())){
-            return buttonDecr;
-        }else {
-            return scrollBar;
-        }
+        super.handleJavaMouseEvent( e );
+        javaMouseEventHandler.handle( e );
     }
 
     void handleJavaInputMethodEvent(InputMethodEvent e) {
@@ -454,8 +330,6 @@
             jtext.processInputMethodEventPublic((InputMethodEvent)e);
     }
 
-
-
     /**
      * @see java.awt.peer.TextComponentPeer
      */
@@ -478,7 +352,6 @@
 //          repaintText();
     }
 
-
     public void setForeground(Color c) {
         super.setForeground(c);
 //          synchronized (getStateLock()) {
@@ -491,6 +364,7 @@
         }
 //          repaintText();
     }
+
     public void setFont(Font f) {
         super.setFont(f);
 //          synchronized (getStateLock()) {
@@ -516,24 +390,21 @@
      * @see java.awt.peer.ComponentPeer
      */
     public void setEnabled(boolean enabled) {
-    	super.setEnabled(enabled);
+        super.setEnabled(enabled);
         if (jtext != null) { 
             jtext.setEnabled(enabled);
             jtext.repaint();
         }
     }
 
-
     /**
      * @see java.awt.peer.TextComponentPeer
      */
-
     public InputMethodRequests getInputMethodRequests() {
         if (jtext != null) return jtext.getInputMethodRequests();
         else  return null;
     }
 
-
     /**
      * @see java.awt.peer.TextComponentPeer
      */
@@ -555,7 +426,6 @@
         return jtext.getText();
     }
 
-
     /**
      * @see java.awt.peer.TextComponentPeer
      */
@@ -622,7 +492,6 @@
         }
     }
 
-
     /**
      * to be implemented.
      * @see java.awt.peer.TextComponentPeer
@@ -671,8 +540,8 @@
         return getPreferredSize(rows, cols);
     }
 
+
     class  AWTTextAreaUI extends MotifTextAreaUI {
-
         /**
          * Creates a UI for a JTextArea.
          *
@@ -683,7 +552,6 @@
 
         protected String getPropertyPrefix() { return "TextArea"; }
 
-
         public void installUI(JComponent c) {
             super.installUI(c);
 
@@ -733,7 +601,6 @@
             editor.setBorder(new BorderUIResource.CompoundBorderUIResource(
                 b,new EmptyBorder(2, 2, 2, 2)));
 
-
             Insets margin = editor.getMargin();
             if (margin == null || margin instanceof UIResource) {
                 editor.setMargin(uidefaults.getInsets(prefix + ".margin"));
@@ -762,17 +629,18 @@
         }        
     }
 
+
     // TODO : fix this duplicate code
     class XAWTCaret extends DefaultCaret {
         public void focusGained(FocusEvent e) {
-	    super.focusGained(e);
-	    getComponent().repaint();
-	}  
-      
+            super.focusGained(e);
+            getComponent().repaint();
+        }  
+
         public void focusLost(FocusEvent e) {
-	    super.focusLost(e);
-	    getComponent().repaint();
-	}
+            super.focusLost(e);
+            getComponent().repaint();
+        }
 
         // Fix for 5100950: textarea.getSelectedText() returns the de-selected text, on XToolkit
         // Restoring Motif behaviour
@@ -787,9 +655,9 @@
         }
     }
 
+
     class XAWTScrollBarButton extends BasicArrowButton
     {
-
         UIDefaults uidefaults = XToolkit.getUIDefaults();
         private Color darkShadow = SystemColor.controlShadow;
         private Color lightShadow = SystemColor.controlLtHighlight;
@@ -816,7 +684,6 @@
             setForeground(uidefaults.getColor("ScrollBar.foreground"));
         }
 
-
         public Dimension getPreferredSize() {
             switch (direction) {
             case NORTH: 
@@ -956,9 +823,9 @@
         }
     }
 
+
     class XAWTScrollBarUI extends BasicScrollBarUI 
     {
-
         public XAWTScrollBarUI() {
             super();
         }
@@ -990,11 +857,13 @@
             trackHighlightColor = uidefaults.getColor("ScrollBar.trackHighlight");
 
         }
+
         protected JButton createDecreaseButton(int orientation) {
             JButton b = new XAWTScrollBarButton(orientation);
             return b;
 
-        } 
+        }
+
         protected JButton createIncreaseButton(int orientation) {
             JButton b = new XAWTScrollBarButton(orientation);
             return b;
@@ -1009,17 +878,14 @@
         }
 
         public void paint(Graphics g, JComponent c) {
-            paintTrack(g, c, getTrackBounds());		
+            paintTrack(g, c, getTrackBounds());
             Rectangle thumbBounds = getThumbBounds();
             paintThumb(g, c, thumbBounds);
         }
 
-        
-
         public void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds)
         {
-
-            if(!scrollbar.isEnabled())      {
+            if(!scrollbar.isEnabled()) {
                 return;
             }
 
@@ -1045,10 +911,11 @@
         }
     }
 
+
     class AWTTextArea extends JTextArea implements DocumentListener {
-
         boolean isFocused = false;
         XTextAreaPeer peer;
+
         public AWTTextArea(String text, XTextAreaPeer peer) {
             super(text);
             setFocusable(false);
@@ -1126,6 +993,7 @@
         }
     }
 
+
     class XAWTScrollPaneUI extends BasicScrollPaneUI
     {
         private final Border vsbMarginBorderR = new EmptyBorder(0, 2, 0, 0);
@@ -1228,13 +1096,10 @@
                 hsbBorder = null;
             }
         }
-
-
     }
 
 
-    class AWTTextPane extends JScrollPane implements FocusListener {
-
+    private class AWTTextPane extends JScrollPane implements FocusListener {
         JTextArea jtext;
         XWindow xwin;
 
@@ -1276,12 +1141,12 @@
         public ComponentPeer getPeer() {
             return (ComponentPeer) (xwin);
         }
+
         public void updateUI() {
             ComponentUI ui = new XAWTScrollPaneUI();
             setUI(ui);
         }
 
-
         public JScrollBar createVerticalScrollBar() {
             return new XAWTScrollBar(JScrollBar.VERTICAL);
         }
@@ -1290,8 +1155,6 @@
             return new XAWTScrollBar(JScrollBar.HORIZONTAL);
         }
 
-
-
         public JTextArea getTextArea () {
             return this.jtext;
         }
@@ -1301,15 +1164,6 @@
         }
 
 
-        public void processMouseEventPublic(MouseEvent e) {
-            processMouseEvent(e);
-        }
-
-        public void processMouseMotionEventPublic(MouseEvent e) {
-            processMouseMotionEvent(e);
-        }
-
-
         class XAWTScrollBar extends ScrollBar {
 
             public XAWTScrollBar(int i) {
@@ -1366,6 +1220,249 @@
         public boolean isOpaque(Component c) { 
             return true;
         }
+    }
 
+
+    // This class dispatches 'MouseEvent's to 'XTextAreaPeer''s (hidden)
+    // subcomponents, and overrides mouse cursor, e.g. for scrollbars.
+    //
+    // However, current dispatching is a kind of fake, and is tuned to do only
+    // what is necessary/possible. E.g. no additional mouse-exited/entered
+    // events are generated, when mouse exits scrollbar and enters viewport
+    // with JTextArea inside. Actually, no events are ever generated here (for
+    // now). They are only dispatched as correctly as possible/neccessary.
+    //
+    // In future, it would be better to replace fake-emulation of grab-detection
+    // and event-dispatching here, by reusing some common implementation of this
+    // functionality. Mouse-cursor setting should also be freed of hacked
+    // overloading here.
+
+    private static final class JavaMouseEventHandler {
+        private final XTextAreaPeer outer;
+        private final Pointer current = new Pointer();
+        private boolean grabbed = false;
+
+        JavaMouseEventHandler( XTextAreaPeer outer ) {
+            this.outer = outer;
+        }
+
+
+        // 1. We can make grab-tracking emulation here more robust to variations in
+        //    in mouse-events order and consistence. E.g. by using such code:
+        //    if( grabbed && event.getID()==MouseEvent.MOUSE_MOVED ) grabbed = false;
+        //    Or we can also use 'assert'ions.
+        // 2. WARNING: Currently, while grab-detection mechanism _here_ says, that
+        //    grab is in progress, we do not update 'current'.  In case 'current'
+        //    is set to a scrollbar or to a scroll-button, then references to their
+        //    'Component'-instances are "remembered". And events are dispatched to
+        //    these remembered components, without checking, if XTextAreaPeer has
+        //    replaced these instances with another ones. This also aplies to
+        //    mouse-drags-from-outside (see comment in 'grabbed_update' method).
+
+        void handle( MouseEvent event ) {
+            if ( ! grabbed ) {
+                // dispatch() needs up-to-date pointer in ungrabbed case.
+                setPointerToUnderEventPoint( event );
+            }
+            dispatch( event );
+            boolean wasGrabbed = grabbed;
+            grabbed_update( event );
+            if ( wasGrabbed && ! grabbed ) {
+                setPointerToUnderEventPoint( event );
+            }
+            setCursor();
+        }
+
+        // Following is internally private:
+
+        // Here dispatching is performed, of 'MouseEvent's to (some)
+        // 'XTextAreaPeer''s (hidden) subcomponents.
+        private void dispatch( MouseEvent event ) {
+            switch( current.getType() )
+            {
+                case TEXT:
+                    Point point = toViewportChildLocalSpace(
+                        outer.textPane.getViewport(), event.getPoint() );
+                    XTextAreaPeer.AWTTextArea jtext = outer.jtext;
+                    MouseEvent newEvent = newMouseEvent( jtext, point, event );
+                    int id = newEvent.getID();
+                    if ( id==MouseEvent.MOUSE_MOVED || id==MouseEvent.MOUSE_DRAGGED ) {
+                        jtext.processMouseMotionEventPublic( newEvent );
+                    } else {
+                        jtext.processMouseEventPublic( newEvent );
+                    }
+                    break;
+
+                // We perform (additional) dispatching of events to buttons of
+                // scrollbar, instead of leaving it to JScrollbar. This is
+                // required, because of different listeners in Swing and AWT,
+                // which trigger scrolling (ArrowButtonListener vs. TrackListener,
+                // accordingly). So we dispatch events to scroll-buttons, to
+                // invoke a correct Swing button listener.
+                // See CR 6175401 for more information.
+                case BAR:
+                case BUTTON:
+                    Component c = current.getBar();
+                    Point p = toLocalSpace( c, event.getPoint() );
+                    if ( current.getType()==Pointer.Type.BUTTON ) {
+                        c = current.getButton();
+                        p = toLocalSpace( c, p );
+                    }
+                    ComponentAccessor.processEvent( c, newMouseEvent( c, p, event ) );
+                    break;
+            }
+        }
+
+        private static MouseEvent newMouseEvent(
+            Component source, Point point, MouseEvent template )
+        {
+            MouseEvent e = template;
+            return new MouseEvent(
+                source,
+                e.getID(), e.getWhen(),
+                e.getModifiersEx() | e.getModifiers(),
+                point.x, point.y,
+                e.getXOnScreen(), e.getYOnScreen(),
+                e.getClickCount(), e.isPopupTrigger(), e.getButton() );
+        }
+
+        private void setCursor() {
+            if ( current.getType()==Pointer.Type.TEXT ) {
+                // 'target.getCursor()' is also applied from elsewhere
+                // (at least now), but only when mouse "entered", and
+                // before 'XTextAreaPeer.handleJavaMouseEvent' is invoked.
+                outer.pSetCursor( outer.target.getCursor() );
+            }
+            else {
+                // We can write here a more intelligent cursor selection
+                // mechanism, like getting cursor from 'current' component.
+                // However, I see no point in doing so now. But if you feel
+                // like implementing it, you'll probably need to introduce
+                // 'Pointer.Type.PANEL'.
+                outer.pSetCursor( outer.textPane.getCursor() );
+            }
+        }
+
+
+        // Current way of grab-detection causes interesting (but harmless)
+        // side-effect. If mouse is draged from outside to inside of TextArea,
+        // we will then (in some cases) be asked to dispatch mouse-entered/exited
+        // events. But, as at least one mouse-button is down, we will detect
+        // grab-mode is on (though the grab isn't ours).
+        //
+        // Thus, we will not update 'current' (see 'handle' method), and will
+        // dispatch events to the last subcomponent, the 'current' was set to.
+        // As always, we set cursor in this case also. But, all this seems
+        // harmless, because mouse entered/exited events seem to have no effect
+        // here, and cursor setting is ignored in case of drags from outside.
+        //
+        // Grab-detection can be further improved, e.g. by taking into account
+        // current event-ID, but I see not point in doing it now.
+
+        private void grabbed_update( MouseEvent event ) {
+            final int allButtonsMask
+                = MouseEvent.BUTTON1_DOWN_MASK
+                | MouseEvent.BUTTON2_DOWN_MASK
+                | MouseEvent.BUTTON3_DOWN_MASK;
+            grabbed = ( (event.getModifiersEx() & allButtonsMask) != 0 );
+        }
+
+        // 'toLocalSpace' and 'toViewportChildLocalSpace' can be "optimized" to
+        // 'return' 'void' and use 'Point' input-argument also as output.
+        private static Point toLocalSpace( Component local, Point inParentSpace )
+        {
+            Point p = inParentSpace;
+            Point l = local.getLocation();
+            return new Point( p.x - l.x, p.y - l.y );
+        }
+        private static Point toViewportChildLocalSpace( JViewport v, Point inViewportParentSpace )
+        {
+            Point l = toLocalSpace(v, inViewportParentSpace);
+            Point p = v.getViewPosition();
+            l.x += p.x;
+            l.y += p.y;
+            return l;
+        }
+
+        private void setPointerToUnderEventPoint( MouseEvent event ) {
+            Point point = event.getPoint();
+            if ( outer.textPane.getViewport().getBounds().contains( point ) ) {
+                current.setText();
+            }
+            else if ( ! setPointerIfPointOverScrollbar(
+                outer.textPane.getVerticalScrollBar(), point ) )
+            {
+                if ( ! setPointerIfPointOverScrollbar(
+                    outer.textPane.getHorizontalScrollBar(), point ) )
+                {
+                    current.setNone();
+                }
+            }
+        }
+
+        private boolean setPointerIfPointOverScrollbar( JScrollBar bar, Point point ) {
+            if ( ! bar.getBounds().contains( point ) ) {
+                return false;
+            }
+            current.setBar( bar );
+            Point local = toLocalSpace( bar, point );
+
+            XTextAreaPeer.XAWTScrollBarUI ui =
+                (XTextAreaPeer.XAWTScrollBarUI) bar.getUI();
+
+            if ( ! setPointerIfPointOverButton( ui.getIncreaseButton(), local ) ) {
+                setPointerIfPointOverButton( ui.getDecreaseButton(), local );
+            }
+
+            return true;
+        }
+
+        private boolean setPointerIfPointOverButton( JButton button, Point point ) {
+            if ( ! button.getBounds().contains( point ) ) {
+                return false;
+            }
+            current.setButton( button );
+            return true;
+        }
+
+        private static final class Pointer {
+            static enum Type {
+                NONE, TEXT, BAR, BUTTON  // , PANEL
+            }
+            Type getType() {
+                return type;
+            }
+            boolean isNone() {
+                return type==Type.NONE;
+            }
+            JScrollBar getBar() {
+                boolean ok = type==Type.BAR || type==Type.BUTTON;
+                assert ok;
+                return ok ? bar : null;
+            }
+            JButton getButton() {
+                boolean ok = type==Type.BUTTON;
+                assert ok;
+                return ok ? button : null;
+            }
+            void setNone() {
+                type = Type.NONE;
+            }
+            void setText() {
+                type = Type.TEXT;
+            }
+            void setBar( JScrollBar bar ) {
+                this.bar=bar;
+                type=Type.BAR;
+            }
+            void setButton( JButton button ) {
+                this.button=button;
+                type=Type.BUTTON;
+            }
+
+            private Type type;
+            private JScrollBar bar;
+            private JButton button;
+        }
     }
 }
--- a/j2se/src/solaris/classes/sun/awt/X11/XToolkit.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XToolkit.java	Fri Jun 22 00:46:43 2007 +0000
@@ -27,8 +27,8 @@
 import java.awt.*;
 import java.awt.event.*;
 import java.awt.peer.*;
+import java.beans.PropertyChangeListener;
 import sun.awt.*;
-import sun.awt.SunToolkit;
 import java.util.*;
 import java.awt.dnd.DragSource;
 import java.awt.dnd.DragGestureListener;
@@ -44,7 +44,6 @@
 import java.awt.datatransfer.Clipboard;
 import javax.swing.LookAndFeel;
 import javax.swing.UIDefaults;
-import java.io.*;
 import java.util.logging.*;
 import sun.font.FontManager;
 import sun.misc.PerformanceLogger;
@@ -512,24 +511,6 @@
         }
     }
 
-    static XFramePeer getParentFramePeer(Component comp) {
-        if (comp == null) {
-            return null;
-        }
-        ComponentPeer peer = comp.getPeer();
-        synchronized(comp.getTreeLock()) {
-            while (comp != null && !(peer instanceof XFramePeer)) {
-                comp = comp.getParent();
-                peer = comp.getPeer();
-            }
-        }
-        if (peer != null && peer instanceof XFramePeer) {
-            return (XFramePeer)peer;
-        } else {
-            return null;
-        }
-    }
-
     static native void awt_toolkit_init();
 
     public void run() {
@@ -583,7 +564,7 @@
                     Component owner = 
                         XKeyboardFocusManagerPeer.getCurrentNativeFocusOwner();
                     if (owner != null) {
-                        XWindow ownerWindow = (XWindow) ComponentAccessor.getPeer(owner);
+                        XWindow ownerWindow = (XWindow)owner.getPeer();
                         if (ownerWindow != null) {
                             w = ownerWindow.getContentWindow();
                         }
@@ -1374,10 +1355,7 @@
             try {
                 return Cursor.getSystemCustomCursor(cursorName);
             } catch (AWTException awte) {
-                if (log.isLoggable(Level.WARNING)) {
-                    log.warning("Cannot load system cursor: " + cursorName + ", " + awte);
-                }
-                return null;
+                throw new RuntimeException("cannot load system cursor: " + cursorName, awte);
             }
         }
 
@@ -1385,10 +1363,30 @@
             return  Boolean.valueOf(isDynamicLayoutSupported());
         }
 
+        if (initXSettingsIfNeeded(name)) {
+            return desktopProperties.get(name);
+        }
+
+        return super.lazilyLoadDesktopProperty(name);
+    }
+
+    public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) {
+        initXSettingsIfNeeded(name);
+        super.addPropertyChangeListener(name, pcl);
+    }
+
+    /**
+     * Initializes XAWTXSettings if a property for a given property name is provided by
+     * XSettings and they are not initialized yet.
+     *
+     * @return true if the method has initialized XAWTXSettings.
+     */
+    private boolean initXSettingsIfNeeded(final String propName) {
         if (!loadedXSettings &&
-            (name.startsWith("gnome.") ||
-             name.equals(SunToolkit.DESKTOPFONTHINTS) ||
-             name.startsWith(dndPrefix))) {
+            (propName.startsWith("gnome.") ||
+             propName.equals(SunToolkit.DESKTOPFONTHINTS) ||
+             propName.startsWith(dndPrefix)))
+        {
             loadedXSettings = true;
             if (!GraphicsEnvironment.isHeadless()) {
                 loadXSettings();
@@ -1397,8 +1395,7 @@
                  * If that isn't found let SunToolkit will see if there's a
                  * system property set by a user.
                  */
-                if (desktopProperties.get(SunToolkit.DESKTOPFONTHINTS)
-                    == null) {
+                if (desktopProperties.get(SunToolkit.DESKTOPFONTHINTS) == null) {
                     if (XWM.isKDE2()) {
                         Object hint = FontManager.getFontConfigAAHint();
                         if (hint != null) {
@@ -1414,27 +1411,25 @@
                                           SunToolkit.getDesktopFontHints());
                 }
 
-                return desktopProperties.get(name);
+                return true;
             }
         }
-
-        return super.lazilyLoadDesktopProperty(name);
+        return false;
     }
-    
-    
-    void loadXSettings() {
+
+    private void loadXSettings() {
        xs = new XAWTXSettings();
     }
 
-      /**
+    /**
      * Callback from the native side indicating some, or all, of the
      * desktop properties have changed and need to be reloaded.
      * <code>data</code> is the byte array directly from the x server and
      * may be in little endian format.
      * <p>
      * NB: This could be called from any thread if triggered by
-     * <code>loadXSettings</code>.  It is called from the toolkit
-     * thread if triggered by an XSETTINGS change.
+     * <code>loadXSettings</code>.  It is called from the System EDT
+     * if triggered by an XSETTINGS change.
      */
     void parseXSettings(int screen_XXX_ignored,Map updatedSettings) {
 
@@ -1454,7 +1449,7 @@
             // XXX: we probably want to do something smarter.  In
             // particular, "Net" properties are of interest to the
             // "core" AWT itself.  E.g.
-            // 
+            //
             // Net/DndDragThreshold -> ???
             // Net/DoubleClickTime  -> awt.multiClickInterval
         }
@@ -2017,7 +2012,7 @@
     /**
      * @inheritDoc
      */
-    protected boolean syncNativeQueue() {
+    protected boolean syncNativeQueue(final long timeout) {
         XBaseWindow win = XBaseWindow.getXAWTRootWindow();
 
         if (oops_waiter == null) {
@@ -2068,13 +2063,13 @@
             long start = System.currentTimeMillis();
             while (!oops_updated && !oops_failed) {
                 try {
-                    awtLockWait(WAIT_TIME);
+                    awtLockWait(timeout);
                 } catch (InterruptedException e) {
                     throw new RuntimeException(e);
                 }
                 // This "while" is a protection from spurious
                 // wake-ups.  However, we shouldn't wait for too long
-                if (System.currentTimeMillis() - start > WAIT_TIME) {
+                if ((System.currentTimeMillis() - start > timeout) && timeout >= 0) {
                     throw new OperationTimedOut(Long.toString(System.currentTimeMillis() - start));
                 }
             }
--- a/j2se/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -69,8 +69,6 @@
     final static int TRAY_ICON_WIDTH = 24;
     final static int TRAY_ICON_HEIGHT = 24;
 
-    static Field f_isTrayIconWindow = SunToolkit.getField(Window.class, "isTrayIconWindow");
-
     XTrayIconPeer(TrayIcon target)
       throws AWTException
     {
@@ -227,21 +225,6 @@
                 }
             };
 
-
-        // Set the EmbeddedFrame override_redirect
-        // to avoid unmapping when switching workspaces.
-        XToolkit.awtLock();
-        try {
-            XSetWindowAttributes xwa = new XSetWindowAttributes();
-            xwa.set_override_redirect(true);
-            XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(), getWindow(),
-                                                XlibWrapper.CWOverrideRedirect, xwa.pData);
-            XlibWrapper.XFlush(XToolkit.getDisplay());
-            xwa.dispose();
-        } finally {
-            XToolkit.awtUnlock();
-        }
-
         addXED(getWindow(), eframeXED, XlibWrapper.StructureNotifyMask);
 
         XSystemTrayPeer.getPeerInstance().addTrayIcon(this); // throws AWTException
@@ -313,9 +296,7 @@
     }
 
     public static void suppressWarningString(Window w) {
-        try {
-            f_isTrayIconWindow.setBoolean(w, true);
-        } catch (IllegalAccessException e) {}
+        WindowAccessor.setTrayIconWindow(w, true);
     }
 
     public void setToolTip(String tooltip) {
@@ -485,6 +466,12 @@
         }
     }
 
+    static boolean isTrayIconStuffWindow(Window w) {
+        return (w instanceof Tooltip) ||
+               (w instanceof Balloon) ||
+               (w instanceof XTrayIconEmbeddedFrame);
+    }
+
     // ***************************************
     // Special embedded frame for tray icon
     // ***************************************
--- a/j2se/src/solaris/classes/sun/awt/X11/XWindow.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XWindow.java	Fri Jun 22 00:46:43 2007 +0000
@@ -845,7 +845,8 @@
                     XAwtState.setComponentMouseEntered(null);
                 }
             } else {
-                ((XComponentPeer)target.getPeer()).pSetCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+                ((XComponentPeer) ComponentAccessor.getPeer(target))
+                    .pSetCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
             }
         }
 
@@ -932,25 +933,6 @@
         ce = new ComponentEvent(target, ComponentEvent.COMPONENT_HIDDEN);
         postEventToEventQueue(ce);
     }
-    public void handleKeyPress(XEvent xev) {
-        super.handleKeyPress(xev);
-        XKeyEvent xkey = xev.get_xkey();
-        if (eventLog.isLoggable(Level.FINE)) eventLog.fine(xev.toString());
-        if (isEventDisabled(xev)) {
-            return;
-        }
-        handleKeyEvent(xkey);
-    }
-
-    public void handleKeyRelease(XEvent xev) {
-        super.handleKeyRelease(xev);
-        XKeyEvent xkey = xev.get_xkey();
-        if (eventLog.isLoggable(Level.FINE)) eventLog.fine(xev.toString());
-        if (isEventDisabled(xev)) {
-            return;
-        }
-        handleKeyEvent(xkey);
-    }
 
     private void dumpKeysymArray(XKeyEvent ev) {
         keyEventLog.fine("  "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 0))+ 
@@ -970,50 +952,44 @@
         return xEventType == XConstants.KeyPress ? java.awt.event.KeyEvent.KEY_PRESSED :
                xEventType == XConstants.KeyRelease ? java.awt.event.KeyEvent.KEY_RELEASED : 0;
     }
-    static java.util.Hashtable<Integer, Character> jkeycode2UCSHash = new java.util.Hashtable<Integer, Character>();
-    static private char getCharForKeycode(int jkeycode) {
-        Character c = jkeycode2UCSHash.get(jkeycode);
-        return c == null ? 0 : c.charValue();
-    }
-    static private void putCharForKeycode(int jkeycode, char ucs) {
-        jkeycode2UCSHash.put(jkeycode, ucs);
-    }
     static private long xkeycodeToKeysym(XKeyEvent ev) {
         return XKeysym.getKeysym( ev );
     }
-    /**
-       Handle a native key event.
-       Using X Window keysym, calculate java keycode; post Java press/release
-       events; if keysym is mapped to a Unicode character, post Java typed
-       event as well.
-       Return (java) keycode. 
-    */
-    int  handleKeyEvent(XKeyEvent ev) {
-        return handleKeyEvent(ev, true);
+    void logIncomingKeyEvent(XKeyEvent ev) {
+        keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev);
+        dumpKeysymArray(ev);
+        keyEventLog.fine("XXXXXXXXXXXXXX javakeycode will be most probably:0x"+ Integer.toHexString(XKeysym.getJavaKeycodeOnly(ev)));
     }
-    int handleKeyEvent(XKeyEvent ev, boolean doPost) {
+    public void handleKeyPress(XEvent xev) {
+        super.handleKeyPress(xev);
+        XKeyEvent ev = xev.get_xkey();
+        if (eventLog.isLoggable(Level.FINE)) eventLog.fine(ev.toString());
+        if (isEventDisabled(xev)) {
+            return;
+        }
+        handleKeyPress(ev); 
+    }
+    // called directly from this package, unlike handleKeyRelease.
+    // un-final it if you need to override it in a subclass.
+    final void handleKeyPress(XKeyEvent ev) {
         int keycode = java.awt.event.KeyEvent.VK_UNDEFINED;
         long keysym[] = new long[2];
         char unicodeKey = 0;
         keysym[0] = NoSymbol;
-
+        
         if (keyEventLog.isLoggable(Level.FINE)) {
-            keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev);
-            keyEventLog.fine("--XWindow.java:handleKeyEvent: type:"+ev.get_type()+"; keycode:"+ev.get_keycode());
-            dumpKeysymArray(ev);
-            keyEventLog.fine("XXXXXXXXXXXXXX javakeycode will be most probably:0x"+ Integer.toHexString(XKeysym.getJavaKeycodeOnly(ev)));
+            logIncomingKeyEvent( ev );
         }
         if ( //TODO check if there's an active input method instance
              // without calling a native method. Is it necessary though?
-            haveCurrentX11InputMethodInstance()
-            && ev.get_type() == XConstants.KeyPress) {
+            haveCurrentX11InputMethodInstance()) {
             if (x11inputMethodLookupString(ev.pData, keysym)) {
                 if (keyEventLog.isLoggable(Level.FINE)) {
                     keyEventLog.fine("--XWindow.java XIM did process event; return; dec keysym processed:"+(keysym[0])+
                                    "; hex keysym processed:"+Long.toHexString(keysym[0])
                                    );
                 }
-                return java.awt.event.KeyEvent.VK_UNDEFINED;
+                return;
             }else {
                 unicodeKey = keysymToUnicode( keysym[0], ev.get_state() );
                 if (keyEventLog.isLoggable(Level.FINE)) {
@@ -1021,7 +997,7 @@
                                      "                                         unicode key:"+Integer.toHexString((int)unicodeKey));
                 }
             }
-        }else if(ev.get_type() == XConstants.KeyPress) {
+        }else  {
             // No input method instance found. For example, there's a Java Input Method.
             // Produce do-it-yourself keysym and perhaps unicode character.
             keysym[0] = xkeycodeToKeysym(ev);
@@ -1031,13 +1007,11 @@
                                  "                                         unicode key:"+Integer.toHexString((int)unicodeKey));
             }
         }
-        // Release or unprocessed Press by XIM.
         // Keysym should be converted to Unicode, if possible and necessary,
         // and Java KeyEvent keycode should be calculated.
-        // For press we should post pressed & typed Java events;
-        // for release - released event.
+        // For press we should post pressed & typed Java events.
         //
-        // Press event might be not processed because
+        // Press event might be not processed to this time because
         //  (1) either XIM could not handle it or
         //  (2) it was Latin 1:1 mapping.
         //
@@ -1045,30 +1019,20 @@
         if( jkc == null ) {
             jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN);
         }
-        if(doPost) {
-        
-            if (keyEventLog.isLoggable(Level.FINE)) {
-                keyEventLog.fine(">>>Fire Event:"+
-                   (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+
-                   "jkeycode:decimal="+jkc.getJavaKeycode()+
-                   ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "
-                );
-            }
-            
-            if(ev.get_type() == XConstants.KeyRelease) {
-                // We obtain keysym from IM and derive unicodeKey from it for
-                // KeyPress only. After that, we cache this unicode character
-                // for Java keycode and now retrieve it.
-                unicodeKey = getCharForKeycode(jkc.getJavaKeycode());
-            }
-            postKeyEvent( keyEventType2Id(ev.get_type()),  // _PRESSED or _RELEASED
+        if (keyEventLog.isLoggable(Level.FINE)) {
+            keyEventLog.fine(">>>Fire Event:"+
+               (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+
+               "jkeycode:decimal="+jkc.getJavaKeycode()+
+               ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "
+            );
+        }
+        postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED, 
                           ev.get_time(),
                           jkc.getJavaKeycode(),
                           (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
                           jkc.getKeyLocation(),
                           ev.get_state(),ev.getPData(), XKeyEvent.getSize());
-                          
-            if((ev.get_type() == XConstants.KeyPress) && unicodeKey > 0 ) {
+        if( unicodeKey > 0 ) {
                 keyEventLog.fine("fire _TYPED on "+unicodeKey);
                 postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED,
                               ev.get_time(),
@@ -1076,12 +1040,60 @@
                               unicodeKey,
                               java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN,
                               ev.get_state(),ev.getPData(), XKeyEvent.getSize());
-                // cache character for later use with KeyRelease.
-                putCharForKeycode(jkc.getJavaKeycode(), unicodeKey);
-            }
-        } // fi(doPost)
+        }
+        
+        
+    }
 
-        return jkc.getJavaKeycode();
+    public void handleKeyRelease(XEvent xev) {
+        super.handleKeyRelease(xev);
+        XKeyEvent ev = xev.get_xkey();
+        if (eventLog.isLoggable(Level.FINE)) eventLog.fine(ev.toString());
+        if (isEventDisabled(xev)) {
+            return;
+        }
+        handleKeyRelease(ev); 
+    }
+    // un-private it if you need to call it from elsewhere
+    private void handleKeyRelease(XKeyEvent ev) {
+        int keycode = java.awt.event.KeyEvent.VK_UNDEFINED;
+        long keysym[] = new long[2];
+        char unicodeKey = 0;
+        keysym[0] = NoSymbol;
+        
+        if (keyEventLog.isLoggable(Level.FINE)) {
+            logIncomingKeyEvent( ev );
+        }
+        // Keysym should be converted to Unicode, if possible and necessary,
+        // and Java KeyEvent keycode should be calculated.
+        // For release we should post released event.
+        //
+        XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev);
+        if( jkc == null ) {
+            jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN);
+        }
+        if (keyEventLog.isLoggable(Level.FINE)) {
+            keyEventLog.fine(">>>Fire Event:"+
+               (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+
+               "jkeycode:decimal="+jkc.getJavaKeycode()+
+               ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "
+            );
+        }
+        // We obtain keysym from IM and derive unicodeKey from it for KeyPress only. 
+        // We used to cache that value and retrieve it on KeyRelease,
+        // but in case for example of a dead key+vowel pair, a vowel after a deadkey
+        // might never be cached before.
+        // Also, switching between keyboard layouts, we might cache a wrong letter. 
+        // That's why we use the same procedure as if there was no IM instance: do-it-yourself unicode.
+        unicodeKey = keysymToUnicode( xkeycodeToKeysym(ev), ev.get_state() );
+        
+        postKeyEvent(  java.awt.event.KeyEvent.KEY_RELEASED,
+                          ev.get_time(),
+                          jkc.getJavaKeycode(),
+                          (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
+                          jkc.getKeyLocation(),
+                          ev.get_state(),ev.getPData(), XKeyEvent.getSize());
+        
     }
 
     public void reshape(Rectangle bounds) {
--- a/j2se/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -43,6 +43,7 @@
 import java.util.logging.Logger;
 
 import sun.awt.ComponentAccessor;
+import sun.awt.WindowAccessor;
 import sun.awt.DisplayChangedListener;
 import sun.awt.SunToolkit;
 import sun.awt.X11GraphicsDevice;
@@ -57,14 +58,16 @@
     private static final Logger grabLog = Logger.getLogger("sun.awt.X11.grab.XWindowPeer");
     private static final Logger iconLog = Logger.getLogger("sun.awt.X11.icon.XWindowPeer");
 
-    private static Set windows = new HashSet();
+    // should be synchronized on awtLock
+    private static Set<XWindowPeer> windows = new HashSet<XWindowPeer>();
+
     static XAtom wm_protocols;
     static XAtom wm_delete_window; 
     static XAtom wm_take_focus;
 
     Insets insets = new Insets( 0, 0, 0, 0 );
     XWindowAttributesData winAttr;
-    boolean cachedFocusableWindow;
+    private boolean cachedFocusableWindow;
     XWarningWindow warningWindow;
 
     private boolean alwaysOnTop;
@@ -79,14 +82,26 @@
 
     // used for modal blocking to keep existing z-order
     protected XWindowPeer prevTransientFor, nextTransientFor;
+    // value of WM_TRANSIENT_FOR hint set on this window
+    private XWindowPeer curRealTransientFor;
+
     private boolean grab = false; // Whether to do a grab during showing
     
+    private boolean isMapped = false; // Is this window mapped or not
     private boolean stateChanged; // Indicates whether the value on savedState is valid
     private int savedState; // Holds last known state of the top-level window
     private boolean mustControlStackPosition = false; // Am override-redirect not on top
     private XEventDispatcher rootPropertyEventDispatcher = null;
-    private boolean focusOnMapNotify = true; // Do we have to focus the window on MapNotify.
-    protected Vector <ToplevelStateListener> toplevelStateListeners = new Vector<ToplevelStateListener>(); //it need to be accessed from XFramePeer
+
+    /*
+     * Focus related flags
+     */    
+    private boolean isUnhiding = false;             // Is the window unhiding.                    
+    private boolean isBeforeFirstMapNotify = false; // Is the window (being shown) between
+                                                    //    setVisible(true) & handleMapNotify().
+
+    // It need to be accessed from XFramePeer.
+    protected Vector <ToplevelStateListener> toplevelStateListeners = new Vector<ToplevelStateListener>();
     XWindowPeer(XCreateWindowParams params) {
         super(params.putIfNull(PARENT_WINDOW, Long.valueOf(0)));
     }
@@ -118,20 +133,22 @@
     private static final int MAXIMUM_BUFFER_LENGTH_NET_WM_ICON = (2<<15) - 1;
 
     void preInit(XCreateWindowParams params) {
+        params.put(REPARENTED,
+                   Boolean.valueOf(isOverrideRedirect() || isSimpleWindow()));
         super.preInit(params);        
         params.putIfNull(BIT_GRAVITY, Integer.valueOf(NorthWestGravity));
 
         savedState = WithdrawnState;
         XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");
 
-        windows.add(this);
-
         winAttr = new XWindowAttributesData();
         insets = new Insets(0,0,0,0);
 
         params.put(OVERRIDE_REDIRECT, Boolean.valueOf(isOverrideRedirect()));
-        XToolkit.awtLock();
+
+        SunToolkit.awtLock();
         try {
+            windows.add(this);
             if (wm_protocols == null) {
                 wm_protocols = XAtom.get("WM_PROTOCOLS");
                 wm_delete_window = XAtom.get("WM_DELETE_WINDOW");
@@ -139,7 +156,7 @@
             }
         }
         finally {
-            XToolkit.awtUnlock();
+            SunToolkit.awtUnlock();
         }
         cachedFocusableWindow = isFocusableWindow();
 
@@ -239,11 +256,9 @@
         if (((Window)target).getWarningString() != null) {
             // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
             // and TrayIcon balloon windows without a warning window.
-            try {
-                if (!XTrayIconPeer.f_isTrayIconWindow.getBoolean((Window)target)) {
-                    warningWindow = new XWarningWindow((Window)target, getWindow());
-                }
-            } catch (IllegalAccessException e) {} 
+            if (!WindowAccessor.isTrayIconWindow((Window)target)) {
+                warningWindow = new XWarningWindow((Window)target, getWindow());
+            }
         }
 
         setSaveUnder(true);
@@ -440,6 +455,14 @@
             setSizeHints(hints.get_flags() | XlibWrapper.PPosition | XlibWrapper.PSize, 
                              bounds.x, bounds.y, bounds.width, bounds.height);
             XWM.setMotifDecor(this, false, 0, 0); 
+
+            XNETProtocol protocol = XWM.getWM().getNETProtocol();
+            if (protocol != null && protocol.active()) {
+                XAtomList net_wm_state = getNETWMState();
+                net_wm_state.add(protocol.XA_NET_WM_STATE_SKIP_TASKBAR);
+                setNETWMState(net_wm_state);
+            }
+
         
 	    if (!bounds.getSize().equals(oldBounds.getSize())) {
 		postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_RESIZED));
@@ -499,14 +522,38 @@
         return getInsets();
     }
 
+    boolean isAutoRequestFocus() {
+        if (XToolkit.isToolkitThread()) {
+            return WindowAccessor.isAutoRequestFocus((Window)target);
+        } else {
+            return ((Window)target).isAutoRequestFocus();
+        }
+    }
+
+    /*
+     * Converts native focused X window id into Java peer.
+     */
+    static XWindowPeer getNativeFocusedWindowPeer() {
+        XBaseWindow baseWindow = XToolkit.windowToXWindow(xGetInputFocus());
+        return (baseWindow instanceof XWindowPeer) ? (XWindowPeer)baseWindow :
+               (baseWindow instanceof XFocusProxyWindow) ?
+               ((XFocusProxyWindow)baseWindow).getOwner() : null;
+    }
+
     boolean isFocusableWindow() {
-        if (XToolkit.isToolkitThread()) {
+        if (XToolkit.isToolkitThread() || SunToolkit.isAWTLockHeldByCurrentThread())
+        {
             return cachedFocusableWindow;
         } else {
             return ((Window)target).isFocusableWindow();
         }
     }
 
+    /* WARNING: don't call client code in this method! */
+    boolean isFocusedWindowModalBlocker() {
+        return false;
+    }
+
     long getFocusTargetWindow() {
         return getContentWindow();
     }
@@ -518,7 +565,8 @@
      * - Java window is simple Window(not Frame or Dialog)    
      */
     boolean isNativelyNonFocusableWindow() {
-        if (XToolkit.isToolkitThread()) {
+        if (XToolkit.isToolkitThread() || SunToolkit.isAWTLockHeldByCurrentThread())
+        {
             return isSimpleWindow() || !cachedFocusableWindow;
         } else {
             return isSimpleWindow() || !(((Window)target).isFocusableWindow());
@@ -527,12 +575,14 @@
 
     public void handleWindowFocusIn_Dispatch() {
         if (EventQueue.isDispatchThread()) {
+            XKeyboardFocusManagerPeer.setCurrentNativeFocusedWindow((Window) target);
             target.dispatchEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_GAINED_FOCUS));
         }
     }
 
     public void handleWindowFocusInSync(long serial) {
         WindowEvent we = new WindowEvent((Window)target, WindowEvent.WINDOW_GAINED_FOCUS);
+        XKeyboardFocusManagerPeer.setCurrentNativeFocusedWindow((Window) target);
         sendEvent(we);
     }
     // NOTE: This method may be called by privileged threads.
@@ -540,6 +590,7 @@
     public void handleWindowFocusIn(long serial) {
         WindowEvent we = new WindowEvent((Window)target, WindowEvent.WINDOW_GAINED_FOCUS);
         /* wrap in Sequenced, then post*/
+        XKeyboardFocusManagerPeer.setCurrentNativeFocusedWindow((Window) target);
         postEvent(wrapInSequenced((AWTEvent) we));
     }
 
@@ -547,11 +598,15 @@
     //       DO NOT INVOKE CLIENT CODE ON THIS THREAD!
     public void handleWindowFocusOut(Window oppositeWindow, long serial) {
         WindowEvent we = new WindowEvent((Window)target, WindowEvent.WINDOW_LOST_FOCUS, oppositeWindow);
+        XKeyboardFocusManagerPeer.setCurrentNativeFocusedWindow(null);
+        XKeyboardFocusManagerPeer.setCurrentNativeFocusOwner(null);
         /* wrap in Sequenced, then post*/        
         postEvent(wrapInSequenced((AWTEvent) we));
     }
     public void handleWindowFocusOutSync(Window oppositeWindow, long serial) {
         WindowEvent we = new WindowEvent((Window)target, WindowEvent.WINDOW_LOST_FOCUS, oppositeWindow);
+        XKeyboardFocusManagerPeer.setCurrentNativeFocusedWindow(null);
+        XKeyboardFocusManagerPeer.setCurrentNativeFocusOwner(null);
         sendEvent(we);
     }
 
@@ -702,7 +757,7 @@
         // is active. If it is - we can freely synthesize focus transfer.
         // Luckily, this logic is already implemented in requestWindowFocus.
         if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Requesting window focus");
-        requestWindowFocus();
+        requestWindowFocus(time, timeProvided);
     }
 
     public final boolean focusAllowedFor() {
@@ -749,24 +804,17 @@
             {
                 // If this window is non-focusable don't post any java focus event
                 if (!isNativelyNonFocusableWindow()) {
-                    XBaseWindow oppositeXBaseWindow = XToolkit.windowToXWindow(xGetInputFocus());
-                    XWindowPeer oppositeXWindow = (oppositeXBaseWindow instanceof XWindowPeer)?(XWindowPeer)oppositeXBaseWindow:
-                        (oppositeXBaseWindow instanceof XFocusProxyWindow)?((XFocusProxyWindow)oppositeXBaseWindow).getOwner():null;
+                    XWindowPeer oppositeXWindow = getNativeFocusedWindowPeer();
                     Object oppositeTarget = (oppositeXWindow!=null)? oppositeXWindow.getTarget() : null;
                     Window oppositeWindow = null;
                     if (oppositeTarget instanceof Window) {
-                        oppositeWindow = (Window)oppositeTarget;
+                        oppositeWindow = (Window) oppositeTarget;
                     }
                     // Check if opposite window is non-focusable. In that case we don't want to
                     // post any event.
                     if (oppositeXWindow != null && oppositeXWindow.isNativelyNonFocusableWindow()) {
                         return;
                     }
-                    // If opposite window is disabled because of modality don't mark as
-                    // opposite in a focus event
-                    if (oppositeXWindow != null && !oppositeXWindow.focusAllowedFor()) {
-                        oppositeXWindow = null;
-                    }
                     if (this == oppositeXWindow) {
                         oppositeWindow = null;
                     }
@@ -785,9 +833,10 @@
         }
         if (isVisible()) {
             super.toFront();
-            if (isFocusableWindow() && !isModalBlocked() && !isWithdrawn()) {
+            if (isFocusableWindow() && isAutoRequestFocus() &&
+                !isModalBlocked() && !isWithdrawn())
+            {
                 requestInitialFocus();
-
             }
         } else {
             setVisible(true);
@@ -813,12 +862,9 @@
         // FIXME: do not call them "toplevel" as it is misleading.
         //
         HashSet toplevels = new HashSet();
-        Iterator it = windows.iterator();
-        XWindowPeer xp = null;
         long topl = 0, mytopl = 0;
 
-        while( it.hasNext() ) {
-            xp = (XWindowPeer)(it.next());
+        for (XWindowPeer xp : windows) {
             topl = getToplevelWindow( xp.getWindow() );
             if( xp.equals( this ) ) {
                 mytopl = topl;
@@ -939,6 +985,21 @@
     }
     
     public void setVisible(boolean vis) {
+        if (!isVisible() && vis) {
+            isBeforeFirstMapNotify = true;
+            winAttr.initialFocus = isAutoRequestFocus();
+            if (!winAttr.initialFocus) {
+                /*
+                 * It's easier and safer to temporary suppress WM_TAKE_FOCUS
+                 * protocol itself than to ignore WM_TAKE_FOCUS client message.
+                 * Because we will have to make the difference between 
+                 * the message come after showing and the message come after
+                 * activation. Also, on Metacity, for some reason, we have _two_
+                 * WM_TAKE_FOCUS client messages when showing a frame/dialog.
+                 */
+                suppressWmTakeFocus(true);
+            }
+        }       
         updateFocusability();
         promoteDefaultPosition();
         super.setVisible(vis);
@@ -972,6 +1033,9 @@
         } 
     }
 
+    protected void suppressWmTakeFocus(boolean doSuppress) {
+    }
+
     final boolean isSimpleWindow() {
         return !(target instanceof Frame || target instanceof Dialog);
     }
@@ -1002,7 +1066,8 @@
     }
 
     boolean isOverrideRedirect() {
-        return XWM.getWMID() == XWM.OPENLOOK_WM ? true : false;
+        return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) ||
+            XTrayIconPeer.isTrayIconStuffWindow((Window)target);
     }
 
     final boolean isOLWMDecorBug() {
@@ -1011,7 +1076,12 @@
     }
 
     public void dispose() {
-        windows.remove(this);
+        SunToolkit.awtLock();
+        try {
+            windows.remove(this);
+        } finally {
+            SunToolkit.awtUnlock();
+        }
         if (warningWindow != null) {
             warningWindow.destroy();
         }
@@ -1061,14 +1131,36 @@
 
     public void handleMapNotifyEvent(XEvent xev) {
         // See 6480534.
-        focusOnMapNotify |= isWMStateNetHidden();
+        isUnhiding |= isWMStateNetHidden();
 
         super.handleMapNotifyEvent(xev);
-        if (isFocusableWindow() && !isModalBlocked() && focusOnMapNotify) {
+        if (!winAttr.initialFocus) {
+            suppressWmTakeFocus(false); // restore the protocol.
+            /*
+             * For some reason, on Metacity, a frame/dialog being shown
+             * without WM_TAKE_FOCUS protocol doesn't get moved to the front.
+             * So, we do it evidently.
+             */
+            XToolkit.awtLock();
+            try {
+                XlibWrapper.XRaiseWindow(XToolkit.getDisplay(), getWindow());
+            } finally {
+                XToolkit.awtUnlock();
+            }
+        }
+        if (shouldFocusOnMapNotify()) {
+            focusLog.fine("Automatically request focus on window");
             requestInitialFocus();
         }
-        focusOnMapNotify = false;
+        isUnhiding = false;
+        isBeforeFirstMapNotify = false;
         updateAlwaysOnTop();
+
+        synchronized (getStateLock()) {
+            if (!isMapped) {
+                isMapped = true;
+            }
+        }
     }
 
     public void handleUnmapNotifyEvent(XEvent xev) {
@@ -1076,7 +1168,29 @@
 
         // On Metacity UnmapNotify comes before PropertyNotify (for _NET_WM_STATE_HIDDEN).
         // So we also check for the property later in MapNotify. See 6480534.
-        focusOnMapNotify |= isWMStateNetHidden();
+        isUnhiding |= isWMStateNetHidden();
+
+        synchronized (getStateLock()) {
+            if (isMapped) {
+                isMapped = false;
+            }
+        }
+    }
+
+    private boolean shouldFocusOnMapNotify() {
+        boolean res = false; 
+         
+        if (isBeforeFirstMapNotify) {
+            res = (winAttr.initialFocus ||          // Window.autoRequestFocus
+                   isFocusedWindowModalBlocker());
+        } else {
+            res = isUnhiding;                       // Unhiding
+        }
+        res = res &&
+            isFocusableWindow() &&                  // General focusability
+            !isModalBlocked();                      // Modality
+         
+        return res;
     }
 
     private boolean isWMStateNetHidden() {
@@ -1170,7 +1284,7 @@
         XToolkit.awtLock();
         try {
             if (isReparented() && delayedModalBlocking) {
-                addToTransientFors((XDialogPeer)modalBlocker.getPeer());
+                addToTransientFors((XDialogPeer) ComponentAccessor.getPeer(modalBlocker));
                 delayedModalBlocking = false;
             }
         } finally {
@@ -1182,7 +1296,7 @@
      * Returns a Vector of all Java top-level windows,
      * sorted by their current Z-order
      */
-    private static Vector<XWindowPeer> collectJavaToplevels() {
+    static Vector<XWindowPeer> collectJavaToplevels() {
         Vector<XWindowPeer> javaToplevels = new Vector<XWindowPeer>();
         Vector<Long> v = new Vector<Long>();
         X11GraphicsEnvironment ge =
@@ -1197,7 +1311,8 @@
         } else {
             v.add(XToolkit.getDefaultRootWindow());
         }
-        while (v.size() > 0) {
+        final int windowsCount = windows.size();
+        while ((v.size() > 0) && (javaToplevels.size() < windowsCount)) {
             long win = v.remove(0);
             XQueryTree qt = new XQueryTree(win);
             try {
@@ -1244,17 +1359,22 @@
     }
 
     public void setModalBlocked(Dialog d, boolean blocked) {
+        setModalBlocked(d, blocked, null);
+    }
+    public void setModalBlocked(Dialog d, boolean blocked,
+                                Vector<XWindowPeer> javaToplevels)
+    {
         XToolkit.awtLock();
         try {
             // State lock should always be after awtLock
             synchronized(getStateLock()) {
-                XDialogPeer blockerPeer = (XDialogPeer)d.getPeer();
+                XDialogPeer blockerPeer = (XDialogPeer) ComponentAccessor.getPeer(d);
                 if (blocked) {
                     log.log(Level.FINE, "{0} is blocked by {1}", new Object[] { this, blockerPeer});
                     modalBlocker = d;
 
                     if (isReparented() || XWM.isNonReparentingWM()) {
-                        addToTransientFors(blockerPeer);
+                        addToTransientFors(blockerPeer, javaToplevels);
                     } else {
                         delayedModalBlocking = true;
                     }
@@ -1304,6 +1424,9 @@
             window.prevTransientFor = transientForWindow;
             transientForWindow.nextTransientFor = window;
         }
+        if (window.curRealTransientFor == transientForWindow) {
+            return;
+        }
         if (!allStates && (window.getWMState() != transientForWindow.getWMState())) {
             return;
         }
@@ -1319,6 +1442,7 @@
             tpw = XlibUtil.getParentWindow(tpw);
         }
         XlibWrapper.XSetTransientFor(XToolkit.getDisplay(), bpw, tpw);
+        window.curRealTransientFor = transientForWindow;
     }
 
     /*
@@ -1364,6 +1488,7 @@
             bpw = XlibUtil.getParentWindow(bpw);
         }
         XlibWrapper.XDeleteProperty(XToolkit.getDisplay(), bpw, XA_WM_TRANSIENT_FOR.getAtom());
+        window.curRealTransientFor = null;
     }
 
     /*
@@ -1407,6 +1532,11 @@
      * @see #setModalBlocked
      */
     private void addToTransientFors(XDialogPeer blockerPeer) {
+        addToTransientFors(blockerPeer, null);
+    }
+
+    private void addToTransientFors(XDialogPeer blockerPeer, Vector<XWindowPeer> javaToplevels)
+    {
         // blockerPeer chain iterator
         XWindowPeer blockerChain = blockerPeer;
         while (blockerChain.prevTransientFor != null) {
@@ -1424,8 +1554,10 @@
         if (blockerChain == blockerPeer) {
             setToplevelTransientFor(blockerPeer, this, true, false);
         } else {
-            Vector<XWindowPeer> javaToplevels = collectJavaToplevels();
-            // Collect all the Java top-levels
+            // Collect all the Java top-levels, if required
+            if (javaToplevels == null) {
+                javaToplevels = collectJavaToplevels();
+            }
             // merged chain tail
             XWindowPeer mergedChain = null;
             for (XWindowPeer w : javaToplevels) {
@@ -1516,7 +1648,7 @@
         // current chain iterator in the order from next to prev
         XWindowPeer chainToSplit = prevTransientFor;
         while (chainToSplit != null) {
-            XWindowPeer blocker = (XWindowPeer)chainToSplit.modalBlocker.getPeer();
+            XWindowPeer blocker = (XWindowPeer) ComponentAccessor.getPeer(chainToSplit.modalBlocker);
             if (thisChainBlockers.contains(blocker)) {
                 // add to this dialog's chain
                 setToplevelTransientFor(thisChain, chainToSplit, true, false);
@@ -1550,15 +1682,19 @@
     }
 
     public boolean requestWindowFocus() {
+        return requestWindowFocus(0, false);
+    }
+
+    public boolean requestWindowFocus(long time, boolean timeProvided) {
         focusLog.fine("Request for window focus");
         // If this is Frame or Dialog we can't assure focus request success - but we still can try
-        // If this is Window and its owner Frame is active we can be sure request succedded.        
+        // If this is Window and its owner Frame is active we can be sure request succedded.
         Window win = (Window) target;
         Window owner = XWindowPeer.getDecoratedOwner(win);
 
-        Window activeWindow =
+        final Window activeWindow =
                 XWindowPeer.getDecoratedOwner(XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow());
-        if (activeWindow != owner) {
+        if (activeWindow == owner) {
             focusLog.fine("Parent window is active - generating focus for this window");
             handleWindowFocusInSync(-1);
             return true;
@@ -1568,7 +1704,7 @@
         ComponentPeer peer = ComponentAccessor.getPeer(owner);
         if (peer instanceof XDecoratedPeer) {
             XDecoratedPeer wpeer = (XDecoratedPeer) peer;
-            if (wpeer.requestWindowFocus(this)) {
+            if (wpeer.requestWindowFocus(this, time, timeProvided)) {
                 focusLog.fine("Parent window accepted focus request - generating focus for this window");
                 return true;
             }
@@ -1827,7 +1963,7 @@
                            && pressTarget != target)
                 {
                     // during grab we do receive mouse release on different component (not on the source
-                    // of nouse press).  So we need to retarget it.
+                    // of mouse press).  So we need to retarget it.
                     // see 6390326 for more information.
                     target = pressTarget.isVisible() ? pressTarget : this;
                     xbe.set_window(target.getWindow());
@@ -1857,9 +1993,9 @@
                     if (toplevel != null) {
                         Window w = (Window)toplevel.target;
                         while (w != null && toplevel != this && !(toplevel instanceof XDialogPeer)) {
-                            w = w.getOwner();
+                            w = (Window) ComponentAccessor.getParent_NoClientCode(w);
                             if (w != null) {
-                                toplevel = (XWindowPeer)w.getPeer();
+                                toplevel = (XWindowPeer) ComponentAccessor.getPeer(w);
                             }
                         }
                         if (w == null || (w != this.target && w instanceof Dialog)) {
--- a/j2se/src/solaris/classes/sun/awt/X11GraphicsDevice.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/X11GraphicsDevice.java	Fri Jun 22 00:46:43 2007 +0000
@@ -84,13 +84,15 @@
         return screen;
     }
 
-    public synchronized Object getProxyKeyFor(SurfaceType st) {
-        Object o = x11ProxyKeyMap.get(st);
-        if (o == null) {
-            o = new Object();
-            x11ProxyKeyMap.put(st, o);
+    public Object getProxyKeyFor(SurfaceType st) {
+        synchronized (x11ProxyKeyMap) {
+            Object o = x11ProxyKeyMap.get(st);
+            if (o == null) {
+                o = new Object();
+                x11ProxyKeyMap.put(st, o);
+            }
+            return o;
         }
-        return o;
     }
 
     /**
--- a/j2se/src/solaris/classes/sun/awt/motif/MDialogPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/motif/MDialogPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -98,4 +98,8 @@
 //       uncomment the postEvent.
 //       postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_DEICONIFIED));
     }
+
+    public void blockWindows(java.util.List<Window> toBlock) {
+        // do nothing
+    }
 }
--- a/j2se/src/solaris/classes/sun/awt/motif/MToolkit.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/motif/MToolkit.java	Fri Jun 22 00:46:43 2007 +0000
@@ -713,7 +713,7 @@
     /**
      * @inheritDoc
      */ 
-    protected boolean syncNativeQueue() {
+    protected boolean syncNativeQueue(final long timeout) {
         awtLock();
         try {
             long event_number = getEventNumber();
@@ -723,13 +723,13 @@
             long start = System.currentTimeMillis();
             while (!isSyncUpdated() && !isSyncFailed()) {
                 try {
-                    awtLockWait(WAIT_TIME);
+                    awtLockWait(timeout);
                 } catch (InterruptedException e) {
                     throw new RuntimeException(e);
                 }
                 // This "while" is a protection from spurious
                 // wake-ups.  However, we shouldn't wait for too long
-                if (System.currentTimeMillis() - start > WAIT_TIME) {
+                if (((System.currentTimeMillis() - start) > timeout) && (timeout >= 0)) {
                     throw new OperationTimedOut();
                 }
             }
@@ -775,5 +775,53 @@
         throw new UnsupportedOperationException();
     }
 
+    public final static int
+        UNDETERMINED_WM = 1,
+        NO_WM = 2,
+        OTHER_WM = 3,
+        OPENLOOK_WM = 4,
+        MOTIF_WM = 5,
+        CDE_WM = 6,
+        ENLIGHTEN_WM = 7,
+        KDE2_WM = 8,
+        SAWFISH_WM = 9,
+        ICE_WM = 10,
+        METACITY_WM = 11,
+        COMPIZ_WM = 12,
+        LG3D_WM = 13;
+
+    public static int getWMID() {
+        String wmName = getWMName();
+
+        if ("NO_WM".equals(wmName)) {
+            return NO_WM;
+        } else if ("OTHER_WM".equals(wmName)) {
+            return OTHER_WM;
+        } else if ("ENLIGHTEN_WM".equals(wmName)) {
+            return ENLIGHTEN_WM;
+        } else if ("KDE2_WM".equals(wmName)) {
+            return KDE2_WM;
+        } else if ("SAWFISH_WM".equals(wmName)) {
+            return SAWFISH_WM;
+        } else if ("ICE_WM".equals(wmName)) {
+            return ICE_WM;
+        } else if ("METACITY_WM".equals(wmName)) {
+            return METACITY_WM;
+        } else if ("OPENLOOK_WM".equals(wmName)) {
+            return OPENLOOK_WM;
+        } else if ("MOTIF_WM".equals(wmName)) {
+            return MOTIF_WM;
+        } else if ("CDE_WM".equals(wmName)) {
+            return CDE_WM;
+        } else if ("COMPIZ_WM".equals(wmName)) {
+            return COMPIZ_WM;
+        } else if ("LG3D_WM".equals(wmName)) {
+            return LG3D_WM;
+        }
+        return UNDETERMINED_WM;
+    }
+
+    private static native String getWMName();
+
 } // class MToolkit
 
--- a/j2se/src/solaris/classes/sun/awt/motif/MWindowPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/awt/motif/MWindowPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -53,8 +53,9 @@
     int dropTargetCount = 0;
     boolean alwaysOnTop;
 
-    native void pCreate(MComponentPeer parent, String targetClassName);
+    native void pCreate(MComponentPeer parent, String targetClassName, boolean isFocusableWindow);
     native void pShow();
+    native void pToFront();
     native void pShowModal(boolean isModal);
     native void pHide();
     native void pReshape(int x, int y, int width, int height);
@@ -101,7 +102,7 @@
     }
 
     void create(MComponentPeer parent) {
-        pCreate(parent, target.getClass().getName());
+        pCreate(parent, target.getClass().getName(), ((Window)target).isFocusableWindow());
     }
 
     void init( Window target ) {
@@ -177,7 +178,8 @@
 
     public void toFront() {
         if (target.isVisible()) {
-            pShow();
+            updateFocusableWindowState();
+            pToFront();
         }
     }
 
@@ -187,6 +189,9 @@
     native void setFocusableWindow(boolean value);
  
     public void setVisible( boolean b ) {
+        if (b) {
+            updateFocusableWindowState();
+        }
         super.setVisible(b);
         updateAlwaysOnTop(alwaysOnTop);
     }    
--- a/j2se/src/solaris/classes/sun/print/IPPPrintService.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/print/IPPPrintService.java	Fri Jun 22 00:46:43 2007 +0000
@@ -550,10 +550,10 @@
 	    }
 
 	    return allMedia;
-	} else if (category == MediaPrintableArea.class) {
+	} else if (category == MediaPrintableArea.class) {           
 	    MediaPrintableArea[] mpas = null;
 	    if (cps != null) {
-		mpas = cps.getMediaPrintableArea();
+                mpas = cps.getMediaPrintableArea();                
 	    } 
 	    
 	    if (mpas == null) {
@@ -561,9 +561,21 @@
 		mpas[0] = (MediaPrintableArea)
 		    getDefaultAttributeValue(MediaPrintableArea.class);
 	    }
-
-	    if ((attributes == null) || (attributes.size() == 0)) {
-		return mpas;
+           
+            if ((attributes == null) || (attributes.size() == 0)) {
+                ArrayList<MediaPrintableArea> printableList =  
+                                       new ArrayList<MediaPrintableArea>();
+ 
+                for (int i=0; i<mpas.length; i++) {
+                    if (mpas[i] != null) {
+                        printableList.add(mpas[i]);
+                    } 
+                }
+                if (printableList.size() > 0) {
+                    mpas  = new MediaPrintableArea[printableList.size()];
+                    printableList.toArray(mpas);         
+                }
+                return mpas;
 	    }
 	    
 	    int match = -1;
@@ -1380,11 +1392,11 @@
 		     (defaultCountry.equals("") ||
 		      defaultCountry.equals(Locale.US.getCountry()) ||
 		      defaultCountry.equals(Locale.CANADA.getCountry()))) {
-		     iw = MediaSize.NA.LETTER.getX(Size2DSyntax.INCH) - 2.0f;
-		     ih = MediaSize.NA.LETTER.getY(Size2DSyntax.INCH) - 2.0f;
+                     iw = MediaSize.NA.LETTER.getX(Size2DSyntax.INCH) - 0.5f;
+                     ih = MediaSize.NA.LETTER.getY(Size2DSyntax.INCH) - 0.5f;
 		 } else {
-		     iw = MediaSize.ISO.A4.getX(Size2DSyntax.INCH) - 2.0f;
-		     ih = MediaSize.ISO.A4.getY(Size2DSyntax.INCH) - 2.0f;
+                     iw = MediaSize.ISO.A4.getX(Size2DSyntax.INCH) - 0.5f;
+                     ih = MediaSize.ISO.A4.getY(Size2DSyntax.INCH) - 0.5f;
 		 }
 		 return new MediaPrintableArea(0.25f, 0.25f, iw, ih,
 					       MediaPrintableArea.INCH);
--- a/j2se/src/solaris/classes/sun/print/UnixPrintService.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/print/UnixPrintService.java	Fri Jun 22 00:46:43 2007 +0000
@@ -222,12 +222,25 @@
 	String command = "/usr/bin/lpstat -a " + printer;
 	String results[]= UnixPrintServiceLookup.execCmd(command);
 	
-	if (results != null && results.length > 0 &&
-	    results[0].startsWith(printer + " accepting requests")) {
-	    return PrinterIsAcceptingJobs.ACCEPTING_JOBS ;
-	} else {
-	    return PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS ;
-	}
+        if (results != null && results.length > 0) {
+            if (results[0].startsWith(printer + " accepting requests")) {
+                return PrinterIsAcceptingJobs.ACCEPTING_JOBS;
+            }
+            else if (results[0].startsWith(printer)) {
+                /* As well as "myprinter accepting requests", look for
+                 * "myprinter@somehost accepting requests".
+                 */
+                int index = printer.length();
+                String str = results[0];
+                if (str.length() > index &&
+                    str.charAt(index) == '@' &&
+                    str.indexOf(" accepting requests", index) > 0 &&
+                    str.indexOf(" not accepting requests", index) == -1) {
+                   return PrinterIsAcceptingJobs.ACCEPTING_JOBS; 
+                }
+            }
+        }
+        return PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS ;
     }
 
     private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsBSD() {
@@ -608,11 +621,11 @@
 		(defaultCountry.equals("") ||
 		 defaultCountry.equals(Locale.US.getCountry()) ||
 		 defaultCountry.equals(Locale.CANADA.getCountry()))) {
-		iw = MediaSize.NA.LETTER.getX(Size2DSyntax.INCH) - 2.0f;
-		ih = MediaSize.NA.LETTER.getY(Size2DSyntax.INCH) - 2.0f;
+                iw = MediaSize.NA.LETTER.getX(Size2DSyntax.INCH) - 0.5f;
+                ih = MediaSize.NA.LETTER.getY(Size2DSyntax.INCH) - 0.5f;
 	    } else {
-		iw = MediaSize.ISO.A4.getX(Size2DSyntax.INCH) - 2.0f;
-		ih = MediaSize.ISO.A4.getY(Size2DSyntax.INCH) - 2.0f;
+                iw = MediaSize.ISO.A4.getX(Size2DSyntax.INCH) - 0.5f;
+                ih = MediaSize.ISO.A4.getY(Size2DSyntax.INCH) - 0.5f;
 	    }
 	    return new MediaPrintableArea(0.25f, 0.25f, iw, ih,
 					  MediaPrintableArea.INCH);	    
--- a/j2se/src/solaris/classes/sun/print/UnixPrintServiceLookup.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/classes/sun/print/UnixPrintServiceLookup.java	Fri Jun 22 00:46:43 2007 +0000
@@ -136,7 +136,7 @@
 
     String[] lpcAllCom = {
 	"/usr/sbin/lpc status | grep : | sed -e 's/://'",
-	"/usr/sbin/lpc -a status | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
+        "/usr/sbin/lpc -a status | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}' | sort"
     };
 
     String[] lpcNameCom = {
@@ -676,7 +676,7 @@
     
     private String[] getAllPrinterNamesSysV() {
         String defaultPrinter = "lp";
-	String command = "/usr/bin/lpstat -v|/usr/bin/expand|/usr/bin/cut -f3 -d' ' |/usr/bin/cut -f1 -d':'";
+        String command = "/usr/bin/lpstat -v|/usr/bin/expand|/usr/bin/cut -f3 -d' ' |/usr/bin/cut -f1 -d':' | /usr/bin/sort";
 	
 	String [] names = execCmd(command);
        	ArrayList printerNames = new ArrayList();
@@ -691,7 +691,7 @@
     }
       
     static String[] execCmd(final String command) {
-	ArrayList results = new ArrayList();
+        ArrayList results = null;
 	try {
 	    final String[] cmd = new String[3];
 	    if (isSysV()) {
@@ -704,39 +704,57 @@
 		cmd[2] = "LC_ALL=C " + command;
 	    }
 
-	    BufferedReader bufferedReader = 
-		(BufferedReader)AccessController.doPrivileged(
-				new PrivilegedExceptionAction() {
-		    public Object run() throws IOException {
-		
-			Process lpstat;
+            results = (ArrayList)AccessController.doPrivileged(
+                new PrivilegedExceptionAction() {
+                    public Object run() throws IOException {
+
+                        Process proc;
+                        BufferedReader bufferedReader = null;
 			File f = File.createTempFile("prn","xc");
 			cmd[2] = cmd[2]+">"+f.getAbsolutePath();
 			
-			lpstat = Runtime.getRuntime().exec(cmd);
-			try {
-			    lpstat.waitFor();
-			} catch (InterruptedException e) {
-			}
-			if (lpstat.exitValue() == 0) {
-			    FileReader reader = new FileReader(f);
-			    f.delete();
-			    return new BufferedReader(reader);
-			}
+                        proc = Runtime.getRuntime().exec(cmd);
+                        try {
+                            boolean done = false; // in case of interrupt.
+                            while (!done) {
+                                try {
+                                    proc.waitFor();
+                                    done = true;
+                                } catch (InterruptedException e) {
+                                }
+                            }
+
+                            if (proc.exitValue() == 0) {
+                                FileReader reader = new FileReader(f);
+                                bufferedReader = new BufferedReader(reader);
+                                String line;
+                                ArrayList results = new ArrayList();
+                                while ((line = bufferedReader.readLine())
+                                       != null) {
+                                    results.add(line);
+                                }
+                                return results;
+                            }
+                        } finally {
+                            f.delete();
+                            // promptly close all streams.
+                            if (bufferedReader != null) {
+                                bufferedReader.close();
+                            }
+                            proc.getInputStream().close();
+                            proc.getErrorStream().close();
+                            proc.getOutputStream().close();
+                        } 
 			return null;
 		    }
 		});
-
-	    if (bufferedReader != null) {
-		String line;
-		while((line = bufferedReader.readLine()) != null) {
-		    results.add(line);
-		}
-	    }
-	} catch (IOException e) {
-	} catch (PrivilegedActionException e) {
+        } catch (PrivilegedActionException e) {
 	}
-	return (String[])results.toArray(new String[results.size()]);
+        if (results == null) {
+            return new String[0];
+        } else {
+            return (String[])results.toArray(new String[results.size()]);
+        }
     }
 
     private class PrinterChangeListener extends Thread {
@@ -750,7 +768,7 @@
 		    IPPPrintService.debug_println(debugPrefix+"Exception in refresh thread.");
 		    break;
 		}
-		
+
 		if ((printServices != null) &&
 		    (printServices.length > minRefreshTime)) {
 		    // compute new refresh time 1 printer = 1 sec
--- a/j2se/src/solaris/native/java/util/TimeZone_md.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/native/java/util/TimeZone_md.c	Fri Jun 22 00:46:43 2007 +0000
@@ -121,9 +121,12 @@
 	}
 
 	/*
-	 * Skip "ROC" since Java doesn't support it.
+	 * Skip "ROC", "posixrules", and "localtime" since Java doesn't
+	 * support them.
 	 */
-	if (strcmp(dp->d_name, "ROC") == 0) {
+	if ((strcmp(dp->d_name, "ROC") == 0)
+	    || (strcmp(dp->d_name, "posixrules") == 0)
+	    || (strcmp(dp->d_name, "localtime") == 0)) {
 	    continue;
 	}
 
--- a/j2se/src/solaris/native/sun/awt/awt_MToolkit.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/native/sun/awt/awt_MToolkit.c	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1137,10 +1137,27 @@
     }
 }
 
+static jclass clazzF, clazzD = NULL;
+
+static Boolean
+initClazzD(JNIEnv *env) {
+    jclass t_clazzD = (*env)->FindClass(env, "java/awt/Dialog");
+    if ((*env)->ExceptionOccurred(env)) {
+        (*env)->ExceptionDescribe(env);
+        (*env)->ExceptionClear(env);
+    }
+    DASSERT(t_clazzD != NULL);
+    if (t_clazzD == NULL) {
+        return False;
+    }
+    clazzD = (*env)->NewGlobalRef(env, t_clazzD);
+    DASSERT(clazzD != NULL);
+    (*env)->DeleteLocalRef(env, t_clazzD);
+    return True;
+}
+
 Boolean
 isFrameOrDialog(jobject target, JNIEnv *env) {
-    static jclass clazzF = NULL, clazzD = NULL;
-   
     if ((*env)->EnsureLocalCapacity(env, 1) < 0) { 
         return False;
     }
@@ -1153,32 +1170,29 @@
         }
         DASSERT(t_clazzF != NULL);
         if (t_clazzF == NULL) {
-            return FALSE;
+            return False;
         }
         clazzF = (*env)->NewGlobalRef(env, t_clazzF);
         DASSERT(clazzF != NULL);
         (*env)->DeleteLocalRef(env, t_clazzF);
     }
  
-    if (clazzD == NULL) {
-        jclass t_clazzD = (*env)->FindClass(env, "java/awt/Dialog");
-        if ((*env)->ExceptionOccurred(env)) {
-            (*env)->ExceptionDescribe(env);
-            (*env)->ExceptionClear(env);
-        }
-        DASSERT(t_clazzD != NULL);
-        if (t_clazzD == NULL) {
-            return FALSE;
-        }
-        clazzD = (*env)->NewGlobalRef(env, t_clazzD);
-        DASSERT(clazzD != NULL);
-        (*env)->DeleteLocalRef(env, t_clazzD);
+    if (clazzD == NULL && !initClazzD(env)) {
+        return False;
     }
 
     return (*env)->IsInstanceOf(env, target, clazzF) ||
         (*env)->IsInstanceOf(env, target, clazzD);
 }
 
+Boolean
+isDialog(jobject target, JNIEnv *env) {
+    if (clazzD == NULL && !initClazzD(env)) {
+        return False;
+    }
+    return (*env)->IsInstanceOf(env, target, clazzD);
+}
+
 // Returns a local ref to a decorated owner of the target,
 // or NULL if the target is Frame or Dialog itself.
 // The local ref returned should be deleted by the caller.
@@ -3413,4 +3427,44 @@
     
 }
 
+/*
+ * Class:     sun_awt_motif_MToolkit
+ * Method:    getWMName
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_sun_awt_motif_MToolkit_getWMName(JNIEnv *env, jclass this)
+{
+    enum wmgr_t wm;  
+
+    AWT_LOCK();
+    wm = awt_wm_getRunningWM(); 
+    AWT_UNLOCK();
+
+    switch (wm) {
+      case NO_WM:
+          return (*env)->NewStringUTF(env, "NO_WM");
+      case OTHER_WM:
+          return (*env)->NewStringUTF(env, "OTHER_WM");
+      case ENLIGHTEN_WM:
+          return (*env)->NewStringUTF(env, "ENLIGHTEN_WM");
+      case KDE2_WM:
+          return (*env)->NewStringUTF(env, "KDE2_WM");
+      case SAWFISH_WM:
+          return (*env)->NewStringUTF(env, "SAWFISH_WM");
+      case ICE_WM:
+          return (*env)->NewStringUTF(env, "ICE_WM");
+      case METACITY_WM:
+          return (*env)->NewStringUTF(env, "METACITY_WM");
+      case OPENLOOK_WM:
+          return (*env)->NewStringUTF(env, "OPENLOOK_WM");
+      case MOTIF_WM:
+          return (*env)->NewStringUTF(env, "MOTIF_WM");
+      case CDE_WM:
+          return (*env)->NewStringUTF(env, "CDE_WM");
+    }
+    return (*env)->NewStringUTF(env, "UNDETERMINED_WM");
+}
+
+
 #endif /* !HEADLESS */
--- a/j2se/src/solaris/native/sun/awt/awt_TopLevel.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/native/sun/awt/awt_TopLevel.c	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -481,12 +481,10 @@
     windowIDs.resetGCMID = (*env)->GetMethodID(env, cls, "resetGC",
                                                  "()V");
 
-    windowIDs.focusableWindowMID = (*env)->GetMethodID(env, cls, "isFocusableWindow",
-                                                       "()Z");
-    windowIDs.focusableWindowState = (*env)->GetFieldID(env, cls, "focusableWindowState",
-                                                        "Z");
     windowIDs.locationByPlatform = (*env)->GetFieldID(env, cls, "locationByPlatform",
                                                         "Z");
+    windowIDs.isAutoRequestFocus = (*env)->GetFieldID(env, cls, "autoRequestFocus", "Z");
+
     DASSERT(windowIDs.resetGCMID);
 }
 
@@ -1285,9 +1283,12 @@
         //   will be generated for it, not for non-focusable.
         // If current window is non-focusable and opposite is focusable then do not generate anything
         // as if we didn't leave previous focusable window so Java events will generated for it.
-        if (oppositeShell != NULL 
-            && isFocusableWindowByShell(env, oppositeShell)
-            && isFocusableWindowByShell(env, shell) && shell != oppositeShell)
+        //
+        // Fix for 6547951.
+        // Also do cleaning when switching to non-java window (opposite is null).
+        if (isFocusableWindowByShell(env, shell) && shell != oppositeShell &&
+            ((oppositeShell != NULL && isFocusableWindowByShell(env, oppositeShell)) ||
+             oppositeShell == NULL))
         {
             // The necessary FOCUS_LOST event will be generated by DKFM.
             // So we need to process focus list like we received FocusOut
@@ -1320,14 +1321,11 @@
                     }
                     (*env)->DeleteLocalRef(env, comp);
                 }
-
-                target = (*env)->GetObjectField(env, this,
-                                                mComponentPeerIDs.target);
-                processTree(defChild, findWindowsProxy(target, env), False);
-                XmProcessTraversal(shell, XmTRAVERSE_CURRENT);
-                XtSetKeyboardFocus(shell, NULL);
-                (*env)->DeleteLocalRef(env, target);
             }
+            target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
+            processTree(defChild, findWindowsProxy(target, env), False);
+            XtSetKeyboardFocus(shell, NULL);
+            (*env)->DeleteLocalRef(env, target);
         }
 #ifndef NOMODALFIX
         if (!awt_isModal() || awt_isWidgetModal(shell)) {
@@ -1422,6 +1420,29 @@
                     if (!(*env)->IsSameObject(env, this, currentFocusedWindow)) {
                         awt_canvas_setFocusedWindowPeer(this);
                         awt_canvas_setFocusOwnerPeer(this);                
+
+                        /*
+                         * Fix for 6465038.
+                         * Restore focus on the toplevel widget if it's broken.
+                         */
+                        Widget widgetToFocus = getFocusWidget(findTopLevelByShell(shell));
+                        Widget currentOwner = XmGetFocusWidget(shell);
+
+                        if (widgetToFocus != currentOwner) {
+#ifdef DEBUG_FOCUS
+                            fprintf(stderr, "Wrong Xm focus; resetting Xm focus from %x to toplevel %x...\n",
+                                    currentOwner != NULL ? XtWindow(currentOwner) : 0,
+                                    widgetToFocus != NULL ? XtWindow(widgetToFocus) : 0);
+#endif
+                            if ( !XmProcessTraversal(widgetToFocus, XmTRAVERSE_CURRENT) ) {
+                                XtSetKeyboardFocus(shell, widgetToFocus);
+                            }
+#ifdef DEBUG_FOCUS
+                            Widget _w = XmGetFocusWidget(shell);
+                            fprintf(stderr, "                ...focus resulted on window %x\n", _w != NULL ? XtWindow(_w) : 0);
+#endif
+                        }
+
                         JNU_CallMethodByName(env, NULL, this, "handleWindowFocusIn", "()V");
                         if ((*env)->ExceptionCheck(env) == JNI_TRUE) {
                             (*env)->ExceptionDescribe(env);
@@ -1453,10 +1474,21 @@
         /* Your body seems to unfade */
         if (wdata->initialFocus == False) {
             XtVaSetValues(wdata->winData.shell, XmNinput, True, NULL);
+
+            // We have to to evidently move the window to the front here.
+            Window shellWindow;
+            if ((shellWindow = XtWindow(wdata->winData.shell)) != None) {
+                XRaiseWindow(awt_display, shellWindow);
+            }
         }
         if (awt_wm_isStateNetHidden(XtWindow(wdata->winData.shell))) {
             focusOnMapNotify = True;
         }
+        /*
+         * TODO: perhaps we need this putback only for simple Window.
+         * For Frame/Dialog XmNinput==True would be enough. The native
+         * system will focus it itself.
+         */
         if (wdata->isFocusableWindow && focusOnMapNotify) {
             XEvent ev;
             memset(&ev, 0, sizeof(ev));
@@ -2424,7 +2456,7 @@
  */
 JNIEXPORT void JNICALL
 Java_sun_awt_motif_MWindowPeer_pCreate(JNIEnv *env, jobject this,
-    jobject parent, jstring target_class_name)
+    jobject parent, jstring target_class_name, jboolean isFocusableWindow)
 {
 #define MAX_ARGC 50
     Arg                 args[MAX_ARGC];
@@ -2545,7 +2577,7 @@
 
     wdata->screenNum = (*env)->GetIntField(env, gd, x11GraphicsDeviceIDs.screen);
 
-    wdata->isFocusableWindow = (*env)->CallBooleanMethod(env, target, windowIDs.focusableWindowMID);
+    wdata->isFocusableWindow = (Boolean)isFocusableWindow;
 
     /*
      * Create a top-level shell widget.
@@ -2896,30 +2928,57 @@
     AWT_FLUSH_UNLOCK();
 }
 
-#if 0
-/* toFront should probably do this put in for reference */
+/*
+ * Class:     sun_awt_motif_MWindowPeer
+ * Method:    pToFront
+ * Signature: ()V
+ */
 JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_toFront(JNIEnv *env, jobject this)
+Java_sun_awt_motif_MWindowPeer_pToFront(JNIEnv *env, jobject this)
 {
     struct FrameData *wdata;
+    jobject target;
+    Window shellWindow;
+    Boolean autoRequestFocus;
+    Boolean isModal = FALSE;
+
     AWT_LOCK();
+
+    target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
    
     wdata = (struct FrameData *)
         JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
     if (wdata == NULL
         || wdata->winData.comp.widget == NULL
         || wdata->winData.shell == NULL
-        || wdata->mainWindow == NULL)
+        || wdata->mainWindow == NULL
+        || JNU_IsNull(env, target))
     {
-        JNU_ThrowNullPointerException(env, "null widget data");
+        JNU_ThrowNullPointerException(env, "null widget/target data");
         AWT_UNLOCK();
         return;
     }
-    if (XtWindow(wdata->winData.shell) != None)
-        XRaiseWindow(awt_display, XtWindow(wdata->winData.shell));
+
+    if ((shellWindow = XtWindow(wdata->winData.shell)) != None) {
+        XRaiseWindow(awt_display, shellWindow);
+
+        autoRequestFocus = (*env)->GetBooleanField(env, target, windowIDs.isAutoRequestFocus);
+
+        if (isDialog(target, env)) {
+            isModal = (*env)->GetBooleanField(env, target, dialogIDs.modal);
+        }
+
+        // In contrast to XToolkit/WToolkit modal dialog can be unfocused.
+        // So we should also ask for modality in addition to 'autoRequestFocus'.
+        if (wdata->isFocusableWindow && (autoRequestFocus || isModal)) {
+            XSetInputFocus(awt_display, XtWindow(wdata->focusProxy), RevertToPointerRoot, CurrentTime);
+        }
+    }
+
+   (*env)->DeleteLocalRef(env, target);
+
     AWT_UNLOCK();
 }
-#endif /* 0 */
 
 /*
  * Class:     sun_awt_motif_MWindowPeer
@@ -2945,17 +3004,10 @@
     Boolean iconic;
     jobject target;
     Boolean locationByPlatform;
-    Boolean isFocusable;
+
+    AWT_LOCK();
 
     target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-    if( target != NULL ) {
-        isFocusable = (*env)->CallBooleanMethod(env, target, windowIDs.focusableWindowMID);
-        (*env)->DeleteLocalRef(env, target);
-    }else {
-        isFocusable = False;
-    }
-
-    AWT_LOCK();
     
     wdata = (struct FrameData *)
         JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
@@ -2963,9 +3015,10 @@
         || wdata->winData.comp.widget == NULL
         || wdata->winData.shell == NULL
         || wdata->mainWindow == NULL
-        || (wdata->winData.flags & W_IS_EMBEDDED))
+        || (wdata->winData.flags & W_IS_EMBEDDED)
+        || JNU_IsNull(env, target))
     {
-        JNU_ThrowNullPointerException(env, "null widget data");
+        JNU_ThrowNullPointerException(env, "null widget/target data");
         AWT_UNLOCK();
         return;
     }
@@ -2975,7 +3028,6 @@
                     wdata->state);
 
     wdata->isModal = isModal;
-    wdata->isFocusableWindow = isFocusable;
 
     /*
      * A workaround for bug 4062589 that is really a motif problem
@@ -3073,7 +3125,6 @@
             XtManageChild(wdata->winData.comp.widget);
             XtSetMappedWhenManaged(wdata->winData.shell, True);
         }
-
         if (wdata->isResizable) {
             /* REMINDER: uwe: will need to revisit for setExtendedStateBounds */
             awt_wm_removeSizeHints(wdata->winData.shell, PMinSize|PMaxSize);
@@ -3093,9 +3144,17 @@
     XtPopup(wdata->winData.shell, XtGrabNone);
     wdata->isShowing = True;
 
-    if (isFocusable) {
-        focusOnMapNotify = True;
-    }
+    wdata->initialFocus = (*env)->GetBooleanField(env, target, windowIDs.isAutoRequestFocus);
+
+    if (wdata->isFocusableWindow) {
+        if (wdata->initialFocus || wdata->isModal) {
+            focusOnMapNotify = True;
+        } else {
+            XtVaSetValues(wdata->winData.shell, XmNinput, False, NULL);
+        }
+    }  
+
+    (*env)->DeleteLocalRef(env, target);
 
     AWT_FLUSH_UNLOCK();
 }
--- a/j2se/src/solaris/native/sun/awt/awt_Window.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/solaris/native/sun/awt/awt_Window.h	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,9 +29,8 @@
 struct WindowIDs {
     jfieldID warningString;
     jmethodID resetGCMID;
-    jmethodID focusableWindowMID;
-    jfieldID focusableWindowState;
     jfieldID locationByPlatform;
+    jfieldID isAutoRequestFocus;
 };
 
 /* fieldIDs for MWindowPeer fields that may be accessed from C */
--- a/j2se/src/windows/classes/sun/awt/windows/WDesktopProperties.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/classes/sun/awt/windows/WDesktopProperties.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,11 +24,20 @@
  */
 
 package sun.awt.windows;
-import sun.awt.*;
-import java.util.*;
-import java.awt.*;
+
+import java.awt.Color;
+import java.awt.Font;
 import static java.awt.RenderingHints.*;
-import java.beans.*;
+import java.awt.RenderingHints;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import java.util.logging.Logger;
+import java.util.logging.Level;
+
+import sun.awt.SunToolkit;
 
 /*
  * Class encapsulating Windows desktop properties.;
@@ -45,13 +54,12 @@
  * itself when running on a Windows platform.
  */
 class WDesktopProperties {
-    private static final DebugHelper	dbg = DebugHelper.create(WDesktopProperties.class);
-    private static final String		PREFIX = "win.";
-    private static final String		FILE_PREFIX = "awt.file.";
-    private static final String		PROP_NAMES = "win.propNames";
-    
+    private static final Logger log = Logger.getLogger("sun.awt.windows.WDesktopProperties");
+    private static final String PREFIX = "win.";
+    private static final String FILE_PREFIX = "awt.file.";
+    private static final String PROP_NAMES = "win.propNames";
+
     private long pData;
-    private PropertyChangeSupport prChgSupport = new PropertyChangeSupport(this);
 
     static {
         initIDs();
@@ -59,7 +67,7 @@
 
     private WToolkit wToolkit;
 
-    private HashMap map = new HashMap();
+    private HashMap<String, Object> map = new HashMap<String, Object>();
 
     /**
      * Initialize JNI field and method IDs
@@ -74,42 +82,10 @@
     WDesktopProperties(WToolkit wToolkit) {
 	this.wToolkit = wToolkit;
 	init();
-	getWindowsParameters();
-    }
-
-    public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) {
-	if (pcl == null) {
-	    return;
-	}
-	prChgSupport.addPropertyChangeListener(name, pcl);
-    }
-
-    /**
-     * remove the specified property change listener for the named 
-     * desktop property
-     * If pcl is null, no exception is thrown and no action is performed.
-     *
-     */
-    public synchronized void removePropertyChangeListener(String name, PropertyChangeListener pcl) {
-	if (pcl == null) {
-	    return;
-	}
-	prChgSupport.removePropertyChangeListener(name, pcl);
     }
 
     private native void init();
 
-    /**
-     * Returns property given a key name
-     */
-    synchronized Object getProperty(String key) {
-	if ( key.equals(PROP_NAMES) ) {
-	    return getKeyNames();
-	}
-
-	return map.get(key);
-    }
-
     /*
      * Returns String[] containing available property names
      */
@@ -134,37 +110,45 @@
      * Called from native code to set a boolean property
      */
     private synchronized void setBooleanProperty(String key, boolean value) {
-	if (dbg.on) dbg.assertion( key != null );
-	if (dbg.on) dbg.println(key + "=" + String.valueOf(value));
-	map.put(key, Boolean.valueOf(value));
+        assert( key != null );
+        if (log.isLoggable(Level.FINE)) {
+            log.fine(key + "=" + String.valueOf(value));
+        }
+        map.put(key, Boolean.valueOf(value));
     }
 
     /*
      * Called from native code to set an integer property
      */
     private synchronized void setIntegerProperty(String key, int value) {
-	if (dbg.on) dbg.assertion( key != null );
-	if (dbg.on) dbg.println(key + "=" + String.valueOf(value));
-	map.put(key, Integer.valueOf(value));
+        assert( key != null );
+        if (log.isLoggable(Level.FINE)) {
+            log.fine(key + "=" + String.valueOf(value));
+        }
+        map.put(key, Integer.valueOf(value));
     }
 
     /*
      * Called from native code to set a string property
      */
     private synchronized void setStringProperty(String key, String value) {
-	if (dbg.on) dbg.assertion( key != null );
-	if (dbg.on) dbg.println(key + "=" + value);
-	map.put(key, value);
+        assert( key != null );
+        if (log.isLoggable(Level.FINE)) {
+            log.fine(key + "=" + value);
+        }
+        map.put(key, value);
     }
 
     /*
      * Called from native code to set a color property
      */
     private synchronized void setColorProperty(String key, int r, int g, int b) {
-	if (dbg.on) dbg.assertion( key != null && r <= 255 && g <=255 && b <= 255 );
-	Color color = new Color(r, g, b);
-	if (dbg.on) dbg.println(key + "=" + color);
-	map.put(key, color);
+        assert( key != null && r <= 255 && g <=255 && b <= 255 );
+        Color color = new Color(r, g, b);
+        if (log.isLoggable(Level.FINE)) {
+            log.fine(key + "=" + color);
+        }
+        map.put(key, color);
     }
 
     /* Map of known windows font aliases to the preferred JDK name */
@@ -182,19 +166,23 @@
      * Called from native code to set a font property
      */
     private synchronized void setFontProperty(String key, String name, int style, int size) {
-	if (dbg.on) dbg.assertion( key != null && style <= (Font.BOLD|Font.ITALIC)  && size >= 0 );
+        assert( key != null && style <= (Font.BOLD|Font.ITALIC)  && size >= 0 );
 
         String mappedName = fontNameMap.get(name);
         if (mappedName != null) {
 	    name = mappedName;
         }
 	Font	font = new Font(name, style, size);
-	if (dbg.on) dbg.println(key + "=" + font);
+        if (log.isLoggable(Level.FINE)) {
+            log.fine(key + "=" + font);
+        }
 	map.put(key, font);
 
         String sizeKey = key + ".height";
         Integer iSize = Integer.valueOf(size);
-	if (dbg.on) dbg.println(sizeKey + "=" + iSize);
+        if (log.isLoggable(Level.FINE)) {
+            log.fine(sizeKey + "=" + iSize);
+        }
 	map.put(sizeKey, iSize);
     }
 
@@ -202,10 +190,12 @@
      * Called from native code to set a sound event property
      */
     private synchronized void setSoundProperty(String key, String winEventName) {
-	if (dbg.on) dbg.assertion( key != null && winEventName != null );
+        assert( key != null && winEventName != null );
 
 	Runnable soundRunnable = new WinPlaySound(winEventName);
-	if (dbg.on) dbg.println(key + "=" + soundRunnable);
+        if (log.isLoggable(Level.FINE)) {
+            log.fine(key + "=" + soundRunnable);
+        }
 	map.put(key, soundRunnable);
     }
 
@@ -246,57 +236,22 @@
     }
 
     /*
-     * Called by WToolkit when Windows settings change-- we determine which
-     * properties changed and fire change events for them
-     */
-    synchronized void firePropertyChanges() {
-	EventQueue.invokeLater(new DiffPropertyChanges());
-    }
-
-    /*
-     * We don't want property change listeners to block the
-     * toolkit thread, so we use invokeLater to fire
-     * property change events on the dispatch thread
-     */
-    class DiffPropertyChanges implements Runnable {
-	public void run() {
-	    ThemeReader.flush();
-	    diffPropertyChanges();
-	}
-    }
-
-    /*
-     * Determines which properties have changed and
-     * fires change events for those values only
+     * Called by WToolkit when Windows settings change-- we (re)load properties and
+     * set new values.
      */
-    private synchronized void diffPropertyChanges() {	    
-	// save the old properties
-	HashMap oldmap = map;
-	
-	// load the changed properties into a new hashmap
-	map = new HashMap();
-	getWindowsParameters();
+    synchronized Map<String, Object> getProperties() {
+        ThemeReader.flush();
+
+        // load the changed properties into a new hashmap
+        map = new HashMap<String, Object>();
+        getWindowsParameters();
         map.put(SunToolkit.DESKTOPFONTHINTS, SunToolkit.getDesktopFontHints());
-	
-	// compare the old/new property values and fire events
-	// for all the values that have changed
-	String	keys[] = getKeyNames();
-	for ( int nprop = 0; nprop < keys.length; nprop++ ) {
-	    String name = keys[nprop];
-	    Object	oldval = oldmap.get(name);
-	    Object	newval = map.get(name);
-	    if (((oldval == null) != (newval == null)) ||
-		(oldval != null && !oldval.equals(newval))) {
+        map.put(PROP_NAMES, getKeyNames());
+        // DnD uses one value for x and y drag diff, but Windows provides
+        // separate ones.  For now, just use the x value - rnk
+        map.put("DnD.Autoscroll.cursorHysteresis", "win.drag.x");
 
-		if (dbg.on) dbg.println("changed "+name+" from "+oldval+" to "+newval);
-		wToolkit.clearDesktopProperty(name);
-		prChgSupport.firePropertyChange(name, oldval, newval);
-	    }
-	}
-    }
-
-    synchronized void setDesktopAAHints() {
-        map.put(SunToolkit.DESKTOPFONTHINTS, SunToolkit.getDesktopFontHints());
+        return (Map<String, Object>) map.clone();
     }
 
     /*
@@ -316,7 +271,7 @@
         Integer fontSmoothingContrast = null;
 
         Boolean smoothingOn = (Boolean)map.get("win.text.fontSmoothingOn");
-  
+
         if (smoothingOn != null && smoothingOn.equals(Boolean.TRUE)) {
             Integer typeID = (Integer)map.get("win.text.fontSmoothingType");
             /* "1" is GASP/Standard but we'll also use that if the return
@@ -341,25 +296,16 @@
                 fontSmoothingContrast = (Integer)
                     map.get("win.text.fontSmoothingContrast");
                 if (fontSmoothingContrast == null) {
-                    fontSmoothingContrast = new Integer(140);
+                    fontSmoothingContrast = Integer.valueOf(140);
                 } else {
                     /* Windows values are scaled 10x those of Java 2D */
-                    int contrastVal = fontSmoothingContrast.intValue()/10;
-                    /* Constrain to the allowed range specified in
-                     * the RenderingHints class, so that we do not
-                     * propagate an illegal value.
-                     */
-                    if (contrastVal < 100) {
-                        contrastVal = 100;
-                    } else if (contrastVal > 250) {
-                        contrastVal = 250;
-                    }
-                    fontSmoothingContrast = new Integer(contrastVal);
+                    fontSmoothingContrast =
+                        Integer.valueOf(fontSmoothingContrast.intValue()/10);
                 }
             }
         }
 
-        RenderingHints hints = new RenderingHints(null);       
+        RenderingHints hints = new RenderingHints(null);
         hints.put(KEY_TEXT_ANTIALIASING, fontSmoothingHint);
         if (fontSmoothingContrast != null) {
             hints.put(KEY_TEXT_LCD_CONTRAST, fontSmoothingContrast);
--- a/j2se/src/windows/classes/sun/awt/windows/WDialogPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/classes/sun/awt/windows/WDialogPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,8 @@
 import java.util.*;
 import java.awt.*;
 import java.awt.peer.*;
+
+import sun.awt.*;
 import sun.awt.im.*;
 
 class WDialogPeer extends WWindowPeer implements DialogPeer {
@@ -89,6 +91,15 @@
         }
     }
 
+    public void blockWindows(java.util.List<Window> toBlock) {
+        for (Window w : toBlock) {
+            WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w);
+            if (wp != null) {
+                wp.setModalBlocked((Dialog)target, true);
+            }
+        }
+    }
+
     public Dimension getMinimumSize() {
         if (((Dialog)target).isUndecorated()) {
             return super.getMinimumSize();
--- a/j2se/src/windows/classes/sun/awt/windows/WFileDialogPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/classes/sun/awt/windows/WFileDialogPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -36,6 +36,7 @@
 import java.util.Vector;
 import sun.awt.EmbeddedFrame;
 import sun.awt.AppContext;
+import sun.awt.ComponentAccessor;
 
 public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer {
 
@@ -177,6 +178,15 @@
         blockedWindows.remove(window);
     }
 
+    public void blockWindows(java.util.List<Window> toBlock) {
+        for (Window w : toBlock) {
+            WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w);
+            if (wp != null) {
+                blockWindow(wp);
+            }
+        }
+    }
+
     public native void toFront();
     public native void toBack();
 
--- a/j2se/src/windows/classes/sun/awt/windows/WPathGraphics.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/classes/sun/awt/windows/WPathGraphics.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1099,13 +1099,20 @@
                     double origDpi = (devResX < devResY) ? devResX : devResY;
                     int dpi = (int)origDpi;
                     double scaleFactor = 1;
-                    while (nbytes > maxBytes && dpi > DEFAULT_USER_RES) {
+
+                    double maxSFX = w/(double)boundsWidth;
+                    double maxSFY = h/(double)boundsHeight;
+                    double maxSF = (maxSFX > maxSFY) ? maxSFY : maxSFX;
+                    int minDpi = (int)(dpi/maxSF);
+                    if (minDpi < DEFAULT_USER_RES) minDpi = DEFAULT_USER_RES;
+
+                    while (nbytes > maxBytes && dpi > minDpi) {
                         scaleFactor *= 2;
                         dpi /= 2;
                         nbytes /= 4;
                     }
-                    if (dpi < DEFAULT_USER_RES) {
-                        scaleFactor = (origDpi / DEFAULT_USER_RES);
+                    if (dpi < minDpi) {
+                        scaleFactor = (origDpi / minDpi);
                     }
 
                     region.setRect(region.getX()/scaleFactor,
--- a/j2se/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,12 +26,14 @@
 package sun.awt.windows;
 
 import java.awt.*;
+import java.awt.peer.DialogPeer;
 import java.awt.dnd.DropTarget;
 import java.util.Vector;
 import sun.awt.AppContext;
 import sun.awt.EmbeddedFrame;
+import sun.awt.ComponentAccessor;
 
-public class WPrintDialogPeer extends WWindowPeer {
+public class WPrintDialogPeer extends WWindowPeer implements DialogPeer {
 
     static {
         initIDs();
@@ -93,6 +95,15 @@
         blockedWindows.remove(window);
     }
 
+    public void blockWindows(java.util.List<Window> toBlock) {
+        for (Window w : toBlock) {
+            WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w);
+            if (wp != null) {
+                blockWindow(wp);
+            }
+        }
+    }
+
     public native void toFront();
     public native void toBack();
 
--- a/j2se/src/windows/classes/sun/awt/windows/WPrinterJob.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/classes/sun/awt/windows/WPrinterJob.java	Fri Jun 22 00:46:43 2007 +0000
@@ -62,6 +62,8 @@
 
 import java.util.Hashtable;
 import java.util.Properties;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
 
 import sun.awt.Win32GraphicsEnvironment;
 
@@ -460,8 +462,15 @@
 	if ((dest == null) || !prv){
 		return prv;
 	} else {
-	    FileDialog fileDialog = new FileDialog(ownerFrame, null, 
-					    FileDialog.SAVE);	    
+            String title = null;
+            String strBundle = "sun.print.resources.serviceui";
+            ResourceBundle rb = ResourceBundle.getBundle(strBundle);
+            try {
+                title = rb.getString("dialog.printtofile");
+            } catch (MissingResourceException e) {
+            }
+            FileDialog fileDialog = new FileDialog(ownerFrame, title, 
+                                                   FileDialog.SAVE);
 
 	    URI destURI = dest.getURI();
 	    // Old code destURI.getPath() would return null for "file:out.prn" 
--- a/j2se/src/windows/classes/sun/awt/windows/WToolkit.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/classes/sun/awt/windows/WToolkit.java	Fri Jun 22 00:46:43 2007 +0000
@@ -31,42 +31,22 @@
 import java.awt.image.*;
 import java.awt.peer.*;
 import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
 import java.awt.datatransfer.Clipboard;
 import java.awt.TrayIcon;
-import java.io.*;
-import java.lang.ref.WeakReference;
-import java.lang.reflect.*;
-import java.net.URL;
-import java.util.ArrayList;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Vector;
-import java.util.Enumeration;
-import java.awt.print.PageFormat;
 import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import sun.awt.image.ByteArrayImageSource;
-import sun.awt.image.FileImageSource;
-import sun.awt.image.URLImageSource;
-import sun.awt.AppContext;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import sun.awt.AWTAutoShutdown;
-import sun.awt.EmbeddedFrame;
-import sun.awt.GlobalCursorManager;
 import sun.awt.SunToolkit;
-import sun.awt.Win32GraphicsConfig;
 import sun.awt.Win32GraphicsDevice;
 import sun.awt.Win32GraphicsEnvironment;
-import sun.awt.DisplayChangedListener;
 import sun.awt.DebugHelper;
-import sun.awt.datatransfer.DataTransferer;
 import sun.java2d.opengl.OGLRenderQueue;
 
 import sun.print.PrintJob2D;
@@ -78,14 +58,11 @@
 import java.awt.dnd.MouseDragGestureRecognizer;
 import java.awt.dnd.InvalidDnDOperationException;
 import java.awt.dnd.peer.DragSourceContextPeer;
- 
-import sun.awt.windows.WDragSourceContextPeer;
 
 import sun.misc.PerformanceLogger;
-import sun.security.action.GetPropertyAction;
-
 
 public class WToolkit extends SunToolkit implements Runnable {
+    private static final Logger log = Logger.getLogger("sun.awt.windows.WToolkit");
     private static final DebugHelper dbg = DebugHelper.create(WToolkit.class);
 
     static GraphicsConfiguration config;
@@ -259,7 +236,7 @@
             AWTAutoShutdown.notifyToolkitThreadBusy();
 
             toolkitThread.start();
-                                                  
+
 	    try {
 	        wait();
 	    }
@@ -528,21 +505,6 @@
      */
     protected native boolean isDynamicLayoutSupportedNative();
 
-    protected boolean isDynamicLayoutSupported() {
-        Boolean dynamicSupported = (Boolean) Toolkit.getDefaultToolkit().
-          getDesktopProperty("awt.dynamicLayoutSupported");
-
-        // Do not cache this value - need to read this from the system
-        // every time
-        clearDesktopProperty("awt.dynamicLayoutSupported");
-
-        if ((dynamicSupported == null) ||
-            dynamicSupported.equals(Boolean.FALSE)) {
-            return false;
-        }
-        return true;
-    }
-
     public boolean isDynamicLayoutActive() {
         return (isDynamicLayoutSet() && isDynamicLayoutSupported());
     }
@@ -803,64 +765,61 @@
 
     protected Object lazilyLoadDesktopProperty(String name) {
         if (name.startsWith(prefix)) {
-            String cursorName = name.substring(prefix.length(),
-              name.length()) + postfix;
+            String cursorName = name.substring(prefix.length(), name.length()) + postfix;
 
             try {
                 return Cursor.getSystemCustomCursor(cursorName);
             } catch (AWTException awte) {
-                throw new RuntimeException("cannot load system cursor: " +
-                  cursorName);
-            }            
-        } else if (WDesktopProperties.isWindowsProperty(name) ||
-                   name.startsWith(awtPrefix) || name.startsWith(dndPrefix)) {
+                throw new RuntimeException("cannot load system cursor: " + cursorName, awte);
+            }
+        }
+
+        if (name.equals("awt.dynamicLayoutSupported")) {
+            return  Boolean.valueOf(isDynamicLayoutSupported());
+        }
+
+        if (WDesktopProperties.isWindowsProperty(name) ||
+            name.startsWith(awtPrefix) || name.startsWith(dndPrefix))
+        {
             synchronized(this) {
-                if (wprops == null) {
-                    wprops = new WDesktopProperties(this);
-                } else {
-                    // Only need to do this if wprops already existed,
-                    // because in that case the value could be stale
-                    if (name.equals("awt.dynamicLayoutSupported")) {
-                        return lazilyLoadDynamicLayoutSupportedProperty(name);
-                    }
-                }
-
-                // XXX do the same for "win.text.fontSmoothingOn" ???
-
-                Object prop = wprops.getProperty(name);
-                return prop;
+                lazilyInitWProps();
+                return desktopProperties.get(name);
             }
         }
 
         return super.lazilyLoadDesktopProperty(name);
     }
 
+    private synchronized void lazilyInitWProps() {
+        if (wprops == null) {
+            wprops = new WDesktopProperties(this);
+            updateProperties();
+        }
+    }
+
     /*
      * Called from lazilyLoadDesktopProperty because Windows doesn't
      * always send WM_SETTINGCHANGE when it should.
      */
-    protected Boolean lazilyLoadDynamicLayoutSupportedProperty(String name) {
+    private synchronized boolean isDynamicLayoutSupported() {
         boolean nativeDynamic = isDynamicLayoutSupportedNative();
-        Boolean prop = (Boolean) wprops.getProperty(name);
+        lazilyInitWProps();
+        Boolean prop = (Boolean) desktopProperties.get("awt.dynamicLayoutSupported");
 
-        if (dbg.on) {
-            dbg.print("In WTK.lazilyLoadDynamicLayoutSupportedProperty()" +
-              "   nativeDynamic == " + nativeDynamic +
-              "   wprops.dynamic == ");
-            if (prop == null)
-                dbg.println("null");
-            else
-                dbg.println(prop);
+        if (log.isLoggable(Level.FINE)) {
+            log.fine("In WTK.isDynamicLayoutSupported()" +
+                      "   nativeDynamic == " + nativeDynamic +
+                      "   wprops.dynamic == " + prop);
         }
 
         if ((prop == null) || (nativeDynamic != prop.booleanValue())) {
             // We missed the WM_SETTINGCHANGE, so we pretend
             // we just got one - fire the propertyChange, etc.
             windowsSettingChange();
-            return Boolean.valueOf(nativeDynamic);
+            return nativeDynamic;
         }
 
-        return prop;
+        return prop.booleanValue();
     }
 
     /*
@@ -869,73 +828,61 @@
      * Windows doesn't always send WM_SETTINGCHANGE when it should.
      */
     private void windowsSettingChange() {
-        //wprops created lazily, so may be null
-        if (wprops != null) {
-            wprops.firePropertyChanges();
-        }
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                updateProperties();
+            }
+        });
     }
 
-    /*
-     * Removes the desktop property from java.awt.Toolkit's Hashmap.
-     * Used to force the value to be reloaded from WDesktopProperties the
-     * next time its value is requested via Toolkit:getDesktopProperty().
-     */
-    synchronized void clearDesktopProperty(String name) {
-        desktopProperties.remove(name);
+    private synchronized void updateProperties() {
+        if (null == wprops) {
+            // wprops has not been initialized, so we have nothing to update
+            return;
+        }
+
+        Map<String, Object> props = wprops.getProperties();
+        for (String propName : props.keySet()) {
+            Object val = props.get(propName);
+            if (log.isLoggable(Level.FINE)) {
+                log.fine("changed " + propName + " to " + val);
+            }
+            setDesktopProperty(propName, val);
+        }
     }
 
     public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) {
-	if ( WDesktopProperties.isWindowsProperty(name) ) {
-        if (wprops == null) {
-            wprops = new WDesktopProperties(this);
+        if ( WDesktopProperties.isWindowsProperty(name)
+             || name.startsWith(awtPrefix)
+             || name.startsWith(dndPrefix))
+        {
+            // someone is interested in Windows-specific desktop properties
+            // we should initialize wprops
+            lazilyInitWProps();
         }
-	    wprops.addPropertyChangeListener(name, pcl);
-	} else {
-	    super.addPropertyChangeListener(name, pcl);
-	}
-    }
-
-    public synchronized void removePropertyChangeListener(String name, PropertyChangeListener pcl) {
-	if ( WDesktopProperties.isWindowsProperty(name) ) {
-        //wprops created lazily, so may be null
-        if (wprops != null) {
-            wprops.removePropertyChangeListener(name, pcl);
-        }
-	} else {
-	    super.removePropertyChangeListener(name, pcl);
-	}
+        super.addPropertyChangeListener(name, pcl);
     }
 
-    protected void initializeDesktopProperties() {
+    /*
+     * initialize only static props here and do not try to initialize props which depends on wprops,
+     * this should be done in lazilyLoadDesktopProperty() only.
+     */
+    protected synchronized void initializeDesktopProperties() {
         desktopProperties.put("DnD.Autoscroll.initialDelay",     Integer.valueOf(50));
         desktopProperties.put("DnD.Autoscroll.interval",         Integer.valueOf(50));
-        //desktopProperties.put("DnD.Autoscroll.cursorHysteresis", Integer.valueOf(5));
-        // DnD uses one value for x and y drag diff, but Windows provides separate ones.
-        // For now, just use the x value - rnk
 
-        wprops = new WDesktopProperties(this);
-
-        desktopProperties.put("DnD.Autoscroll.cursorHysteresis", wprops.getProperty("win.drag.x"));
-
-	try {
-		desktopProperties.put("Shell.shellFolderManager",
-				      Class.forName("sun.awt.shell.Win32ShellFolderManager2"));
-	} catch (ClassNotFoundException ex) {
-	}
-
-        /* This has to be called after wprops construction, as the value
-         * of the desktop property may be specified from a system property.
-         * If its not SunToolkit will call WToolkit.getDesktopAAHints()
-         */
-        wprops.setDesktopAAHints();
+        try {
+            desktopProperties.put("Shell.shellFolderManager",
+                                  Class.forName("sun.awt.shell.Win32ShellFolderManager2"));
+        } catch (ClassNotFoundException ex) {
+        }
     }
 
     /*
      * This returns the value for the desktop property "awt.font.desktophints"
      * This requires that the Windows properties have already been gathered.
      */
-    protected RenderingHints getDesktopAAHints() {
-
+    protected synchronized RenderingHints getDesktopAAHints() {
         if (wprops == null) {
             return null;
         } else {
@@ -979,7 +926,7 @@
         }
     }
 
-    public native boolean syncNativeQueue();
+    public native boolean syncNativeQueue(final long timeout);
     public boolean isDesktopSupported() {
         return true;
     }
@@ -989,4 +936,3 @@
     }
 
 }
-
--- a/j2se/src/windows/native/sun/font/fontpath.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/font/fontpath.c	Fri Jun 22 00:46:43 2007 +0000
@@ -197,6 +197,11 @@
     LOGFONTW lfw;
     CheckFamilyInfo info;
 
+    /* If fullName can't be stored in the struct, assume correct family */
+    if (wcslen((LPWSTR)fullName) >= LF_FACESIZE) {
+        return 0;
+    }
+
     memset(&info, 0, sizeof(CheckFamilyInfo));
     info.family = family;
     info.fullName = fullName;
--- a/j2se/src/windows/native/sun/java2d/d3d/D3DContext.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/java2d/d3d/D3DContext.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -845,7 +845,8 @@
     glyphCache = AccelGlyphCache_Init(D3D_GCACHE_WIDTH, 
                                       D3D_GCACHE_HEIGHT, 
                                       D3D_GCACHE_CELL_WIDTH, 
-                                      D3D_GCACHE_CELL_HEIGHT);
+                                      D3D_GCACHE_CELL_HEIGHT,
+                                      NULL);
     if (glyphCache == NULL) {
         J2dRlsTraceLn(J2D_TRACE_ERROR, 
                       "D3DContext::InitGlyphCache: "\
--- a/j2se/src/windows/native/sun/java2d/windows/GDIRenderer.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/java2d/windows/GDIRenderer.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -39,6 +39,14 @@
 #include <windows.h>
 #include <math.h>                /* for cos(), sin(), etc */
 
+#define MAX_CLAMP_BND (1<<26)
+#define MIN_CLAMP_BND (-MAX_CLAMP_BND)
+
+#define CLAMP(x) (((x) > MAX_CLAMP_BND) ?   \
+    MAX_CLAMP_BND : ((x) < MIN_CLAMP_BND) ? \
+        MIN_CLAMP_BND : (x))
+
+
 extern "C" {
 
 #define POLYTEMPSIZE	(512 / sizeof(POINT))
@@ -86,8 +94,8 @@
 	x = xpoints[i];
 	y = ypoints[i];
 	isempty = isempty && (x == mx && y == my);
-	pPoints[i].x = x + transx;
-	pPoints[i].y = y + transy;
+        pPoints[i].x = CLAMP(x + transx);
+        pPoints[i].y = CLAMP(y + transy);
     }
     if (close && !isclosed) {
 	pPoints[npoints] = pPoints[0];
--- a/j2se/src/windows/native/sun/java2d/windows/Win32SurfaceData.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/java2d/windows/Win32SurfaceData.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -238,54 +238,6 @@
  * code.
  */
 
-
-static void GetCursorRect(HWND hW, RECT& rRect) {
-    POINT ptPos;
-
-    J2dTraceLn(J2D_TRACE_INFO, "Win32SD::GetCursorRect");
-    rRect.left = rRect.right = 0;
-    rRect.top = rRect.bottom = 0;
-
-    if( NULL != hW ) {
-	::GetCursorPos(&ptPos);
-	int cX = ::GetSystemMetrics(SM_CXCURSOR);
-	int cY = ::GetSystemMetrics(SM_CYCURSOR);
-
-	::ScreenToClient(hW,&ptPos);
-
-	rRect.left = ptPos.x - cX;
-	rRect.right = ptPos.x + cX;
-	rRect.top = ptPos.y - cY;
-	rRect.bottom = ptPos.y + cY;
-    }
-}
-
-static BOOL Win32SD_CheckCursorArea(Win32SDOps *wsdo, 
-				    SurfaceDataBounds *bounds) 
-{
-    AwtToolkit& tk = AwtToolkit::GetInstance();
-    
-    J2dTraceLn(J2D_TRACE_INFO, "Win32SD_CheckCursorArea");
-    if ((IS_NT || IS_WINME) ||	// Custom cursor bug only appears on win95/98
-	(!tk.IsCustomCursor() && !tk.AreThemesInstalled())) 
-    {
-	return TRUE;
-    }
-
-    HWND hW = wsdo->window;
-    RECT rSect = {0,0,0,0};
-    RECT rCurs = {0,0,0,0};
-    RECT rView = {bounds->x1, bounds->y1, bounds->x2, bounds->y2};
-
-    GetCursorRect(hW, rCurs);
-    ::IntersectRect(&rSect,&rView,&rCurs);
-
-    if( FALSE == ::IsRectEmpty(&rSect) ) {
-	return FALSE;
-    }
-    return TRUE;
-}
-
 static BOOL Win32SD_CheckMonitorArea(Win32SDOps *wsdo, 
 				     SurfaceDataBounds *bounds,
 				     HDC hDC) 
@@ -706,8 +658,7 @@
 	wsdo->y -= mi->rMonitor.top;
     }
     if (!Win32SD_SimpleClip(env, wsdo, &pRasInfo->bounds, hDC) ||
-	!Win32SD_CheckCursorArea(wsdo, &pRasInfo->bounds) ||
-	!Win32SD_CheckMonitorArea(wsdo, &pRasInfo->bounds, hDC)) 
+        !Win32SD_CheckMonitorArea(wsdo, &pRasInfo->bounds, hDC))
     {
 	DDUnlock(env, wsdo);
 	windowMoveLock.Leave();
--- a/j2se/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c	Fri Jun 22 00:46:43 2007 +0000
@@ -449,6 +449,7 @@
 		}
 	    }
 	}	
+        CloseHandle(hThread);
     } else {
 	JNU_ThrowIOExceptionWithLastError(env, "CreateRemoteThread failed");
     }
--- a/j2se/src/windows/native/sun/windows/WPrinterJob.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/WPrinterJob.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -959,10 +959,6 @@
     } else if (type == ACCEPTJOB) {
 	if (pPrinterInfo->Status &
 	    (PRINTER_STATUS_ERROR |
-	     PRINTER_STATUS_PAPER_JAM |
-	     PRINTER_STATUS_PAPER_OUT |
-	     PRINTER_STATUS_PAPER_PROBLEM |
-	     PRINTER_STATUS_OUTPUT_BIN_FULL |
 	     PRINTER_STATUS_NOT_AVAILABLE |
 	     PRINTER_STATUS_NO_TONER |
 	     PRINTER_STATUS_OUT_OF_MEMORY |
--- a/j2se/src/windows/native/sun/windows/awt_Component.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Component.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -123,6 +123,7 @@
 HWND AwtComponent::sm_focusedWindow;
 HWND AwtComponent::sm_realFocusOpposite;
 BOOL AwtComponent::sm_bMenuLoop = FALSE;
+AwtComponent* AwtComponent::sm_getComponentCache = NULL;
 
 /************************************************************************/
 // Struct for _Reshape() and ReshapeNoCheck() methods
@@ -279,6 +280,10 @@
      */
     AwtToolkit::DestroyComponentHWND(m_hwnd);
     m_hwnd = NULL;
+
+    if (sm_getComponentCache == this) {
+        sm_getComponentCache = NULL;
+    }
 }
 
 void AwtComponent::Dispose()
@@ -347,23 +352,24 @@
  * infinite recursion
  */
 AwtComponent* AwtComponent::GetComponent(HWND hWnd) {
-    AwtComponent * component = NULL;
+    // Requests for Toolkit hwnd resolution happen pretty often. Check first.
+    if (hWnd == AwtToolkit::GetInstance().GetHWnd()) {
+        return NULL;
+    }
+    if (sm_getComponentCache && sm_getComponentCache->GetHWnd() == hWnd) {
+        return sm_getComponentCache;
+    }
 
     // check that it's an AWT component from the same toolkit as the caller
     if (::IsWindow(hWnd) && 
-        AwtToolkit::MainThread() == ::GetWindowThreadProcessId(hWnd, NULL)) {
+        AwtToolkit::MainThread() == ::GetWindowThreadProcessId(hWnd, NULL))
+    {
         DASSERT(WmAwtIsComponent != 0);   
         if (::SendMessage(hWnd, WmAwtIsComponent, 0, 0L)) {
-            component = GetComponentImpl(hWnd);
-        } else if (::GetParent(hWnd) != NULL) {
-            AwtComponent *parent = AwtComponent::GetComponent(::GetParent(hWnd));
-            if (parent != NULL && parent->GetWrappeeHandle() == hWnd) {
-                component = parent;
-            }
+            return sm_getComponentCache = GetComponentImpl(hWnd);
         }
     }
-
-    return component;
+    return NULL;
 }
 
 /*
@@ -1510,7 +1516,6 @@
               (!fMinimized || (nState == WA_INACTIVE))) 
           {
 	      mr = WmActivate(nState, fMinimized, (HWND)lParam); 
-	      AwtToolkit::GetInstance().UpdateThemesStatus();
               m_skipNextSetFocus = FALSE;
 	      // When the window is deactivated, send WM_IME_ENDCOMPOSITION
 	      // message to deactivate the composition window so that
@@ -1996,33 +2001,6 @@
   
 MsgRouting AwtComponent::WmSizing()
 {
-    if (!AwtToolkit::GetInstance().IsDynamicLayoutActive()) {
-        return mrDoDefault;
-    }
-
-    DTRACE_PRINTLN("AwtComponent::WmSizing  fullWindowDragEnabled");
-
-    // If the top-level ancestor is this window itself, we want to
-    // dynamically layout the components.
-    HWND thisHwnd = GetHWnd();
-    if (thisHwnd == NULL) {
-        return mrDoDefault;
-    }
-
-    HWND parentHwnd = AwtComponent::GetTopLevelParentForWindow(thisHwnd);
-    if (thisHwnd != parentHwnd) {
-        // This is not a top-level window
-        return mrDoDefault;
-    }
-
-    DTRACE_PRINTLN("AwtComponent::WmSizing  top-level window");
-
-    // Call WComponentPeer::dynamicallyLayoutContainer()
-    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    jobject peer = GetPeer(env);
-    JNU_CallMethodByName(env, NULL, peer, "dynamicallyLayoutContainer", "()V");
-    DASSERT(!safe_ExceptionOccurred(env));
-
     return mrDoDefault;
 }
 
@@ -2077,24 +2055,12 @@
         return mrConsume;
     }
 
-    /*
-     * Fix for 6374321.
-     * It's to activate EmbeddedFrame at return from browser menu by Alt.
-     * Note though that the fix shouldn't break focuses when a click happens.
-     * This is achived by checking 'sm_focusedWindow'. When a component
-     * is clicked it will receive WM_SETFOCUS but only after the EmbeddedFrame
-     * receives WM_ACTIVATE(WA_ACTIVE) that makes it active.
-     */
-    HWND oppositeToplevel = AwtComponent::GetTopLevelParentForWindow(hWndLostFocus);
     HWND toplevelHWnd = AwtComponent::GetTopLevelParentForWindow(GetHWnd());
-
-    if (AwtComponent::IsEmbeddedFrameHWnd(toplevelHWnd) &&
-        sm_focusedWindow != toplevelHWnd) // check that EmbeddedFrame is not yet active
+    AwtComponent *comp = AwtComponent::GetComponent(toplevelHWnd);
+
+    if (comp && comp->IsEmbeddedFrame() &&
+        !((AwtFrame*)comp)->activateEmbeddedFrameOnSetFocus(hWndLostFocus))
     {
-        AwtFrame *frame = (AwtFrame*)AwtComponent::GetComponent(toplevelHWnd);
-        if (frame) {
-            frame->SynthesizeWmActivate(TRUE, oppositeToplevel);
-        }
         return mrConsume;
     }
 
@@ -2130,16 +2096,10 @@
         return mrConsume;
     }
 
-    /* If focus is going to leave EmbeddedFrame then send it the deactivating message */
-    HWND oppositeToplevel = AwtComponent::GetTopLevelParentForWindow(hWndGotFocus);
-
-    if (AwtComponent::IsEmbeddedFrameHWnd(sm_focusedWindow) &&
-        oppositeToplevel != sm_focusedWindow)
-    {
-        AwtFrame *frame = (AwtFrame*)AwtComponent::GetComponent(sm_focusedWindow);
-        if (frame) {
-            frame->SynthesizeWmActivate(FALSE, oppositeToplevel);
-        }
+    AwtComponent *comp = AwtComponent::GetComponent(sm_focusedWindow);
+
+    if (comp && comp->IsEmbeddedFrame()) {
+        ((AwtFrame*)comp)->deactivateEmbeddedFrameOnKillFocus(hWndGotFocus);
     }
 
     sm_focusOwner = NULL;
@@ -2224,12 +2184,14 @@
     }
 
     HWND fgWindow = ::GetForegroundWindow();
-    DWORD fgProcessID;
-    ::GetWindowThreadProcessId(fgWindow, &fgProcessID);
-
-    if (fgProcessID != ::GetCurrentProcessId()) {
-        // fix for 6458497.  we shouldn't request focus if it is out of our application.
-        return FALSE;
+    if (NULL != fgWindow) {
+        DWORD fgProcessID;
+        ::GetWindowThreadProcessId(fgWindow, &fgProcessID);
+
+        if (fgProcessID != ::GetCurrentProcessId()) {
+            // fix for 6458497.  we shouldn't request focus if it is out of our application.
+            return FALSE;
+        }
     }
 
     AwtFrame *owner = GetContainer()->GetOwningFrameOrDialog();
--- a/j2se/src/windows/native/sun/windows/awt_Component.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Component.h	Fri Jun 22 00:46:43 2007 +0000
@@ -718,7 +718,6 @@
     static BOOL sm_suppressFocusAndActivation;
     static HWND sm_realFocusOpposite;
     
-    virtual INLINE HWND GetWrappeeHandle() { return NULL; }
     virtual void SetDragCapture(UINT flags);
     virtual void ReleaseDragCapture(UINT flags);
 
@@ -780,6 +779,8 @@
 
     BOOL m_skipNextSetFocus;
 
+    static AwtComponent* sm_getComponentCache; // a cache for the GetComponent(..) method.
+
     int windowMoveLockPosX;
     int windowMoveLockPosY;
     int windowMoveLockPosCX;
--- a/j2se/src/windows/native/sun/windows/awt_Cursor.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Cursor.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -523,13 +523,7 @@
     }
 
     if (!blocked) {
-        if( TRUE == awtCursor->IsCustomCursor() ) {
-            AwtToolkit::GetInstance().NotifyCustomCursor();
-        }
         ::SetCursor(hCursor); // don't need WM_AWT_SETCURSOR
-        if( FALSE == awtCursor->IsCustomCursor() ) {
-            AwtToolkit::GetInstance().NotifySystemCursor();
-        }
     }
 
     env->DeleteGlobalRef(((GlobalSetCursorStruct*)pStruct)->cursor);
--- a/j2se/src/windows/native/sun/windows/awt_Cursor.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Cursor.h	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -64,8 +64,6 @@
 	}
 	return hCursor;
     }
-    INLINE BOOL IsCustomCursor() { return custom; }
-
     static AwtCursor * CreateSystemCursor(jobject jCursor);
     static void UpdateCursor(AwtComponent *comp);
     static void DirtyAllCustomCursors();
--- a/j2se/src/windows/native/sun/windows/awt_Dialog.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Dialog.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -234,22 +234,25 @@
             ::ShowWindow(hWnd, SW_RESTORE);
         }
         HWND topMostBlocker = blocker;
+        HWND toolkitHWnd = AwtToolkit::GetInstance().GetHWnd();
         while (::IsWindow(blocker)) {
             topMostBlocker = blocker;
-            // fix for 6270632 - continued
-            if (::IsIconic(topMostBlocker)) {
-                ::ShowWindow(topMostBlocker, SW_RESTORE);
+            // fix for 6494032: restore the blocker if it was minimized
+            // together with its parent frame; in such cases the check
+            // ::IsIconic() for the blocker returns false, so we use
+            // ::IsWindowVisible() instead
+            if (!::IsWindowVisible(topMostBlocker) &&
+                (topMostBlocker != toolkitHWnd))
+            {
+                ::ShowWindow(topMostBlocker, SW_SHOWNA);
             }
             blocker = AwtWindow::GetModalBlocker(blocker);
         }
-        if (topMostBlocker != NULL) {
-            if ((topMostBlocker != AwtToolkit::GetInstance().GetHWnd()) &&
-                ::IsWindowVisible(topMostBlocker))
-            {
-                ::SetForegroundWindow(topMostBlocker);
-            }
-            return 1;
+        if (topMostBlocker != toolkitHWnd) {
+            ::BringWindowToTop(topMostBlocker);
+            ::SetForegroundWindow(topMostBlocker);
         }
+        return 1;
     }
     return CallNextHookEx(0, code, wParam, lParam);
 }
@@ -337,11 +340,10 @@
     if (locationByPlatform) {
          moveToDefaultLocation();
     }
-
-    if (!IsFocusableWindow()) {
+    if (IsFocusableWindow() && (IsAutoRequestFocus() || IsFocusedWindowModalBlocker())) {
+        ::ShowWindow(GetHWnd(), SW_SHOW);
+    } else {
         ::ShowWindow(GetHWnd(), SW_SHOWNA);
-    } else {
-        ::ShowWindow(GetHWnd(), SW_SHOW);
     }
 }
 
@@ -473,7 +475,6 @@
     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);  
 
     DASSERT( ::GetCurrentThreadId() == AwtToolkit::MainThread() );
-    DASSERT( ::IsWindowVisible( GetHWnd() ) );
     DASSERT( ::IsWindow(m_modalWnd) );
 
     m_modalWnd = NULL;
--- a/j2se/src/windows/native/sun/windows/awt_Dialog.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Dialog.h	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -73,6 +73,15 @@
     MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button);
     virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
 
+    /*
+     * The check is performed before the dialog is shown.
+     * The focused window can't be blocked at the time it's focused.
+     * Thus we don't have to perform any transitive (a blocker of a blocker) checks.
+     */
+    INLINE virtual BOOL IsFocusedWindowModalBlocker() {
+        return (sm_focusedWindow != NULL) && (GetModalBlocker(sm_focusedWindow) == GetHWnd());
+    }
+
     // finds and activates some window after the modal dialog is hidden
     static void ModalActivateNextWindow(HWND dialogHWnd, HWND parentHWnd,
                                         jobject dialogTarget, jobject dialogPeer);
--- a/j2se/src/windows/native/sun/windows/awt_DnDDS.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_DnDDS.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -312,11 +312,6 @@
  */
 HRESULT AwtDragSource::ChangeCursor()
 {
-    if (m_cursor != NULL && m_cursor->IsCustomCursor()) {
-        AwtToolkit::GetInstance().NotifyCustomCursor();
-    } else {
-        AwtToolkit::GetInstance().NotifySystemCursor();
-    }
     if (m_cursor != NULL) {
         ::SetCursor(m_cursor->GetHCursor());
         return S_OK; 
--- a/j2se/src/windows/native/sun/windows/awt_Frame.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Frame.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -114,7 +114,6 @@
     m_iconic = FALSE;
     m_zoomed = FALSE;
     m_maxBoundsSet = FALSE;
-    m_isEmbeddedFrameActivationRequest = FALSE;
 
     isInManualMoveOrSize = FALSE;
     grabbedHitTest = 0;
@@ -254,7 +253,6 @@
                     style = WS_POPUP | WS_SYSMENU | WS_CLIPCHILDREN |
                         WS_MAXIMIZEBOX | WS_MINIMIZEBOX;
                   if (state & java_awt_Frame_ICONIFIED) {
-                      style |= WS_ICONIC;
                       frame->setIconic(TRUE);
                   }
                     frame->m_isUndecorated = TRUE;
@@ -262,7 +260,6 @@
 		    exStyle = WS_EX_WINDOWEDGE;
 		    style = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
                   if (state & java_awt_Frame_ICONIFIED) {
-                      style |= WS_ICONIC;
                       frame->setIconic(TRUE);
                   }
 		}
@@ -543,6 +540,62 @@
     return mrDoDefault;
 }
 
+
+// Override AwtWindow::Reshape() to handle minimized/maximized
+// frames (see 6525850, 4065534)
+void AwtFrame::Reshape(int x, int y, int width, int height)
+{
+    if (isIconic()) {
+    // normal AwtComponent::Reshape will not work for iconified windows so...
+        WINDOWPLACEMENT wp;
+        POINT       ptMinPosition = {x,y};
+        POINT       ptMaxPosition = {0,0};
+        RECT        rcNormalPosition = {x,y,x+width,y+height};
+        RECT        rcWorkspace;
+        HWND        hWndDesktop = GetDesktopWindow();
+        HWND        hWndSelf = GetHWnd();
+
+        // SetWindowPlacement takes workspace coordinates, but
+        // if taskbar is at top of screen, workspace coords !=
+        // screen coords, so offset by workspace origin
+        VERIFY(::SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)&rcWorkspace, 0));
+        ::OffsetRect(&rcNormalPosition, -rcWorkspace.left, -rcWorkspace.top);
+
+        // set the window size for when it is not-iconified
+        wp.length = sizeof(wp);
+        wp.flags = WPF_SETMINPOSITION;
+        wp.showCmd = IsVisible() ? SW_SHOWMINIMIZED : SW_HIDE;
+        wp.ptMinPosition = ptMinPosition;
+        wp.ptMaxPosition = ptMaxPosition;
+        wp.rcNormalPosition = rcNormalPosition;
+
+        // If the call is not guarded with ignoreWmSize,
+        // a regression for bug 4851435 appears.
+        // Having this call guarded also prevents
+        // changing the iconified state of the frame
+        // while calling the Frame.setBounds() method.
+        m_ignoreWmSize = TRUE;
+        ::SetWindowPlacement(hWndSelf, &wp);
+        m_ignoreWmSize = FALSE;
+
+        return;
+    }
+
+    if (isZoomed()) {
+    // setting size of maximized window, we remove the
+    // maximized state bit (matches Motif behaviour)
+    // (calling ShowWindow(SW_RESTORE) would fire an
+    //  activation event which we don't want)
+        LONG    style = GetStyle();
+        DASSERT(style & WS_MAXIMIZE);
+        style ^= WS_MAXIMIZE;
+        SetStyle(style);
+    }
+
+    AwtWindow::Reshape(x, y, width, height);
+}
+
+
 /* Show the frame in it's current state */
 void
 AwtFrame::Show()
@@ -561,6 +614,7 @@
     if (locationByPlatform) {
          moveToDefaultLocation();
     }
+    BOOL autoRequestFocus = IsAutoRequestFocus();
 	    
     if (m_iconic) {
 	if (m_zoomed) {
@@ -574,7 +628,7 @@
 	    ::ZeroMemory(&wp, sizeof(WINDOWPLACEMENT));
 	    wp.length = sizeof(WINDOWPLACEMENT);
 	    ::GetWindowPlacement(hwnd, &wp);
-            if (!IsFocusableWindow()) {
+            if (!IsFocusableWindow() || !autoRequestFocus) {
                 wp.showCmd = SW_SHOWMINNOACTIVE;
             } else {
                 wp.showCmd = SW_SHOWMINIMIZED;
@@ -584,7 +638,7 @@
 	}
 	else {
 	    DTRACE_PRINTLN("AwtFrame::Show(SW_SHOWMINIMIZED)");
-            if (!IsFocusableWindow()) {
+            if (!IsFocusableWindow() || !autoRequestFocus) { 
                 ::ShowWindow(hwnd, SW_SHOWMINNOACTIVE);
             } else {
                 ::ShowWindow(hwnd, SW_SHOWMINIMIZED);
@@ -593,7 +647,13 @@
     }
     else if (m_zoomed) {
 	DTRACE_PRINTLN("AwtFrame::Show(SW_SHOWMAXIMIZED)");
-        if (!IsFocusableWindow()) {
+        if (!autoRequestFocus) {  
+    
+            m_filterFocusAndActivation = TRUE;  
+            ::ShowWindow(hwnd, SW_MAXIMIZE);  
+            m_filterFocusAndActivation = FALSE;  
+    
+        } else if (!IsFocusableWindow()) { 
             ::ShowWindow(hwnd, SW_MAXIMIZE);
         } else {
             ::ShowWindow(hwnd, SW_SHOWMAXIMIZED);
@@ -623,7 +683,7 @@
 	// to show in "normal" state regardless of whatever stale
 	// state might the invisible window still has.
 	DTRACE_PRINTLN("AwtFrame::Show(SW_RESTORE)");
-        if (!IsFocusableWindow()) {
+        if (!IsFocusableWindow() || !autoRequestFocus) {  
             ::ShowWindow(hwnd, SW_SHOWNOACTIVATE);
         } else {
             ::ShowWindow(hwnd, SW_RESTORE);
@@ -784,12 +844,6 @@
 
 MsgRouting AwtFrame::WmActivate(UINT nState, BOOL fMinimized, HWND opposite)
 {
-    // Process WM_ACTIVATE for EmbeddedFrame by request only
-    if (IsEmbeddedFrame() && m_isEmbeddedFrameActivationRequest == FALSE) {
-        return mrConsume;
-    }
-    m_isEmbeddedFrameActivationRequest = FALSE;
-
     jint type;
     BOOL doActivateFrame = TRUE;
 
@@ -1046,11 +1100,55 @@
 }
 
 /*
+ * hWndLostFocus - the opposite component
+ * Returns TRUE if WM_SETFOCUS may be processed further, otherwise FALSE.
+ */
+BOOL AwtFrame::activateEmbeddedFrameOnSetFocus(HWND hWndLostFocus) {
+
+    // If the EmbeddedFrame is not yet active, then this is either:
+    // - requesting focus on smth in the EmbeddedFrame, or
+    // - Alt hitting in IE while its menu is active (see 6374321).
+    // In both these cases we get WM_SETFOCUS without WM_ACTIVATE
+    // on the EmbeddedFrame.
+    if (sm_focusedWindow != GetHWnd()) {
+        HWND oppositeToplevelHWnd = AwtComponent::GetTopLevelParentForWindow(hWndLostFocus);
+
+        // As we get WM_SETFOCUS from the native system we expect
+        // the native toplevel be set to the active window.
+        HWND activeWindowHWnd = ::GetActiveWindow();
+        DASSERT(activeWindowHWnd == ::GetAncestor(GetHWnd(), GA_ROOT));
+        
+        // See 6538154.
+        ::BringWindowToTop(activeWindowHWnd);
+        ::SetForegroundWindow(activeWindowHWnd);
+        
+        SynthesizeWmActivate(TRUE, oppositeToplevelHWnd);
+
+        return FALSE;
+    }
+    // If the EmbeddedFrame is already active, then this is a mouse click
+    // or activation (by Alt-Tab, start etc).
+    return TRUE;
+}
+
+/*
+ * hWndGotFocus - the opposite component
+ * Returns TRUE if WM_KILLFOCUS may be processed further, otherwise FALSE.
+ */
+BOOL AwtFrame::deactivateEmbeddedFrameOnKillFocus(HWND hWndGotFocus) {
+    HWND oppositeToplevelHWnd = AwtComponent::GetTopLevelParentForWindow(hWndGotFocus);
+
+    if (oppositeToplevelHWnd != sm_focusedWindow) {
+        SynthesizeWmActivate(FALSE, oppositeToplevelHWnd);
+    }
+    return TRUE;
+}
+
+/*
  * Execute on Toolkit only.
  */
 void AwtFrame::SynthesizeWmActivate(BOOL doActivate, HWND opposite) {
     if (::IsWindowVisible(GetHWnd())) {
-        m_isEmbeddedFrameActivationRequest = TRUE;
         ::SendMessage(GetHWnd(), WM_ACTIVATE, MAKEWPARAM(doActivate ? WA_ACTIVE : WA_INACTIVE, FALSE), (LPARAM) opposite);
     }
 }
--- a/j2se/src/windows/native/sun/windows/awt_Frame.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Frame.h	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -75,9 +75,6 @@
 
     INLINE BOOL IsSimpleWindow() { return FALSE; }
 
-    /* Confirms that EmbeddedFrame is currently requesting activation */
-    INLINE BOOL IsEmbeddedFrameActivationRequest() { return m_isEmbeddedFrameActivationRequest; }
-
     /* Returns whether this window is in iconified state. */
     INLINE BOOL isIconic() { return m_iconic; }
     INLINE void setIconic(BOOL b) { m_iconic = b; }
@@ -136,6 +133,9 @@
 
     void SynthesizeWmActivate(BOOL doActivate, HWND opposite);
 
+    BOOL activateEmbeddedFrameOnSetFocus(HWND hWndLostFocus);
+    BOOL deactivateEmbeddedFrameOnKillFocus(HWND hWndGotFocus);
+
     // invoked on Toolkit thread
     static jobject _GetBoundsPrivate(void *param);
 
@@ -149,6 +149,8 @@
     static void _SynthesizeWmActivate(void *param);
     static void _NotifyModalBlocked(void *param);
 
+    virtual void Reshape(int x, int y, int width, int height);
+
 protected:
     /* The frame is undecorated. */
     BOOL m_isUndecorated;
@@ -171,9 +173,6 @@
     /* The frame is an EmbeddedFrame. */
     BOOL m_isEmbedded;
 
-    /* EmbeddedFrame is to be activated on demand only */
-    BOOL m_isEmbeddedFrameActivationRequest;
-
     /* used so that calls to ::MoveWindow in SetMenuBar don't propogate
        because they are immediately followed by calls to Component.resize */
     BOOL m_ignoreWmSize;
--- a/j2se/src/windows/native/sun/windows/awt_List.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_List.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -301,6 +301,7 @@
     MapWindowPoints(0, parentHWnd, (LPPOINT)&rect, 2);
 
     HANDLE font = (HANDLE)SendListMessage(WM_GETFONT);
+    LRESULT itemHeight = SendListMessage(LB_GETITEMHEIGHT, 0);
     DWORD style = ::GetWindowLong(GetListHandle(), GWL_STYLE) | WS_VSCROLL | WS_HSCROLL;
     if (isMultiSelect) {
         style |= LBS_MULTIPLESEL;
@@ -322,6 +323,7 @@
                peer);
 
     SendListMessage(WM_SETFONT, (WPARAM)font, (LPARAM)FALSE);
+    SendListMessage(LB_SETITEMHEIGHT, 0, MAKELPARAM(itemHeight, 0));
     SendListMessage(LB_RESETCONTENT);  
     for (i = 0; i < nCount; i++) {
         InsertString(i, strings[i]);
--- a/j2se/src/windows/native/sun/windows/awt_PopupMenu.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_PopupMenu.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -186,23 +186,19 @@
         DASSERT(isTrayIconPopupID);
     }
 
-    if (AwtToolkit::IsMainThread()) {
-        ShowStruct *ss = (ShowStruct*)param;
-        if (ss->self != NULL) {
-            PDATA pData = JNI_GET_PDATA(ss->self);
-            if (pData) {
-                AwtPopupMenu *p = (AwtPopupMenu *)pData;
-                jobject target = p->GetTarget(env);    
-                BOOL isTrayIconPopup = env->GetBooleanField(target, isTrayIconPopupID);
-                env->DeleteLocalRef(target);
-                p->Show(env, ss->event, isTrayIconPopup);
-            }
-            env->DeleteGlobalRef(ss->self);
+    ShowStruct *ss = (ShowStruct*)param;
+    if (ss->self != NULL) {
+        PDATA pData = JNI_GET_PDATA(ss->self);
+        if (pData) {
+            AwtPopupMenu *p = (AwtPopupMenu *)pData;
+            jobject target = p->GetTarget(env);
+            BOOL isTrayIconPopup = env->GetBooleanField(target, isTrayIconPopupID);
+            env->DeleteLocalRef(target);
+            p->Show(env, ss->event, isTrayIconPopup);
         }
-        delete ss;
-    } else {
-        AwtToolkit::GetInstance().InvokeFunction(AwtPopupMenu::_Show, param);
-    }   
+        env->DeleteGlobalRef(ss->self);
+    }
+    delete ss;
 }
 
 void AwtPopupMenu::AddItem(AwtMenuItem *item)
@@ -304,7 +300,8 @@
     ss->self = env->NewGlobalRef(self);
     ss->event = env->NewGlobalRef(event);
 
-    AwtToolkit::GetInstance().SyncCall(AwtPopupMenu::_Show, ss);
+    // fix for 6268046: invoke the function without CriticalSection's synchronization
+    AwtToolkit::GetInstance().InvokeFunction(AwtPopupMenu::_Show, ss);
     // global ref is deleted in _Show() and ss is deleted in Show()
 
     CATCH_BAD_ALLOC;
--- a/j2se/src/windows/native/sun/windows/awt_PrintJob.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_PrintJob.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -3068,25 +3068,7 @@
 	*isPortrait = paperSize->x < paperSize->y;
     }
 
-    /* The Paper class expresses the page size in
-     * portait mode while Windows returns the paper
-     * size adjusted for the orientation. If the
-     * orientation is landscape then we want to
-     * flip the width and height to get a portait
-     * description of the page.
-     */
-    if (*isPortrait == FALSE){
-	long hold = paperSize->x;
-	paperSize->x = paperSize->y;
-	paperSize->y = hold;
-
-	margins->left = setup->rtMargin.top;
-	margins->right = setup->rtMargin.bottom;
-	margins->top = setup->rtMargin.right;
-	margins->bottom = setup->rtMargin.left;	   
-    } else {
-	*margins = setup->rtMargin;
-    }
+    *margins = setup->rtMargin;
 
     // compare margin from page setup dialog with our device printable area
     RectDouble deviceMargin;
@@ -3119,6 +3101,24 @@
 	    margins->right = devMargin.right;
 	}
     }
+
+    /* The Paper class expresses the page size in
+     * portait mode while Windows returns the paper
+     * size adjusted for the orientation. If the
+     * orientation is landscape then we want to
+     * flip the width and height to get a portait
+     * description of the page.
+     */
+    if (*isPortrait == FALSE){
+        long hold = paperSize->x;
+        paperSize->x = paperSize->y;
+        paperSize->y = hold;
+
+        margins->left = setup->rtMargin.top;
+        margins->right = setup->rtMargin.bottom;
+        margins->top = setup->rtMargin.right;
+        margins->bottom = setup->rtMargin.left;
+    }
 }
 
 /**
@@ -4083,10 +4083,8 @@
 	return FALSE;
     }
   
-    pDevMode->dmFields |= DM_ORIENTATION;
-    pDevMode->dmOrientation = DMORIENT_PORTRAIT;
     SAVE_CONTROLWORD
-      ::ResetDC(pdc, pDevMode);
+    ::ResetDC(pdc, pDevMode);
     RESTORE_CONTROLWORD
   
     int left = GetDeviceCaps(pdc, PHYSICALOFFSETX);
--- a/j2se/src/windows/native/sun/windows/awt_Toolkit.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Toolkit.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -447,8 +447,6 @@
 
     awt_dnd_initialize();
 
-    tk._begin_cursors();
-
     return TRUE;
 }
 
@@ -496,8 +494,6 @@
 
     delete tk.m_cmdIDs;
 
-    tk._end_cursors();
-
     ::CloseHandle(m_waitEvent);
 
     ComCtl32Util::GetInstance().FreeLibraries();
@@ -1448,52 +1444,6 @@
     }
 }
 
-/* cursor support 
- */
-void AwtToolkit::_begin_cursors() {
-  m_nCustomCursor = FALSE;
-  _detect_themes();
-}
-void AwtToolkit::_end_cursors() {
-  m_nCustomCursor = FALSE;
-}
-void AwtToolkit::_detect_themes() {
-  HKEY regKey = NULL;
-  
-  m_nHasThemes = FALSE;
-  
-  if( ERROR_SUCCESS == ::RegOpenKeyEx(
-				      HKEY_CURRENT_USER,
-				      TEXT("Control Panel\\Cursors"),
-				      0,
-				      KEY_READ,
-				      &regKey ) ) {
-    TCHAR nBuffer[0xFF];
-    DWORD buffLen = 0xFF;
-    
-    if( ERROR_SUCCESS == ::RegQueryValueEx(
-					   regKey,
-					   TEXT("Arrow"),
-					   0,0,(LPBYTE)nBuffer,
-					   &buffLen) ) {
-      HCURSOR hC;
-      if (_tcsstr(nBuffer, TEXT("%SYSTEMROOT%"))) {
-        TCHAR nBufferCorrect[0xff];
-        _tcscpy(nBufferCorrect, _tgetenv(TEXT("SYSTEMROOT")));
-        _tcscat(nBufferCorrect, (nBuffer + _tcslen(TEXT("%SYSTEMROOT%"))));
-        hC = ::LoadCursorFromFile(nBufferCorrect);
-      } else {
-        hC = ::LoadCursorFromFile(nBuffer);
-      }
-      if( NULL != hC ) {
-	m_nHasThemes = TRUE;
-	::DestroyCursor(hC);
-      }
-    }
-    ::RegCloseKey(regKey);
-  }
-}
-
 void throw_if_shutdown(void) throw (awt_toolkit_shutdown)
 {
     AwtToolkit::GetInstance().VerifyActive();
@@ -2183,12 +2133,12 @@
 }
 
 JNIEXPORT jboolean JNICALL
-Java_sun_awt_windows_WToolkit_syncNativeQueue(JNIEnv *env, jobject self)
+Java_sun_awt_windows_WToolkit_syncNativeQueue(JNIEnv *env, jobject self, jlong timeout)
 {
     AwtToolkit & tk = AwtToolkit::GetInstance();
     DWORD eventNumber = tk.eventNumber;
     tk.PostMessage(WM_SYNC_WAIT, 0, 0);
-    ::WaitForSingleObject(tk.m_waitEvent, INFINITE);    
+    ::WaitForSingleObject(tk.m_waitEvent, INFINITE);
     DWORD newEventNumber = tk.eventNumber;
     return (newEventNumber - eventNumber) > 2;
 }
--- a/j2se/src/windows/native/sun/windows/awt_Toolkit.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Toolkit.h	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1996-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -433,24 +433,6 @@
     BOOL HasDisplayChanged() { return m_displayChanged; }
     void ResetDisplayChanged() { m_displayChanged = FALSE; }
 
-
-/* cursor support
- */
- private:
-    BOOL m_nCustomCursor;
-    BOOL m_nHasThemes;
-
-    void _begin_cursors();
-    void _end_cursors();
-    void _detect_themes();
-
- public:
-    void NotifyCustomCursor() { m_nCustomCursor = TRUE; }
-    void NotifySystemCursor() { m_nCustomCursor = FALSE; }
-    void UpdateThemesStatus() { _detect_themes(); }
-    BOOL IsCustomCursor() { return m_nCustomCursor; }
-    BOOL AreThemesInstalled() { return m_nHasThemes; }
-    
  private:
     static JNIEnv *m_env;
     static HANDLE m_thread;
--- a/j2se/src/windows/native/sun/windows/awt_Window.cpp	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Window.cpp	Fri Jun 22 00:46:43 2007 +0000
@@ -125,6 +125,7 @@
 
 jfieldID AwtWindow::warningStringID;
 jfieldID AwtWindow::locationByPlatformID;
+jfieldID AwtWindow::autoRequestFocusID;
 
 int AwtWindow::ms_instanceCounter = 0;
 HHOOK AwtWindow::ms_hCBTFilter;
@@ -154,6 +155,7 @@
     m_grabbed = FALSE;
     m_isFocusableWindow = TRUE;
     m_isRetainingHierarchyZOrder = FALSE;
+    m_filterFocusAndActivation = FALSE;
 
     if (AwtWindow::ms_instanceCounter == 1) {
         AwtWindow::ms_hCBTFilter =
@@ -329,15 +331,9 @@
     if (nCode == HCBT_ACTIVATE || nCode == HCBT_SETFOCUS) {
         AwtComponent *comp = AwtComponent::GetComponent((HWND)wParam);
 
-        if (comp != NULL && comp->IsTopLevel()) {
-            AwtWindow* win = (AwtWindow*)comp;
-
-            if (!win->IsFocusableWindow() ||
-                (win->IsEmbeddedFrame() && !((AwtFrame*)win)->IsEmbeddedFrameActivationRequest()))
-            {
-                return 1;
-            }
-        } 
+        if (comp != NULL && comp->IsTopLevel() && !((AwtWindow*)comp)->IsFocusableWindow()) {
+            return 1; // Don't change focus/activation.
+        }
     }
     return ::CallNextHookEx(AwtWindow::ms_hCBTFilter, nCode, wParam, lParam);
 }
@@ -449,55 +445,6 @@
     m_owningFrameDialog = (AwtFrame *)owner;
 }
 
-//
-// Override AwtComponent's Reshape to handle minimized/maximized
-// windows, fixes 4065534 (robi.khan@eng).
-// NOTE: See also AwtWindow::WmSize
-//
-void AwtWindow::Reshape(int x, int y, int width, int height) 
-{
-    HWND    hWndSelf = GetHWnd();
-
-    if ( ::IsIconic(hWndSelf)) {
-    // normal AwtComponent::Reshape will not work for iconified windows so...
-        WINDOWPLACEMENT wp;
-        POINT       ptMinPosition = {x,y};
-        POINT       ptMaxPosition = {0,0};
-        RECT        rcNormalPosition = {x,y,x+width,y+height};
-        RECT        rcWorkspace;
-        HWND        hWndDesktop = GetDesktopWindow();
-
-        // SetWindowPlacement takes workspace coordinates, but
-        // if taskbar is at top of screen, workspace coords !=
-        // screen coords, so offset by workspace origin
-        VERIFY(::SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)&rcWorkspace, 0));
-        ::OffsetRect(&rcNormalPosition, -rcWorkspace.left, -rcWorkspace.top);
-
-        // set the window size for when it is not-iconified
-        wp.length = sizeof(wp);
-        wp.flags = WPF_SETMINPOSITION;
-        wp.showCmd = SW_SHOWNA;
-        wp.ptMinPosition = ptMinPosition;
-        wp.ptMaxPosition = ptMaxPosition;
-        wp.rcNormalPosition = rcNormalPosition;
-        SetWindowPlacement(hWndSelf, &wp);
-        return;
-    }
-    
-    if (IsZoomed(hWndSelf)) {
-    // setting size of maximized window, we remove the
-    // maximized state bit (matches Motif behaviour)
-    // (calling ShowWindow(SW_RESTORE) would fire an
-    //  activation event which we don't want)
-        LONG    style = GetStyle();
-        DASSERT(style & WS_MAXIMIZE);
-        style ^= WS_MAXIMIZE;
-        SetStyle(style);
-    }
-
-    AwtComponent::Reshape(x, y, width, height);
-}
-
 void AwtWindow::moveToDefaultLocation() {
     HWND boggy = ::CreateWindow(GetClassName(), L"BOGGY", WS_OVERLAPPED, CW_USEDEFAULT, 0 ,0, 0, 
         NULL, NULL, NULL, NULL);
@@ -531,7 +478,7 @@
     INT nCmdShow;
 
     AwtFrame* owningFrame = GetOwningFrameOrDialog();
-    if (IsFocusableWindow() && owningFrame != NULL &&
+    if (IsFocusableWindow() && IsAutoRequestFocus() && owningFrame != NULL &&
         ::GetForegroundWindow() == owningFrame->GetHWnd())
     {
         nCmdShow = SW_SHOW;
@@ -1124,6 +1071,30 @@
     return mrConsume;
 }
 
+MsgRouting AwtWindow::WmSizing()
+{
+    if (!AwtToolkit::GetInstance().IsDynamicLayoutActive()) {
+        return mrDoDefault;
+    }
+
+    DTRACE_PRINTLN("AwtWindow::WmSizing  fullWindowDragEnabled");
+
+    SendComponentEvent(java_awt_event_ComponentEvent_COMPONENT_RESIZED);
+
+    HWND thisHwnd = GetHWnd();
+    if (thisHwnd == NULL) {
+        return mrDoDefault;
+    }
+
+    // Call WComponentPeer::dynamicallyLayoutContainer()
+    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+    jobject peer = GetPeer(env);
+    JNU_CallMethodByName(env, NULL, peer, "dynamicallyLayoutContainer", "()V");
+    DASSERT(!safe_ExceptionOccurred(env));
+
+    return mrDoDefault;
+}
+
 /*
  * Override AwtComponent's size handling to first update the 
  * java AWT target's dimension fields directly, since Windows
@@ -1484,8 +1455,11 @@
 void AwtWindow::SetAndActivateModalBlocker(HWND window, HWND blocker) {
     if (::IsWindow(window) && ::IsWindow(blocker)) {
         AwtWindow::SetModalBlocker(window, blocker);
-        ::BringWindowToTop(blocker);
-        ::SetForegroundWindow(blocker);
+        // We must check for visibility. Otherwise invisible dialog will receive WM_ACTIVATE.
+        if (::IsWindowVisible(blocker)) {
+            ::BringWindowToTop(blocker);
+            ::SetForegroundWindow(blocker);
+        }
     }
 }
 
@@ -1514,12 +1488,14 @@
     {
         UINT flags = SWP_NOMOVE|SWP_NOSIZE;
         BOOL focusable = w->IsFocusableWindow();
-        if (!focusable)
+        BOOL autoRequestFocus = w->IsAutoRequestFocus();
+
+        if (!focusable || !autoRequestFocus)
         {
             flags = flags|SWP_NOACTIVATE;
         }
         ::SetWindowPos(w->GetHWnd(), HWND_TOP, 0, 0, 0, 0, flags);
-        if (focusable)
+        if (focusable && autoRequestFocus)
         {
             ::SetForegroundWindow(w->GetHWnd());
         }
@@ -2165,6 +2141,8 @@
         env->GetFieldID(cls, "warningString", "Ljava/lang/String;");
     AwtWindow::locationByPlatformID =
         env->GetFieldID(cls, "locationByPlatform", "Z");
+    AwtWindow::autoRequestFocusID =
+        env->GetFieldID(cls, "autoRequestFocus", "Z");
 
     CATCH_BAD_ALLOC;
 }
--- a/j2se/src/windows/native/sun/windows/awt_Window.h	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/src/windows/native/sun/windows/awt_Window.h	Fri Jun 22 00:46:43 2007 +0000
@@ -54,6 +54,7 @@
     static jfieldID warningStringID;
     static jfieldID locationByPlatformID;
     static jfieldID screenID; /* screen number passed over from WindowPeer */
+    static jfieldID autoRequestFocusID;
 
     AwtWindow();
     virtual ~AwtWindow();
@@ -102,8 +103,17 @@
 
     INLINE BOOL IsRetainingHierarchyZOrder() { return m_isRetainingHierarchyZOrder; }
 
+    /* WARNING: don't invoke on Toolkit thread! */
+    INLINE BOOL IsAutoRequestFocus() {
+        JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+        return env->GetBooleanField(GetTarget(env), AwtWindow::autoRequestFocusID);
+    }
+
+    INLINE virtual BOOL IsFocusedWindowModalBlocker() {
+        return FALSE;
+    }
+
     virtual void Invalidate(RECT* r);
-    virtual void Reshape(int x, int y, int width, int height);
     virtual void Show();
     virtual void SetResizable(BOOL isResizable);
     BOOL IsResizable();
@@ -151,6 +161,7 @@
     virtual MsgRouting WmGetMinMaxInfo(LPMINMAXINFO lpmmi);
     virtual MsgRouting WmMove(int x, int y);
     virtual MsgRouting WmSize(UINT type, int w, int h);
+    virtual MsgRouting WmSizing();
     virtual MsgRouting WmPaint(HDC hDC);
     virtual MsgRouting WmSettingChange(UINT wFlag, LPCTSTR pszSection);
     virtual MsgRouting WmNcCalcSize(BOOL fCalcValidRects,
@@ -221,6 +232,7 @@
     HICON m_hIcon;            /* Icon for this window. It can be set explicitely or inherited from the owner */
     HICON m_hIconSm;          /* Small icon for this window. It can be set explicitely or inherited from the owner */
     BOOL m_iconInherited;     /* TRUE if icon is inherited from the owner */
+    BOOL m_filterFocusAndActivation; /* Used in the WH_CBT hook */
 
 
 private:
--- a/j2se/test/com/sun/jdi/ShellScaffold.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/com/sun/jdi/ShellScaffold.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,7 @@
 # have any questions.
 #
 
-# @(#)ShellScaffold.sh	1.23 07/05/09
+# @(#)ShellScaffold.sh	1.24 07/05/24
 #
 # jtreg runs this in a scratch dir.
 # It (and runregress -no) sets these env vars:
@@ -132,7 +132,7 @@
 # This can be increased if timing seems to be an issue.
 sleep_seconds=1
 
-echo "ShellScaffold.sh: Version 07/05/09" >& 2
+echo "ShellScaffold.sh: Version 07/05/24" >& 2
 
 cleanup()
 {
@@ -443,6 +443,9 @@
         # we get here.
         echo quit >& 2
         echo quit
+        # See 6562090. Maybe there is a way that the exit
+        # can cause jdb to not get the quit.
+        sleep 5
         exit 1
     fi
 
--- a/j2se/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java	Fri Jun 22 00:46:43 2007 +0000
@@ -21,13 +21,13 @@
  * have any questions.
  */
 
-/* @test @(#)DebugUsingCustomConnector.java	1.7 07/05/05
+/* @test @(#)DebugUsingCustomConnector.java	1.8 07/05/22
  * @bug 4287596
  * @summary Unit test for "Pluggable Connectors and Transports" feature.
  *
  * This tests launches a debuggee using a custom LaunchingConnector.
  *
- * @build DebugUsingCustomConnector SimpleLaunchingConnector Foo
+ * @build DebugUsingCustomConnector SimpleLaunchingConnector Foo NullTransportService
  * @run main DebugUsingCustomConnector
  */
 import com.sun.jdi.*;
--- a/j2se/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 #
 
 # 
-# @test     @(#)TestTotalSwap.sh	1.5 07/05/05
+# @test     @(#)TestTotalSwap.sh	1.6 07/05/22
 # @summary  Tests MM getTotalSwapSpaceSize() api.
 # @author   Swamy V
 # @bug      6252770
@@ -65,10 +65,10 @@
 solaris_swap_size()
 {
    total_swap=0
-   for i in `/usr/sbin/swap -l |  /bin/awk  '{print $4}' | /bin/grep -v blocks`
+   for i in `/usr/sbin/swap -l |  awk  '{print $4}' | grep -v blocks`
    do
       # swap -l returns size in blocks of 512 bytes.
-      total_swap=`/bin/expr $i \* 512 + $total_swap`
+      total_swap=`expr $i \* 512 + $total_swap`
    done
 }
 
@@ -80,7 +80,7 @@
        runOne GetTotalSwapSpaceSize $total_swap 
        ;;
      Linux )
-       total_swap=`/usr/bin/free -b | /bin/grep -i swap | /bin/awk '{print $2}'`
+       total_swap=`free -b | grep -i swap | awk '{print $2}'`
        runOne GetTotalSwapSpaceSize $total_swap 
        ;;
     * )
--- a/j2se/test/com/sun/management/UnixOperatingSystemMXBean/GetMaxFileDescriptorCount.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/com/sun/management/UnixOperatingSystemMXBean/GetMaxFileDescriptorCount.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 #
 
 #
-# @test    @(#)GetMaxFileDescriptorCount.sh	1.6 00:55:05
+# @test    @(#)GetMaxFileDescriptorCount.sh	1.6 00:59:24
 # @bug     4858522
 # @summary 
 # @author  Steve Bohne
--- a/j2se/test/com/sun/management/UnixOperatingSystemMXBean/GetOpenFileDescriptorCount.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/com/sun/management/UnixOperatingSystemMXBean/GetOpenFileDescriptorCount.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
 #
 
 #
-# @test    @(#)GetOpenFileDescriptorCount.sh	1.6 00:55:05
+# @test    @(#)GetOpenFileDescriptorCount.sh	1.6 00:59:24
 # @bug     4858522
 # @summary 
 # @author  Steve Bohne
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Choice/ChoiceKeyEventReaction/ChoiceKeyEventReaction.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+<html>
+<!--  
+  @test 1.2 06/11/07
+  @bug 6252982
+  @summary PIT: Keyboard FocusTraversal not working when choice's drop-down is visible, on XToolkit
+  @author andrei.dmitriev : area=awt.choice
+  @library ../../regtesthelpers
+  @build Util
+  @run applet ChoiceKeyEventReaction.html
+  -->
+<head>
+<title>  </title>
+</head>
+<body>
+
+<h1>ChoiceKeyEventReaction<br>Bug ID: 6252982 </h1>
+
+<p> This is an AUTOMATIC test, simply wait for completion </p>
+
+<APPLET CODE="ChoiceKeyEventReaction.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Component/F10TopToplevel/F10TopToplevel.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,21 @@
+<html>
+<!--  
+  @test @(#)F10TopToplevel.html	1.1 07/04/09
+  @bug 6533175
+  @summary Block F10 if closest toplevel to keystroke target is not a Frame.
+  @author yuri nesterenko : area= awt.toplevel
+  @run applet F10TopToplevel.html
+  -->
+<head>
+<title>  </title>
+</head>
+<body>
+
+<h1>F10TopToplevel<br>Bug ID: 6533175 Pressing F10 when a modal dialog is visible hangs the Xserver, XToolkit</h1>
+
+<p> This is an AUTOMATIC test, simply wait for completion </p>
+
+<APPLET CODE="F10TopToplevel.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Component/F10TopToplevel/F10TopToplevel.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,124 @@
+/* 
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/* 
+  test @(#)F10TopToplevel.java	1.2 07/05/28
+  @bug 6533175
+  @summary Block F10 if closest toplevel to keystroke target is not a Frame.
+  @author yuri nesterenko : area=awt.toplevel
+  @run applet F10TopToplevel.html
+*/
+
+
+
+/**
+ * F10TopToplevel.java
+ *
+ * summary: tests if F10 has no effect if focused toplevel if not Frame
+ */
+
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.*;
+
+
+public class F10TopToplevel extends Applet 
+{
+    //Declare things used in the test, like buttons and labels here
+    Frame frame;
+    Dialog dialog;
+    volatile boolean menuToggled = false;
+
+    public void init() 
+    {
+        setLayout (new BorderLayout ());
+
+    }//End  init()
+
+    public void start ()
+    {
+        //Get things going.  Request focus, set size, et cetera
+        setSize (200,200);
+        setVisible(true);
+        validate();
+
+        
+        //What would normally go into main() will probably go here.
+        //Use System.out.println for diagnostic messages that you want
+        //to read after the test is done.
+        MenuBar mb;
+        Menu menu;
+        MenuItem item;
+        frame = new Frame("am below");
+        frame.setMenuBar( (mb=new MenuBar()) ); 
+        menu = new Menu("nu");
+        menu.add((item = new MenuItem("item")));
+        item.addActionListener( new ActionListener() {
+            public void actionPerformed( ActionEvent ae ) {
+                menuToggled = true;
+            }
+        });
+        mb.add(menu);
+
+        frame.setSize(200,200);
+        frame.setLocation( 400,100 );
+        frame.setVisible( true );
+
+        dialog = new Dialog(frame);
+        dialog.setSize( 100,100 );
+        dialog.setVisible(true);
+        
+        Robot robot;
+        try {
+            robot = new Robot();
+        } catch(AWTException e){
+            throw new RuntimeException("cannot create robot.", e);
+        }
+        ((sun.awt.SunToolkit)Toolkit.getDefaultToolkit()).realSync();
+        robot.mouseMove(dialog.getLocationOnScreen().x + dialog.getWidth()/2,
+                        dialog.getLocationOnScreen().y + dialog.getHeight()/2 );
+        robot.delay(5);                
+        robot.mousePress(InputEvent.BUTTON1_MASK);
+        robot.delay(5);                
+        robot.mouseRelease(InputEvent.BUTTON1_MASK);
+        robot.delay(5);                
+        robot.keyPress(KeyEvent.VK_F10);        
+        robot.delay(5);                
+        robot.keyRelease(KeyEvent.VK_F10);        
+        robot.delay(5);                
+        
+        robot.delay(10);
+        robot.keyPress(KeyEvent.VK_ENTER);
+        robot.delay(5);                
+        robot.keyRelease(KeyEvent.VK_ENTER);
+        robot.delay(5);                
+
+        ((sun.awt.SunToolkit)Toolkit.getDefaultToolkit()).realSync();
+
+        if(menuToggled) {
+            throw new RuntimeException("Oops! Menu should not open.");
+        }
+
+    }// start()
+
+}// class F10TopToplevel
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Focus/AutoRequestFocusTest/AutoRequestFocusSetVisibleTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,608 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+  @test       @(#)AutoRequestFocusSetVisibleTest.java	1.2 07/05/28
+  @bug       6187066
+  @summary   Tests the Window.autoRequestFocus property for the Window.setVisible() method.
+  @author    anton.tarasov: area=awt.focus
+  @library    ../../regtesthelpers
+  @build      Util
+  @run       main AutoRequestFocusSetVisibleTest
+*/
+ 
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.Applet;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.lang.reflect.InvocationTargetException;
+import test.java.awt.regtesthelpers.Util;
+ 
+public class AutoRequestFocusSetVisibleTest extends Applet {
+    static Frame focusedFrame;
+    static Button focusOwner;
+    static Frame frame;
+    static Button frameButton;
+    static Frame frame2;
+    static Button frameButton2;
+    static Window window;
+    static Button winButton;
+    static Window ownedWindow;
+    static Button ownWinButton;
+    static Dialog ownedDialog;
+    static Button ownDlgButton;
+    static Dialog dialog;
+    static Button dlgButton;
+
+    static String toolkitClassName;
+    static Robot robot = Util.createRobot();
+ 
+    public static void main(String[] args) {
+        AutoRequestFocusSetVisibleTest app = new AutoRequestFocusSetVisibleTest();
+        app.init();
+        app.start();
+    }
+ 
+    public void init() {
+        // Create instructions for the user here, as well as set up
+        // the environment -- set the layout manager, add buttons,
+        // etc.
+        this.setLayout (new BorderLayout ());
+        Sysout.createDialogWithInstructions(new String[]
+            {"This is an automatic test. Simply wait until it is done."
+            });
+        toolkitClassName = Toolkit.getDefaultToolkit().getClass().getName();
+    }
+
+    void recreateGUI() {
+        if (focusedFrame != null) {
+            focusedFrame.dispose();
+            frame.dispose();
+            frame2.dispose();
+            window.dispose();
+            ownedWindow.dispose();
+            ownedDialog.dispose();
+            dialog.dispose();
+        }
+
+        focusedFrame = new Frame("Base Frame");
+        focusOwner = new Button("button");
+
+        frame = new Frame("Test Frame");
+        frameButton = new Button("button");
+
+        frame2 = new Frame("Test Frame");
+        frameButton2 = new Button("button");
+
+        window = new Window(focusedFrame);
+        winButton = new Button("button");
+
+        ownedWindow = new Window(frame) {
+                /*
+                 * When 'frame' is shown along with the 'ownedWindow'
+                 * (i.e. showWithParent==true) then it can appear
+                 * that the 'ownedWindow' is shown too early and
+                 * it can't be focused due to its owner can't be
+                 * yet activated. So, to avoid this race, we pospone
+                 * a little the showing of the 'ownedWindow'.
+                 */
+                public void show() {
+                    robot.delay(100);
+                    super.show();
+                }
+            };
+        ownWinButton = new Button("button");
+
+        ownedDialog = new Dialog(frame2);
+        ownDlgButton = new Button("button");
+
+        dialog = new Dialog(focusedFrame, "Test Dialog");
+        dlgButton = new Button("button");
+
+        focusedFrame.add(focusOwner);
+        focusedFrame.setBounds(100, 100, 300, 300);
+
+        frame.setBounds(140, 140, 220, 220);
+        frame.add(frameButton);
+
+        frame2.setBounds(140, 140, 220, 220);
+        frame2.add(frameButton2);
+        
+        window.setBounds(140, 140, 220, 220);
+        window.add(winButton);
+
+        ownedWindow.setBounds(180, 180, 140, 140);
+        ownedWindow.add(ownWinButton);
+
+        ownedDialog.setBounds(180, 180, 140, 140);
+        ownedDialog.add(ownDlgButton);
+
+        dialog.setBounds(140, 140, 220, 220);
+        dialog.add(dlgButton);
+    }
+ 
+    public void start() {
+
+        ///////////////////////////////////////////////////////
+        // 1. Show Frame with owned modal Dialog without delay.
+        //    Check that the Dialog takes focus.
+        ///////////////////////////////////////////////////////
+
+        recreateGUI();
+        
+        Sysout.println("Stage 1 in progress...");
+
+        dialog.setModal(true);
+        dialog.setAutoRequestFocus(false);
+        setVisible(focusedFrame, true);
+
+        TestHelper.invokeLaterAndWait(new Runnable() {
+                public void run() {
+                    dialog.setVisible(true);
+                }
+            }, robot);
+
+        if (focusOwner.hasFocus()) {
+            throw new TestFailedException("the modal dialog must gain focus but it didn't!");
+        }
+        setVisible(dialog, false);
+
+        //////////////////////////////////////////////////
+        // 2. Show Frame, activate, auto hide, auto show.
+        //    Check that the Frame takes focus.
+        //////////////////////////////////////////////////
+
+        recreateGUI();
+
+        Sysout.println("Stage 2 in progress...");
+
+        setVisible(focusedFrame, false);
+
+        focusedFrame.setAutoRequestFocus(false);
+        setVisible(focusedFrame, true);
+
+        Util.clickOnTitle(focusedFrame, robot);
+        Util.waitForIdle(robot);
+        
+        if (!focusedFrame.isFocused()) {
+            throw new Error("Test error: the frame couldn't be focused.");
+        }
+
+        focusedFrame.setExtendedState(Frame.ICONIFIED);
+        Util.waitForIdle(robot);
+        focusedFrame.setExtendedState(Frame.NORMAL);
+        Util.waitForIdle(robot);
+
+        if (!focusedFrame.isFocused()) {
+            throw new TestFailedException("the restored frame must gain focus but it didn't!");
+        }
+
+
+        ////////////////////////
+        // 3.1 Show Frame normal.
+        ////////////////////////
+
+        recreateGUI();
+
+        test("Stage 3.1 in progress...", frame, frameButton);
+
+
+        // 3.2. Show Frame maximized both.
+        /////////////////////////////////
+
+        if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
+            System.out.println("Stage 3.2: Frame.MAXIMIZED_BOTH not supported. Skipping.");
+        } else {
+            frame.setExtendedState(Frame.MAXIMIZED_BOTH);
+
+            test("Stage 3.2 in progress...", frame, frameButton);
+        }
+
+
+        // 3.3. Show Frame maximized vertically.
+        ///////////////////////////////////////
+             
+        if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_VERT)) {
+            System.out.println("Stage 3.3: Frame.MAXIMIZED_VERT not supported. Skipping.");
+        } else {   
+            frame.setExtendedState(Frame.MAXIMIZED_VERT);
+
+            test("Stage 3.3 in progress...", frame, frameButton);
+        }
+
+
+        // 3.4. Show Frame maximized horizontally.
+        /////////////////////////////////////////
+
+        if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_HORIZ)) {
+            System.out.println("Stage 3.4: Frame.MAXIMIZED_HORIZ not supported. Skipping.");
+        } else {        
+            frame.setExtendedState(Frame.MAXIMIZED_HORIZ);
+            
+            test("Stage 3.4 in progress...", frame, frameButton);
+        }
+
+
+        // 3.5. Show Frame iconified.
+        ////////////////////////////
+        
+        if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.ICONIFIED)) {
+            System.out.println("Stage 3.5: Frame.ICONIFIED not supported. Skipping.");
+        } else {
+            frame.setExtendedState(Frame.ICONIFIED);
+            
+            test("Stage 3.5 in progress...", frame, frameButton);
+        }
+
+
+        ///////////////////
+        // 4.1 Show Window.
+        ///////////////////
+        recreateGUI();
+        test("Stage 4.1 in progress...", window, winButton);
+
+
+        // 4.2 Show Dialog.
+        //////////////////
+  
+        test("Stage 4.2 in progress...", dialog, dlgButton);
+
+
+        // 4.3. Show modal Dialog.
+        /////////////////////////
+
+        dialog.setModal(true);
+        test("Stage 4.3 in progress...", dialog, dlgButton, true);
+
+
+        ///////////////////////////////////
+        // 5.1 Show Frame with owned Window.
+        ///////////////////////////////////
+
+        // On Windows, an owned Window will not be focused on its showing
+        // if the owner is not currently active.
+        if ("sun.awt.windows.WToolkit".equals(toolkitClassName)) {
+            Sysout.println("Stage 5.1 - Skiping.");
+        } else {
+            setVisible(ownedWindow, true);
+            setVisible(frame, false); // 'ownedWindow' will be shown along with the owner.
+
+            test("Stage 5.1 in progress...", frame, ownedWindow, ownWinButton, true);
+        }
+
+
+        // 5.2 Show Frame with owned Dialog.
+        ///////////////////////////////////
+
+        setVisible(ownedDialog, true);
+        setVisible(frame2, false); // 'ownedDialog' will be shown along with the owner.
+
+        test("Stage 5.2 in progress...", frame2, ownedDialog, ownDlgButton, true);
+
+
+        ///////////////////////////////////
+        // 6. Show unblocking modal Dialog.
+        ///////////////////////////////////
+
+        if ("sun.awt.motif.MToolkit".equals(toolkitClassName)) {
+            Sysout.println("Stage 6 - Skiping.");
+        } else {
+            Sysout.println("Stage 6 in progress...");
+
+            // ---
+            // Testing the bug of activating invisible modal Dialog (awt_Window::SetAndActivateModalBlocker).
+            // Having some window not excluded from modality, so that it would be blocked.
+            Frame f = new Frame("Aux. Frame");
+            f.setSize(100, 100);
+            setVisible(f, true);
+            // ---
+
+            setVisible(focusedFrame, true);
+            if (!focusOwner.hasFocus()) {
+                Util.clickOnComp(focusOwner, robot);
+                Util.waitForIdle(robot);
+                if (!focusOwner.hasFocus()) {
+                    throw new Error("Test error: the frame couldn't be focused.");
+                }
+            }
+
+            dialog.setModal(true);
+            dialog.setAutoRequestFocus(false);
+            focusedFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
+
+            TestHelper.invokeLaterAndWait(new Runnable() {
+                    public void run() {
+                        dialog.setVisible(true);
+                    }
+                }, robot);
+            
+            if (dialog.isFocused()) {
+                throw new TestFailedException("the unblocking dialog shouldn't gain focus but it did!");
+            }
+            setVisible(dialog, false);
+        }
+
+        Sysout.println("Test passed.");
+    }
+
+    /*
+     * @param msg notifies test stage number
+     * @param showWindow a window to show/test (if ownedWindow == null)
+     * @param ownedWindow an owned window to show/test, or null if showWindow should be tested
+     * @param clickButton a button of the window (owner or owned) expected to be on the top of stack order
+     * @param shouldFocusChange true the test window should gain focus
+     */
+    void test(String msg, final Window showWindow, Window ownedWindow, final Button clickButton, boolean shouldFocusChange) {
+        Window testWindow = (ownedWindow == null ? showWindow : ownedWindow);
+
+        Sysout.println(msg);
+
+        if (showWindow.isVisible()) {
+            showWindow.dispose();
+            Util.waitForIdle(robot);
+        }
+        if (!focusedFrame.isVisible()) {
+            setVisible(focusedFrame, true);
+        }
+        if (!focusOwner.hasFocus()) {
+            Util.clickOnComp(focusOwner, robot);
+            Util.waitForIdle(robot);
+            if (!focusOwner.hasFocus()) {
+                throw new Error("Test error: the frame couldn't be focused.");
+            }
+        }
+
+        //////////////////////////////////////////
+        // Test focus change on showing the window
+        //////////////////////////////////////////
+
+        final Runnable showAction = new Runnable() {
+                public void run() {
+                    showWindow.setAutoRequestFocus(false);
+                    showWindow.setVisible(true);
+                }
+            };
+
+        final Runnable trackerAction = new Runnable() {
+                public void run() {
+                    if (showWindow instanceof Dialog && ((Dialog)showWindow).isModal()) {
+                        TestHelper.invokeLaterAndWait(showAction, robot);
+                    } else {
+                        showAction.run();
+                    }
+                }
+            };
+
+        if (shouldFocusChange) {
+            trackerAction.run();
+            Util.waitForIdle(robot);
+
+            if (!testWindow.isFocused()) {
+                throw new TestFailedException("the window must gain focus but it didn't!");
+            }
+
+        } else if (TestHelper.trackFocusChangeFor(trackerAction, robot)) {
+            throw new TestFailedException("the window shouldn't gain focus but it did!");
+        }
+
+
+        ////////////////////////////////////////////
+        // Test that the window was shown on the top.
+        // Test that it can be focused.
+        ////////////////////////////////////////////
+
+        if (!(testWindow instanceof Frame) ||
+            ((Frame)testWindow).getExtendedState() != Frame.ICONIFIED)
+        {
+            boolean performed = Util.trackActionPerformed(clickButton, new Runnable() {
+                    public void run() {
+                        /*
+                         * If 'showWindow' is not on the top then
+                         * 'focusOwner' button completely overlaps 'clickButton'
+                         * and we won't catch the action.
+                         */
+                        Util.clickOnComp(clickButton, robot);
+                    }
+                }, 1000, false);
+
+            if (!performed) {
+                // In case of loosing ACTION_PERFORMED, try once more.
+                Sysout.println("(ACTION_EVENT was not generated. One more attemp.)");
+                performed = Util.trackActionPerformed(clickButton, new Runnable() {
+                        public void run() {
+                            Util.clickOnComp(clickButton, robot);
+                        }
+                    }, 1000, false);
+
+                if (!performed) {
+                    throw new TestFailedException("the window shown is not on the top!");
+                }
+            }
+        }
+
+        recreateGUI();
+    }
+
+    void test(String msg, final Window showWindow, Button clickButton) {
+        test(msg, showWindow, null, clickButton, false);
+    }
+    void test(String msg, final Window showWindow, Button clickButton, boolean shouldFocusChange) {
+        test(msg, showWindow, null, clickButton, shouldFocusChange);
+    }
+    void test(String msg, final Window showWindow, Window ownedWindow, Button clickButton) {
+        test(msg, showWindow, ownedWindow, clickButton, false);
+    }
+
+    private static void setVisible(Window w, boolean b) {
+        w.setVisible(b);
+        try {
+            Util.waitForIdle(robot);
+        } catch (RuntimeException rte) { // InfiniteLoop
+            rte.printStackTrace();
+        }
+        robot.delay(200);
+    }
+}
+ 
+class TestFailedException extends RuntimeException {
+    TestFailedException(String msg) {
+        super("Test failed: " + msg);
+    }
+}
+ 
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+//        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+//        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+//        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Focus/AutoRequestFocusTest/AutoRequestFocusToFrontTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,571 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+  @test       @(#)AutoRequestFocusToFrontTest.java	1.2 07/05/28
+  @bug       6187066
+  @summary   Tests the Window.autoRequestFocus property for the Window.toFront() method.
+  @author    anton.tarasov: area=awt.focus
+  @library    ../../regtesthelpers
+  @build      Util
+  @run       main AutoRequestFocusToFrontTest
+*/
+ 
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.Applet;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.lang.reflect.InvocationTargetException;
+import test.java.awt.regtesthelpers.Util;
+ 
+public class AutoRequestFocusToFrontTest extends Applet {
+    static boolean haveDelays;
+
+    static Frame auxFrame;
+    static Frame frame;
+    static Button frameButton;
+    static Frame frame2;
+    static Button frameButton2;
+    static Frame frame3;
+    static Button frameButton3;
+    static Window window;
+    static Button winButton;
+    static Dialog dialog;
+    static Button dlgButton;
+    static Window ownedWindow;
+    static Button ownWinButton;
+    static Dialog ownedDialog;
+    static Button ownDlgButton;
+    static Dialog modalDialog;
+    static Button modalDlgButton;
+
+    static String toolkitClassName;
+    static Robot robot = Util.createRobot();
+ 
+    public static void main(String[] args) {
+        
+        if (args.length != 0) {
+            haveDelays = "delay".equals(args[0]) ? true : false;
+        }
+
+        AutoRequestFocusToFrontTest app = new AutoRequestFocusToFrontTest();
+        app.init();
+        app.start();
+    }
+ 
+    public void init() {
+        // Create instructions for the user here, as well as set up
+        // the environment -- set the layout manager, add buttons,
+        // etc.
+        this.setLayout (new BorderLayout ());
+        Sysout.createDialogWithInstructions(new String[]
+            {"This is an automatic test. Simply wait until it is done."
+            });
+        toolkitClassName = Toolkit.getDefaultToolkit().getClass().getName();
+    }
+
+    static void recreateGUI() {
+        if (auxFrame != null) {
+            auxFrame.dispose();
+            frame.dispose();
+            frame2.dispose();
+            frame3.dispose();
+            window.dispose();
+            dialog.dispose();
+            ownedWindow.dispose();
+            ownedDialog.dispose();
+            modalDialog.dispose();
+        }
+
+        auxFrame = new Frame("Auxiliary Frame");
+
+        frame = new Frame("Test Frame");
+        frameButton = new Button("button");
+
+        frame2 = new Frame("Test Frame 2");
+        frameButton2 = new Button("button");
+
+        frame3 = new Frame("Test Frame 3");
+        frameButton3 = new Button("button");
+
+        window = new Window(null);
+        winButton = new Button("button");
+        dialog = new Dialog((Frame)null, "Test Dialog");
+        dlgButton = new Button("button");
+
+        ownedWindow = new Window(frame);
+        ownWinButton = new Button("button");
+
+        ownedDialog = new Dialog(frame2, "Test Owned Dialog");
+        ownDlgButton = new Button("button");
+
+        modalDialog = new Dialog(frame3, "Test Modal Dialog");
+        modalDlgButton = new Button("button");
+
+        auxFrame.setBounds(100, 100, 300, 300);
+
+        frame.setBounds(120, 120, 260, 260);
+        frame.add(frameButton);
+
+        frame2.setBounds(120, 120, 260, 260);
+        frame2.add(frameButton2);
+
+        frame3.setBounds(120, 120, 260, 260);
+        frame3.add(frameButton3);
+
+        window.setBounds(120, 120, 260, 260);
+        window.add(winButton);
+
+        dialog.setBounds(120, 120, 260, 260);
+        dialog.add(dlgButton);
+
+        ownedWindow.setBounds(140, 140, 220, 220);
+        ownedWindow.add(ownWinButton);
+
+        ownedDialog.setBounds(140, 140, 220, 220);
+        ownedDialog.add(ownDlgButton);
+
+        modalDialog.setBounds(140, 140, 220, 220);
+        modalDialog.add(modalDlgButton);
+        modalDialog.setModal(true);
+    }
+ 
+    public void start() {
+        // 1. Simple Frame.
+        //////////////////
+
+        recreateGUI();
+        Test.setWindows(frame, null, null);
+        Test.test("Test stage 1 in progress", frameButton);
+
+
+        // 2. Ownerless Window.
+        //////////////////////
+
+        recreateGUI();
+        Test.setWindows(window, null, null);
+        Test.test("Test stage 2 in progress", winButton);
+
+
+        // 3. Ownerless Dialog.
+        //////////////////////
+
+        recreateGUI();
+        Test.setWindows(dialog, null, null);
+        Test.test("Test stage 3 in progress", dlgButton);
+
+
+        // 4.1. Owner Frame (with owned Window).
+        ///////////////////////////////////////
+
+        recreateGUI();
+        Test.setWindows(frame, null, new Window[] {ownedWindow, frame});
+        Test.test("Test stage 4.1 in progress", ownWinButton);
+
+
+        // 4.2. Owned Window (with owner Frame).
+        ///////////////////////////////////////
+
+        recreateGUI();
+        Test.setWindows(ownedWindow, null, new Window[] {ownedWindow, frame});
+        Test.test("Test stage 4.2 in progress", ownWinButton);
+
+
+        // 5.1. Owner Frame (with owned Dialog).
+        ///////////////////////////////////////
+
+        recreateGUI();
+        Test.setWindows(frame2, null, new Window[] {ownedDialog, frame2});
+        Test.test("Test stage 5.1 in progress", ownDlgButton);
+
+
+        // 5.2. Owned Dialog (with owner Frame).
+        ///////////////////////////////////////
+
+        recreateGUI();
+        Test.setWindows(ownedDialog, null, new Window[] {ownedDialog, frame2});
+        Test.test("Test stage 5.2 in progress", ownDlgButton);
+
+
+        ////////////////////////////////////////////////
+        // 6.1. Owned modal Dialog (with owner Frame).
+        //      Focused frame is excluded from modality.
+        ////////////////////////////////////////////////
+
+        if (!"sun.awt.motif.MToolkit".equals(toolkitClassName)) {
+            recreateGUI();
+            auxFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
+
+            Test.setWindows(modalDialog, modalDialog, new Window[] {modalDialog, frame3});
+            Test.test("Test stage 6.1 in progress", modalDlgButton);
+        }
+
+
+        // 6.2. Owner Frame (with owned modal Dialog).
+        //      Focused frame is excluded from modality.
+        ////////////////////////////////////////////////
+
+        if (!"sun.awt.motif.MToolkit".equals(toolkitClassName)) {
+            recreateGUI();
+            auxFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
+
+            Test.setWindows(frame3, modalDialog, new Window[] {modalDialog, frame3});
+            Test.test("Test stage 6.2 in progress", modalDlgButton, true);
+        }
+
+        ///////////////////////////////////////////////////
+        // 7. Calling setVisible(true) for the shown Frame.
+        ///////////////////////////////////////////////////
+
+        recreateGUI();
+        Test.setWindows(frame, null, null);
+        Test.setTestSetVisible();
+        Test.test("Test stage 7 in progress", frameButton);
+
+
+        Sysout.println("Test passed.");
+    }
+
+    static class Test {
+        static Window testWindow; // a window to move to front with autoRequestFocus set
+        static Window focusWindow; // a window to gain focus
+        static Window[] showWindows; // windows to show, or null if only testWindow should be shown
+
+        static boolean testSetVisible;
+
+        static void setWindows(Window _testWindow, Window _focusWindow, Window[] _showWindows) {
+            testWindow = _testWindow;
+            focusWindow = _focusWindow;
+            showWindows = _showWindows;
+        }
+        static void setTestSetVisible() {
+            testSetVisible = true;
+        }
+
+        /*
+         * @param msg notifies test stage number
+         * @param testButton a button of the window (owner or owned) that is to be on the top of stack order
+         * @param shouldFocusChange true for modal dialogs
+         */
+        static void test(String msg, final Button testButton, boolean shouldFocusChange) {
+            Sysout.println(msg);
+
+            showWindows(testWindow, showWindows, true);
+
+            pause(100);
+
+            /////////////////////////////////////////////////////////
+            // Test that calling toFront() doesn't cause focus change
+            // when 'autoRequestFocus' is false.
+            /////////////////////////////////////////////////////////
+
+            Runnable action = new Runnable() {
+                    public void run() {
+                        testWindow.setAutoRequestFocus(false);
+                        if (testSetVisible) {
+                            setVisible(testWindow, true);
+                        } else {
+                            toFront(testWindow);
+                        }
+                    }
+                };
+
+            if (shouldFocusChange) {
+                action.run();
+                Util.waitForIdle(robot);
+                if (!focusWindow.isFocused()) {
+                    throw new TestFailedException("the window must gain focus on moving to front but it didn't!");
+                }
+            } else if (TestHelper.trackFocusChangeFor(action, robot)) {
+                throw new TestFailedException("the window shouldn't gain focus on moving to front but it did!");
+            }
+
+            pause(100);
+
+            ///////////////////////////////////////////////////////
+            // Test that the window (or its owned window) is on top.
+            ///////////////////////////////////////////////////////
+
+            // The latest versions of Metacity (e.g. 2.16) have problems with moving a window to the front.
+            if (Util.getWMID() != Util.METACITY_WM) {
+
+                boolean performed = Util.trackActionPerformed(testButton, new Runnable() {
+                        public void run() {
+                            Util.clickOnComp(testButton, robot);
+                        }
+                    }, 1000, false);
+
+                if (!performed) {
+                    // For the case when the robot failed to trigger ACTION_EVENT.
+                    Sysout.println("(ACTION_EVENT was not generated. One more attemp.)");
+                    performed = Util.trackActionPerformed(testButton, new Runnable() {
+                            public void run() {
+                                Util.clickOnComp(testButton, robot);
+                            }
+                        }, 1000, false);
+                    if (!performed) {
+                        throw new TestFailedException("the window moved to front is not on the top!");
+                    }
+                }
+            }
+
+            showWindows(testWindow, showWindows, false);
+
+
+            /////////////////////////////////////////////////
+            // Test that calling toFront() focuses the window
+            // when 'autoRequestFocus' is true.
+            /////////////////////////////////////////////////
+
+            // Skip this stage for unfocusable window
+            if (!testWindow.isFocusableWindow()) {
+                return;
+            }
+
+            showWindows(testWindow, showWindows, true);
+
+            pause(100);
+
+            boolean gained = Util.trackWindowGainedFocus(testWindow, new Runnable() {
+                    public void run() {
+                        testWindow.setAutoRequestFocus(true);
+                        if (testSetVisible) {
+                            setVisible(testWindow, true);
+                        } else {
+                            toFront(testWindow);
+                        }
+                    }
+                }, 1000, false);
+
+            // Either the window or its owned window must be focused
+            if (!gained && !testButton.hasFocus()) {
+                throw new TestFailedException("the window should gain focus automatically but it didn't!");
+            }
+        
+            showWindows(testWindow, showWindows, false);
+        }
+
+        static void test(String msg, Button testButton) {
+            test(msg, testButton, false);
+        }
+
+        private static void showWindows(Window win, Window[] wins, final boolean visible) {
+            pause(100);
+
+            if (wins == null) {
+                wins = new Window[] {win}; // operate with 'win'
+            }
+            for (final Window w: wins) {
+                if (visible) {
+                    if ((w instanceof Dialog) && ((Dialog)w).isModal()) {
+                        TestHelper.invokeLaterAndWait(new Runnable() {
+                                public void run() {
+                                    w.setVisible(true);
+                                }
+                            }, robot);
+                    } else {
+                        setVisible(w, true);
+                    }
+                } else {
+                    w.dispose();
+                }
+            }
+            setVisible(auxFrame, visible);
+
+            if (visible) {
+                if (!auxFrame.isFocused()) {
+                    Util.clickOnTitle(auxFrame, robot);
+                    Util.waitForIdle(robot);
+                    if (!auxFrame.isFocused()) {
+                        throw new Error("Test error: the frame couldn't be focused.");
+                    }
+                }
+            }
+        }
+    }
+
+    private static void setVisible(Window w, boolean b) {
+        w.setVisible(b);
+        try {
+            Util.waitForIdle(robot);
+        } catch (RuntimeException rte) { // InfiniteLoop
+            rte.printStackTrace();
+        }
+        robot.delay(200);
+    }
+
+    private static void toFront(Window w) {
+        w.toFront();
+        Util.waitForIdle(robot);
+        robot.delay(200);
+    }
+
+    private static void pause(int msec) {
+        if (haveDelays) {
+            robot.delay(msec);
+        }
+    }
+}
+ 
+class TestFailedException extends RuntimeException {
+    TestFailedException(String msg) {
+        super("Test failed: " + msg);
+    }
+}
+ 
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+//        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+//        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+//        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Focus/AutoRequestFocusTest/TestHelper.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * Util class used for testing RFE 6187066.
+ * @author anton.tarasov
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import test.java.awt.regtesthelpers.Util;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.lang.reflect.InvocationTargetException;
+
+public class TestHelper {
+    private static volatile boolean focusChanged;
+    private static volatile boolean trackFocusChange;
+    private static boolean focusChangeTrackerSet;
+
+    /*
+     * @param action the action to perform
+     * @return if {@code action} caused focus change
+     */
+    public static boolean trackFocusChangeFor(Runnable action, Robot robot) {
+        if (!focusChangeTrackerSet) {
+            setFocusChangeTracker();
+        }
+
+        focusChanged = false;
+        trackFocusChange = true;
+
+        action.run();
+
+        Util.waitForIdle(robot);
+
+        trackFocusChange = false;
+
+        return focusChanged;
+    }
+
+    public static void invokeLaterAndWait(Runnable action, Robot robot) {
+        EventQueue.invokeLater(action);
+        try {
+            EventQueue.invokeAndWait(new Runnable() { // waiting for action
+                    public void run() {}
+                });
+        } catch (InterruptedException ie) {
+        } catch (InvocationTargetException ite) {}
+
+        Util.waitForIdle(robot); // waiting for events
+    }
+
+    private static void setFocusChangeTracker() {
+        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
+                public void eventDispatched(AWTEvent e) {
+                    int id = e.getID();
+                    if (trackFocusChange &&
+                        (id == FocusEvent.FOCUS_GAINED || id == FocusEvent.FOCUS_LOST ||
+                         id == WindowEvent.WINDOW_GAINED_FOCUS || id == WindowEvent.WINDOW_LOST_FOCUS ||
+                         id == WindowEvent.WINDOW_ACTIVATED || id == WindowEvent.WINDOW_DEACTIVATED))
+                    {
+                        System.out.println(e.toString());
+                        focusChanged = true; 
+                    }
+                }
+            }, FocusEvent.FOCUS_EVENT_MASK | WindowEvent.WINDOW_FOCUS_EVENT_MASK | WindowEvent.WINDOW_EVENT_MASK);
+        
+        focusChangeTrackerSet = true;
+    }
+}
--- a/j2se/test/java/awt/Focus/DeiconifiedFrameLoosesFocus/DeiconifiedFrameLoosesFocus.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/java/awt/Focus/DeiconifiedFrameLoosesFocus/DeiconifiedFrameLoosesFocus.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
  */
 
 /*
-  test       @(#)DeiconifiedFrameLoosesFocus.java	1.5 07/05/05
+  test       @(#)DeiconifiedFrameLoosesFocus.java	1.6 07/05/08
   @bug       6480534
   @summary   A Frame changing its state from ICONIFIED to NORMAL should regain focus.
   @author    anton.tarasov@...: area=awt.focus
@@ -50,23 +50,20 @@
         // the environment -- set the layout manager, add buttons,
         // etc.
         this.setLayout (new BorderLayout ());
-        Sysout.createDialogWithInstructions(new String[]
-            {"This is an automatic test. Simply wait until it is done."
-            });
     }
  
     public void start() {
         if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.ICONIFIED) ||
             !Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.NORMAL))
         {
-            Sysout.println("Frame.ICONIFIED or Frame.NORMAL state is unsupported.");
+            System.out.println("Frame.ICONIFIED or Frame.NORMAL state is unsupported.");
             return;
         }
 
         frame.setSize(100, 100);
 
         frame.setVisible(true);
-        
+
         Util.waitForIdle(robot);
 
         if (!frame.isFocused()) {
@@ -79,7 +76,7 @@
         }
 
         test();
-        Sysout.println("Test passed.");
+        System.out.println("Test passed.");
     }
 
     void test() {
@@ -103,139 +100,3 @@
     }
 }
  
-/****************************************************
- Standard Test Machinery
- DO NOT modify anything below -- it's a standard 
-  chunk of code whose purpose is to make user 
-  interaction uniform, and thereby make it simpler
-  to read and understand someone else's test.
- ****************************************************/
-
-/**
- This is part of the standard test machinery.
- It creates a dialog (with the instructions), and is the interface
-  for sending text messages to the user.
- To print the instructions, send an array of strings to Sysout.createDialog
-  WithInstructions method.  Put one line of instructions per array entry.
- To display a message for the tester to see, simply call Sysout.println
-  with the string to be displayed.
- This mimics System.out.println but works within the test harness as well 
-  as standalone.
- */
-
-class Sysout 
-{ 
-    static TestDialog dialog;
-
-    public static void createDialogWithInstructions( String[] instructions )
-    {
-        dialog = new TestDialog( new Frame(), "Instructions" );
-        dialog.printInstructions( instructions );
-        dialog.setVisible(true);
-        println( "Any messages for the tester will display here." );
-    }
-   
-    public static void createDialog( )
-    {
-        dialog = new TestDialog( new Frame(), "Instructions" );
-        String[] defInstr = { "Instructions will appear here. ", "" } ;
-        dialog.printInstructions( defInstr );
-//        dialog.setVisible(true);
-        println( "Any messages for the tester will display here." );
-    }
-   
-      
-    public static void printInstructions( String[] instructions )
-    {
-        dialog.printInstructions( instructions );
-    }
-
-
-    public static void println( String messageIn )
-    {
-        dialog.displayMessage( messageIn );
-    }
-
-}// Sysout  class
-
-/**
-  This is part of the standard test machinery.  It provides a place for the
-   test instructions to be displayed, and a place for interactive messages
-   to the user to be displayed.
-  To have the test instructions displayed, see Sysout.
-  To have a message to the user be displayed, see Sysout.
-  Do not call anything in this dialog directly.
-  */
-class TestDialog extends Dialog
-{
-
-    TextArea instructionsText;
-    TextArea messageText;
-    int maxStringLength = 80;
-   
-    //DO NOT call this directly, go through Sysout
-    public TestDialog( Frame frame, String name ) 
-    {
-        super( frame, name );
-        int scrollBoth = TextArea.SCROLLBARS_BOTH;
-        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
-        add( "North", instructionsText );
-      
-        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
-        add("Center", messageText);
-      
-        pack();
-      
-//        setVisible(true);
-    }// TestDialog()
-
-    //DO NOT call this directly, go through Sysout
-    public void printInstructions( String[] instructions )
-    {
-        //Clear out any current instructions
-        instructionsText.setText( "" );
-
-        //Go down array of instruction strings
-
-        String printStr, remainingStr;
-        for( int i=0; i < instructions.length; i++ )
-        { 
-            //chop up each into pieces maxSringLength long
-            remainingStr = instructions[ i ];
-            while( remainingStr.length() > 0 )
-            {
-                //if longer than max then chop off first max chars to print
-                if( remainingStr.length() >= maxStringLength )
-                {
-                    //Try to chop on a word boundary
-                    int posOfSpace = remainingStr.
-                        lastIndexOf( ' ', maxStringLength - 1 );
-               
-                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
-               
-                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
-                    remainingStr = remainingStr.substring( posOfSpace + 1 );
-                }
-                //else just print
-                else 
-                { 
-                    printStr = remainingStr;
-                    remainingStr = "";
-                }
-            
-                instructionsText.append( printStr + "\n" );
-            
-            }// while
-         
-        }// for
-      
-    }//printInstructions()
-
-    //DO NOT call this directly, go through Sysout
-    public void displayMessage( String messageIn )
-    {
-        messageText.append( messageIn + "\n" );
-        System.out.println(messageIn);
-    }  
-   
-}// TestDialog  class
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Focus/FocusEmbeddedFrameTest/FocusEmbeddedFrameTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+  @test       @(#)FocusEmbeddedFrameTest.java	1.2 07/05/28
+  @bug       6516675
+  @summary   Tests that EmbeddedFrame can be focused.
+  @author    anton.tarasov: area=awt-focus
+  @library   ../../regtesthelpers
+  @build     Util
+  @run       main FocusEmbeddedFrameTest
+*/
+ 
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.Applet;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.lang.reflect.InvocationTargetException;
+import test.java.awt.regtesthelpers.Util;
+ 
+public class FocusEmbeddedFrameTest extends Applet {
+    static Frame embedder = new Frame("Embedder");
+    static Frame ef = null;
+    static volatile boolean passed;
+
+    Robot robot;
+ 
+    public static void main(String[] args) {
+        FocusEmbeddedFrameTest app = new FocusEmbeddedFrameTest();
+        app.init();
+        app.start();
+    }
+ 
+    public void init() {
+        robot = Util.createRobot(); 
+    }
+ 
+    public void start() {
+
+        if (!"sun.awt.windows.WToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName())) {
+            System.out.println("The test is for WToolkit only!");
+            return;
+        }
+
+        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
+                public void eventDispatched(AWTEvent e) {
+                   System.err.println("--> " + e);
+                }
+            }, FocusEvent.FOCUS_EVENT_MASK | WindowEvent.WINDOW_EVENT_MASK);
+
+        embedder.addNotify();
+
+        try {
+            ef = Util.createEmbeddedFrame(embedder);
+        } catch (Throwable t) {
+            t.printStackTrace();
+            throw new Error("Test error: couldn't create an EmbeddedFrame!");
+        }
+
+        ef.setSize(100, 100);
+        ef.setBackground(Color.blue);
+
+        embedder.addFocusListener(new FocusAdapter() {
+                public void focusGained(FocusEvent e) {
+                    FocusEmbeddedFrameTest.ef.requestFocus();
+                }
+            });
+
+        ef.addFocusListener(new FocusAdapter() {
+                public void focusGained(FocusEvent e) {
+                    passed = true;
+                }
+            });
+
+        embedder.setSize(150, 150);
+        embedder.setVisible(true);
+
+        Util.waitForIdle(robot);
+
+        if (!passed) {
+            throw new TestFailedException("the EmbeddedFrame didn't get focus on request!");
+        }
+
+        System.out.println("Test passed.");
+    }
+}
+ 
+class TestFailedException extends RuntimeException {
+    TestFailedException(String msg) {
+        super("Test failed: " + msg);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Focus/FrameMinimizeTest/FrameMinimizeTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  @test @(#)FrameMinimizeTest.java	1.2 07/05/28
+  @bug 6502358
+  @summary focus is not restored after programmatic iconification and restoring
+  @author : area=awt.focus
+  @library ../../regtesthelpers
+  @build Util
+  @run main FrameMinimizeTest
+*/
+
+import java.awt.Button;
+import java.awt.Frame;
+
+import test.java.awt.regtesthelpers.Util;
+
+public class FrameMinimizeTest {
+    public static void main(String args[]) throws Exception {
+        Frame frame = new Frame("Frame Minimize Test");
+        Button b = new Button("Focus ownder");
+        frame.add("South", b);
+        frame.pack();
+        frame.setVisible(true);
+        Util.waitForIdle(null);
+        if (!b.hasFocus()) {
+            throw new RuntimeException("button is not a focus owner after showing :(");
+        }
+        frame.setExtendedState(Frame.ICONIFIED);
+        Util.waitForIdle(null);
+        frame.setExtendedState(Frame.NORMAL);
+        Util.waitForIdle(null);
+        if (!b.hasFocus()) {
+            throw new RuntimeException("button is not a focus owner after restoring :(");
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/FontClass/BigMetrics.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,45 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test @(#)BigMetrics.java	1.2 03/21/07
+ * @bug 6533413
+ * @summary Test no crashing getting metrics using large font.
+ * @run main BigMetrics
+ */
+
+import java.awt.*;
+
+public class BigMetrics {
+
+  public static void main(String args[]) {
+    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+    Font[] fonts = ge.getAllFonts();
+    Toolkit tk = Toolkit.getDefaultToolkit();
+    for (int i=0; i<fonts.length;i++) {
+       Font f = fonts[i].deriveFont(240f);
+       FontMetrics fm = tk.getFontMetrics(f);
+       int sw = fm.stringWidth("{}[]Hello world!");
+    } 
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Frame/InitialMaximizedTest/InitialMaximizedTest.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,20 @@
+<html>
+<!--  
+  @test @(#)InitialMaximizedTest.html	1.2 07/05/25
+  @bug 4464714 6365898
+  @summary Frames cannot be shown initially maximized
+  @author Valeriy Ushakov: area=toplevel
+  @run applet/manual=yesno InitialMaximizedTest.html
+  -->
+<head>
+<title> InitialMaximizedTest </title>
+</head>
+<body>
+
+<h1>InitialMaximizedTest<br>Bug ID: 4464714</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="InitialMaximizedTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Frame/InitialMaximizedTest/InitialMaximizedTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  test @(#)InitialMaximizedTest.java	1.3 07/05/25
+  @bug 4464714 6365898
+  @summary Frames cannot be shown initially maximized
+  @author Valeriy Ushakov: area=toplevel
+  @run applet/manual=yesno InitialMaximizedTest.html
+*/
+
+
+/**
+ * InitialMaximizedTest.java
+ *
+ * summary:
+ */
+
+import java.applet.Applet;
+import java.awt.*;
+
+
+public class InitialMaximizedTest extends Applet
+{
+    Frame f;
+
+    public void init() 
+    {
+        this.setLayout (new BorderLayout ());
+
+        String[] instructions = 
+        {
+            "This test creates a frame that is initially maximized.",
+            "Press PASS if frame is shown initially maximized, else press FAIL"
+        };
+        Sysout.createDialogWithInstructions( instructions );
+
+    }//End  init()
+
+    public void start ()
+    {
+        //Get things going.  Request focus, set size, et cetera
+        setSize (200,200);
+        setVisible(true);
+        validate();
+
+        f = new Frame("The frame SHOULD be shown MAXIMIZED");
+        f.setSize(300, 300);
+        f.setLocation(50, 50);
+        f.setExtendedState(Frame.MAXIMIZED_BOTH);
+        f.setVisible(true);
+    }// start()
+
+}// class InitialMaximizedTest
+
+/* Place other classes related to the test after this line */
+
+
+
+
+  
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    private static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class    
+  
--- a/j2se/test/java/awt/Frame/LayoutOnMaximizeTest/LayoutOnMaximizeTest.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/java/awt/Frame/LayoutOnMaximizeTest/LayoutOnMaximizeTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
  */
 
 /* 
-  @test @(#)LayoutOnMaximizeTest.java	1.6 07/05/05
+  @test @(#)LayoutOnMaximizeTest.java	1.7 07/05/08
   @bug 6355340
   @summary Test correctness of laying out the contents of a frame on maximize
   @author anthony.petrov@...: area=awt.toplevel
@@ -56,17 +56,6 @@
 
 
     private static void init() {
-        String s = Toolkit.getDefaultToolkit().getClass().getName();
-        
-        // This is Windows-only test
-        if (!s.contains("WToolkit")) { 
-            pass(); 
-        }
-
-        // MAXIMIZED_BOTH is known to be supported on MS Windows.
-        if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
-            fail("Toolkit doesn't support the Frame.MAXIMIZED_BOTH extended state.");
-        }
         
         //*** Create instructions for the user here ***
       
@@ -83,6 +72,17 @@
         Sysout.println("NOTE: The test is known to work correctly with English MS Windows only.");
 
 
+        String s = Toolkit.getDefaultToolkit().getClass().getName();
+        
+        // This is Windows-only test
+        if (!s.contains("WToolkit")) { 
+            pass(); 
+        }
+
+        // MAXIMIZED_BOTH is known to be supported on MS Windows.
+        if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
+            fail("Toolkit doesn't support the Frame.MAXIMIZED_BOTH extended state.");
+        }
 
         final Frame frame = new Frame("Test Frame");
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Frame/ShownOnPack/ShownOnPack.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,20 @@
+<html>
+<!--
+  @test @(#)ShownOnPack.html	1.2 07/05/22
+  @bug 6525850
+  @summary Iconified frame gets shown after pack()
+  @author anthony.petrov@...: area=awt.toplevel
+  @run applet/manual=yesno ShownOnPack.html
+  -->
+<head>
+<title> ShownOnPack </title>
+</head>
+<body>
+
+<h1>ShownOnPack<br>Bug ID: 6525850</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="ShownOnPack.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Frame/ShownOnPack/ShownOnPack.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  test @(#)ShownOnPack.java	1.2 07/05/22
+  @bug 6525850
+  @summary Iconified frame gets shown after pack()
+  @author anthony.petrov@...: area=awt.toplevel
+  @run applet/manual=yesno ShownOnPack.html
+*/
+
+
+/**
+ * ShownOnPack.java
+ *
+ * summary:
+ */
+
+import java.applet.Applet;
+import java.awt.*;
+
+public class ShownOnPack extends Applet
+{
+    //Declare things used in the test, like buttons and labels here
+    Frame f;
+
+    public void init() 
+    {
+        //Create instructions for the user here, as well as set up 
+        // the environment -- set the layout manager, add buttons,
+        // etc.
+        this.setLayout (new BorderLayout ());
+
+        String[] instructions = 
+        {
+            "This test creates an invisible and iconified frame that should not become visible.",
+            "If you observe the window titled 'Should NOT BE SHOWN' in the taskbar, press FAIL,",
+            "else press PASS"
+        };
+        Sysout.createDialogWithInstructions( instructions );
+
+    }//End  init()
+
+    public void start ()
+    {
+        //Get things going.  Request focus, set size, et cetera
+        setSize (200,200);
+        setVisible(true);
+        validate();
+
+        //What would normally go into main() will probably go here.
+        //Use System.out.println for diagnostic messages that you want
+        // to read after the test is done.
+        //Use Sysout.println for messages you want the tester to read.
+        f = new Frame("Should NOT BE SHOWN");
+        f.setExtendedState(Frame.ICONIFIED);
+        f.pack();
+    }// start()
+
+    //The rest of this class is the actions which perform the test...
+
+    //Use Sysout.println to communicate with the user NOT System.out!!
+    //Sysout.println ("Something Happened!");
+
+}// class ShownOnPack
+
+/* Place other classes related to the test after this line */
+
+
+
+
+  
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    private static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class    
+  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Graphics/DrawImageBG/SystemBgColorTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,98 @@
+/*
+ * @test    @(#)SystemBgColorTest.java	1.1 07/04/02
+ * @bug     4614845
+ * @summary Test drawImage(bgcolor) gets correct RGB from SystemColor objects.
+ * @run     main SystemBgColorTest
+ */
+
+import java.awt.*;
+import java.awt.image.*;
+
+public class SystemBgColorTest {
+    public static final int TESTW = 10;
+    public static final int TESTH = 10;
+
+    static SystemColor systemColorObjects [] = {
+        SystemColor.desktop,
+        SystemColor.activeCaption,
+        SystemColor.activeCaptionText,
+        SystemColor.activeCaptionBorder,
+        SystemColor.inactiveCaption,
+        SystemColor.inactiveCaptionText,
+        SystemColor.inactiveCaptionBorder,
+        SystemColor.window,
+        SystemColor.windowBorder,
+        SystemColor.windowText,
+        SystemColor.menu,
+        SystemColor.menuText,
+        SystemColor.text,
+        SystemColor.textText,
+        SystemColor.textHighlight,
+        SystemColor.textHighlightText,
+        SystemColor.textInactiveText,
+        SystemColor.control,
+        SystemColor.controlText,
+        SystemColor.controlHighlight,
+        SystemColor.controlLtHighlight,
+        SystemColor.controlShadow,
+        SystemColor.controlDkShadow,
+        SystemColor.scrollbar,
+        SystemColor.info,
+        SystemColor.infoText
+    };
+
+    static boolean counterrors;
+    static int errcount;
+
+    public static void error(String problem) {
+        if (counterrors) {
+            errcount++;
+        } else {
+            throw new RuntimeException(problem);
+        }
+    }
+
+    public static void main(String argv[]) {
+        counterrors = (argv.length > 0);
+        test(BufferedImage.TYPE_INT_ARGB);
+        test(BufferedImage.TYPE_INT_RGB);
+        if (errcount > 0) {
+            throw new RuntimeException(errcount+" errors");
+        }
+        System.exit(0); // For 1.3 and earlier VMs...
+    }
+
+    static int cmap[] = {
+        0x00000000,
+        0xffffffff,
+    };
+
+    public static void test(int dsttype) {
+        BufferedImage src =
+            new BufferedImage(TESTW, TESTH, BufferedImage.TYPE_INT_ARGB);
+        test(src, dsttype);
+        IndexColorModel icm = new IndexColorModel(8, 2, cmap, 0, true, 0,
+                                                  DataBuffer.TYPE_BYTE);
+        src = new BufferedImage(TESTW, TESTH,
+                                BufferedImage.TYPE_BYTE_INDEXED, icm);
+        test(src, dsttype);
+    }
+
+    public static void test(Image src, int dsttype) {
+        BufferedImage dst =
+            new BufferedImage(TESTW, TESTH, dsttype);
+        for (int i = 0; i < systemColorObjects.length; i++) {
+            test(src, dst, systemColorObjects[i]);
+        }
+    }
+
+    public static void test(Image src, BufferedImage dst, Color bg) {
+        Graphics g = dst.getGraphics();
+        g.setColor(Color.white);
+        g.fillRect(0, 0, TESTW, TESTH);
+        g.drawImage(src, 0, 0, bg, null);
+        if (dst.getRGB(0, 0) != bg.getRGB()) {
+            error("bad bg pixel for: "+bg);
+        }
+    }
+}
--- a/j2se/test/java/awt/List/ActionAfterRemove/ActionAfterRemove.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/java/awt/List/ActionAfterRemove/ActionAfterRemove.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,10 +22,10 @@
  */
 
 /* 
-  @test 1.5 07/05/05
+  @test 1.6 07/05/16
   @bug 6426186
   @summary XToolkit: List throws ArrayIndexOutOfBoundsException on double clicking when the List is empty
-  @author Dmitry.Cherepanov@... area=awt.list
+  @author Dmitry Cherepanov area=awt-list
   @library ../../regtesthelpers
   @build Util
   @run main ActionAfterRemove
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/List/SetFontTest/SetFontTest.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,20 @@
+<html>
+<!--  
+  @test @(#)SetFontTest.html	1.2 07/05/16  1.2, 05/16/07
+  @bug 5010944 6248072
+  @summary List's rows overlap one another
+  @author Dmitry Cherepanov area=awt-list
+  @run applet/manual=yesno SetFontTest.html
+  -->
+<head>
+<title> SetFontTest </title>
+</head>
+<body>
+
+<h1>SetFontTest<br>Bug ID: 5010944</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="SetFontTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/List/SetFontTest/SetFontTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  test @(#)SetFontTest.java	1.2 07/05/14  1.2, 05/14/07
+  @bug 5010944 6248072
+  @summary List's rows overlap one another
+  @author Dmitry Cherepanov area=awt-list
+  @run applet/manual=yesno SetFontTest.html
+*/
+
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.*;
+
+public class SetFontTest extends Applet
+{
+    List list = new List(8, false);
+    Button button1 = new Button("Enlarge font");
+    Button button2 = new Button("Change mode");
+
+    public void init() 
+    {
+        list.add("111");
+        list.add("222");
+        list.add("333");
+        list.add("444");
+        this.add(list);
+
+        this.add(button1);
+        this.add(button2);
+
+        button1.addActionListener(
+            new ActionListener(){
+                public void actionPerformed(ActionEvent ae){
+                    list.setFont( new Font( "SansSerif", Font.PLAIN, 30 ) );
+                    list.repaint();
+                }
+            });
+
+        button2.addActionListener(
+            new ActionListener(){
+                public void actionPerformed(ActionEvent ae){
+                    list.setMultipleMode(true);
+                }
+            });
+
+        this.setLayout (new FlowLayout ());
+
+        String[] instructions = 
+        {
+            "1) Click on the 'Enlarge font' button to enlarge font of the list.",
+            "2) If you see that the rows of the list overlap one another "+
+            "then the test failed. Otherwise, goto to the step 3.",
+            "3) Click on the 'Change mode' button to set multiple-selection mode.",
+            "4) If you see that the rows of the list overlap one another "+
+            "then the test failed. Otherwise, the test passed."
+        };
+        Sysout.createDialogWithInstructions( instructions );
+
+    }//End  init()
+
+    public void start ()
+    {
+
+        setSize (200,200);
+        setVisible(true);
+        validate();
+
+    }// start()
+}
+
+/* Place other classes related to the test after this line */
+
+
+
+
+  
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    private static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class    
+  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/List/SingleModeDeselect/SingleModeDeselect.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  @test 1.2 07/05/28
+  @bug 6248040
+  @summary List.deselect() de-selects the currently selected item regardless of the index, win32
+  @author Dmitry Cherepanov area=awt.list
+  @run main SingleModeDeselect
+*/
+
+import java.awt.*;
+import sun.awt.SunToolkit;
+
+public class SingleModeDeselect
+{
+    public static final void main(String args[]) 
+    {
+        final Frame frame = new Frame();
+        final List list = new List();
+
+        list.add(" item 0 ");
+        list.add(" item 1 ");
+
+        frame.add(list);
+        frame.setLayout(new FlowLayout());
+        frame.setBounds(100,100,300,300);
+        frame.setVisible(true);
+
+        list.select(0);
+        list.deselect(1);
+
+        ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
+
+        if (list.getSelectedIndex() != 0){
+            throw new RuntimeException("Test failed: List.getSelectedIndex() returns "+list.getSelectedIndex());
+        }
+
+    }//End  init()
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Modal/NpeOnClose/NpeOnCloseTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+  @test 1.2 07/05/28
+  @bug 6547881
+  @summary NPE when closing modal dialog
+  @author Oleg Sukhodolsky: area=awt.modal
+  @library ../../regtesthelpers
+  @build Util
+  @run main NpeOnCloseTest
+*/
+import java.awt.Dialog;
+import java.awt.EventQueue;
+import java.awt.Frame;
+
+import java.lang.reflect.InvocationTargetException;
+
+import test.java.awt.regtesthelpers.Util;
+
+public class NpeOnCloseTest {
+    public static void main(String[] args)
+    {
+        Frame frame1 = new Frame("frame 1");
+        frame1.setBounds(0, 0, 100, 100);
+        frame1.setVisible(true);
+        Util.waitForIdle(null);
+
+        Frame frame2 = new Frame("frame 2");
+        frame2.setBounds(150, 0, 100, 100);
+        frame2.setVisible(true);
+        Util.waitForIdle(null);
+
+        Frame frame3 = new Frame("frame 3");
+        final Dialog dialog = new Dialog(frame3, "dialog", true);
+        dialog.setBounds(300, 0, 100, 100);
+        EventQueue.invokeLater(new Runnable() {
+                public void run() {
+                    dialog.setVisible(true);
+                }
+            });
+        try {
+            EventQueue.invokeAndWait(new Runnable() { public void run() {} });
+            Util.waitForIdle(null);
+            EventQueue.invokeAndWait(new Runnable() {
+                    public void run() {
+                        dialog.dispose();
+                    }
+                });
+        }
+        catch (InterruptedException ie) {
+            throw new RuntimeException(ie);
+        }
+        catch (InvocationTargetException ite) {
+            throw new RuntimeException(ite);
+        }
+
+        frame1.dispose();
+        frame2.dispose();
+        frame3.dispose();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/PrintJob/SaveDialogTitleTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4851363
+ * @summary Tests the save to file dialog has a title
+ * @run main/manual=yesno/othervm SaveDialogTitleTest
+ */
+
+import java.awt.*;
+
+public class SaveDialogTitleTest {
+
+    public static void main(String args[]) {
+    
+        System.out.print("Once the dialog appears, press OK and the ");
+        System.out.print("Save to File dialog should appear and it ");
+        System.out.println("must have a window title else the test fails.");
+        Toolkit tk = Toolkit.getDefaultToolkit();
+        JobAttributes jobAttributes = new JobAttributes();
+        jobAttributes.setDestination(JobAttributes.DestinationType.FILE);
+        PrintJob printJob =
+            tk.getPrintJob(new Frame(), "Save Title Test",
+                           jobAttributes, null);
+        if (printJob != null) { // in case user cancels.
+          printJob.end();
+        }
+        System.exit(0); // safe because use 'othervm'
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/PrintJob/Text/StringWidth.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.*;
+import java.util.Properties;
+import sun.awt.*;
+
+public class StringWidth extends Frame {
+
+  public StringWidth() {
+    Font plain = new Font("Dialog", Font.PLAIN, 10);
+    Font bold = new Font("Dialog", Font.BOLD, 10);
+    Properties props = new Properties();
+    int x, y;
+
+    // we must have visible Frame context for PrintDialog in Solaris
+    setSize(400, 300);
+    setVisible(true);
+
+    PrintJob pj = getToolkit().getPrintJob(this, "", props);
+    if (pj == null) {
+	return;
+    }
+    Graphics  pg = pj.getGraphics();
+
+
+    String test = "Hello World!";
+
+    FontMetrics plainFm = pg.getFontMetrics(plain);
+    FontMetrics boldFm = pg.getFontMetrics(bold);
+    Dimension size = pj.getPageDimension();
+   
+    // now right justify on the printed page
+    int center = size.width/2;
+    y = 150;
+    x = center - plainFm.stringWidth(test);
+    pg.setFont(plain);
+    pg.drawString(test, x-1, y);
+
+    pg.dispose();
+    pj.end();
+    setVisible(false);
+    System.exit(0);
+  }
+
+  public static void main(String[] args) {
+    new StringWidth();
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/PrintJob/Text/stringwidth.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,43 @@
+#!/bin/ksh -p
+#
+#   @test      
+#   @bug        4692562
+#   @summary    Requirement: Windows with printer installed.  It should print with text "Hello World".
+#   @compile StringWidth.java
+#   @run shell/manual stringwidth.sh
+#
+OS=`uname`
+
+status=1
+checkstatus()
+ {
+  status=$?
+  if [ $status -ne "0" ]; then
+    exit "$status"
+  fi
+ }
+
+# pick up the compiled class files.
+if [ -z "${TESTCLASSES}" ]; then
+  CP="."
+else
+  CP="${TESTCLASSES}"
+fi
+
+
+if [ $OS = SunOS -o $OS = Linux ]
+then
+    exit 0
+fi
+# Windows
+
+if [ -z "${TESTJAVA}" ] ; then
+   JAVA_HOME=../../../../../../build/windows-i586
+else
+   JAVA_HOME=$TESTJAVA
+fi
+
+    $JAVA_HOME/bin/java -cp "${CP}" StringWidth
+    checkstatus
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/TextArea/TextAreaCursorTest/HoveringAndDraggingTest.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,20 @@
+<html>
+<!--  
+  @test @(#)HoveringAndDraggingTest.html	1.1 07/05/23  1.1, 05/23/07
+  @bug 6497109
+  @summary Mouse cursor icons for TextArea should be correct in case of hovering or dragging mouse over different subcomponents.
+  @author Konstantin Voloshin: area=awt.TextArea
+  @run applet/manual=yesno HoveringAndDraggingTest.html
+  -->
+<head>
+<title> HoveringAndDraggingTest </title>
+</head>
+<body>
+
+<h1>HoveringAndDraggingTest<br>Bug ID: 6497109</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="HoveringAndDraggingTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/TextArea/TextAreaCursorTest/HoveringAndDraggingTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  test @(#)HoveringAndDraggingTest.java	1.1 07/05/23  1.1, 05/23/07
+  @bug 6497109
+  @summary Mouse cursor icons for TextArea should be correct in case of hovering or dragging mouse over different subcomponents.
+  @author Konstantin Voloshin: area=awt.TextArea
+  @run applet/manual=yesno HoveringAndDraggingTest.html
+*/
+
+/**
+ * HoveringAndDraggingTest.java
+ *
+ * summary: Mouse cursor icons for TextArea should be correct in case
+ *   of hovering or dragging mouse over different subcomponents.
+ */
+
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.GridLayout;
+import java.awt.TextArea;
+import java.awt.Dialog;
+
+public class HoveringAndDraggingTest extends java.applet.Applet {
+    public void start() {
+        String[] instructions = new String[] {
+            "1. Notice components in test window: main-panel, box-for-text,"
+                +" 2 scroll-sliders, and 4 scroll-buttons.",
+            "2. Hover mouse over box-for-text."
+                +" Make sure, that mouse cursor is TextCursor (a.k.a. \"beam\").",
+            "3. Hover mouse over each of components (see item 1), except for box-for-text."
+                +" Make sure, that cursor is DefaultCursor (arrow).",
+            "4. Drag mouse (using any mouse button) from box-for-text to every"
+                +" component in item 1, and also outside application window."
+                +" Make sure, that cursor remains TextCursor while mouse button is pressed.",
+            "5. Repeat item 4 for each other component in item 1, except for box-for-text,"
+                +" _but_ now make sure that cursor is DefaultCursor.",
+            "6. If cursor behaves as described in items 2-3-4-5, then test passed; otherwise it failed."
+        };
+        Sysout.createDialogWithInstructions( instructions );
+
+        Panel panel = new Panel();
+        panel.setLayout( new GridLayout(3,3) );
+
+        for( int y=0; y<3; ++y ) {
+            for( int x=0; x<3; ++x ) {
+                if( x==1 && y==1 ) {
+                    panel.add( new TextArea( bigString() ) );
+                } else {
+                    panel.add( new Panel() );
+                }
+            }
+        }
+
+        Frame frame = new Frame( "TextArea cursor icon test" );
+        frame.setSize( 300, 300 );
+        frame.add( panel );
+        frame.setVisible( true );
+    }
+
+    static String bigString() {
+        String s = "";
+        for( int lines=0; ; ++lines ) {
+            for( int symbols=0; symbols<100; ++symbols ) {
+                s += "0";
+            }
+            if( lines<50 ) {
+                s += "\n";
+            } else {
+                break;
+            }
+        }
+        return s;
+    }
+}
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    private static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/TextArea/UsingWithMouse/SelectionAutoscrollTest.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,22 @@
+<html>
+<!--  
+  @test 1.1 07/05/23
+  @bug 6497109
+  @summary TextArea must have selection expanding, and also be autoscrolled, if mouse is dragged from inside.
+  @author Konstantin Voloshin: area=TextArea
+  @library ../../regtesthelpers
+  @build Util
+  @run applet SelectionAutoscrollTest.html
+  -->
+<head>
+<title>  </title>
+</head>
+<body>
+
+<h1>SelectionAutoscrollTest<br>Bug ID: 6497109</h1>
+
+<p> This is an AUTOMATIC test, simply wait for completion </p>
+
+<APPLET CODE="SelectionAutoscrollTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/TextArea/UsingWithMouse/SelectionAutoscrollTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  test 1.1 07/05/23
+  @bug 6497109
+  @summary TextArea must have selection expanding, and also be autoscrolled, if mouse is dragged from inside.
+  @author Konstantin Voloshin: area=TextArea
+  @run applet SelectionAutoscrollTest.html
+*/
+
+/**
+ * SelectionAutoscrollTest.java
+ *
+ * summary: TextArea should be auto-scrolled and text should be selected to
+ *   the end, if mouse is dragged from inside box-for-text to outside it, and
+ *   is hold pressed there.
+ */
+
+
+import java.applet.Applet;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.GridLayout;
+import java.awt.TextArea;
+
+import java.awt.Point;
+import java.awt.Dimension;
+import java.awt.event.MouseEvent;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import test.java.awt.regtesthelpers.Util;
+
+
+public class SelectionAutoscrollTest extends Applet {
+    TextArea textArea;
+    Robot robot;
+    final int desiredSelectionEnd = ('z'-'a'+1)*2;  // 52
+
+    public void start () {
+        createObjects();
+        manipulateMouse();
+        checkResults();
+    }
+
+    void createObjects() {
+        textArea = new TextArea( bigString() );
+        robot = Util.createRobot();
+
+        Panel panel = new Panel();
+        panel.setLayout( new GridLayout(3,3) );
+
+        for( int y=0; y<3; ++y ) {
+            for( int x=0; x<3; ++x ) {
+                if( x==1 && y==1 ) {
+                    panel.add( textArea );
+                } else {
+                    panel.add( new Panel() );
+                }
+            }
+        }
+
+        Frame frame = new Frame( "TextArea cursor icon test" );
+        frame.setSize( 300, 300 );
+        frame.add( panel );
+        frame.setVisible( true );
+    }
+
+    static String bigString() {
+        String s = "";
+        for( char c='a'; c<='z'; ++c ) {
+            s += c+"\n";
+        }
+        return s;
+    }
+
+    void manipulateMouse() {
+        moveMouseToCenterOfTextArea();
+        Util.waitForIdle( robot );
+
+        robot.mousePress( MouseEvent.BUTTON1_MASK );
+        Util.waitForIdle( robot );
+
+        for( int tremble=0; tremble < desiredSelectionEnd; ++tremble ) {
+            // Mouse is moved repeatedly here (with conservatively chosen
+            // ammount of times), to give some time/chance for TextArea to
+            // autoscroll and for text-selection to expand to the end.
+            // This is because:
+            // - On Windows,
+            //   autoscrolling and selection-expansion happens only once per
+            //   each mouse-dragged event received, and only for some ammount,
+            //   not to the end. So, we have to drag mouse repeatedly.
+            // - on X,
+            //   only 1 mouse-dragged event is required for autoscrolling/
+            //   selection-expanding to commence. Once commenced, it will
+            //   continue to the end of text (provided that mouse-button is
+            //   hold pressed), but it may take hardly predictable ammount of
+            //   time. However, repeatedly dragging mouse seems perfectly help
+            //   here, instead of having to use 'Thread.sleep( ??? )'.
+            // Note: It's required here to move mouse 2 times to receive the
+            //   1-st drag-event. After 1-st movement, only mouse-exited event
+            //   will be generated. If mouse was released after first movement
+            //   here, we would even get mouse-clicked event (at least for now,
+            //   and this is probably a bug). But, starting with 2nd iteration,
+            //   all events received will be mouse-dragged events.
+
+            moveMouseBelowTextArea( tremble%2!=0 );
+            Util.waitForIdle( robot );
+        }
+
+        robot.mouseRelease( MouseEvent.BUTTON1_MASK );
+        Util.waitForIdle( robot );
+    }
+
+    void moveMouseToCenterOfTextArea() {
+        Dimension d = textArea.getSize();
+        Point l = textArea.getLocationOnScreen();
+        robot.mouseMove( (int)(l.x+d.width*.5), (int)(l.y+d.height*.5) );
+    }
+
+    void moveMouseBelowTextArea( boolean shift ) {
+        Dimension d = textArea.getSize();
+        Point l = textArea.getLocationOnScreen();
+        int y = (int)(l.y+d.height*1.5);
+        if( shift ) y+=15;
+        robot.mouseMove( (int)(l.x+d.width*.5), y );
+    }
+
+    void checkResults() {
+        //try { Thread.sleep( 30*1000 ); }
+        //catch( Exception e ) { throw new RuntimeException( e ); }
+
+        final int currentSelectionEnd = textArea.getSelectionEnd();
+
+        System.out.println(
+            "TEST: Selection range after test is: ( "
+            + textArea.getSelectionStart() + ", "
+            + currentSelectionEnd + " )"
+        );
+
+        boolean resultOk = ( currentSelectionEnd == desiredSelectionEnd );
+        String desiredSelectionEndString = "" + desiredSelectionEnd;
+
+        // On Windows, last empty line is surprisingly not selected.
+        // Even if it's a bug, it's not for this test.
+        // So, we have 2 acceptable results in this case.
+        String toolkitName = Toolkit.getDefaultToolkit().getClass().getName();
+        if( toolkitName.equals("sun.awt.windows.WToolkit") ) {
+            final int desiredSelectionEnd2 = desiredSelectionEnd-1;  // 51
+            resultOk |= ( currentSelectionEnd == desiredSelectionEnd2 );
+            desiredSelectionEndString += " or " + desiredSelectionEnd2;
+        }
+
+        if( resultOk ) {
+            System.out.println(
+                "TEST: passed: Text is selected to the end"
+                + " (expected selection range end is "
+                + desiredSelectionEndString + ")."
+            );
+        } else {
+            System.out.println(
+                "TEST: FAILED: Text should be selected to the end"
+                + " (selection range end should be "
+                + desiredSelectionEndString + ")."
+            );
+            throw new RuntimeException(
+                "TEST: FAILED: Text should be selected to the end, but it is not."
+            );
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/Toolkit/RealSync/RealSyncOnEDT.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,401 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  @test 07/05/28 @(#)RealSyncOnEDT.java	1.3
+  @bug 6541903
+  @summary Tests if the realSync() throws the IllegalThreadException while invoked on the EDT
+  @author anthony.petrov: area=awt.toolkit
+  @run main/timeout=10 RealSyncOnEDT
+*/
+
+
+/**
+ * RealSyncOnEDT.java
+ *
+ * summary: Tests if the realSync() throws the IllegalThreadException while invoked on the EDT 
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+
+
+public class RealSyncOnEDT
+{
+    static Exception exceptionCaught = null;
+
+    private static void init() 
+    {
+        String[] instructions = 
+        {
+            "This is an AUTOMATIC test, simply wait until it is done.",
+            "The result (passed or failed) will be shown in the",
+            "message window below."
+        };
+        Sysout.createDialog( );
+        Sysout.printInstructions( instructions );
+
+
+        // Try to invoke the realSync() on the EDT
+        try {
+            EventQueue.invokeAndWait(new Runnable() {
+                public void run() {
+                    Frame frame = new Frame("Test frame");
+
+                    frame.setSize(100, 100);
+                    frame.setVisible(true);
+
+                    try {
+                        ((sun.awt.SunToolkit)java.awt.Toolkit.getDefaultToolkit()).realSync();
+                    } catch (Exception e) {
+                        exceptionCaught = e;
+                    }
+                }
+            });
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            fail("Unexpected exception caught: " + e);
+            return;
+        } catch (java.lang.reflect.InvocationTargetException e) {
+            e.printStackTrace();
+            fail("Unexpected exception caught: " + e);
+            return;
+        }
+
+        // We expect the IllegalThreadException to be thrown.
+        if (exceptionCaught == null) {
+            fail("No exception was thrown by the realSync() method.");
+            return;
+        } else if (!exceptionCaught.getClass().getName().equals("sun.awt.SunToolkit$IllegalThreadException")) {
+            exceptionCaught.printStackTrace();
+            fail("Unexpected exception caught while invoking the realSync(): " + exceptionCaught);
+            return;
+        }
+        pass();
+      
+    }//End  init()
+
+
+
+    /*****************************************************
+     * Standard Test Machinery Section
+     * DO NOT modify anything in this section -- it's a 
+     * standard chunk of code which has all of the
+     * synchronisation necessary for the test harness.
+     * By keeping it the same in all tests, it is easier
+     * to read and understand someone else's test, as
+     * well as insuring that all tests behave correctly
+     * with the test harness.
+     * There is a section following this for test-
+     * classes
+     ******************************************************/
+    private static boolean theTestPassed = false;
+    private static boolean testGeneratedInterrupt = false;
+    private static String failureMessage = "";
+
+    private static Thread mainThread = null;
+
+    private static int sleepTime = 300000;
+
+    // Not sure about what happens if multiple of this test are
+    //  instantiated in the same VM.  Being static (and using
+    //  static vars), it aint gonna work.  Not worrying about
+    //  it for now.
+    public static void main( String args[] ) throws InterruptedException
+    {
+        mainThread = Thread.currentThread();
+        try
+        {
+            init();
+        }
+        catch( TestPassedException e )
+        {
+            //The test passed, so just return from main and harness will
+            // interepret this return as a pass
+            return;
+        }
+        //At this point, neither test pass nor test fail has been
+        // called -- either would have thrown an exception and ended the
+        // test, so we know we have multiple threads.
+
+        //Test involves other threads, so sleep and wait for them to
+        // called pass() or fail()
+        try 
+        {
+            Thread.sleep( sleepTime );
+            //Timed out, so fail the test
+            throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
+        } 
+        catch (InterruptedException e) 
+        {
+            //The test harness may have interrupted the test.  If so, rethrow the exception
+            // so that the harness gets it and deals with it.
+            if( ! testGeneratedInterrupt ) throw e;
+
+            //reset flag in case hit this code more than once for some reason (just safety)
+            testGeneratedInterrupt = false;
+
+            if ( theTestPassed == false )
+            {
+                throw new RuntimeException( failureMessage );
+            }
+        }
+      
+    }//main
+
+    public static synchronized void setTimeoutTo( int seconds )
+    {
+        sleepTime = seconds * 1000;
+    }
+   
+    public static synchronized void pass()
+    {
+        Sysout.println( "The test passed." );
+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
+        //first check if this is executing in main thread
+        if ( mainThread == Thread.currentThread() )
+        {
+            //Still in the main thread, so set the flag just for kicks,
+            // and throw a test passed exception which will be caught
+            // and end the test.
+            theTestPassed = true;
+            throw new TestPassedException();
+        }
+        theTestPassed = true;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }//pass()
+
+    public static synchronized void fail()
+    {
+        //test writer didn't specify why test failed, so give generic
+        fail( "it just plain failed! :-)" );
+    }
+
+    public static synchronized void fail( String whyFailed )
+    {
+        Sysout.println( "The test failed: " + whyFailed );
+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
+        //check if this called from main thread
+        if ( mainThread == Thread.currentThread() )
+        {
+            //If main thread, fail now 'cause not sleeping
+            throw new RuntimeException( whyFailed );
+        }
+        theTestPassed = false;
+        testGeneratedInterrupt = true;
+        failureMessage = whyFailed;
+        mainThread.interrupt();
+    }//fail()
+
+}// class RealSyncOnEDT
+
+//This exception is used to exit from any level of call nesting
+// when it's determined that the test has passed, and immediately
+// end the test.
+class TestPassedException extends RuntimeException
+{
+}
+
+//*********** End Standard Test Machinery Section **********
+
+ 
+//************ Begin classes defined for the test ****************
+
+// if want to make listeners, here is the recommended place for them, then instantiate 
+//  them in init()
+
+/* Example of a class which may be written as part of a test
+class NewClass implements anInterface 
+ {
+   static int newVar = 0;
+   
+   public void eventDispatched(AWTEvent e) 
+    {
+      //Counting events to see if we get enough
+      eventCount++;
+      
+      if( eventCount == 20 )
+       {
+         //got enough events, so pass
+
+         RealSyncOnEDT.pass();
+       }
+      else if( tries == 20 )
+       {
+         //tried too many times without getting enough events so fail
+
+         RealSyncOnEDT.fail();
+       }
+      
+    }// eventDispatched()
+
+ }// NewClass class
+
+*/
+
+
+//************** End classes defined for the test *******************
+  
+
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    private static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+        System.out.println(messageIn);
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class    
+  
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/event/HierarchyEvent/AncestorResized/AncestorResized.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,439 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  @test @(#)AncestorResized.java	1.3 07/05/28
+  @bug 6533330
+  @summary ANCESTOR_RESIZED is not sent while resizing a frame. Regression caused by 6500477.
+  @author anthony.petrov: area=awt.toplevel
+  @library ../../../regtesthelpers
+  @build Util
+  @run main AncestorResized
+*/
+
+
+/**
+ * AncestorResized.java
+ *
+ * summary:  After fixing the 6500477, the ANCESTOR_RESIZED event stoped 
+ *           firing while resizing a frame. This was a regression.
+ *           The test checks whether the event starts dispatching as it
+ *           was before fixing the 6500477.
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import test.java.awt.regtesthelpers.Util;
+
+
+public class AncestorResized
+{
+    public static volatile int ancestorResizedCounter = 0;
+
+
+    static class HierarchyBoundsListenerImpl implements HierarchyBoundsListener {
+        public void ancestorMoved(HierarchyEvent ce) {
+            // ANCESTOR_MOVED seems to work OK.
+        }
+        public void ancestorResized(HierarchyEvent ce) {
+            ancestorResizedCounter++;
+        }
+    }
+
+    private static void init() 
+    {
+        Frame frame;
+        Panel panel;
+        Button button;
+        Label label;
+        Component[] components;
+
+        String[] instructions = 
+        {
+            "This is an AUTOMATIC test, simply wait until it is done.",
+            "The result (passed or failed) will be shown in the",
+            "message window below."
+        };
+        Sysout.createDialog( );
+        Sysout.printInstructions( instructions );
+
+        frame = new Frame("Test Frame");
+        frame.setLayout(new FlowLayout());
+
+        panel = new Panel();
+        button = new Button("Button");
+        label = new Label("Label");
+
+        components = new Component[] {
+            panel, button, label
+        };
+
+        frame.setSize(300, 300);
+        frame.setVisible(true);
+
+        Robot robot = Util.createRobot();
+        robot.setAutoDelay(20);
+
+        // To ensure the window is shown and packed
+        Util.waitForIdle(robot);
+
+        Insets insets = frame.getInsets();
+        if (insets.right == 0 || insets.bottom == 0) {
+            // Because we want to catch the "size-grip" of the frame.
+            System.out.println("The test environment must have non-zero right & bottom insets! The current insets are: " + insets);
+            pass();
+            return;
+        }
+
+        // Let's move the mouse pointer to the bottom-right coner of the frame (the "size-grip")
+        Rectangle bounds = frame.getBounds();
+
+        robot.mouseMove(bounds.x + bounds.width - 1, bounds.y + bounds.height - 1);
+
+        // From now on the ANCESTOR_RESIZED events get counted.
+        HierarchyBoundsListener listener = new HierarchyBoundsListenerImpl();
+        for (int i = 0; i < components.length; i++) {
+            components[i].addHierarchyBoundsListener(listener);
+            frame.add(components[i]);
+        }
+
+        // ... and start resizing
+        robot.mousePress( InputEvent.BUTTON1_MASK );
+        robot.mouseMove(bounds.x + bounds.width + 20, bounds.y + bounds.height + 15);
+        Util.waitForIdle(robot);
+
+        if (ancestorResizedCounter == 0) {
+            robot.mouseRelease( InputEvent.BUTTON1_MASK );
+            AncestorResized.fail("No ANCESTOR_RESIZED events received.");
+            return;
+        }
+
+        robot.mouseRelease( InputEvent.BUTTON1_MASK );
+
+        AncestorResized.pass();
+    }//End  init()
+
+
+
+    /*****************************************************
+     * Standard Test Machinery Section
+     * DO NOT modify anything in this section -- it's a 
+     * standard chunk of code which has all of the
+     * synchronisation necessary for the test harness.
+     * By keeping it the same in all tests, it is easier
+     * to read and understand someone else's test, as
+     * well as insuring that all tests behave correctly
+     * with the test harness.
+     * There is a section following this for test-
+     * classes
+     ******************************************************/
+    private static boolean theTestPassed = false;
+    private static boolean testGeneratedInterrupt = false;
+    private static String failureMessage = "";
+
+    private static Thread mainThread = null;
+
+    private static int sleepTime = 300000;
+
+    // Not sure about what happens if multiple of this test are
+    //  instantiated in the same VM.  Being static (and using
+    //  static vars), it aint gonna work.  Not worrying about
+    //  it for now.
+    public static void main( String args[] ) throws InterruptedException
+    {
+        mainThread = Thread.currentThread();
+        try
+        {
+            init();
+        }
+        catch( TestPassedException e )
+        {
+            //The test passed, so just return from main and harness will
+            // interepret this return as a pass
+            return;
+        }
+        //At this point, neither test pass nor test fail has been
+        // called -- either would have thrown an exception and ended the
+        // test, so we know we have multiple threads.
+
+        //Test involves other threads, so sleep and wait for them to
+        // called pass() or fail()
+        try 
+        {
+            Thread.sleep( sleepTime );
+            //Timed out, so fail the test
+            throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
+        } 
+        catch (InterruptedException e) 
+        {
+            //The test harness may have interrupted the test.  If so, rethrow the exception
+            // so that the harness gets it and deals with it.
+            if( ! testGeneratedInterrupt ) throw e;
+
+            //reset flag in case hit this code more than once for some reason (just safety)
+            testGeneratedInterrupt = false;
+
+            if ( theTestPassed == false )
+            {
+                throw new RuntimeException( failureMessage );
+            }
+        }
+      
+    }//main
+
+    public static synchronized void setTimeoutTo( int seconds )
+    {
+        sleepTime = seconds * 1000;
+    }
+   
+    public static synchronized void pass()
+    {
+        Sysout.println( "The test passed." );
+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
+        //first check if this is executing in main thread
+        if ( mainThread == Thread.currentThread() )
+        {
+            //Still in the main thread, so set the flag just for kicks,
+            // and throw a test passed exception which will be caught
+            // and end the test.
+            theTestPassed = true;
+            throw new TestPassedException();
+        }
+        theTestPassed = true;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }//pass()
+
+    public static synchronized void fail()
+    {
+        //test writer didn't specify why test failed, so give generic
+        fail( "it just plain failed! :-)" );
+    }
+
+    public static synchronized void fail( String whyFailed )
+    {
+        Sysout.println( "The test failed: " + whyFailed );
+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
+        //check if this called from main thread
+        if ( mainThread == Thread.currentThread() )
+        {
+            //If main thread, fail now 'cause not sleeping
+            throw new RuntimeException( whyFailed );
+        }
+        theTestPassed = false;
+        testGeneratedInterrupt = true;
+        failureMessage = whyFailed;
+        mainThread.interrupt();
+    }//fail()
+
+}// class AncestorResized
+
+//This exception is used to exit from any level of call nesting
+// when it's determined that the test has passed, and immediately
+// end the test.
+class TestPassedException extends RuntimeException
+{
+}
+
+//*********** End Standard Test Machinery Section **********
+
+ 
+//************ Begin classes defined for the test ****************
+
+// if want to make listeners, here is the recommended place for them, then instantiate 
+//  them in init()
+
+/* Example of a class which may be written as part of a test
+class NewClass implements anInterface 
+ {
+   static int newVar = 0;
+   
+   public void eventDispatched(AWTEvent e) 
+    {
+      //Counting events to see if we get enough
+      eventCount++;
+      
+      if( eventCount == 20 )
+       {
+         //got enough events, so pass
+
+         AncestorResized.pass();
+       }
+      else if( tries == 20 )
+       {
+         //tried too many times without getting enough events so fail
+
+         AncestorResized.fail();
+       }
+      
+    }// eventDispatched()
+
+ }// NewClass class
+
+*/
+
+
+//************** End classes defined for the test *******************
+  
+
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+{ 
+    private static TestDialog dialog;
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        dialog.printInstructions( instructions );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        dialog = new TestDialog( new Frame(), "Instructions" );
+        String[] defInstr = { "Instructions will appear here. ", "" } ;
+        dialog.printInstructions( defInstr );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        dialog.displayMessage( messageIn );
+        System.out.println(messageIn);
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+{
+
+    TextArea instructionsText;
+    TextArea messageText;
+    int maxStringLength = 80;
+   
+    //DO NOT call this directly, go through Sysout
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+        setVisible(true);
+    }// TestDialog()
+
+    //DO NOT call this directly, go through Sysout
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    //DO NOT call this directly, go through Sysout
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+        System.out.println(messageIn);
+    }  
+   
+}// TestDialog  class    
+  
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/font/TextLayout/TestHebrewMark.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/* @test
+ * @summary verify TextLayout handles Hebrew marks correctly
+ * @bug 6529141
+ */
+
+import java.awt.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+
+public class TestHebrewMark {
+
+    public static void main(String args[]) {
+       FontRenderContext frc = new FontRenderContext(null,false,false);
+       final String fonts[] = { "Arial", "Lucida Sans", "Lucida Sans Regular" };
+       final char ALEF = '\u05D0';
+       final char QAMATS = '\u05B8';  // a combining mark, should show up UNDER the alef (no advance)
+       final char chars1[] = { ALEF };
+       final char chars2[] = { ALEF, QAMATS };
+       final String string1 = new String(chars1);
+       final String string2 = new String(chars2);
+       Font f = null;
+       // try to find a font that will work
+       for(String fontname : fonts ) {
+           Font afont = new Font(fontname,Font.PLAIN,32);
+           if(!afont.getFontName().equals(fontname)) {
+             System.out.println(fontname + ": is actually  " + afont.getFontName() + " - skipping this font.");
+             continue;
+           }
+           if(!afont.canDisplay(ALEF) || !afont.canDisplay(QAMATS)) {
+             System.out.println(fontname + ": can't display ALEF or QAMATS - skipping this font");
+             continue;
+           }
+           f = afont;
+       } 
+
+       if(f == null) {
+           System.out.println("Could not find a suitable font - skipping this test.");
+           return;
+       }
+       System.out.println("Using font " + f.getFontName());
+       TextLayout tl = new TextLayout(string1, f, frc);
+       TextLayout tl2 = new TextLayout(string2, f, frc);
+       Rectangle2D tlBounds = tl.getBounds();
+       Rectangle2D tlBounds2 = tl2.getBounds();
+       System.out.println("tlbounds="+tlBounds);
+       System.out.println("tl.getAdvance()="+tl.getAdvance());
+       System.out.println("tl2bounds="+tlBounds2);
+       System.out.println("tl2.getAdvance()="+tl2.getAdvance());
+
+       if(tl.getAdvance() != tl2.getAdvance()) {
+          throw new RuntimeException("Advance of alef with and without QAMATS differs: " + tl.getAdvance() + " vs. " + tl2.getAdvance());
+       } else {
+          System.out.println("6529141 OK, widths are same.");
+       }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/font/TextLayout/TextLayoutBounds.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/* @test
+ * @summary verify TextLayout.getBounds() return visual bounds
+ * @bug 6323611
+ */
+
+import java.awt.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+
+public class TextLayoutBounds {
+
+    public static void main(String args[]) {
+       FontRenderContext frc = new FontRenderContext(null, false, false);
+       Font f = new Font("SansSerif",Font.BOLD,32);
+       String s = new String("JAVA");
+       TextLayout tl = new TextLayout(s, f, frc);
+       Rectangle2D tlBounds = tl.getBounds();
+       GlyphVector gv = f.createGlyphVector(frc, s);
+       Rectangle2D gvvBounds = gv.getVisualBounds();
+       System.out.println("tlbounds="+tlBounds);
+       System.out.println("gvbounds="+gvvBounds);
+       if (!gvvBounds.equals(tlBounds)) {
+          throw new RuntimeException("Bounds differ");
+       }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/image/ImagingOpsNoExceptionsTest/ImagingOpsNoExceptionsTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2004-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  @test
+  @bug 5068850
+  @summary Tests that no exceptions are thrown when BufferedImageOp or RasterOps
+  are used.
+  @run main ImagingOpsNoExceptionsTest
+*/
+
+import java.awt.image.*;
+import java.awt.color.*;
+import java.awt.geom.AffineTransform;
+
+public class ImagingOpsNoExceptionsTest {
+    private static final String opsName[] = { 
+	"Threshold", "RescaleOp" ,"Invert", "Yellow Invert", "3x3 Blur", 
+	"3x3 Sharpen", "3x3 Edge", "5x5 Edge", "Color Convert", "Rotate"};
+    private static BufferedImageOp biop[] = new BufferedImageOp[opsName.length];
+    private static RasterOp rop[] = new RasterOp[opsName.length];
+    private static int low = 100, high = 200;
+
+    private static final int SIZE = 100;
+
+    public static void runTest() {
+	int exceptions = 0;
+	for (int i = 0; i < opsName.length; i++) {
+	    // BUG: can't iterate through all image types because
+	    // of crashes on solaris with VIS as of tiger-rc
+	    for (int j = BufferedImage.TYPE_INT_RGB; 
+		 j <= BufferedImage.TYPE_INT_RGB; j++) 
+	    {
+		BufferedImage srcImage = 
+		    new BufferedImage(SIZE, SIZE, j);
+		BufferedImage dstImage = 
+		    new BufferedImage(SIZE, SIZE, j);
+		System.err.println("bi type="+j);
+		System.err.println("  biop ="+opsName[i]);
+		try {
+		    biop[i].filter(srcImage, dstImage);
+		} catch (Exception e) {
+		    e.printStackTrace();
+		    exceptions++;
+		}
+		try {
+		    biop[i].filter(srcImage, null);
+		} catch (Exception e) {
+		    e.printStackTrace();
+		    exceptions++;
+		}
+
+		// BUG: LookupOp raster op crashes on solaris with VIS
+		// as of tiger-rc
+		if (! (rop[i] instanceof LookupOp)) {
+		    System.err.println("  rop  ="+opsName[i]);
+		    try {
+			rop[i].filter(srcImage.getRaster(), 
+				      (WritableRaster)dstImage.getRaster());
+		    } catch (Exception e) {
+			e.printStackTrace();
+			exceptions++;
+		    }
+		}
+	    }
+	}
+	
+	if (exceptions > 0) {
+	    throw new RuntimeException("Test Failed, " + exceptions + 
+				       " exceptions were thrown");
+	}
+	System.err.println("Test Passed, no exceptions were thrown.");
+    }
+
+    public static void thresholdOp(int low, int high) {
+        byte threshold[] = new byte[256];
+        for (int j = 0; j < 256 ; j++) {
+            if (j > high) {
+                threshold[j] = (byte) 255;
+            } else if (j < low) {
+                threshold[j] = (byte) 0;
+            } else {
+                threshold[j] = (byte) j;
+            }
+        }
+	LookupOp lop = new LookupOp(new ByteLookupTable(0,threshold), null);
+        biop[0] = lop;
+	rop[0] = lop;
+    }
+
+    public static void main (String[] args) {
+        thresholdOp(low, high);
+        int i = 1;
+	RescaleOp resop = new RescaleOp(1.0f, 0, null); 
+        biop[i] = resop;
+	rop[i] = resop;
+	i++;
+
+        byte invert[] = new byte[256];
+        byte ordered[] = new byte[256];
+        for (int j = 0; j < 256 ; j++) {
+            invert[j] = (byte) (256-j);
+            ordered[j] = (byte) j;
+        }
+	LookupOp lop = new LookupOp(new ByteLookupTable(0,invert), null);
+        biop[i] = lop;
+	rop[i] = lop;
+	i++;
+
+        byte[][] yellowInvert = new byte[][] { invert, invert, ordered };
+	lop = new LookupOp(new ByteLookupTable(0,yellowInvert), null);
+        biop[i] = lop;
+	rop[i] = lop;
+	i++;
+        int dim[][] = {{3,3}, {3,3}, {3,3}, {5,5}};
+        float data[][] = { {0.1f, 0.1f, 0.1f,              // 3x3 blur
+                            0.1f, 0.2f, 0.1f,
+                            0.1f, 0.1f, 0.1f},
+                           {-1.0f, -1.0f, -1.0f,           // 3x3 sharpen
+                            -1.0f, 9.0f, -1.0f,
+                            -1.0f, -1.0f, -1.0f},
+                           { 0.f, -1.f,  0.f,                  // 3x3 edge
+			     -1.f,  5.f, -1.f,
+                             0.f, -1.f,  0.f},
+                           {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  // 5x5 edge
+                            -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
+                            -1.0f, -1.0f, 24.0f, -1.0f, -1.0f,
+                            -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
+                            -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}};
+        for (int j = 0; j < data.length; j++, i++) {
+	    ConvolveOp cop = new ConvolveOp(new Kernel(dim[j][0],dim[j][1],data[j]));
+            biop[i] = cop;
+            rop[i] = cop;
+        }
+
+        ColorSpace cs1 = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+        ColorSpace cs2 = ColorSpace.getInstance(ColorSpace.CS_PYCC);
+        ColorConvertOp ccop = new ColorConvertOp(cs1, cs2, null);
+	biop[i] = ccop;
+	rop[i] = ccop;
+	i++;
+
+	AffineTransform at = 
+	    AffineTransform.getRotateInstance(0.5*Math.PI, SIZE/2, SIZE/2);
+	AffineTransformOp atOp = 
+	    new AffineTransformOp(at, null);
+	biop[i] = atOp;
+	rop[i] = atOp;
+
+	runTest();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/print/Dialog/PaperSizeError.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6360339
+ * @summary Test for fp error in paper size calculations.
+ * @run main/manual PaperSizeError
+ */
+
+import java.awt.print.*;
+import javax.print.*;
+import javax.print.attribute.*;
+import javax.print.attribute.standard.*;
+
+public class PaperSizeError {
+
+  static String[] instructions = {
+     "This test assumes and requires that you have a printer installed",
+     "Two page dialogs will appear. You must press 'OK' on both.",
+     "If the test fails, it will throw an Exception.",
+     ""
+  };
+
+  public static void main(String[] args) {
+
+      for (int i=0;i<instructions.length;i++) {
+         System.out.println(instructions[i]);
+      }
+
+      /* First find out if we have a valid test environment:
+       * ie print service exists and supports A4.
+       */
+      PrinterJob job = PrinterJob.getPrinterJob();
+      PrintService service = job.getPrintService();
+      if (service == null ||
+          !service.isAttributeValueSupported(MediaSizeName.ISO_A4,
+                                             null, null)) {
+         return;
+      }
+    
+      // Create A4 sized PageFormat.
+      MediaSize a4 = MediaSize.ISO.A4;
+      double a4w = Math.rint((a4.getX(1) * 72.0) / Size2DSyntax.INCH);
+      double a4h = Math.rint((a4.getY(1) * 72.0) / Size2DSyntax.INCH);
+      System.out.println("Units = 1/72\" size=" + a4w + "x" + a4h);
+      Paper paper = new Paper();
+      paper.setSize(a4w, a4h);
+      PageFormat pf = new PageFormat();
+      pf.setPaper(paper);
+
+      // Test dialog with PF argument
+      PageFormat newPF = job.pageDialog(pf);
+      if (newPF == null) {
+          return; // user cancelled the dialog (and hence the test). 
+      } else {
+          verifyPaper(newPF, a4w, a4h);
+      }
+
+      PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+      aset.add(OrientationRequested.PORTRAIT);
+      aset.add(MediaSizeName.ISO_A4);
+
+      // Test dialog with AttributeSet argument
+      newPF = job.pageDialog(aset);
+      if (newPF == null) {
+          return; // user cancelled the dialog (and hence the test). 
+      } else {
+          verifyPaper(newPF, a4w, a4h);
+      }
+  }
+
+  static void verifyPaper(PageFormat pf , double a4w, double a4h) {
+
+      double dw1 = pf.getWidth();
+      double dh1 = pf.getHeight();
+      float fwMM = (float)((dw1 * 25.4) / 72.0);
+      float fhMM = (float)((dh1 * 25.4) / 72.0);
+      MediaSizeName msn = MediaSize.findMedia(fwMM, fhMM, Size2DSyntax.MM);
+      System.out.println("Units = 1/72\" new size=" + dw1 + "x" + dh1);
+      System.out.println("Units = MM new size=" + fwMM + "x" + fhMM);
+      System.out.println("Media = " + msn);
+      if (a4w != Math.rint(dw1) || a4h != Math.rint(dh1)) {
+         System.out.println("Got " + Math.rint(dw1) + "x" + Math.rint(dh1) +
+                            ". Expected " + a4w + "x" + a4h);
+         throw new RuntimeException("Size is not close enough to A4 size");
+      }
+      // So far as I know, there's no other standard size that is A4.
+      // So we should match the right one.
+      if (msn != MediaSizeName.ISO_A4) {
+          throw new RuntimeException("MediaSizeName is not A4: " + msn);
+      }
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/print/PrinterJob/ImagePrinting/ClippedImages.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,456 @@
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test @(#)ClippedImages.java	1.1 07/04/03
+ * @bug 6531728
+ * @summary Test printing of images which need to have src area clipped
+ * @run main/manual=yesno/timeout=900 ClippedImages
+ */
+
+import java.io.*;
+import java.awt.*;
+import java.awt.geom.*;
+import java.awt.event.*;
+import java.awt.print.*;
+import java.awt.image.BufferedImage;
+import javax.print.*;
+import javax.print.attribute.*;
+
+public class ClippedImages extends Frame implements ActionListener {
+
+    private ClippedImageCanvas c;
+
+    public static void main(String args[]) {    
+
+        ClippedImages f = new ClippedImages();
+        f.setVisible(true);
+    }
+    
+    public ClippedImages() {
+	super("Clipped Src Area Image Printing Test");
+        c = new ClippedImageCanvas();
+        add("Center", c);
+
+        Button paintButton = new Button("Toggle Contents");
+        paintButton.addActionListener(this);
+
+        Button printThisButton = new Button("Print This");
+        printThisButton.addActionListener(this);
+
+        Button printAllButton = new Button("Print All");
+        printAllButton.addActionListener(this);
+
+        Panel p = new Panel();
+        p.add(paintButton);
+        p.add(printThisButton);
+        p.add(printAllButton);
+        add("South", p);
+        add("North", getInstructions());
+        addWindowListener(new WindowAdapter() {
+                public void windowClosing(WindowEvent e) {
+                    System.exit(0);
+                }
+            });
+ 
+        pack();
+    }
+
+    private TextArea getInstructions() {
+        TextArea ta = new TextArea(18, 60);
+        ta.setFont(new Font("Dialog", Font.PLAIN, 11));
+        ta.setText
+            ("This is a manual test as it requires that you compare "+
+             "the on-screen rendering with the printed output.\n"+
+             "Select the 'Print All' button to print out the test\n"+
+             "It will generate 4 sides of content: as it will print "+
+             "each of 2 sets of transformed images in portrait, \n"+
+             "and landscape orientations. \n"+
+             "The sets of images are in turn made up\n"+
+             "of two similar sets of pages: one is 'random' images,\n "+
+             " the other is 16 squares.\n"+
+             "Use the 'Toggle Contents' button to view the screen rendering\n"+
+             "For each page compare the printed content to the same\n"+
+             "on-screen one taking careful note of\n"+
+             "a) the positions of the red/blue circles on the corners\n"+
+             "b) that numerical text on the image is displayed similarly\n"+
+             "e) that the green quadrilaterals match on-screen\n"+
+             "f) that the rendering is clipped at the default (typically 1 inch) "+
+             "margins of the page.\n"+
+             "The test PASSES if the onscreen and printed rendering match");
+        return ta;
+    }
+
+    public void actionPerformed(ActionEvent e) {
+
+        if (e.getActionCommand().equals("Print This")) {
+            printOne();
+        } else if (e.getActionCommand().equals("Print All")) {
+            printAll();
+        } else if (e.getActionCommand().equals("Toggle Contents")) {
+            c.toggleContents();
+            c.repaint();
+        }
+    }
+
+    private void printOne() {
+        PrinterJob pj = PrinterJob.getPrinterJob();
+
+        PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
+        if (pj != null && (false||pj.printDialog(attrs))) {
+            c.setPrinterJob(pj, false);
+            pj.setPrintable(c);
+            try {
+                pj.print(attrs);
+            } catch (PrinterException pe) {
+                pe.printStackTrace();
+                throw new RuntimeException("Exception whilst printing.");
+            } finally {
+                System.out.println("PRINT RETURNED OK.");
+            }
+        }             
+    }
+
+    private void printAll() {
+        PrinterJob pj = PrinterJob.getPrinterJob();
+        PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
+        if (pj != null && (false||pj.printDialog(attrs))) {
+            c.setPrinterJob(pj, true);
+            pj.setPageable(c);
+            try {
+                pj.print(attrs);
+            } catch (PrinterException pe) {
+                pe.printStackTrace();
+                throw new RuntimeException("Exception whilst printing.");
+            } finally {
+                System.out.println("PRINT RETURNED OK.");
+            }
+        }             
+    }
+}
+
+class ClippedImageCanvas extends Component implements Printable, Pageable {
+
+    BufferedImage img = null;
+    int sw=50, sh=50;
+
+    ClippedImageCanvas() {
+        img = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g2d = img.createGraphics();
+        g2d.setColor(Color.red);
+        g2d.fillRect(0 ,0, sw, sh);
+        g2d.setColor(Color.black);
+        int cnt = 0;
+        Font font = new Font("Serif", Font.PLAIN, 11);
+        g2d.setFont(font);
+        FontMetrics fm = g2d.getFontMetrics();
+        for (int y=12;y<sh;y+=12) {
+            int x = 0;
+            while (x < sw) {
+                String s = (new Integer(++cnt)).toString();
+                g2d.drawString(s, x, y);
+                x+= fm.stringWidth(s);
+            }
+        }
+    }
+
+    private boolean paintSquares = true;
+    void toggleContents() {
+        paintSquares = !paintSquares;
+    }
+
+    public int getNumberOfPages() {
+        if (pageable) {
+            return 4;
+        } else {
+            return 1;
+        }
+    }
+
+    boolean pageable = false;
+    PrinterJob myPrinterJob;
+    void setPrinterJob(PrinterJob job, boolean pageable) {
+        this.myPrinterJob = job;
+        this.pageable = pageable;
+    }
+
+    public PageFormat getPageFormat(int pageIndex)
+        throws IndexOutOfBoundsException {
+        
+        if (pageIndex < 0 || pageIndex >= getNumberOfPages()) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        PageFormat pf = myPrinterJob.defaultPage();
+        switch (pageIndex % 2) {
+
+        case 0 :
+            pf.setOrientation(PageFormat.PORTRAIT);
+            break;
+
+        case 1:
+            pf.setOrientation(PageFormat.LANDSCAPE);
+             break;
+        }
+        return pf;
+    }
+
+    String getOrientStr(PageFormat pf) {
+        if (pf.getOrientation() == PageFormat.PORTRAIT) {
+            return "Portrait Orientation, ";
+        } else {
+            return "Landscape Orientation,";
+        }
+    }
+
+    public Printable getPrintable(int pageIndex)
+        throws IndexOutOfBoundsException {
+
+        if (pageIndex < 0 || pageIndex >= getNumberOfPages()) {
+            throw new IndexOutOfBoundsException();
+        }
+        if (pageIndex < 2) {
+            paintSquares = true;
+        } else {
+            paintSquares = false;
+        }
+        return this;
+    }
+
+    public int print(Graphics g, PageFormat pgFmt, int pgIndex) {
+
+        if (pgIndex > getNumberOfPages()-1) {
+            return Printable.NO_SUCH_PAGE;
+        }
+        Graphics2D g2d = (Graphics2D)g;
+        g2d.translate(pgFmt.getImageableX(), pgFmt.getImageableY());
+        g.drawString(getOrientStr(pgFmt), 0, 12);
+        paint(g2d);
+        return Printable.PAGE_EXISTS;
+    }
+
+    private void drawImage(Graphics g,
+                           int dx1, int dy1, int dx2, int dy2,
+                           int sx1, int sy1, int sx2, int sy2) {
+
+        int rx = (dx1 < dx2) ? dx1 : dx2;
+        int ry = (dy1 < dy2) ? dy1 : dy2;
+        int rw = dx2-dx1;
+        if (rw < 0) rw = -rw;
+        int rh = dy2-dy1;
+        if (rh < 0) rh = -rh;
+
+        g.setColor(Color.green);
+        g.drawRect(rx-1 ,ry-1, rw+1, rh+1);
+        g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null);
+        g.setColor(Color.blue);
+        int r=5;
+        g.drawOval(dx1-r, dy1-r, 2*r, 2*r);
+        g.setColor(Color.red);
+        g.drawOval(dx2-r, dy2-r, 2*r, 2*r);    
+    }
+
+    private AffineTransform savedTx = null;
+
+    private void saveTx(Graphics2D g2d) {
+        savedTx = g2d.getTransform();
+    }
+
+    private void restoreTx(Graphics2D g2d) {
+        g2d.setTransform(savedTx);
+    }
+
+    public void paint(Graphics g) {
+        Dimension size = getSize();
+        g.setColor(Color.black);
+        for (int p=0;p<size.width;p+=20) {
+            g.drawLine(p, 0, p, size.height);
+        }
+       for (int p=0;p<size.height;p+=20) {
+            g.drawLine(0, p, size.width, p);
+        }
+        if (paintSquares) {
+            paintSquares(g);
+        } else {
+            paintRandom(g);
+        }
+    }
+
+    private void paintRandom(Graphics g) {
+
+        int dx, dy, dw, dh;
+
+        Graphics2D g2d = (Graphics2D)g;
+        g.setColor(Color.black);
+
+        saveTx(g2d);
+        int sx = -20, sy=-20;
+        
+        dx=300; dy=10; dw=50; dh=50;
+
+        drawImage(g, dx, dy, dx+dw, dy+dh ,sx,sy,1,1);
+
+        dx=20; dy=20; dw=400; dh=80;
+        g2d.shear(0.0, Math.PI/20);
+        drawImage(g, dx, dy, dx+dw, dy+dh, sx, sy, dw/2, dh/2);
+
+        dx=125; dy=40;
+        restoreTx(g2d);
+
+        g2d.rotate(Math.PI/4);
+        drawImage(g, dx, dy, dx+dw, dy+dh, sx, sy, dw/2, dh/2);
+
+        restoreTx(g2d);       
+
+        dx=290; dy=180; dw=20; dh=20;
+        drawImage(g, dx, dy, dx+dw*10, dy+dh*10, 30, sy, dw, dh);
+        g2d.scale(-1, -1);
+        dx=-280; dy=-200;
+        drawImage(g, dx, dy, dx+dw*2, dy+dh*2, 30, sy, dw, dh);
+
+        restoreTx(g2d);       
+
+        g2d.scale(1, -1);
+        dx=430; dy=-150;
+        drawImage(g, dx, dy, dx+dw*5, dy+dh*2, 30, sy, dw, dh);
+
+        restoreTx(g2d);
+
+        dx = 10; dy = 290; dw = 200; dh = 200;
+        drawImage(g, dx, dy, dx+dw, dy+dh, sx, sy, sw, sh);
+
+        dx = 0; dy = 400; dw=-30; dh=-50;
+        drawImage(g, dx, dy, dx-dw, dy-dh, dx, dy, dx-dw, dy-dh);
+    }
+
+    private void paintSquares(Graphics g) {
+
+        /* drawImage is required to handle mapping sx1,sy1 -> dx1,dy1 and
+         * sx2,sy2 -> dx2,dy2 which may imply flips and scales.
+         * To test this we need to test all combinations of these parameters
+         * with drawImage.
+         * If we have a source rectangle with vertices, sA, sB, sC, sD
+         * there are 4 combinations : sA+sD, sD+sA, sB+sC, sC+sB.
+         * Similarly for the destination with vertices, dA, dB, dC, dD
+         * there are 4 combinations : dA+dD, dD+dA, dB+dC, dC+dB.
+         * Thus we need 16 calls to test all combinations.
+         * Note that we set the source area coordinates (x and y -20->80) 
+         * to be beyond the image size (50x50) so clipping is always needed.
+         */
+        int sxa = -20, sya =  -20;
+        int sxb = 80, syb =  -20;
+        int sxc =  -20, syc = 80;
+        int sxd = 80, syd = 80;
+
+        int dxa =  0, dya =  0;
+        int dxb = 80, dyb =  0;
+        int dxc =  0, dyc = 80;
+        int dxd = 80, dyd = 80;
+
+        int incX = 100;
+        int incY = 100;
+
+        g.translate(20, 20);
+
+         /* sA + sD -> dA + dD - the normal untransformed case */
+        drawImage(g, dxa, dya, dxd, dyd, sxa, sya, sxd, syd);
+        g.translate(incX, 0);
+
+        /* sD + sA -> dA + dD */
+        drawImage(g, dxa, dya, dxd, dyd, sxd, syd, sxa, sya);
+        g.translate(incX, 0);
+
+        /* sB + sC -> dA + dD */
+        drawImage(g, dxa, dya, dxd, dyd, sxb, syb, sxc, syc);
+        g.translate(incX, 0);
+
+        /* sC + sB -> dA + dD */
+        drawImage(g, dxa, dya, dxd, dyd, sxc, syc, sxb, syb);
+
+        g.translate(-3*incX, incY);
+        /******/
+
+        /* sA + sD -> dD + dA */
+        drawImage(g, dxd, dyd, dxa, dya, sxa, sya, sxd, syd);
+        g.translate(incX, 0);
+
+        /* sD + sA -> dD + dA */
+        drawImage(g, dxd, dyd, dxa, dya, sxd, syd, sxa, sya);
+        g.translate(incX, 0);
+
+        /* sB + sC -> dD + dA */
+        drawImage(g, dxd, dyd, dxa, dya, sxb, syb, sxc, syc);
+        g.translate(incX, 0);
+
+        /* sC + sB -> dD + dA */
+        drawImage(g, dxd, dyd, dxa, dya, sxc, syc, sxb, syb);
+
+        g.translate(-3*incX, incY);
+        /******/
+
+        /* sA + sD -> dB + dC */
+        drawImage(g, dxb, dyb, dxc, dyc, sxa, sya, sxd, syd);
+        g.translate(incX, 0);
+
+        /* sD + sA -> dB + dC */
+        drawImage(g, dxb, dyb, dxc, dyc, sxd, syd, sxa, sya);
+        g.translate(incX, 0);
+
+        /* sB + sC -> dB + dC */
+        drawImage(g, dxb, dyb, dxc, dyc, sxb, syb, sxc, syc);
+        g.translate(incX, 0);
+
+        /* sC + sB -> dB + dC */
+        drawImage(g, dxb, dyb, dxc, dyc, sxc, syc, sxb, syb);
+
+        g.translate(-3*incX, incY);
+        /******/
+
+
+        /* sA + sD -> dC + dB */
+        drawImage(g, dxc, dyc, dxb, dyb, sxa, sya, sxd, syd);
+        g.translate(incX, 0);
+
+        /* sD + sA -> dC + dB */
+        drawImage(g, dxc, dyc, dxb, dyb, sxd, syd, sxa, sya);
+        g.translate(incX, 0);
+
+        /* sB + sC -> dC + dB */
+        drawImage(g, dxc, dyc, dxb, dyb, sxb, syb, sxc, syc);
+        g.translate(incX, 0);
+
+        /* sC + sB -> dC + dB */
+        drawImage(g, dxc, dyc, dxb, dyb, sxc, syc, sxb, syb);
+    }
+
+
+        
+     /* Size is chosen to match default imageable width of a NA letter
+      * page. This means there will be clipping, what is clipped will
+      * depend on PageFormat orientation.
+      */
+     public Dimension getPreferredSize() {
+        return new Dimension(468, 468);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/print/PrinterJob/Margins.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6543815
+ * @summary Image should be sent to printer, no exceptions thrown.  
+ *    The 2 printouts should have a rectangle which is the minimum 
+ *    possible margin. 
+ * @run main/manual Margins
+ */
+
+import java.awt.*;
+import java.awt.print.*;
+
+public class Margins implements Printable {
+
+    public static void main(String args[]) {
+        PrinterJob job = PrinterJob.getPrinterJob();
+        PageFormat pageFormat = job.defaultPage();
+        Paper paper = pageFormat.getPaper();
+        double wid = paper.getWidth();
+        double hgt = paper.getHeight();
+        paper.setImageableArea(0, -10, wid, hgt);
+	pageFormat = job.pageDialog(pageFormat);
+        pageFormat.setPaper(paper);
+        job.setPrintable(new Margins(), pageFormat);
+        try {
+            job.print();
+        } catch (PrinterException e) {
+        }
+
+       	paper.setImageableArea(0, 0, wid, hgt+72);
+	pageFormat = job.pageDialog(pageFormat);
+        pageFormat.setPaper(paper);
+        
+        job.setPrintable(new Margins(), pageFormat);
+        try {
+           job.print();
+        } catch (PrinterException e) {
+        }
+   }
+
+   public int print(Graphics g, PageFormat pf, int page)
+       throws PrinterException {
+
+       if (page > 0) {
+           return NO_SUCH_PAGE;
+       }
+       int ix = (int)pf.getImageableX();
+       int iy = (int)pf.getImageableY();
+       int iw = (int)pf.getImageableWidth();
+       int ih = (int)pf.getImageableHeight();
+       System.out.println("ix="+ix+" iy="+iy+" iw="+iw+" ih="+ih);
+       if ((ix < 0) || (iy < 0)) {
+           throw new RuntimeException("Imageable x or y is a negative value.");
+       }
+
+       Paper paper = pf.getPaper();
+       double wid = paper.getWidth();
+       double hgt = paper.getHeight();
+
+       if ((ix+iw > wid) || (iy+ih > hgt)) {
+           throw new RuntimeException("Printable width or height exceeds paper width or height.");
+       }
+
+       Graphics2D g2d = (Graphics2D)g;
+       g2d.translate(ix, iy);
+       g2d.setColor(Color.black);
+       g2d.drawRect(1, 1, iw-2, ih-2);
+
+       return PAGE_EXISTS;
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/print/PrinterJob/ValidatePage/ValidatePage.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,428 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test 
+ * @bug 4252108 6229507
+ * @summary PrinterJob.validatePage() is unimplemented.
+ * @author prr
+ * @run main/manual ValidatePage
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.print.*;
+
+public class ValidatePage extends Frame implements Printable {
+
+PrinterJob myPrinterJob;
+PageFormat myPageFormat;
+Label pw, ph, pglm, pgrm, pgiw, pgih, pgtm, pgbm;
+TextField tpw, tph, tpglm, tpgtm, tpgiw, tpgih;
+Label myWidthLabel;
+Label myHeightLabel;
+Label myImageableXLabel;
+Label myImageableYLabel;
+Label myImageableRightLabel;
+Label myImageableBottomLabel;
+Label myImageableWidthLabel;
+Label myImageableHeightLabel;
+Label myOrientationLabel;
+
+  protected void displayPageFormatAttributes() {
+    myWidthLabel.setText ("Format Width = " + drnd(myPageFormat.getWidth()));
+    myHeightLabel.setText ("Format Height = " + drnd(myPageFormat.getHeight()));
+    myImageableXLabel.setText
+    	("Format Left Margin = " + drnd(myPageFormat.getImageableX()));
+    myImageableRightLabel.setText
+    	("Format Right Margin = " + drnd(myPageFormat.getWidth() - 
+        (myPageFormat.getImageableX() + myPageFormat.getImageableWidth())));
+    myImageableWidthLabel.setText
+    	("Format ImageableWidth = " + drnd(myPageFormat.getImageableWidth()));
+    myImageableYLabel.setText
+    	("Format Top Margin = " + drnd(myPageFormat.getImageableY()));
+    myImageableBottomLabel.setText
+    	("Format Bottom Margin = " + drnd(myPageFormat.getHeight() - 
+        (myPageFormat.getImageableY() + myPageFormat.getImageableHeight())));
+    myImageableHeightLabel.setText
+    	("Format ImageableHeight = " + drnd(myPageFormat.getImageableHeight()));
+    int o = myPageFormat.getOrientation();
+    myOrientationLabel.setText
+    	("Format Orientation = " +
+    		(o == PageFormat.PORTRAIT ? "PORTRAIT" :
+    		 o == PageFormat.LANDSCAPE ? "LANDSCAPE" :
+    		 o == PageFormat.REVERSE_LANDSCAPE ? "REVERSE_LANDSCAPE" :
+    		 "<invalid>"));
+    Paper p = myPageFormat.getPaper();
+    pw.setText("Paper Width = " + drnd(p.getWidth()));
+    ph.setText("Paper Height = " + drnd(p.getHeight()));
+    pglm.setText("Paper Left Margin = " + drnd(p.getImageableX()));
+    pgiw.setText("Paper Imageable Width = " + drnd(p.getImageableWidth()));
+    pgih.setText("Paper Imageable Height = " + drnd(p.getImageableHeight()));
+
+    pgrm.setText("Paper Right Margin = " + 
+         drnd(p.getWidth() - (p.getImageableX()+p.getImageableWidth())));
+    pgtm.setText("Paper Top Margin = " + drnd(p.getImageableY()));
+    pgbm.setText("Paper Bottom Margin = " + 
+       drnd(p.getHeight() - (p.getImageableY()+p.getImageableHeight())));
+  }
+
+  static String drnd(double d) {
+      d = d * 10.0 + 0.5;
+      d = Math.floor(d) /10.0;
+      String ds = Double.toString(d);
+      int decimal_pos = ds.indexOf(".");
+      int len = ds.length();
+      if (len > decimal_pos+2) {
+          return ds.substring(0, decimal_pos+2);
+      } else {
+          return ds;
+      }
+  }
+     
+  public ValidatePage() {
+    super ("Validate Page Test");
+    myPrinterJob = PrinterJob.getPrinterJob();
+    myPageFormat = new PageFormat();
+    Paper p = new Paper();
+    p.setSize(28*72, 21.5 * 72);
+    myPageFormat.setPaper(p);
+    setLayout(new FlowLayout());
+    Panel pfp = new Panel();
+    pfp.setLayout (new GridLayout (9, 1, 0, 0));
+    pfp.add (myOrientationLabel = new Label());
+    pfp.add (myWidthLabel = new Label());
+    pfp.add (myImageableXLabel = new Label());
+    pfp.add (myImageableRightLabel = new Label());
+    pfp.add (myImageableWidthLabel = new Label());
+    pfp.add (myHeightLabel = new Label());
+    pfp.add (myImageableYLabel = new Label());
+    pfp.add (myImageableBottomLabel = new Label());
+    pfp.add (myImageableHeightLabel = new Label());
+
+    add(pfp);
+
+    Panel pp = new Panel();
+    pp.setLayout (new GridLayout (8, 1, 0, 0));
+    pp.add (pw = new Label());
+    pp.add (pglm = new Label());
+    pp.add (pgtm = new Label());
+    pp.add (ph = new Label());
+    pp.add (pgiw = new Label());
+    pp.add (pgih = new Label());
+    pp.add (pgrm = new Label());
+    pp.add (pgbm = new Label());
+  
+    add(pp);
+
+    Panel epp = new Panel();
+    epp.setLayout (new GridLayout (6, 2, 0, 0));
+
+    epp.add(new Label("Page width:"));
+    epp.add (tpw = new TextField());
+    epp.add(new Label("Page height:"));
+    epp.add (tph = new TextField());
+    epp.add(new Label("Left Margin:"));
+    epp.add (tpglm = new TextField());
+    epp.add(new Label("Top margin:"));
+    epp.add (tpgtm = new TextField());  
+    epp.add(new Label("Imageable Wid:"));
+    epp.add (tpgiw = new TextField());
+    epp.add(new Label("Imageable Hgt:"));
+    epp.add (tpgih = new TextField());
+    
+    add(epp);
+       displayPageFormatAttributes();
+
+    Panel panel = new Panel();
+    Button defButton = new Button ("Default Page");
+    defButton.addActionListener(new ActionListener() {
+    		public void actionPerformed (ActionEvent e) {
+    			myPageFormat = myPrinterJob.defaultPage();
+    			displayPageFormatAttributes();
+		}
+    });
+
+    Button pageButton = new Button ("Page Setup..");
+    pageButton.addActionListener(new ActionListener() {
+    		public void actionPerformed (ActionEvent e) {
+    			myPageFormat = myPrinterJob.pageDialog (myPageFormat);
+    			displayPageFormatAttributes();
+		}
+    });
+    Button printButton = new Button ("Print");
+    printButton.addActionListener(new ActionListener() {
+    		public void actionPerformed (ActionEvent e) {
+                    try {
+                         //if (myPrinterJob.printDialog()) {
+                             myPrinterJob.setPrintable(ValidatePage.this,
+                                                       myPageFormat);
+                             myPrinterJob.print();
+                   // }
+                    } catch (PrinterException pe ) { 
+                    }
+		}
+    });
+    
+    Button chooseButton = new Button ("Printer..");
+    chooseButton.addActionListener(new ActionListener() {
+    		public void actionPerformed (ActionEvent e) {
+                            myPrinterJob.printDialog();  
+		}
+    });
+
+    Button validateButton = new Button ("Validate Page");
+    validateButton.addActionListener(new ActionListener() {
+    		public void actionPerformed (ActionEvent e) {
+    			myPageFormat = myPrinterJob.validatePage(myPageFormat);
+    			displayPageFormatAttributes();
+		}
+    });
+    Button setButton = new Button ("Set Paper");
+    setButton.addActionListener(new ActionListener() {
+    		public void actionPerformed (ActionEvent e) {
+                  try {
+                      Paper p = new Paper();
+                      double pwid = Double.parseDouble(tpw.getText());
+                      double phgt = Double.parseDouble(tph.getText());
+                      double pimx = Double.parseDouble(tpglm.getText());
+                      double pimy = Double.parseDouble(tpgtm.getText());
+                      double pimwid = Double.parseDouble(tpgiw.getText());
+                      double pimhgt = Double.parseDouble(tpgih.getText());
+                      p.setSize(pwid, phgt);
+                      p.setImageableArea(pimx, pimy, pimwid, pimhgt);
+                      myPageFormat.setPaper(p);
+    			    displayPageFormatAttributes();
+                  } catch (NumberFormatException nfe) {
+                  }
+		}
+    });
+    panel.add (setButton);
+    panel.add (defButton);
+    panel.add (pageButton);
+    panel.add (chooseButton);
+    panel.add (validateButton);
+    panel.add (printButton);
+    add(panel);
+    TextArea ta = new TextArea(7, 60);
+    String ls = System.getProperty("line.Separator", "\n");
+    ta.setText(
+        "When validating a page, the process is 1st to find the closest matching " + ls +
+        "paper size, next to make sure the requested imageable area fits within " + ls +
+        "the printer's imageable area for that paper size. Finally the top and " + ls +
+        "left margins will be shrunk if they are too great for the adjusted " + ls +
+        "imageable area to fit at that position. They will shrink by the minimum" + ls +
+        "needed to accomodate the imageable area."+ls+ls+
+        "To test 6229507, put the minimum margins (all 0s) in Page Setup dialog."+ls+
+	"Compare Imageable width, height, and margins of portrait against landscape.");
+    ta.setEditable(false);
+    add(ta);
+
+    addWindowListener (new WindowAdapter() {
+         public void windowClosing (WindowEvent e) {
+            dispose();
+            System.exit (0);
+         }
+       
+      });
+      setSize (500, 630);
+      setVisible (true);
+  } 
+
+  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
+
+     if (pageIndex > 0) {
+        return Printable.NO_SUCH_PAGE;
+     }
+
+     Graphics2D g2d = (Graphics2D)graphics;
+
+    int o = pageFormat.getOrientation();
+
+     System.out.println("Format Orientation = " +
+    		(o == PageFormat.PORTRAIT ? "PORTRAIT" :
+    		 o == PageFormat.LANDSCAPE ? "LANDSCAPE" :
+    		 o == PageFormat.REVERSE_LANDSCAPE ? "REVERSE_LANDSCAPE" :
+    		 "<invalid>"));
+     System.out.println(g2d.getTransform());
+     System.out.println("ix="+pageFormat.getImageableX()+
+                       " iy="+pageFormat.getImageableY());
+     g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
+     g2d.drawString("ORIGIN", 20, 20);
+     g2d.drawString("X THIS WAY", 200, 50);
+     g2d.drawString("Y THIS WAY", 60 , 200);
+     g2d.drawRect(0,0,(int)pageFormat.getImageableWidth(),
+                      (int)pageFormat.getImageableHeight());
+     g2d.setColor(Color.blue);
+     g2d.drawRect(1,1,(int)pageFormat.getImageableWidth()-2,
+                      (int)pageFormat.getImageableHeight()-2);
+
+     return  Printable.PAGE_EXISTS;
+  }
+
+  public static void main( String[] args) {
+  String[] instructions =
+        {
+         "You must have a printer available to perform this test",
+         "This test is very flexible and requires much interaction.",
+	 "There are several buttons.",
+	 "Set Paper: if all fields are valid numbers it sets the Paper object.",
+	 "This is used to create arbitrary nonsensical paper sizes to help", 
+	 "test validatePage.",
+	 "Default Page: sets a default page. This should always be valid.",
+	 "Page Setup: brings up the page dialog. You must OK this dialog",
+	 "for it to have any effect. You can use this to set different size,",
+	 "orientation and margins - which of course affect imageable area.",
+	 "Printer: Used to set the current printer. Useful because current",
+         "printer affects the choice of paper sizes available.",
+         "You must OK this dialog for it to have any effect.",
+	 "Validate Page:",
+         "The most important button in the test. By setting nonsensical",
+	 "or valid papers with varying margins etc, this should always find",
+         "the closest",
+	 "match within the limits of what is possible on the current printer.",
+	 "Print: to the current printer. Not vital for this test.",
+         "request."
+       };
+      Sysout.createDialog( );
+      Sysout.printInstructions( instructions );
+
+     new ValidatePage();
+  }
+
+}
+
+class Sysout {
+   private static TestDialog dialog;
+
+   public static void createDialogWithInstructions( String[] instructions )
+    {
+      dialog = new TestDialog( new Frame(), "Instructions" );
+      dialog.printInstructions( instructions );
+      dialog.show();
+      println( "Any messages for the tester will display here." );
+    }
+
+   public static void createDialog( )
+    {
+      dialog = new TestDialog( new Frame(), "Instructions" );
+      String[] defInstr = { "Instructions will appear here. ", "" } ;
+      dialog.printInstructions( defInstr );
+      dialog.show();
+      println( "Any messages for the tester will display here." );
+    }
+
+
+   public static void printInstructions( String[] instructions )
+    {
+      dialog.printInstructions( instructions );
+    }
+
+
+   public static void println( String messageIn )
+    {
+      dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog {
+
+   TextArea instructionsText;
+   TextArea messageText;
+   int maxStringLength = 80;
+
+   //DO NOT call this directly, go through Sysout
+   public TestDialog( Frame frame, String name )
+    {
+      super( frame, name );
+      int scrollBoth = TextArea.SCROLLBARS_BOTH;
+      instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+      add( "North", instructionsText );
+
+      messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+      add("Center", messageText);
+
+      pack();
+
+      show();
+    }// TestDialog()
+
+   //DO NOT call this directly, go through Sysout
+   public void printInstructions( String[] instructions )
+    {
+      //Clear out any current instructions
+      instructionsText.setText( "" );
+
+      //Go down array of instruction strings
+
+      String printStr, remainingStr;
+      for( int i=0; i < instructions.length; i++ )
+       {
+         //chop up each into pieces maxSringLength long
+         remainingStr = instructions[ i ];
+         while( remainingStr.length() > 0 )
+          {
+            //if longer than max then chop off first max chars to print
+            if( remainingStr.length() >= maxStringLength )
+             {
+               //Try to chop on a word boundary
+               int posOfSpace = remainingStr.
+                  lastIndexOf( ' ', maxStringLength - 1 );
+
+               if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+               printStr = remainingStr.substring( 0, posOfSpace + 1 );
+               remainingStr = remainingStr.substring( posOfSpace + 1 );
+             }
+            //else just print
+            else
+             {
+               printStr = remainingStr;
+               remainingStr = "";
+             }
+
+            instructionsText.append( printStr + "\n" );
+
+          }// while
+
+       }// for
+
+    }//printInstructions()
+
+   //DO NOT call this directly, go through Sysout
+   public void displayMessage( String messageIn )
+    {
+      messageText.append( messageIn + "\n" );
+    }
+
+ }// TestDialog  class
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/regtesthelpers/AbstractTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * <p>This is the base class for automatic main tests.
+ * <p>When using jtreg you would include this class into 
+ * the build list via something like:
+ * <pre>
+     @library ../../../regtesthelpers
+     @build AbstractTest
+     @run main YourTest
+   </pre>
+ * Note that if you are about to create a test based on
+ * Applet-template, then put those lines into html-file, not in java-file.
+ * <p> And put an 
+ * import test.java.awt.regtesthelpers.AbstractTest;
+ * into the java source.
+ */
+
+package test.java.awt.regtesthelpers;
+
+public abstract class AbstractTest
+{
+    public static void pass()
+    {
+        Sysout.println( "The test passed." );
+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
+    }//pass()
+
+    public static void fail()
+    {
+        //test writer didn't specify why test failed, so give generic
+        fail("no reason given.");
+    }
+
+    public static void fail( String whyFailed )
+    {
+        Sysout.println( "The test failed: " + whyFailed );
+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
+        throw new RuntimeException( whyFailed );
+    }
+
+    public static void fail(Exception ex) throws Exception
+    {
+        Sysout.println( "The test failed with exception:" );
+        ex.printStackTrace();
+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
+        throw ex;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/regtesthelpers/Sysout.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+   This class creates a dialog (with the instructions) and is the interface
+   for sending text messages to the user.
+   To print the instructions, send an array of strings to 
+   Sysout.createDialogWithInstructions() method.  
+   Put one line of instructions per array entry.
+   To display a message for the tester to see, simply call Sysout.println()
+   with the string to be displayed.
+   This mimics System.out.println but works within the test harness as well 
+   as standalone.
+   @build TestDialog
+ */
+package test.java.awt.regtesthelpers;
+
+import java.awt.*;
+
+public final class Sysout 
+{ 
+    private static TestDialog dialog;
+
+    public static void createDefaultInstructionDialog() 
+    {
+        final String[] instructions = 
+        {
+            "This is an AUTOMATIC test, simply wait until it is done.",
+            "The result (passed or failed) will be shown in the",
+            "message window below."
+        };
+        Sysout.createDialogWithInstructions(instructions);
+    }
+
+    public static void createDialogWithInstructions( String[] instructions )
+    {
+        dialog = new TestDialog(null, "Instructions" );
+        dialog.printInstructions( instructions );
+        dialog.setVisible(true);
+        println( "Any messages for the tester will display here." );
+    }
+   
+    public static void createDialog( )
+    {
+        String[] defInstr = { "Instructions will appear here. ", 
+                              "", 
+                              "Any messages for the tester will display here." } ;
+        createDialogWithInstructions(defInstr);
+    }
+   
+      
+    public static void printInstructions( String[] instructions )
+    {
+        dialog.printInstructions( instructions );
+    }
+
+
+    public static void println( String messageIn )
+    {
+        if (dialog != null){
+            dialog.displayMessage( messageIn );
+        }
+        System.out.println(messageIn);
+    }
+}// Sysout  class
+
+/**
+  This class provides a place for the
+  test instructions to be displayed, and a place for interactive messages
+  to the user to be displayed.
+  To have the test instructions displayed, see Sysout class.
+  To have a message to the user be displayed, see Sysout class.
+*/
+
+final class TestDialog extends Dialog
+{
+
+    private TextArea instructionsText;
+    private TextArea messageText;
+    private int maxStringLength = 80;
+
+    public TestDialog( Frame frame, String name ) 
+    {
+        super( frame, name );
+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+        add( "North", instructionsText );
+      
+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+        add("Center", messageText);
+      
+        pack();
+      
+        setVisible(true);
+    }// TestDialog()
+
+    public void printInstructions( String[] instructions )
+    {
+        //Clear out any current instructions
+        instructionsText.setText( "" );
+
+        //Go down array of instruction strings
+
+        String printStr, remainingStr;
+        for( int i=0; i < instructions.length; i++ )
+        { 
+            //chop up each into pieces maxSringLength long
+            remainingStr = instructions[ i ];
+            while( remainingStr.length() > 0 )
+            {
+                //if longer than max then chop off first max chars to print
+                if( remainingStr.length() >= maxStringLength )
+                {
+                    //Try to chop on a word boundary
+                    int posOfSpace = remainingStr.
+                        lastIndexOf( ' ', maxStringLength - 1 );
+               
+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+               
+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
+                }
+                //else just print
+                else 
+                { 
+                    printStr = remainingStr;
+                    remainingStr = "";
+                }
+            
+                instructionsText.append( printStr + "\n" );
+            
+            }// while
+         
+        }// for
+      
+    }//printInstructions()
+
+    public void displayMessage( String messageIn )
+    {
+        messageText.append( messageIn + "\n" );
+    }  
+}// TestDialog  class    
--- a/j2se/test/java/awt/regtesthelpers/Util.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/java/awt/regtesthelpers/Util.java	Fri Jun 22 00:46:43 2007 +0000
@@ -24,21 +24,25 @@
 package test.java.awt.regtesthelpers;
 /**
  * <p>This class contains utilities useful for regression testing.
- * <p>When using jtreg you would include this class via something like:
+ * <p>When using jtreg you would include this class into the build 
+ * list via something like:
  * <pre>
      @library ../../../regtesthelpers
      @build Util
      @run main YourTest
    </pre>
+ * Note that if you are about to create a test based on 
+ * Applet-template, then put those lines into html-file, not in java-file.
  * <p> And put an 
  * import test.java.awt.regtesthelpers.Util;
- * into the test.
+ * into the java source of test.
 */
 
 import java.awt.Component;
 import java.awt.Frame;
 import java.awt.Dialog;
 import java.awt.Window;
+import java.awt.Button;
 import java.awt.Point;
 import java.awt.Dimension;
 import java.awt.Rectangle;
@@ -46,11 +50,17 @@
 import java.awt.Toolkit;
 import java.awt.IllegalComponentStateException;
 import java.awt.AWTException;
+import java.awt.AWTEvent;
 
 import java.awt.event.InputEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
 import java.awt.event.WindowListener;
+import java.awt.event.WindowFocusListener;
+import java.awt.event.FocusListener;
+import java.awt.event.ActionListener;
 
 import java.awt.peer.FramePeer;
 
@@ -116,8 +126,9 @@
     public static void clickOnComp(final Component comp, final Robot robot) {
         Rectangle bounds = new Rectangle(comp.getLocationOnScreen(), comp.getSize());
         robot.mouseMove(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2);
+        robot.delay(50);
         robot.mousePress(InputEvent.BUTTON1_MASK);
-        robot.delay(10);
+        robot.delay(50);
         robot.mouseRelease(InputEvent.BUTTON1_MASK);
     }
 
@@ -131,9 +142,9 @@
         
         if (decoratedWindow instanceof Frame || decoratedWindow instanceof Dialog) {
             robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + (int)decoratedWindow.getInsets().top/2);
-            robot.delay(10);
+            robot.delay(50);
             robot.mousePress(InputEvent.BUTTON1_MASK);
-            robot.delay(10);
+            robot.delay(50);
             robot.mouseRelease(InputEvent.BUTTON1_MASK);
         }
     }
@@ -290,4 +301,195 @@
             }
         };
     }
+
+    /*
+     * The values directly map to the ones of
+     * sun.awt.X11.XWM & sun.awt.motif.MToolkit classes.
+     */
+    public final static int
+        UNDETERMINED_WM = 1,
+        NO_WM = 2,
+        OTHER_WM = 3,
+        OPENLOOK_WM = 4,
+        MOTIF_WM = 5,
+        CDE_WM = 6,
+        ENLIGHTEN_WM = 7,
+        KDE2_WM = 8,
+        SAWFISH_WM = 9,
+        ICE_WM = 10,
+        METACITY_WM = 11,
+        COMPIZ_WM = 12,
+        LG3D_WM = 13;
+
+    /*
+     * Returns -1 in case of not X Window or any problems.
+     */
+    public static int getWMID() {
+        Class clazz = null;
+        try {
+            if ("sun.awt.X11.XToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName())) {
+                clazz = Class.forName("sun.awt.X11.XWM");
+            } else if ("sun.awt.motif.MToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName())) {
+                clazz = Class.forName("sun.awt.motif.MToolkit");
+            }
+        } catch (ClassNotFoundException cnfe) {
+            cnfe.printStackTrace();
+        }
+        if (clazz == null) {
+            return -1;
+        }
+
+        try {
+            final Class _clazz = clazz;
+            Method m_getWMID = (Method)AccessController.doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        try {
+                            Method method = _clazz.getDeclaredMethod("getWMID", new Class[] {});
+                            if (method != null) {
+                                method.setAccessible(true);
+                            }
+                            return method;
+                        } catch (NoSuchMethodException e) {
+                            assert false;
+                        } catch (SecurityException e) {
+                            assert false;
+                        }
+                        return null;
+                    }
+                });
+            return ((Integer)m_getWMID.invoke(null, new Object[] {})).intValue();
+        } catch (IllegalAccessException iae) {
+            iae.printStackTrace();
+        } catch (InvocationTargetException ite) {
+            ite.printStackTrace();
+        }
+        return -1;
+    }
+
+
+    ////////////////////////////
+    // Some stuff to test focus.
+    ////////////////////////////
+
+    private static WindowGainedFocusListener wgfListener = new WindowGainedFocusListener();
+    private static FocusGainedListener fgListener = new FocusGainedListener();
+    private static ActionPerformedListener apListener = new ActionPerformedListener();
+
+    private abstract static class EventListener {
+        AtomicBoolean notifier = new AtomicBoolean(false);
+        Component comp;
+        boolean printEvent;
+
+        public void listen(Component comp, boolean printEvent) {
+            this.comp = comp;
+            this.printEvent = printEvent;
+            notifier.set(false);
+            setListener(comp);
+        }
+
+        public AtomicBoolean getNotifier() {
+            return notifier;
+        }
+
+        abstract void setListener(Component comp);
+
+        void printAndNotify(AWTEvent e) {
+            if (printEvent) {
+                System.err.println(e);
+            }
+            synchronized (notifier) {
+                notifier.set(true);
+                notifier.notifyAll();
+            }
+        }
+    }
+
+    private static class WindowGainedFocusListener extends EventListener implements WindowFocusListener {
+      
+        void setListener(Component comp) {
+            ((Window)comp).addWindowFocusListener(this);
+        }
+
+        public void windowGainedFocus(WindowEvent e) {
+
+            ((Window)comp).removeWindowFocusListener(this);
+            printAndNotify(e);
+        }
+
+        public void windowLostFocus(WindowEvent e) {}
+    }
+
+    private static class FocusGainedListener extends EventListener implements FocusListener {
+
+        void setListener(Component comp) {
+            comp.addFocusListener(this);
+        }
+
+        public void focusGained(FocusEvent e) {
+            comp.removeFocusListener(this);
+            printAndNotify(e);
+        }
+
+        public void focusLost(FocusEvent e) {}
+    }
+
+    private static class ActionPerformedListener extends EventListener implements ActionListener {
+
+        void setListener(Component comp) {
+            ((Button)comp).addActionListener(this);
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            ((Button)comp).removeActionListener(this);
+            printAndNotify(e);
+        }
+    }
+
+    private static boolean trackEvent(int eventID, Component comp, Runnable action, int time, boolean printEvent) {
+        EventListener listener = null;
+
+        switch (eventID) {
+        case WindowEvent.WINDOW_GAINED_FOCUS:
+            listener = wgfListener;
+            break;
+        case FocusEvent.FOCUS_GAINED:
+            listener = fgListener;
+            break;
+        case ActionEvent.ACTION_PERFORMED:
+            listener = apListener;
+            break;
+        }
+
+        listener.listen(comp, printEvent);
+        action.run();
+        return Util.waitForCondition(listener.getNotifier(), time);
+    }
+  
+    /*
+     * Tracks WINDOW_GAINED_FOCUS event for a window caused by an action.
+     * @param window the window to track the event for
+     * @param action the action to perform
+     * @param time the max time to wait for the event
+     * @param printEvent should the event received be printed or doesn't
+     * @return true if the event has been received, otherwise false
+     */
+    public static boolean trackWindowGainedFocus(Window window, Runnable action, int time, boolean printEvent) {
+        return trackEvent(WindowEvent.WINDOW_GAINED_FOCUS, window, action, time, printEvent);
+    }
+
+    /*
+     * Tracks FOCUS_GAINED event for a component caused by an action.
+     * @see #trackWindowGainedFocus
+     */
+    public static boolean trackFocusGained(Component comp, Runnable action, int time, boolean printEvent) {
+        return trackEvent(FocusEvent.FOCUS_GAINED, comp, action, time, printEvent);
+    }
+
+    /*
+     * Tracks ACTION_PERFORMED event for a button caused by an action.
+     * @see #trackWindowGainedFocus
+     */
+    public static boolean trackActionPerformed(Button button, Runnable action, int time, boolean printEvent) {
+        return trackEvent(ActionEvent.ACTION_PERFORMED, button, action, time, printEvent);
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/regtesthelpers/process/ProcessCommunicator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package test.java.awt.regtesthelpers.process;
+
+import java.io.*;
+
+/** This class is created to solve interprocess communication problems.
+ *  When you need to write a regression test which should verify inter jvm
+ *  behavior such as DnD data transfer, Clipboard data transfer, focus
+ *  transfer etc., you could use the next scenario:
+ *
+ *  1. Write an implementation for the parent JVM, using applet test.
+ *  2. Write an implimentation for the child JVM or native application, using
+ *     main() function.
+ *  3. Execute child process using  ProcessCommunicator.executeChildProcess()
+ *     method.
+ *  4. You can decide whetherthe test is passed on the basis of
+ *     ProcessResults class data.
+ *
+ *  Note: The class is not thread safe. You should access its methods only from the same
+ *        thread.
+ */
+
+public class ProcessCommunicator {
+
+    private static final String javaHome = System.getProperty("java.home", "");
+    private static final String javaPath = javaHome + File.separator + "bin" +
+            File.separator + "java ";
+    private static String command = "";
+
+    private ProcessCommunicator() {}
+
+    /** The same as {#link #executeChildProcess(Class,String)} except
+     *  the {@code classPathArgument} parameter. The class path
+     *  parameter is for the debug purposes
+     *
+     *  @param classToExecute is passed to the child JVM
+     *  @param classPathArguments class path for the child JVM
+     *  @param args arguments that will be passed to the executed class
+     *  @return results of the executed {@code Process} 
+     */
+    public static ProcessResults executeChildProcess(final Class classToExecute,
+                           final String classPathArguments, final String [] args)
+    {
+        try {
+            String command = buildCommand(classToExecute, classPathArguments, args);
+            Process process = Runtime.getRuntime().exec(command);
+            return doWaitFor(process);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /** Executes child {code Process}
+     *
+     * @param classToExecute class to be executed as a child java process
+     * @param args args to be passed in to the child process
+     * @return results of the executed {@code Process}
+     */
+    public static ProcessResults executeChildProcess(final Class classToExecute,
+                           final String [] args)
+    {
+        return executeChildProcess(classToExecute, " ", args);
+    }
+
+    /**
+     * Waits for a process and return its results.
+     * This is a workaround for <code>Process.waitFor()</code> never returning.
+     *
+     * @return results of the executed {@code Process}
+     */
+    private static ProcessResults doWaitFor(final Process p) {
+        ProcessResults pres = new ProcessResults();
+
+        final InputStream in;
+        final InputStream err;
+
+        try {
+            in = p.getInputStream();
+            err = p.getErrorStream();
+
+            boolean finished = false;
+
+            while (!finished) {
+                try {
+                    while (in.available() > 0) {
+                        pres.appendToStdOut((char)in.read());
+                    }
+                    while (err.available() > 0) {
+                        pres.appendToStdErr((char)err.read());
+                    }
+                    // Ask the process for its exitValue. If the process
+                    // is not finished, an IllegalThreadStateException
+                    // is thrown. If it is finished, we fall through and
+                    // the variable finished is set to true.
+                    pres.setExitValue(p.exitValue());
+                    finished  = true;
+                }
+                catch (IllegalThreadStateException e) {
+                    // Process is not finished yet;
+                    // Sleep a little to save on CPU cycles
+                    Thread.currentThread().sleep(500);
+                }
+            }
+            if (in != null) in.close();
+            if (err != null) err.close();
+        }
+        catch (Throwable e) {
+            System.err.println("doWaitFor(): unexpected exception");
+            e.printStackTrace();
+        }
+        return pres;
+    }
+
+    /** Builds command on the basis of the passed class name,
+     *  class path and arguments.
+     *
+     * @param classToExecute with class will be executed in the new JVM
+     * @param classPathArguments java class path (only for test purposes)
+     * @param args arguments for the new application. This could be used
+     *             to pass some information from the parnent to child JVM.
+     * @return command to execute the {@code Process}
+     */
+    private static String buildCommand(final Class classToExecute,
+                         final String classPathArguments, final String [] args)
+    {
+        StringBuilder commandBuilder = new StringBuilder();
+        commandBuilder.append(javaPath).append(classPathArguments).append(classToExecute.getName());
+        for (String argument:args) {
+            commandBuilder.append(" ").append(argument);
+        }
+        command = commandBuilder.toString();
+        return command;
+    }
+
+    /** Could be used for the debug purposes.
+     *
+      * @return command that was build to execute the child process
+     */
+    public static String getExecutionCommand () {
+        return command;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/awt/regtesthelpers/process/ProcessResults.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package test.java.awt.regtesthelpers.process;
+
+import java.io.PrintStream;
+
+/**
+ * The calss incapsulates process related information and methods to
+ * handle this information.
+ *
+ */
+
+public class ProcessResults {
+    private int exitValue;
+    private StringBuilder stdout;
+    private StringBuilder stderr;
+
+    public ProcessResults() {
+        exitValue = -1;
+        stdout = new StringBuilder();
+        stderr = new StringBuilder();
+    }
+
+    public synchronized int getExitValue () {
+        return exitValue;
+    }
+
+    public synchronized String getStdOut() {
+        return stdout.toString();
+    }
+
+   public synchronized String getStdErr() {
+        return stderr.toString();
+    }
+
+    /** Prints child process standart output into the desired PrintStream.
+     *
+     * @param printTo PrintStraem where output have to be redirected
+     */
+    public synchronized void printProcessStandartOutput(PrintStream printTo) {
+        if (stdout != null && stdout.length() > 0) {
+            printTo.println("========= Child VM System.out ========");
+            printTo.print(stdout);
+            printTo.println("======================================");
+        }
+    }
+
+    /** Prints child process error output into the desired PrintStream.
+     *
+     * @param printTo PrintStraem where output have to be redirected
+     */
+    public synchronized void printProcessErrorOutput(PrintStream printTo) {
+        if (stderr != null && stderr.length() > 0) {
+            printTo.println("========= Child VM System.err ========");
+            printTo.print(stderr);
+            printTo.println("======================================");
+        }
+    }
+
+    /**  Prints child process error output into the desired {@code PrintStream},
+     *   if child JVM error output contains any of the next words: "error",
+     *   "exception". We cannot be sure that the test is failed when stderr is
+     *   not empty, because in error stream could be written some debug information.
+     *
+     * @param err PrintStraem where output have to be redirected
+     */
+    public synchronized void verifyStdErr(PrintStream err) {
+        if (stderr != null && ((stderr.toString().toLowerCase().indexOf("error") != -1)
+                || (stderr.toString().toLowerCase().indexOf("exception") != -1)))
+        {
+            printProcessErrorOutput(err);
+            throw new RuntimeException("WARNING: Child process  error stream " +
+                    "is not empty!");
+        }
+    }
+
+    /**  Throws new RuntimeException if the child JVM returns not 0 value.
+     *
+     * @param err PrintStraem where output have to be redirected
+     */
+    public synchronized void verifyProcessExitValue(PrintStream err) {
+        if (exitValue != 0) {
+            throw new RuntimeException("Child process returns not 0 value!" +
+                    "Returned value is " + exitValue);
+        }
+    }
+
+    public void verifyProcessExecutionResults(PrintStream err) {
+        // the next functions are synchronized
+        verifyStdErr(err);
+        verifyProcessExitValue(err);
+    }
+
+    synchronized void appendToStdOut(char c) {
+        stdout.append(c);
+    }
+
+    synchronized void appendToStdErr(char c) {
+        stderr.append(c);
+    }
+
+    synchronized void setExitValue(int exitValue) {
+        this.exitValue = exitValue;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/lang/System/Available.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1998 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * This class tests to see if System.in.available starts
+ * with an appropriate value
+ *
+ * @test 1.3 07/05/18
+ * @bug 4104888
+ * @summary Test for System.in.available
+ */
+
+public class Available {
+    public static void main(String args[]) throws Exception {
+        int bytesAvailable = System.in.available();
+        if (bytesAvailable != 0)
+            throw new RuntimeException("System.in.available returned non-zero");
+        }
+}
--- a/j2se/test/java/lang/ref/SoftReference/Pin.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/java/lang/ref/SoftReference/Pin.java	Fri Jun 22 00:46:43 2007 +0000
@@ -21,7 +21,7 @@
  * have any questions.
  */
 
-/* @test 1.6 07/05/24
+/* @test 1.6 07/06/21
  * @bug 4076287
  * @summary Invoking get on a SoftReference shouldn't pin the referent
  * @run main/othervm -ms16m -mx16m Pin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/net/ProxySelector/B6563259.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.1 07/06/04
+ * @bug 6563259
+ * @summary incorrect handling when including uppercase letter in hostname
+ */
+
+import java.net.ProxySelector;
+import java.net.Proxy;
+import java.net.URI;
+
+public class B6563259 {
+    public static void main(String[] args) throws Exception {
+	System.setProperty("http.proxyHost", "myproxy");
+	System.setProperty("http.proxyPort", "8080");
+        System.setProperty("http.nonProxyHosts", "host1.*");
+        ProxySelector sel = ProxySelector.getDefault();
+        java.util.List<Proxy> l = sel.select(new URI("http://HOST1.sun.com/"));
+	if (l.get(0) != Proxy.NO_PROXY) {
+	    throw new RuntimeException("ProxySelector returned the wrong proxy");
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/net/URL/B6529759.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test 1.2 07/05/08
+ * @bug 6529759
+ * @summary URL constructor of specific form does not provide exception chaining
+ */
+
+import java.net.URL;
+
+public class B6529759 
+{
+    public static void main(String[] args) {
+	try {
+            new java.net.URL(null, "a:", new a());                   
+        } catch (Exception e) {
+	    if (e.getCause() == null) {
+		e.printStackTrace();
+		throw new RuntimeException("Failed: Exception has no cause");
+	    }
+        }
+    }
+
+    static class a extends java.net.URLStreamHandler {
+	protected java.net.URLConnection openConnection(java.net.URL u)  {
+	    throw new UnsupportedOperationException();
+	}
+
+ 	protected void parseURL(java.net.URL u, String spec, int start, int limit) {
+            throw new RuntimeException();
+    	}
+    }
+}
--- a/j2se/test/java/security/Security/signedfirst/Dyn.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/java/security/Security/signedfirst/Dyn.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -21,7 +21,7 @@
 # have any questions.
 #
 
-# @test 1.7 07/05/24
+# @test 1.7 07/06/21
 # @bug 4504355
 # @summary problems if signed crypto provider is the most preferred provider
 #
--- a/j2se/test/java/security/Security/signedfirst/Static.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/java/security/Security/signedfirst/Static.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -21,7 +21,7 @@
 # have any questions.
 #
 
-# @test 1.8 07/05/24
+# @test 1.8 07/06/21
 # @bug 4504355 4744260
 # @summary problems if signed crypto provider is the most preferred provider
 #
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/BitSet/MemoryLeak.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,56 @@
+/*
+ * Copyright 1997 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test 1.6 07/05/18
+ * @bug 4091185
+ * @summary Repeatedly OR BitSets; No OutOfMemoryException should result
+ */
+
+import java.util.*;
+
+/**
+ * This is a simple test class that repeatedly ORs two
+ * BitSets of unequal size together. Previously this
+ * caused an exponential growth in the memory underlying
+ * the BitSets quickly using all available memory
+ */
+public class MemoryLeak {
+
+   public static void main(String[] args) {
+
+        //create 2 test bitsets
+        BitSet setOne = new BitSet();
+        BitSet setTwo = new BitSet();
+
+        setOne.set(64);
+        setTwo.set(129);
+
+        //test for bug #4091185
+        //exponential set growth causing memory depletion
+        for (int i = 0; i < 50; i++) {
+            setOne.or(setTwo);
+            setTwo.or(setOne);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Currency/Bug4512215.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,68 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.4 04/06/07
+ * @bug 4512215 4818420 4819436
+ * @summary Updated currency data.
+ */
+
+import java.util.Currency;
+import java.util.Locale;
+
+public class Bug4512215 {
+
+    public static void main(String[] args) throws Exception {
+        testCurrencyDefined("XBD", -1);
+        testCountryCurrency("TJ", "TJS", 2);
+        testCountryCurrency("FO", "DKK", 2);
+        testCountryCurrency("FK", "FKP", 2);
+
+        testCountryCurrency("AF", "AFN", 2);	// changed from "AFA"
+
+        // Newsletter V-5 on ISO 3166-1 (2002-05-20)
+        testCountryCurrency("TL", "USD", 2);	// successor to TP/TPE
+
+        // Newsletter V-8 on ISO 3166-1 (2003-07-23)
+        testCountryCurrency("CS", "CSD", 2);	// successor to YU/YUM
+    }
+    
+    private static void testCountryCurrency(String country, String currencyCode,
+            int digits) {
+        testCurrencyDefined(currencyCode, digits);
+        Currency currency = Currency.getInstance(new Locale("", country));
+        if (!currency.getCurrencyCode().equals(currencyCode)) {
+            throw new RuntimeException("[" + country
+                    + "] expected: " + currencyCode
+                    + "; got: " + currency.getCurrencyCode());
+        }
+    }
+    
+    private static void testCurrencyDefined(String currencyCode, int digits) {
+	Currency currency = Currency.getInstance(currencyCode);
+        if (currency.getDefaultFractionDigits() != digits) {
+            throw new RuntimeException("[" + currencyCode
+                    + "] expected: " + digits
+                    + "; got: " + currency.getDefaultFractionDigits());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Currency/CheckDataVersion.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,79 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ * @(#)CheckDataVersion.java	1.2 07/04/06
+ *
+ * Check the consistency between the regression tests and the currency data in the JRE
+ */
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.security.*;
+
+class CheckDataVersion {
+    static final String datafile = "tablea1.txt";
+    static final String VERSIONKEY = "VERSION=";
+    static String version;
+    static boolean checked = false;
+
+    static void check() {
+        if (!checked) {
+            try {
+	        FileReader fr = new FileReader(new File(System.getProperty("test.src", "."), datafile));
+	        BufferedReader in = new BufferedReader(fr);
+	        String line;
+
+	        while ((line = in.readLine()) != null) {
+	            if (line.startsWith(VERSIONKEY)) {
+		        version = line.substring(VERSIONKEY.length());
+		        break;
+		    }
+	        }
+	    } catch (IOException ioe) {
+		throw new RuntimeException(ioe);
+	    }
+
+	    AccessController.doPrivileged(new PrivilegedAction<Object>() {
+		public Object run() {
+		    try {
+			Class curdata = Class.forName("java.util.CurrencyData");
+			Field f = curdata.getDeclaredField("version");
+			f.setAccessible(true);
+			String jreVersion = (String)f.get(null);
+			if (!version.equals(jreVersion)) {
+			    throw new RuntimeException("Test data and JRE's currency data are inconsistent.  test: "+version+" JRE: "+jreVersion);
+			}
+	    	    } catch (ClassNotFoundException cnfe) {
+			throw new RuntimeException(cnfe);
+	    	    } catch (NoSuchFieldException nsfe) {
+			throw new RuntimeException(nsfe);
+	    	    } catch (IllegalAccessException iae) {
+			throw new RuntimeException(iae);
+	    	    }    
+		    return null;
+		}
+	    });
+	    checked = true;
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Currency/CurrencyTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,236 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test @(#)CurrencyTest.java	1.12 07/04/06
+ * @bug 4290801 4693631 5101540 5104960 6296410 6336600 6371531 6466763
+ *    6488442
+ * @summary Basic tests for Currency class.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Currency;
+import java.util.GregorianCalendar;
+import java.util.Locale;
+import java.util.TimeZone;
+
+
+public class CurrencyTest {
+
+    public static void main(String[] args) throws Exception {
+        CheckDataVersion.check();
+        testCurrencyCodeValidation();
+        testLocaleMapping();
+        testSymbols();
+        testFractionDigits();
+        testSerialization();
+    }
+    
+    static void testCurrencyCodeValidation() {
+        // test creation of some valid currencies
+        testValidCurrency("USD");
+        testValidCurrency("EUR");
+        testValidCurrency("GBP");
+        testValidCurrency("JPY");
+        testValidCurrency("CNY");
+        testValidCurrency("CHF");
+        
+        // test creation of some fictitious currencies
+        testInvalidCurrency("AQD");
+        testInvalidCurrency("US$");
+        testInvalidCurrency("\u20AC");
+    }
+    
+    static void testValidCurrency(String currencyCode) {
+        Currency currency1 = Currency.getInstance(currencyCode);
+        Currency currency2 = Currency.getInstance(currencyCode);
+        if (currency1 != currency2) {
+            throw new RuntimeException("Didn't get same instance for same currency code");
+        }
+        if (!currency1.getCurrencyCode().equals(currencyCode)) {
+            throw new RuntimeException("Currency code changed");
+        }
+    }
+    
+    static void testInvalidCurrency(String currencyCode) {
+        boolean gotException = false;
+        try {
+            Currency currency = Currency.getInstance(currencyCode);
+        } catch (IllegalArgumentException e) {
+            gotException = true;
+        }
+        if (!gotException) {
+            throw new RuntimeException("didn't get specified exception");
+        }
+    }
+    
+    static void testLocaleMapping() {
+        // very basic test: most countries have their own currency, and then
+        // their currency code is an extension of their country code.
+        Locale[] locales = Locale.getAvailableLocales();
+        int goodCountries = 0;
+        int ownCurrencies = 0;
+        for (int i = 0; i < locales.length; i++) {
+            Locale locale = locales[i];
+            if (locale.getCountry().length() == 0) {
+                boolean gotException = false;
+                try {
+                    Currency.getInstance(locale);
+                } catch (IllegalArgumentException e) {
+                    gotException = true;
+                }
+                if (!gotException) {
+                    throw new RuntimeException("didn't get specified exception");
+                }
+            } else {
+                goodCountries++;
+                Currency currency = Currency.getInstance(locale);
+                if (currency.getCurrencyCode().indexOf(locale.getCountry()) == 0) {
+                    ownCurrencies++;
+                }
+            }
+        }
+        System.out.println("Countries tested: " + goodCountries +
+                ", own currencies: " + ownCurrencies);
+        if (ownCurrencies < (goodCountries / 2 + 1)) {
+            throw new RuntimeException("suspicious: not enough countries have their own currency.");
+        }
+        
+        // check a few countries that don't change their currencies too often
+        String[] country1 = {"US", "CA", "JP", "CN", "SG", "CH"};
+        String[] currency1 = {"USD", "CAD", "JPY", "CNY", "SGD", "CHF"};
+        for (int i = 0; i < country1.length; i++) {
+            checkCountryCurrency(country1[i], currency1[i]);
+        }
+
+        // check currency changes
+	String[] switchOverCtry = {"DE", "FR", "ES", "IT", "NL", "BE", "TR", "RO", "AZ", "MZ"};
+	String[] switchOverOld = {"DEM", "FRF", "ESP", "ITL", "NLG", "BEF", "TRL", "ROL", "AZM", "MZM"};
+	String[] switchOverNew = {"EUR", "EUR", "EUR", "EUR", "EUR", "EUR", "TRY", "RON", "AZN", "MZN"}; 
+	String[] switchOverTZ = {"Europe/Paris", "Europe/Paris", "Europe/Paris", "Europe/Paris",
+	                         "Europe/Paris", "Europe/Paris", "Asia/Istanbul", "Europe/Bucharest",
+                                 "Asia/Baku", "Africa/Maputo"};
+        int[] switchOverYear = {2002, 2002, 2002, 2002, 2002, 2002, 2005, 2005, 2006, 2006};
+        int[] switchOverMonth = {Calendar.JANUARY, Calendar.JANUARY, Calendar.JANUARY, Calendar.JANUARY,
+	                         Calendar.JANUARY, Calendar.JANUARY, Calendar.JANUARY, Calendar.JULY,
+				 Calendar.JANUARY, Calendar.JULY};
+        int[] switchOverDay = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+        for (int i = 0; i < switchOverCtry.length; i++) {
+            TimeZone.setDefault(TimeZone.getTimeZone(switchOverTZ[i]));
+            Calendar date = new GregorianCalendar(switchOverYear[i], switchOverMonth[i], switchOverDay[i]);
+            long switchOver = date.getTime().getTime();
+            boolean switchedOver = System.currentTimeMillis() >= switchOver;
+            checkCountryCurrency(switchOverCtry[i], switchedOver ? switchOverNew[i] : switchOverOld[i]);
+	}
+        
+        // check a country code which doesn't have a currency
+        checkCountryCurrency("AQ", null);
+        
+        // check an invalid country code
+        boolean gotException = false;
+        try {
+            Currency.getInstance(new Locale("", "EU"));
+        } catch (IllegalArgumentException e) {
+            gotException = true;
+        }
+        if (!gotException) {
+            throw new RuntimeException("didn't get specified exception.");
+        }
+    }
+    
+    static void checkCountryCurrency(String countryCode, String expected) {
+        Locale locale = new Locale("", countryCode);
+        Currency currency = Currency.getInstance(locale);
+        String code = (currency != null) ? currency.getCurrencyCode() : null;
+        if (!(expected == null ? code == null : expected.equals(code))) {
+            throw new RuntimeException("Wrong currency for " +
+                    locale.getDisplayCountry() +
+                    ": expected " + expected + ", got " + code);
+        }
+    }
+    
+    static void testSymbols() {
+        testSymbol("USD", Locale.US, "$");
+        testSymbol("EUR", Locale.GERMANY, "\u20AC");
+        testSymbol("USD", Locale.PRC, "USD");
+    }
+    
+    static void testSymbol(String currencyCode, Locale locale, String expectedSymbol) {
+        String symbol = Currency.getInstance(currencyCode).getSymbol(locale);
+        if (!symbol.equals(expectedSymbol)) {
+            throw new RuntimeException("Wrong symbol for currency " +
+                    currencyCode +": expected " + expectedSymbol +
+                    ", got " + symbol);
+        }
+    }
+    
+    static void testFractionDigits() {
+        testFractionDigits("USD", 2);
+        testFractionDigits("EUR", 2);
+        testFractionDigits("JPY", 0);
+        testFractionDigits("XDR", -1);
+
+        testFractionDigits("BHD", 3);
+        testFractionDigits("IQD", 3);
+        testFractionDigits("JOD", 3);
+        testFractionDigits("KWD", 3);
+        testFractionDigits("LYD", 3);
+        testFractionDigits("OMR", 3);
+        testFractionDigits("TND", 3);
+
+        // Turkish Lira
+        testFractionDigits("TRL", 0);
+        testFractionDigits("TRY", 2);
+    }
+    
+    static void testFractionDigits(String currencyCode, int expectedFractionDigits) {
+        int digits = Currency.getInstance(currencyCode).getDefaultFractionDigits();
+        if (digits != expectedFractionDigits) {
+            throw new RuntimeException("Wrong number of fraction digits for currency " +
+                    currencyCode +": expected " + expectedFractionDigits +
+                    ", got " + digits);
+        }
+    }
+    
+    static void testSerialization() throws Exception {
+        Currency currency1 = Currency.getInstance("DEM");
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oStream = new ObjectOutputStream(baos);
+        oStream.writeObject(currency1);
+        oStream.flush();
+        byte[] bytes = baos.toByteArray();
+        
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        ObjectInputStream iStream = new ObjectInputStream(bais);
+        Currency currency2 = (Currency) iStream.readObject();
+        
+        if (currency1 != currency2) {
+            throw new RuntimeException("serialization breaks class invariant");
+        }
+    }       
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Currency/ValidateISO4217.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,252 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.7 07/04/12
+ * @bug 4819436 4942982 5104960 6544471
+ * @summary Validate ISO 4217 data for Currency class.
+ */
+
+/*
+ * ############################################################################
+ * 
+ *  ValidateISO4217 is a tool to detect differences between the latest ISO 4217
+ *  data and and Java's currency data which is based on ISO 4217.
+ *  If there is a difference, the following file which includes currency data
+ *  may need to be updated.
+ *      src/share/classes/java/util/CurrencyData.properties
+ *
+ * ############################################################################
+ *
+ * 1) Make a golden-data file.
+ *      From BSi's ISO4217 data (TABLE A1.doc), extract three (or five, if currency is changing)
+ *      fields and save as ./tablea1.txt.
+ *	  <Country code>\t<Currency code>\t<Minor unit>[\t<Cutover Date>\t<new Currency code>\t<new Minor unit>]
+ *      The Cutover Date is given in SimpleDateFormat's 'yyyy-MM-dd-HH-mm-ss' format in the GMT time zone.
+ *
+ * 2) Compile ValidateISO4217.java
+ *
+ * 3) Execute ValidateISO4217 as follows:
+ *      java ValidateISO4217
+ */
+
+import java.io.*;
+import java.text.*;
+import java.util.*;
+
+public class ValidateISO4217 {
+
+    static final int ALPHA_NUM = 26;
+
+    static final byte UNDEFINED = 0;
+    static final byte DEFINED = 1;
+    static final byte SKIPPED = 2;
+
+    /* input files */
+    static final String datafile = "tablea1.txt";
+
+    /* alpha2-code table */
+    static byte[] codes = new byte[ALPHA_NUM * ALPHA_NUM];
+
+    static final String[][] additionalCodes = {
+	/* Defined in ISO 4217 list, but don't have code and minor unit info. */
+	{"AQ", "", "0"},	// Antarctica
+
+	/*
+	 * Defined in ISO 4217 list, but don't have code and minor unit info in
+	 * it. On the othe hand, both code and minor unit are defined in
+	 * .properties file. I don't know why, though.
+	 */
+	{"GS", "GBP", "2"},	// South Georgia And The South Sandwich Islands
+
+	/* Not defined in ISO 4217 list, but defined in .properties file. */
+	{"PS", "ILS", "2"},	// Palestinian Territory, Occupied
+
+	/* Not defined in ISO 4217 list, but added in ISO 3166 country code list */
+	{"JE", "GBP", "2"},	// Jersey
+	{"GG", "GBP", "2"},	// Guernsey
+	{"IM", "GBP", "2"},	// Isle of Man
+    };
+
+    static boolean err = false;
+
+    public static void main(String[] args) throws Exception {
+        CheckDataVersion.check();
+	test1();
+	test2();
+
+	if (err) {
+	    throw new RuntimeException("Failed: Validation ISO 4217 data");
+	}
+    }
+
+    static void test1() throws Exception {
+
+	FileReader fr = new FileReader(new File(System.getProperty("test.src", "."), datafile));
+	BufferedReader in = new BufferedReader(fr);
+	String line;
+        SimpleDateFormat format = null;
+
+	while ((line = in.readLine()) != null) {
+	    if (line.length() == 0 || line.charAt(0) == '#') {
+		continue;
+	    }
+
+	    StringTokenizer tokens = new StringTokenizer(line, "\t");
+	    String country = tokens.nextToken();
+	    if (country.length() != 2) {
+	        continue;
+	    }
+
+	    String currency;
+	    String minorUnit;
+            int tokensCount = tokens.countTokens();
+	    if (tokensCount < 2) {
+		currency = "";
+		minorUnit = "0";
+	    } else {
+		currency = tokens.nextToken();
+		minorUnit = tokens.nextToken();
+
+                // check for the cutover
+                if (tokensCount > 2) {
+                    if (format == null) {
+                        format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.US);
+                        format.setTimeZone(TimeZone.getTimeZone("GMT"));
+                        format.setLenient(false);
+                    }
+                    if (format.parse(tokens.nextToken()).getTime() <
+                        System.currentTimeMillis()) {
+                        currency = tokens.nextToken();
+                        minorUnit = tokens.nextToken();
+                    }
+                }
+	    }
+	    int index = toIndex(country);
+	    testCountryCurrency(country, currency, Integer.parseInt(minorUnit),
+		index);
+	}
+	in.close();
+
+	for (int i = 0; i < additionalCodes.length; i++) {
+	    int index = toIndex(additionalCodes[i][0]);
+	    if (additionalCodes[i][1].length() != 0) {
+		testCountryCurrency(additionalCodes[i][0], additionalCodes[i][1],
+		    Integer.parseInt(additionalCodes[i][2]), index);
+	    } else {
+		codes[index] = SKIPPED;
+	    }
+	}
+    }
+
+    static int toIndex(String s) {
+	return ((s.charAt(0) - 'A') * ALPHA_NUM + s.charAt(1) - 'A');
+    }
+
+    static void testCountryCurrency(String country, String currencyCode, int digits, int index) {
+	if (currencyCode.length() == 0) {
+	    return;
+	}
+	testCurrencyDefined(currencyCode, digits);
+
+	Locale loc = new Locale("", country);
+	try {
+	    Currency currency = Currency.getInstance(loc);
+	    if (!currency.getCurrencyCode().equals(currencyCode)) {
+		System.err.println("Error: [" + country + ":" +
+		    loc.getDisplayCountry() + "] expected: " + currencyCode +
+		    ", got: " + currency.getCurrencyCode());
+		err = true;
+	    }
+
+	    if (codes[index] != UNDEFINED) {
+		System.out.println("Warning: [" + country + ":" +
+		    loc.getDisplayCountry() +
+		    "] multiple definitions. currency code=" + currencyCode);
+	    }
+	    codes[index] = DEFINED;
+	}
+	catch (Exception e) {
+	    System.err.println("Error: " + e + ": Country=" + country);
+	    err = true;
+	}
+    }
+
+    static void testCurrencyDefined(String currencyCode, int digits) {
+	try {
+	    Currency currency = currency = Currency.getInstance(currencyCode);
+
+	    if (currency.getDefaultFractionDigits() != digits) {
+		System.err.println("Error: [" + currencyCode + "] expected: " +
+		    digits + "; got: " + currency.getDefaultFractionDigits());
+		err = true;
+	    }
+	}
+	catch (Exception e) {
+	    System.err.println("Error: " + e + ": Currency code=" +
+		currencyCode);
+	    err = true;
+	}
+    }
+
+    static void test2() {
+	for (int i = 0; i < ALPHA_NUM; i++) {
+	    for (int j = 0; j < ALPHA_NUM; j++) {
+		char[] code = new char[2];
+		code[0] = (char)('A'+ i);
+		code[1] = (char)('A'+ j);
+		String country = new String(code);
+		boolean ex;
+
+		if (codes[toIndex(country)] == UNDEFINED) {
+		    ex = false;
+		    try {
+			Currency.getInstance(new Locale("", country));
+		    }
+		    catch (IllegalArgumentException e) {
+			ex = true;
+		    }
+		    if (!ex) {
+			System.err.println("Error: This should be an undefined code and throw IllegalArgumentException: " +
+			    country);
+			err = true;
+		    }
+		} else if (codes[toIndex(country)] == SKIPPED) {
+		    Currency cur = null;
+		    try {
+			cur = Currency.getInstance(new Locale("", country));
+		    }
+		    catch (Exception e) {
+			System.err.println("Error: " + e + ": Country=" +
+			    country);
+			err = true;
+		    }
+		    if (cur != null) {
+			System.err.println("Error: Currency.getInstance() for an this locale should return null: " +
+			    country);
+			err = true;
+		    }
+		}
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Currency/tablea1.txt	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,266 @@
+#
+# Based on BSi's ISO4217 data - "TABLE A1.doc" + amendments up until MA134.doc
+#   (As of 25 October 2006)
+#
+
+# Version
+VERSION=134
+
+# ISO 4217 currency data
+AF	AFN	2
+AL	ALL	2
+DZ	DZD	2
+AS	USD	2
+AD	EUR	2
+AO	AOA	2
+AI	XCD	2
+AQ		
+AG	XCD	2
+AR	ARS	2
+AM	AMD	2
+AW	AWG	2
+AU	AUD	2
+AT	EUR	2
+AZ	AZM	2	2005-12-31-20-00-00	AZN	2
+AX	EUR	2
+BS	BSD	2
+BH	BHD	3
+BD	BDT	2
+BB	BBD	2
+BY	BYR	0
+BE	EUR	2
+BZ	BZD	2
+BJ	XOF	0
+BM	BMD	2
+#BT	INR	2
+BT	BTN	2
+BO	BOB	2
+#BO	BOV	2
+BA	BAM	2
+BW	BWP	2
+BV	NOK	2
+BR	BRL	2
+IO	USD	2
+BN	BND	2
+BG	BGN	2
+BF	XOF	0
+BI	BIF	0
+KH	KHR	2
+CM	XAF	0
+CA	CAD	2
+CV	CVE	2
+KY	KYD	2
+CF	XAF	0
+TD	XAF	0
+CL	CLP	0
+#CL	CLF	0
+CN	CNY	2
+CX	AUD	2
+CC	AUD	2
+CO	COP	2
+#CO	COU	2
+KM	KMF	0
+CG	XAF	0
+CD	CDF	2
+CK	NZD	2
+CR	CRC	2
+CI	XOF	0
+HR	HRK	2
+CU	CUP	2
+CY	CYP	2
+CZ	CZK	2
+DK	DKK	2
+DJ	DJF	0
+DM	XCD	2
+DO	DOP	2
+EC	USD	2
+EG	EGP	2
+SV	SVC	2
+#SV	USD	2
+GQ	XAF	0
+ER	ERN	2
+EE	EEK	2
+ET	ETB	2
+FK	FKP	2
+FO	DKK	2
+FJ	FJD	2
+FI	EUR	2
+FR	EUR	2
+GF	EUR	2
+PF	XPF	0
+TF	EUR	2
+GA	XAF	0
+GM	GMD	2
+GE	GEL	2
+DE	EUR	2
+GH	GHC	2
+GI	GIP	2
+GR	EUR	2
+GL	DKK	2
+GD	XCD	2
+GP	EUR	2
+GU	USD	2
+GT	GTQ	2
+GN	GNF	0
+#GW	GWP	2
+GW	XOF	0
+GY	GYD	2
+HT	HTG	2
+#HT	USD	2
+HM	AUD	2
+VA	EUR	2
+HN	HNL	2
+HK	HKD	2
+HU	HUF	2
+IS	ISK	2
+IN	INR	2
+ID	IDR	2
+IR	IRR	2
+IQ	IQD	3
+IE	EUR	2
+IL	ILS	2
+IT	EUR	2
+JM	JMD	2
+JP	JPY	0
+JO	JOD	3
+KZ	KZT	2
+KE	KES	2
+KI	AUD	2
+KP	KPW	2
+KR	KRW	0
+KW	KWD	3
+KG	KGS	2
+LA	LAK	2
+LV	LVL	2
+LB	LBP	2
+#LS	ZAR	2
+LS	LSL	2
+LR	LRD	2
+LY	LYD	3
+LI	CHF	2
+LT	LTL	2
+LU	EUR	2
+MO	MOP	2
+MK	MKD	2
+MG	MGA	2
+MW	MWK	2
+MY	MYR	2
+MV	MVR	2
+ML	XOF	0
+MT	MTL	2
+MH	USD	2
+MQ	EUR	2
+MR	MRO	2
+MU	MUR	2
+YT	EUR	2
+MX	MXN	2
+#MX	MXV	2
+FM	USD	2
+MD	MDL	2
+MC	EUR	2
+MN	MNT	2
+MS	XCD	2
+MA	MAD	2
+MZ	MZM	2	2006-06-30-22-00-00	MZN	2
+MM	MMK	2
+ME	EUR	2
+#NA	ZAR	2
+NA	NAD	2
+NR	AUD	2
+NP	NPR	2
+NL	EUR	2
+AN	ANG	2
+NC	XPF	0
+NZ	NZD	2
+NI	NIO	2
+NE	XOF	0
+NG	NGN	2
+NU	NZD	2
+NF	AUD	2
+MP	USD	2
+NO	NOK	2
+OM	OMR	3
+PK	PKR	2
+PW	USD	2
+PS		
+PA	PAB	2
+#PA	USD	2
+PG	PGK	2
+PY	PYG	0
+PE	PEN	2
+PH	PHP	2
+PN	NZD	2
+PL	PLN	2
+PT	EUR	2
+PR	USD	2
+QA	QAR	2
+RE	EUR	2
+RO	ROL	2	2005-06-30-21-00-00	RON	2
+#RU	RUR	2
+RU	RUB	2
+RW	RWF	0
+SH	SHP	2
+KN	XCD	2
+LC	XCD	2
+PM	EUR	2
+VC	XCD	2
+WS	WST	2
+SM	EUR	2
+ST	STD	2
+SA	SAR	2
+SN	XOF	0
+RS	RSD	2
+#CS	EUR	2
+CS	CSD	2
+SC	SCR	2
+SL	SLL	2
+SG	SGD	2
+SK	SKK	2
+SI	EUR	2
+SB	SBD	2
+SO	SOS	2
+ZA	ZAR	2
+GS		
+ES	EUR	2
+LK	LKR	2
+SD	SDD	2
+SR	SRD	2
+SJ	NOK	2
+SZ	SZL	2
+SE	SEK	2
+CH	CHF	2
+SY	SYP	2
+TW	TWD	2
+TJ	TJS	2
+TZ	TZS	2
+TH	THB	2
+TL	USD	2
+TG	XOF	0
+TK	NZD	2
+TO	TOP	2
+TT	TTD	2
+TN	TND	3
+TR	TRY	2
+TM	TMM	2
+TC	USD	2
+TV	AUD	2
+UG	UGX	2
+UA	UAH	2
+AE	AED	2
+GB	GBP	2
+US	USD	2
+#US	USS	2
+#US	USN	2
+UM	USD	2
+UY	UYU	2
+UZ	UZS	2
+VU	VUV	0
+VE	VEB	2
+VN	VND	2
+VG	USD	2
+VI	USD	2
+WF	XPF	0
+EH	MAD	2
+YE	YER	2
+ZM	ZMK	2
+ZW	ZWD	2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/Bug4152725.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,76 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 04/06/07
+ * @bug 4152725
+ * @summary Verify that the default locale can be specified from the
+ * command line.
+ * @run main/othervm -Duser.language=de -Duser.country=DE -Duser.variant=EURO
+ *      Bug4152725 de_DE_EURO
+ * @run main/othervm -Duser.language=ja -Duser.country= -Duser.variant=
+ *      Bug4152725 ja
+ * @run main/othervm -Duser.language=en -Duser.country=SG -Duser.variant=
+ *      Bug4152725 en_SG
+ * @run main/othervm -Duser.language= -Duser.country=DE -Duser.variant=EURO
+ *      Bug4152725 _DE_EURO
+ * @run main/othervm -Duser.language=ja -Duser.country= -Duser.variant=YOMI
+ *      Bug4152725 ja__YOMI
+ * @run main/othervm -Duser.language= -Duser.country= -Duser.variant=EURO
+ *      Bug4152725 __EURO
+ * @run main/othervm -Duser.language=de -Duser.region=DE_EURO
+ *      Bug4152725 de_DE_EURO
+ */
+
+import java.util.Locale;
+
+public class Bug4152725 {
+
+    public static void main(String[] args) {
+    
+        if (args.length != 1) {
+            throw new RuntimeException("expected locale needs to be specified");
+        }
+
+        Locale locale = Locale.getDefault();
+
+        // don't use Locale.toString - it's bogus
+        String language = locale.getLanguage();
+        String country = locale.getCountry();
+        String variant = locale.getVariant();
+        String localeID = null;
+        if (variant.length() > 0) {
+            localeID = language + "_" + country + "_" + variant;
+        } else if (country.length() > 0) {
+            localeID = language + "_" + country;
+        } else {
+            localeID = language;
+        }
+        
+        if (localeID.equals(args[0])) {
+            System.out.println("Correctly set from command line: " + localeID);
+        } else {
+            throw new RuntimeException("expected default locale: " + args[0]
+                    + ", actual default locale: " + localeID);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/Bug4175998Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,863 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test  1.9 07/04/06
+    @summary test ISO639-2 language codes
+    @compile -encoding ascii -source 1.4 -target 1.4 Bug4175998Test.java
+    @run main Bug4175998Test
+    @bug 4175998
+*/
+/*
+ * @(#)Bug4175998Test.java	1.9 07/04/06
+ *
+ * (C) Copyright IBM Corp. 1998 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.*;
+import java.io.*;
+
+/**
+ *  Bug4175998Test verifies that the following bug has been fixed:
+ *  Bug 4175998 - The java.util.Locale.getISO3Language() returns wrong result for a locale with 
+ *           language code 'ta'(Tamil).
+ */
+public class Bug4175998Test extends LocaleTestFmwk {
+    public static void main(String[] args) throws Exception {
+        new Bug4175998Test().run(args);
+        //generateTables();    //uncomment this to regenerate data tables
+    }
+
+    public void testIt() throws Exception {
+        boolean bad = false;
+        for (int i = 0; i < CODES.length; i++) {
+            final String[] localeCodes = CODES[i];
+            final Locale l = new Locale(localeCodes[0], "");
+            final String iso3 = l.getISO3Language();
+            if (!iso3.equals(localeCodes[1]) /*&& !iso3.equals(localeCodes[2])*/) {
+                logln("Locale("+l+") returned bad ISO3 language code."
+                        +"   Got '"+iso3+"' instead of '"+localeCodes[1]+"'"/*+" or '"+localeCodes[2]+"'"*/);
+                bad = true;
+            }
+        }
+        if (bad) {
+            errln("Bad ISO3 language codes detected.");
+        }
+    }
+
+     private static final String[][] CODES = {
+        {"pt","por","por"},
+        {"eu","eus","baq"},
+        {"ps","pus","pus"},
+        {"et","est","est"},
+        {"ka","kat","geo"},
+        {"es","spa","spa"},
+        {"eo","epo","epo"},
+        {"en","eng","eng"},
+        {"pl","pol","pol"},
+        {"el","ell","gre"},
+        {"uz","uzb","uzb"},
+        {"jv","jav","jav"},
+        {"ur","urd","urd"},
+        {"uk","ukr","ukr"},
+        {"ug","uig","uig"},
+        {"zu","zul","zul"},
+        {"ja","jpn","jpn"},
+        {"or","ori","ori"},
+        {"om","orm","orm"},
+        {"zh","zho","chi"},
+        {"tw","twi","twi"},
+        {"de","deu","ger"},
+        {"oc","oci","oci"},
+        {"za","zha","zha"},
+        {"tt","tat","tat"},
+        {"iu","iku","iku"},
+        {"ts","tso","tso"},
+        {"it","ita","ita"},
+        {"tr","tur","tur"},
+        {"da","dan","dan"},
+        {"is","isl","ice"},
+        {"to","ton","ton"},
+        {"tl","tgl","tgl"},
+        {"tk","tuk","tuk"},
+        {"ik","ipk","ipk"},
+        {"ti","tir","tir"},
+        {"th","tha","tha"},
+        {"tg","tgk","tgk"},
+        {"te","tel","tel"},
+        {"cy","cym","wel"},
+        {"ie","ile","ile"},
+        {"id","ind","ind"},
+        {"ta","tam","tam"},
+        {"ia","ina","ina"},
+        {"cs","ces","cze"},
+        {"yo","yor","yor"},
+        {"no","nor","nor"},
+        {"co","cos","cos"},
+        {"nl","nld","dut"},
+        {"yi","yid","yid"},
+        {"hy","hye","arm"},
+        {"sw","swa","swa"},
+        {"ne","nep","nep"},
+        {"sv","swe","swe"},
+        {"su","sun","sun"},
+        {"hu","hun","hun"},
+        {"na","nau","nau"},
+        {"sr","srp","scc"},
+        {"ca","cat","cat"},
+        {"sq","sqi","alb"},
+        {"hr","hrv","scr"},
+        {"so","som","som"},
+        {"sn","sna","sna"},
+        {"sm","smo","smo"},
+        {"sl","slv","slv"},
+        {"sk","slk","slo"},
+        {"si","sin","sin"},
+        {"hi","hin","hin"},
+        {"my","mya","bur"},
+        {"sd","snd","snd"},
+        {"he","heb","heb"},
+        {"sa","san","san"},
+        {"mt","mlt","mlt"},
+        {"ms","msa","may"},
+        {"ha","hau","hau"},
+        {"mr","mar","mar"},
+        {"br","bre","bre"},
+        {"mo","mol","mol"},
+        {"bo","bod","tib"},
+        {"mn","mon","mon"},
+        {"bn","ben","ben"},
+        {"ml","mal","mal"},
+        {"mk","mkd","mac"},
+        {"xh","xho","xho"},
+        {"mi","mri","mao"},
+        {"bi","bis","bis"},
+        {"bh","bih","bih"},
+        {"mg","mlg","mlg"},
+        {"bg","bul","bul"},
+        {"rw","kin","kin"},
+        {"be","bel","bel"},
+        {"ru","rus","rus"},
+        {"gu","guj","guj"},
+        {"ba","bak","bak"},
+        {"ro","ron","rum"},
+        {"rm","roh","roh"},
+        {"gn","grn","grn"},
+        {"az","aze","aze"},
+        {"ay","aym","aym"},
+        {"gd","gla","gla"},
+        {"lv","lav","lav"},
+        {"lt","lit","lit"},
+        {"ga","gle","gle"},
+        {"as","asm","asm"},
+        {"ar","ara","ara"},
+        {"wo","wol","wol"},
+        {"ln","lin","lin"},
+        {"am","amh","amh"},
+        {"fy","fry","fry"},
+        {"af","afr","afr"},
+        {"qu","que","que"},
+        {"ab","abk","abk"},
+        {"la","lat","lat"},
+        {"aa","aar","aar"},
+        {"fr","fra","fre"},
+        {"fo","fao","fao"},
+        {"fj","fij","fij"},
+        {"fi","fin","fin"},
+        {"ky","kir","kir"},
+        {"ku","kur","kur"},
+        {"fa","fas","per"},
+        {"ks","kas","kas"},
+        {"vo","vol","vol"},
+        {"ko","kor","kor"},
+        {"kn","kan","kan"},
+        {"kk","kaz","kaz"},
+        {"vi","vie","vie"},
+    };
+
+/*
+    The following code was used to generate the table above from the two ISO standards.
+    It matches the language names (not the codes) from both standards to associate
+    the two and three letter codes.
+
+    private static final String ISO639 = "d:\\temp\\iso639.txt";
+    private static final String ISO6392 = "d:\\temp\\iso-639-2.txt";
+    private static void generateTables() {
+        try {
+            BufferedReader ISO639File = new BufferedReader(new FileReader(ISO639));
+            Hashtable i639 = new Hashtable();
+            for (String line = ISO639File.readLine(); line != null; line = ISO639File.readLine()) {
+                if (!line.startsWith("#")) {
+                    final int ndx = line.indexOf(' ');
+                    final String arg1 = line.substring(0, ndx);
+                    final int ndx2 = line.indexOf(' ', ndx+1);
+                    final String arg2 = line.substring(ndx+1, ndx2 < 0 ? line.length() : ndx2);
+                    i639.put(arg1, arg2);
+                }
+            }
+            
+            BufferedReader ISO6392File = new BufferedReader(new FileReader(ISO6392));
+            Hashtable i6392 = new Hashtable();
+            for (String line = ISO6392File.readLine(); line != null; line = ISO6392File.readLine()) {
+                final int ndx = line.indexOf(' ');
+                final int ndx2 = line.indexOf(' ', ndx+1);
+                int ndx3 = line.indexOf(' ', ndx2+1);
+                if (ndx3 < 0) ndx3 = line.length();
+                final String arg1 = line.substring(0, ndx);
+                final String arg2 = line.substring(ndx+1, ndx2);
+                final String arg3 = line.substring(ndx2+1, ndx3);
+                i6392.put(arg3, new ISO6392Entry(arg1, arg2));
+            }
+            
+            Enumeration keys = i639.keys();
+            while (keys.hasMoreElements()) {
+                final Object key = keys.nextElement();
+                final Object name = i639.get(key);
+                final Object value = i6392.get(name);
+                
+                if (value != null) {
+                    System.out.print("{");
+                    System.out.print("\""+key+"\",");
+                    System.out.print(value);
+                    System.out.println("},");
+                }
+            }
+        } catch (Exception e) {
+            System.out.println(e);
+        }
+    }
+    
+    
+    private static final class ISO6392Entry {
+        public final String code;
+        public final String name;
+        public ISO6392Entry(String code, String name) {
+            this.code = code;
+            this.name = name;
+        }
+        public String toString() {
+            return "\""+code+"\",\""+name+"\"";
+        }
+
+    }
+*/    
+
+}
+
+/* 
+
+data from ftp://dkuug.dk on March 4, 1999
+verified by http://www.triacom.com/archive/iso639-2.en.html
+
+iso 639 data
+aa Afar
+ab Abkhazian
+af Afrikaans
+am Amharic
+ar Arabic
+as Assamese
+ay Aymara
+az Azerbaijani
+ba Bashkir
+be Belarussian
+bg Bulgarian
+bh Bihari
+bi Bislama
+bn Bengali
+bo Tibetan
+br Breton
+ca Catalan
+co Corsican
+cs Czech
+cy Welsh
+da Danish
+de German
+dz Bhutani
+el Greek
+en English
+eo Esperanto
+es Spanish
+et Estonian
+eu Basque
+fa Persian
+fi Finnish
+fj Fijian
+fo Faroese
+fr French
+fy Frisian
+ga Irish
+gd Gaelic
+gl Galician
+gn Guarani
+gu Gujarati
+ha Hausa
+he Hebrew
+hi Hindi
+hr Croatian
+hu Hungarian
+hy Armenian
+ia Interlingua
+id Indonesian
+ie Interlingue
+ik Inupiak
+is Icelandic
+it Italian
+iu Inuktitut
+ja Japanese
+jw Javanese
+ka Georgian
+kk Kazakh
+kl Greenlandic
+km Cambodian
+kn Kannada
+ko Korean
+ks Kashmiri
+ku Kurdish
+ky Kirghiz
+la Latin
+ln Lingala
+lo Laothian
+lt Lithuanian
+lv Latvian
+mg Malagasy
+mi Maori
+mk Macedonian
+ml Malayalam
+mn Mongolian
+mo Moldavian
+mr Marathi
+ms Malay
+mt Maltese
+my Burmese
+na Nauru
+ne Nepali
+nl Dutch
+no Norwegian
+oc Occitan
+om Oromo
+or Oriya
+pa Punjabi
+pl Polish
+ps Pushto
+pt Portuguese
+qu Quechua
+rm Raeto-Romance
+rn Kirundi
+ro Romanian
+ru Russian
+rw Kinyarwanda
+sa Sanskrit
+sd Sindhi
+sg Sangho
+sh Croatian (Serbo)
+si Sinhalese
+sk Slovak
+sl Slovenian
+sm Samoan
+sn Shona
+so Somali
+sq Albanian
+sr Serbian
+ss Siswati
+st Sesotho
+su Sundanese
+sv Swedish
+sw Swahili
+ta Tamil
+te Telugu
+tg Tajik
+th Thai
+ti Tigrinya
+tk Turkmen
+tl Tagalog
+tn Setswana
+to Tonga
+tr Turkish
+ts Tsonga
+tt Tatar
+tw Twi
+ug Uighur
+uk Ukrainian
+ur Urdu
+uz Uzbek
+vi Vietnamese
+vo Volapuk
+wo Wolof
+xh Xhosa
+yi Yiddish
+yo Yoruba
+za Zhuang
+zh Chinese
+zu Zulu
+
+ISO 639-2 data
+
+aar aar Afar
+abk abk Abkhazian
+ace ace Achinese
+ach ach Acoli
+ada ada Adangme
+afa afa Afro-Asiatic (Other)
+afh afh Afrihili
+afr afr Afrikaans
+aka aka Akan
+akk akk Akkadian
+ale ale Aleut
+alg alg Algonquian languages
+amh amh Amharic
+ang ang English-Old (ca. 450-1100)
+apa apa Apache languages
+ara ara Arabic
+arc arc Aramaic
+arn arn Araucanian
+arp arp Arapaho
+art art Artificial (Other)
+arw arw Arawak
+asm asm Assamese
+ath ath Athapascan languages
+aus aus Australian languages
+ava ava Avaric
+ave ave Avestan
+awa awa Awadhi
+aym aym Aymara
+aze aze Azerbaijani
+bad bad Banda
+bai bai Bamileke languages
+bak bak Bashkir
+bal bal Baluchi
+bam bam Bambara
+ban ban Balinese
+bas bas Basa
+bat bat Baltic (Other)
+bej bej Beja
+bel bel Belarussian
+bem bem Bemba
+ben ben Bengali
+ber ber Berber (Other)
+bho bho Bhojpuri
+bih bih Bihari
+bik bik Bikol
+bin bin Bini
+bis bis Bislama
+bla bla Siksika
+bnt bnt Bantu (Other)
+bod tib Tibetan
+bra bra Braj
+bre bre Breton
+btk btk Batak (Indonesia)
+bua bua Buriat
+bug bug Buginese
+bul bul Bulgarian
+cad cad Caddo
+cai cai Central-American-Indian (Other)
+car car Carib
+cat cat Catalan
+cau cau Caucasian (Other)
+ceb ceb Cebuano
+cel cel Celtic (Other)
+ces cze Czech
+cha cha Chamorro
+chb chb Chibcha
+che che Chechen
+chg chg Chagatai
+chk chk Chuukese
+chm chm Mari
+chn chn Chinook-jargon
+cho cho Choctaw
+chp chp Chipewyan
+chr chr Cherokee
+chu chu Church-Slavic
+chv chv Chuvash
+chy chy Cheyenne
+cmc cmc Chamic languages
+cop cop Coptic
+cor cor Cornish
+cos cos Corsican
+cpe cpe Creoles-and-pidgins-English-based (Other)
+cpf cpf Creoles-and-pidgins-French-based (Other)
+cpp cpp Creoles-and-pidgins-Portuguese-based (Other)
+cre cre Cree
+crp crp Creoles-and-pidgins (Other)
+cus cus Cushitic (Other)
+cym wel Welsh
+dak dak Dakota
+dan dan Danish
+day day Dayak
+del del Delaware
+den den Slave (Athapascan)
+deu ger German
+dgr dgr Dogrib
+din din Dinka
+div div Divehi
+doi doi Dogri
+dra dra Dravidian (Other)
+dua dua Duala
+dum dum Dutch-Middle (ca. 1050-1350)
+dyu dyu Dyula
+dzo dzo Dzongkha
+efi efi Efik
+egy egy Egyptian (Ancient)
+eka eka Ekajuk
+ell gre Greek Modern (post 1453)
+elx elx Elamite
+eng eng English
+enm enm English-Middle (1100-1500)
+epo epo Esperanto
+est est Estonian
+eus baq Basque
+ewe ewe Ewe
+ewo ewo Ewondo
+fan fan Fang
+fao fao Faroese
+fas per Persian
+fat fat Fanti
+fij fij Fijian
+fin fin Finnish
+fiu fiu Finno-Ugrian (Other)
+fon fon Fon
+fra fre French
+frm frm French-Middle (ca. 1400-1600)
+fro fro French-Old (842-ca. 1400)
+fry fry Frisian
+ful ful Fulah
+fur fur Friulian
+gaa gaa Ga
+gay gay Gayo
+gba gba Gbaya
+gem gem Germanic (Other)
+gez gez Geez
+gil gil Gilbertese
+gdh gae Gaelic
+gai iri Irish
+glg glg Gallegan
+glv glv Manx
+gmh gmh German-Middle High (ca. 1050-1500)
+goh goh German-Old High (ca. 750-1050)
+gon gon Gondi
+gor gor Gorontalo
+got got Gothic
+grb grb Grebo
+grc grc Greek-Ancient (to 1453)
+grn grn Guarani
+guj guj Gujarati
+gwi gwi Gwich'in
+hai hai Haida
+hau hau Hausa
+haw haw Hawaiian
+heb heb Hebrew
+her her Herero
+hil hil Hiligaynon
+him him Himachali
+hin hin Hindi
+hit hit Hittite
+hmn hmn Hmong
+hmo hmo Hiri Motu
+hrv scr Croatian
+hun hun Hungarian
+hup hup Hupa
+hye arm Armenian
+iba iba Iban
+ibo ibo Igbo
+ijo ijo Ijo
+iku iku Inuktitut
+ile ile Interlingue
+ilo ilo Iloko
+ina ina Interlingua (International Auxilary Language Association)
+inc inc Indic (Other)
+ind ind Indonesian
+ine ine Indo-European (Other)
+ipk ipk Inupiak
+ira ira Iranian (Other)
+iro iro Iroquoian languages
+isl ice Icelandic
+ita ita Italian
+jaw jav Javanese
+jpn jpn Japanese
+jpr jpr Judeo-Persian
+jrb jrb Judeo-Arabic
+kaa kaa Kara-Kalpak
+kab kab Kabyle
+kac kac Kachin
+kal kal Kalaallisut
+kam kam Kamba
+kan kan Kannada
+kar kar Karen
+kas kas Kashmiri
+kat geo Georgian
+kau kau Kanuri
+kaw kaw Kawi
+kaz kaz Kazakh
+kha kha Khasi
+khi khi Khoisan (Other)
+khm khm Khmer
+kho kho Khotanese
+kik kik Kikuyu
+kin kin Kinyarwanda
+kir kir Kirghiz
+kmb kmb Kimbundu
+kok kok Konkani
+kom kom Komi
+kon kon Kongo
+kor kor Korean
+kos kos Kosraean
+kpe kpe Kpelle
+kro kro Kru
+kru kru Kurukh
+kua kua Kuanyama
+kum kum Kumyk
+kur kur Kurdish
+kut kut Kutenai
+lad lad Ladino
+lah lah Lahnda
+lam lam Lamba
+lao lao Lao
+lat lat Latin
+lav lav Latvian
+lez lez Lezghian
+lin lin Lingala
+lit lit Lithuanian
+lol lol Mongo
+loz loz Lozi
+ltz ltz Letzeburgesch
+lua lua Luba-Lulua
+lub lub Luba-Katanga
+lug lug Ganda
+lui lui Luiseno
+lun lun Lunda
+luo luo Luo (Kenya and Tanzania)
+lus lus Lushai
+mad mad Madurese
+mag mag Magahi
+mah mah Marshall
+mai mai Maithili
+mak mak Makasar
+mal mal Malayalam
+man man Mandingo
+map map Austronesian (Other)
+mar mar Marathi
+mas mas Masai
+mdr mdr Mandar
+men men Mende
+mga mga Irish-Middle (900-1200)
+mic mic Micmac
+min min Minangkabau
+mis mis Miscellaneous languages
+mkd mac Macedonian
+mkh mkh Mon-Khmer (Other)
+mlg mlg Malagasy
+mlt mlt Maltese
+mni mni Manipuri
+mno mno Manobo languages
+moh moh Mohawk
+mol mol Moldavian
+mon mon Mongolian
+mos mos Mossi
+mri mao Maori
+msa may Malay
+mul mul Multiple languages
+mun mun Munda languages
+mus mus Creek
+mwr mwr Marwari
+mya bur Burmese
+myn myn Mayan languages
+nah nah Nahuatl
+nai nai North American Indian (Other)
+nau nau Nauru
+nav nav Navajo
+nbl nbl Ndebele, South
+nde nde Ndebele, North
+ndo ndo Ndonga
+nep nep Nepali
+new new Newari
+nia nia Nias
+nic nic Niger-Kordofanian (Other)
+niu niu Niuean
+nld dut Dutch
+non non Norse, Old
+nor nor Norwegian
+nso nso Sohto, Northern
+nub nub Nubian languages
+nya nya Nyanja
+nym nym Nyamwezi
+nyn nyn Nyankole
+nyo nyo Nyoro
+nzi nzi Nzima
+oci oci Occitan (post 1500)
+oji oji Ojibwa
+ori ori Oriya
+orm orm Oromo
+osa osa Osage
+oss oss Ossetic
+ota ota Turkish, Ottoman (1500-1928)
+oto oto Otomian languages
+paa paa Papuan (Other)
+pag pag Pangasinan
+pal pal Pahlavi
+pam pam Pampanga
+pan pan Panjabi
+pap pap Papiamento
+pau pau Palauan
+peo peo Persian, Old (ca. 600-400 B.C.)
+phi phi Philippine (Other)
+phn phn Phoenician
+pli pli Pali
+pol pol Polish
+pon pon Pohnpeian
+por por Portuguese
+pra pra Prakrit languages
+pro pro Provençal, Old (to 1500)
+pus pus Pushto
+qaa-qtz qaa-qtz Reserved for local use
+que que Quechua
+raj raj Rajasthani
+rap rap Rapanui
+rar rar Rarotongan
+roa roa Romance (Other)
+roh roh Raeto-Romance
+rom rom Romany
+ron rum Romanian
+run run Rundi
+rus rus Russian
+sad sad Sandawe
+sag sag Sango
+sah sah Yakut
+sai sai South American Indian (Other)
+sal sal Salishan languages
+sam sam Samaritan Aramaic
+san san Sanskrit
+sas sas Sasak
+sat sat Santali
+sco sco Scots
+sel sel Selkup
+sem sem Semitic (Other)
+sga sga Irish-Old (to 900)
+shn shn Shan
+sid sid Sidamo
+sin sin Sinhalese
+sio sio Siouan languages
+sit sit Sino-Tibetan (Other)
+sla sla Slavic (Other)
+slk slo Slovak
+slv slv Slovenian
+smi smi Sami languages
+smo smo Samoan
+sna sna Shona
+snd snd Sindhi
+snk snk Soninke
+sog sog Sogdian
+som som Somali
+son son Songhai
+sot sot Sotho Southern
+spa spa Spanish
+sqi alb Albanian
+srd srd Sardinian
+srp scc Serbian
+srr srr Serer
+ssa ssa Nilo-Saharan (Other)
+ssw ssw Swati
+suk suk Sukuma
+sun sun Sundanese
+sus sus Susu
+sux sux Sumerian
+swa swa Swahili
+swe swe Swedish
+syr syr Syriac
+tah tah Tahitian
+tai tai Tai (Other)
+tam tam Tamil
+tat tat Tatar
+tel tel Telugu
+tem tem Timne
+ter ter Tereno
+tet tet Tetum
+tgk tgk Tajik
+tgl tgl Tagalog
+tha tha Thai
+tig tig Tigre
+tir tir Tigrinya
+tiv tiv Tiv
+tkl tkl Tokelau
+tli tli Tlingit
+tmh tmh Tamashek
+tog tog Tonga (Nyasa)
+ton ton Tonga (Tonga Islands)
+tpi tpi Tok Pisin
+tsi tsi Tsimshian
+tsn tsn Tswana
+tso tso Tsonga
+tuk tuk Turkmen
+tum tum Tumbuka
+tur tur Turkish
+tut tut Altaic
+tvl tvl Tuvalu
+twi twi Twi
+tyv tyv Tuvinian
+uga uga Ugaritic
+uig uig Uighur
+ukr ukr Ukrainian
+umb umb Umbundu
+und und Undetermined
+urd urd Urdu
+uzb uzb Uzbek
+vai vai Vai
+ven ven Venda
+vie vie Vietnamese
+vol vol Volapuk
+vot vot Votic
+wak wak Wakashan
+wal wal Walamo
+war war Waray
+was was Washo
+wen wen Sorbian
+wol wol Wolof
+xho xho Xhosa
+yao yao Yao
+yap yap Yapese
+yid yid Yiddish
+yor yor Yoruba
+ypk ypk Yupik
+zap zap Zapotec
+zen zen Zenaga
+zha zha Zhuang
+zho chi Chinese
+znd znd Zande
+zul zul Zulu
+zun zun Zuni
+
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/Bug4184873Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,132 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test  1.3 07/04/06
+    @summary test that locale invariants are preserved across serialization
+    @run main Bug4184873Test
+    @bug 4184873
+*/
+/*
+ * @(#)Bug4184873Test.java	1.3 07/04/06
+ *
+ * (C) Copyright IBM Corp. 1996 - 1999 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ */
+
+import java.util.*;
+import java.io.*;
+
+/**
+ *  A Locale can never contain the following language codes: he, yi or id.
+ */
+public class Bug4184873Test extends LocaleTestFmwk {
+    public static void main(String[] args) throws Exception {
+        if (args.length == 1 && args[0].equals("prepTest")) {
+            prepTest();
+        } else {
+            new Bug4184873Test().run(args);
+        }
+    }
+
+    public void testIt() throws Exception {
+        verify("he");
+        verify("yi");
+        verify("id");
+    }
+
+    private void verify(String lang) {
+        try {
+            ObjectInputStream in = getStream(lang);
+            if (in != null) {
+                final Locale loc = (Locale)in.readObject();
+                final Locale expected = new Locale(lang, "XX");
+                if (!(expected.equals(loc))) {
+                    errln("Locale didn't maintain invariants for: "+lang);
+                    errln("         got: "+loc);
+                    errln("    excpeted: "+expected);
+                } else {
+                    logln("Locale "+lang+" worked");
+                }
+                in.close();
+            }
+        } catch (Exception e) {
+            errln(e.toString());
+        }
+    }
+
+    private ObjectInputStream getStream(String lang) {
+        try {
+            final File f = new File(System.getProperty("test.src", "."), "Bug4184873_"+lang);
+            return new ObjectInputStream(new FileInputStream(f));
+        } catch (Exception e) {
+            errln(e.toString());
+            return null;
+        }
+    }
+
+    /**
+     * Create serialized output files of the test locales.  After they are created, these test
+     * files should be corrupted (by hand) to contain invalid locale name values.
+     */
+    private static void prepTest() {
+        outputLocale("he");
+        outputLocale("yi");
+        outputLocale("id");
+    }
+
+    private static void outputLocale(String lang) {
+        try {
+            ObjectOutputStream out = new ObjectOutputStream(
+                    new FileOutputStream("Bug4184873_"+lang));
+            out.writeObject(new Locale(lang, "XX"));
+            out.close();
+        } catch (Exception e) {
+            System.out.println(e);
+        }
+    }
+
+}
Binary file j2se/test/java/util/Locale/Bug4184873_he has changed
Binary file j2se/test/java/util/Locale/Bug4184873_id has changed
Binary file j2se/test/java/util/Locale/Bug4184873_yi has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/Bug4210525.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,52 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+    @test  @(#)Bug4210525.java	1.2 07/04/06
+    @summary Locale variant should not be uppercased
+    @run main Bug4210525
+    @bug 4210525
+*/
+
+import java.util.Locale;
+
+public class Bug4210525 {
+
+    public static void main(String[] args) throws Exception {
+        String language = "en";
+        String country = "US";
+        String variant = "socal";
+
+        Locale aLocale = new Locale(language, country, variant);
+
+        String localeVariant = aLocale.getVariant();
+        if (localeVariant.equals(variant)) {
+            System.out.println("passed");
+        } else {
+            System.out.println("failed");
+            throw new Exception("Bug4210525 test failed.");
+        }
+    }
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/Bug4316602.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,46 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+    @test  @(#)Bug4316602.java	1.2 07/04/06
+    @summary Locale constructor should allow language-only argument
+    @bug 4316602
+    @author joconner
+*/
+
+import java.util.Locale;
+
+public class Bug4316602 {
+
+    public static void main(String[] args) throws Exception {
+	String language = "ja";
+	Locale aLocale = new Locale(language);
+	if (aLocale.toString().equals(language)) {
+	    System.out.println("passed");
+	} else {
+	    System.out.println("Bug4316602 failed");
+	    throw new Exception("Bug4316602 failed");
+	}
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/Bug4518797.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,99 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/06
+ * @bug 4518797
+ * @summary Make sure that hashCode() and read/writeObject() are thread-safe.
+ * @run main/timeout=200 Bug4518797
+ */
+
+import java.util.*;
+import java.io.*;
+
+public class Bug4518797 {
+    static volatile boolean runrun = true;
+    static volatile String message = null;
+
+    public static void main(String[] args) {
+	final Locale loc = new Locale("ja", "US");
+	final int hashcode = loc.hashCode();
+
+	System.out.println("correct hash code: " + hashcode);
+	Thread t1 = new Thread(new Runnable() {
+	    public void run() {
+		while (runrun) {
+		    int hc = loc.hashCode();
+		    if (hc != hashcode) {
+			runrun = false;
+			message = "t1: wrong hashcode: " + hc;
+		    }
+		}
+	    }
+	  });
+
+	Thread t2 = new Thread(new Runnable() {
+	    public void run() {
+		// Repeat serialization and deserialization. And get the
+		// hash code from a deserialized Locale object.
+		while (runrun) {
+		    try {
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			ObjectOutputStream oos = new ObjectOutputStream(baos);
+			oos.writeObject(loc);
+			byte[] b = baos.toByteArray();
+			oos.close();
+			ByteArrayInputStream bais = new ByteArrayInputStream(b);
+			ObjectInputStream ois = new ObjectInputStream(bais);
+			Locale loc2 = (Locale) ois.readObject();
+			int hc = loc2.hashCode();
+			if (hc != hashcode) {
+			    runrun = false;
+			    message = "t2: wrong hashcode: " + hc;
+			}
+		    } catch (IOException ioe) {
+			runrun = false;
+			throw new RuntimeException("t2: can't perform test", ioe);
+		    } catch (ClassNotFoundException cnfe) {
+			runrun = false;
+			throw new RuntimeException("t2: can't perform test", cnfe);
+		    }
+		}
+	    }
+	  });
+
+	t1.start();
+	t2.start();
+	try {
+	    for (int i = 0; runrun && i < 180; i++) {
+		Thread.sleep(1000);
+	    }
+	    runrun = false;
+	    t1.join();
+	    t2.join();
+	} catch (InterruptedException e) {
+	}
+	if (message != null) {
+	    throw new RuntimeException(message);
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/GenerateKeyList.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,90 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ * This is a simple program that will generate a key list that can be used as the basis
+ * for a LocaleData file suitable for use with LocaleDataTest.  It always sends its
+ * output to standard out.
+ */
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.Enumeration;
+import java.io.PrintStream;
+
+public class GenerateKeyList {
+    public static void main(String[] args) throws Exception {
+        doOutputFor("sun.util.resources", "CalendarData", System.out);
+        doOutputFor("sun.util.resources", "CurrencyNames", System.out);
+        doOutputFor("sun.util.resources", "LocaleNames", System.out);
+        doOutputFor("sun.util.resources", "TimeZoneNames", System.out);
+        doOutputFor("sun.text.resources", "CollationData", System.out);
+        doOutputFor("sun.text.resources", "FormatData", System.out);
+    };
+
+    public static void doOutputFor(String packageName,
+            String resourceBundleName, PrintStream out)
+                    throws Exception {
+        Locale[] availableLocales = Locale.getAvailableLocales();
+
+        ResourceBundle bundle = ResourceBundle.getBundle(packageName +
+                        resourceBundleName, new Locale("", "", ""));
+        dumpResourceBundle(resourceBundleName + "/", bundle, out);
+        for (int i = 0; i < availableLocales.length; i++) {
+            bundle = ResourceBundle.getBundle(packageName + resourceBundleName,
+                            availableLocales[i]);
+            dumpResourceBundle(resourceBundleName + "/" + availableLocales[i].toString(),
+                            bundle, out);
+        }
+    }
+
+    public static void dumpResourceBundle(String pathName, ResourceBundle bundle,
+                    PrintStream out) throws Exception {
+        Enumeration keys = bundle.getKeys();
+        while(keys.hasMoreElements()) {
+            String key = (String)(keys.nextElement());
+            dumpResource(pathName + "/" + key, bundle.getObject(key), out);
+        }
+    }
+
+    public static void dumpResource(String pathName, Object resource, PrintStream out)
+                    throws Exception {
+        if (resource instanceof String[]) {
+            String[] stringList = (String[])resource;
+            for (int i = 0; i < stringList.length; i++)
+                out.println(pathName + "/" + i);
+        }
+        else if (resource instanceof String[][]) {
+            String[][] stringArray = (String[][])resource;
+            if (pathName.startsWith("TimeZoneNames")) {
+                for (int i = 0; i < stringArray.length; i++)
+                    for (int j = 0; j < stringArray[i].length; j++)
+                        out.println(pathName + "/" + i + "/" + j);
+            }
+            else {
+                for (int i = 0; i < stringArray.length; i++)
+                    out.println(pathName + "/" + stringArray[i][0]);
+            }
+        }
+        else
+            out.println(pathName);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/HashCodeTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,59 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/06
+ * @bug 4944561
+ * @summary Test hashCode() to have less than 10% of hash code conflicts.
+ */
+
+import java.util.*;
+
+public class HashCodeTest {
+    public static void main(String[] args) {
+	Locale[] locales = Locale.getAvailableLocales();
+	int min = Integer.MAX_VALUE;
+	int max = Integer.MIN_VALUE;
+	Map map = new HashMap(locales.length);
+	int conflicts = 0;
+
+	for (int i = 0; i < locales.length; i++) {
+	    Locale loc = locales[i];
+	    int hc = loc.hashCode();
+	    min = Math.min(hc, min);
+	    max = Math.max(hc, max);
+	    Integer key = new Integer(hc);
+	    if (map.containsKey(key)) {
+		conflicts++;
+		System.out.println("conflict: " + (Locale) map.get(key) + ", " + loc);
+	    } else {
+		map.put(key, loc);
+	    }
+	}
+	System.out.println(locales.length+" locales: conflicts="+conflicts
+			   +", min="+min+", max="+max +", diff="+(max-min));
+	if (conflicts >= (locales.length / 10)) {
+	    throw new RuntimeException("too many conflicts: " + conflicts
+				       + " per " + locales.length + " locales");
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/InternationalBAT.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,290 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.10 04/06/07
+ * @bug 4449637
+ * @summary Basic acceptance test for international J2RE. Verifies that the
+ * most important locale data and character converters exist and are
+ * minimally functional.
+ */
+
+import java.io.UnsupportedEncodingException;
+import java.text.DateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+public class InternationalBAT {
+
+    public static void main(String[] args) {
+        boolean pass = true;
+        if (!testRequiredLocales()) {
+            pass = false;
+        }
+        if (!testRequiredEncodings()) {
+            pass = false;
+        }
+        
+        if (!pass) {
+            System.out.println("\nSome tests failed.\n"
+                    + "If you installed the US-only J2RE for Windows, "
+                    + "failures are expected and OK.\n"
+                    + "If you installed the international J2RE, or any J2SDK, "
+                    + "or if this occurs on any platform other than Windows, "
+                    + "please file a bug report.\n"
+                    + "Unfortunately, this test cannot determine whether you "
+                    + "installed a US-only J2RE, an international J2RE, or "
+                    + "a J2SDK.\n");
+            throw new RuntimeException();
+        }
+    }
+
+    // We require the "fully supported locales" for java.util and java.text:
+    // http://webwork.eng/j2se/1.4/docs/guide/intl/locale.doc.html#util-text
+
+    private static Locale[] requiredLocales = {
+        new Locale("ar", "SA"),
+        new Locale("zh", "CN"),
+        new Locale("zh", "TW"),
+        new Locale("nl", "NL"),
+        new Locale("en", "AU"),
+        new Locale("en", "CA"),
+        new Locale("en", "GB"),
+        new Locale("en", "US"),
+        new Locale("fr", "CA"),
+        new Locale("fr", "FR"),
+        new Locale("de", "DE"),
+        new Locale("iw", "IL"),
+        new Locale("hi", "IN"),
+        new Locale("it", "IT"),
+        new Locale("ja", "JP"),
+        new Locale("ko", "KR"),
+        new Locale("pt", "BR"),
+        new Locale("es", "ES"),
+        new Locale("sv", "SE"),
+        new Locale("th", "TH"),
+    };
+    
+    // Date strings for May 10, 2001, for the required locales
+    private static String[] requiredLocaleDates = {
+        "10 \u0645\u0627\u064A\u0648, 2001",
+        "2001\u5E745\u670810\u65E5 \u661F\u671F\u56DB",
+        "2001\u5E745\u670810\u65E5 \u661F\u671F\u56DB",
+        "donderdag 10 mei 2001",
+        "Thursday, 10 May 2001",
+        "Thursday, May 10, 2001",
+        "Thursday, 10 May 2001",
+        "Thursday, May 10, 2001",
+        "jeudi 10 mai 2001",
+        "jeudi 10 mai 2001",
+        "Donnerstag, 10. Mai 2001",
+        "\u05D9\u05D5\u05DD \u05D7\u05DE\u05D9\u05E9\u05D9 10 \u05DE\u05D0\u05D9 2001",
+        "\u0917\u0941\u0930\u0941\u0935\u093E\u0930, \u0967\u0966 \u092E\u0908, \u0968\u0966\u0966\u0967",
+        "gioved\u00EC 10 maggio 2001",
+        "2001\u5E745\u670810\u65E5", // ja_JP
+        "2001\uB144 5\uC6D4 10\uC77C \uBAA9\uC694\uC77C",
+        "Quinta-feira, 10 de Maio de 2001",
+        "jueves 10 de mayo de 2001",
+        "den 10 maj 2001",
+        "\u0E27\u0E31\u0E19\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35\u0E17\u0E35\u0E48 10 \u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21 \u0E1E.\u0E28. 2544",
+    };
+    
+    private static boolean testRequiredLocales() {
+        boolean pass = true;
+
+        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
+        Calendar calendar = Calendar.getInstance(Locale.US);
+        calendar.clear();
+        calendar.set(2001, 4, 10, 12, 0, 0);
+        Date date = calendar.getTime();
+
+        Locale[] available = Locale.getAvailableLocales();
+        for (int i = 0; i < requiredLocales.length; i++) {
+            Locale locale = requiredLocales[i];
+            boolean found = false;
+            for (int j = 0; j < available.length; j++) {
+                if (available[j].equals(locale)) {
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) {
+                System.out.println("Locale not available: " + locale);
+                pass = false;
+            } else {
+                DateFormat format =
+                        DateFormat.getDateInstance(DateFormat.FULL, locale);
+                String dateString = format.format(date);
+                if (!dateString.equals(requiredLocaleDates[i])) {
+                    System.out.println("Incorrect date string for locale "
+                            + locale + ". Expected: " + requiredLocaleDates[i]
+                            + ", got: " + dateString);
+                    pass = false;
+                }
+            }
+        }
+        return pass;
+    }
+    
+    // We require the encodings of the fully supported writing systems:
+    // http://webwork.eng/j2se/1.4/docs/guide/intl/locale.doc.html#jfc
+    
+    private static String[] requiredEncodings = {
+        "Cp1256",
+        "MS936",
+        "MS950",
+        "Cp1255",
+        "MS932",
+        "MS949",
+        "Cp1252",
+        "MS874",
+        "ISO8859_6",
+        "EUC_CN",
+        "UTF8",
+        "GBK",
+        "EUC_TW",
+        "ISO8859_8",
+        "EUC_JP",
+        "PCK",
+        "EUC_KR",
+        "ISO8859_1",
+        "ISO8859_15",
+        "TIS620",
+    };
+    
+    // one sample locale each for the required encodings
+    
+    private static Locale[] sampleLocales = {
+        new Locale("ar", "SA"),
+        new Locale("zh", "CN"),
+        new Locale("zh", "TW"),
+        new Locale("iw", "IL"),
+        new Locale("ja", "JP"),
+        new Locale("ko", "KR"),
+        new Locale("it", "IT"),
+        new Locale("th", "TH"),
+        new Locale("ar", "SA"),
+        new Locale("zh", "CN"),
+        new Locale("zh", "CN"),
+        new Locale("zh", "CN"),
+        new Locale("zh", "TW"),
+        new Locale("iw", "IL"),
+        new Locale("ja", "JP"),
+        new Locale("ja", "JP"),
+        new Locale("ko", "KR"),
+        new Locale("it", "IT"),
+        new Locale("it", "IT"),
+        new Locale("th", "TH"),
+    };
+    
+    // expected conversion results for the date strings of the sample locales
+    
+    private static byte[][] expectedBytes = {
+        { 0x31, 0x30, 0x20, (byte) 0xE3, (byte) 0xC7, (byte) 0xED, (byte) 0xE6, 0x2C, 0x20, 0x32, 0x30, 0x30, 0x31, },
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xC4, (byte) 0xEA, 0x35, (byte) 0xD4, (byte) 0xC2, 0x31, 0x30, (byte) 0xC8, (byte) 0xD5, 0x20, (byte) 0xD0, (byte) 0xC7, (byte) 0xC6, (byte) 0xDA, (byte) 0xCB, (byte) 0xC4},
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xA6, 0x7E, 0x35, (byte) 0xA4, (byte) 0xEB, 0x31, 0x30, (byte) 0xA4, (byte) 0xE9, 0x20, (byte) 0xAC, (byte)0x50, (byte) 0xB4, (byte) 0xC1, (byte) 0xA5, (byte) 0x7C},
+        { (byte) 0xE9, (byte) 0xE5, (byte) 0xED, 0x20, (byte) 0xE7, (byte) 0xEE, (byte) 0xE9, (byte) 0xF9, (byte) 0xE9, 0x20, 0x31, 0x30, 0x20, (byte) 0xEE, (byte) 0xE0, (byte) 0xE9, 0x20, 0x32, 0x30, 0x30, 0x31, },
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0x94, 0x4E, 0x35, (byte) 0x8C, (byte) 0x8E, 0x31, 0x30, (byte) 0x93, (byte) 0xFA, },
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xB3, (byte) 0xE2, 0x20, 0x35, (byte) 0xBF, (byte) 0xF9, 0x20, 0x31, 0x30, (byte) 0xC0, (byte) 0xCF, 0x20, (byte) 0xB8, (byte) 0xF1, (byte) 0xBF, (byte) 0xE4, (byte) 0xC0, (byte) 0xCF, },
+        { 0x67, 0x69, 0x6F, 0x76, 0x65, 0x64, (byte) 0xEC, 0x20, 0x31, 0x30, 0x20, 0x6D, 0x61, 0x67, 0x67, 0x69, 0x6F, 0x20, 0x32, 0x30, 0x30, 0x31, },
+        { (byte) 0xC7, (byte) 0xD1, (byte) 0xB9, (byte) 0xBE, (byte) 0xC4, (byte) 0xCB, (byte) 0xD1, (byte) 0xCA, (byte) 0xBA, (byte) 0xB4, (byte) 0xD5, (byte) 0xB7, (byte) 0xD5, (byte) 0xE8, 0x20, 0x31, 0x30, 0x20, (byte) 0xBE, (byte) 0xC4, (byte) 0xC9, (byte) 0xC0, (byte) 0xD2, (byte) 0xA4, (byte) 0xC1, 0x20, (byte) 0xBE, 0x2E, (byte) 0xC8, 0x2E, 0x20, 0x32, 0x35, 0x34, 0x34, },
+        { 0x31, 0x30, 0x20, (byte) 0xE5, (byte) 0xC7, (byte) 0xEA, (byte) 0xE8, 0x2C, 0x20, 0x32, 0x30, 0x30, 0x31, },
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xC4, (byte) 0xEA, 0x35, (byte) 0xD4, (byte) 0xC2, 0x31, 0x30, (byte) 0xC8, (byte) 0xD5, 0x20, (byte) 0xD0, (byte) 0xC7, (byte) 0xC6, (byte) 0xDA, (byte) 0xCB, (byte) 0xC4},
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xE5, (byte) 0xB9, (byte) 0xB4, 0x35, (byte) 0xE6, (byte) 0x9C, (byte) 0x88, 0x31, 0x30, (byte) 0xE6, (byte) 0x97, (byte) 0xA5, 0x20, (byte) 0xE6, (byte)0x98, (byte) 0x9F, (byte) 0xE6, (byte) 0x9C, (byte) 0x9F, (byte) 0xE5, (byte) 0x9B, (byte) 0x9B},
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xC4, (byte) 0xEA, 0x35, (byte) 0xD4, (byte) 0xC2, 0x31, 0x30, (byte) 0xC8, (byte) 0xD5, 0x20, (byte) 0xD0, (byte) 0xC7, (byte) 0xC6, (byte) 0xDA, (byte) 0xCB, (byte) 0xC4},
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xC8, (byte) 0xA1, 0x35, (byte) 0xC5, (byte) 0xCC, 0x31, 0x30, (byte) 0xC5, (byte) 0xCA, 0x20, (byte) 0xD1, (byte) 0xD3, (byte) 0xDF, (byte) 0xE6, (byte) 0xC6, (byte) 0xBE},
+        { (byte) 0xE9, (byte) 0xE5, (byte) 0xED, 0x20, (byte) 0xE7, (byte) 0xEE, (byte) 0xE9, (byte) 0xF9, (byte) 0xE9, 0x20, 0x31, 0x30, 0x20, (byte) 0xEE, (byte) 0xE0, (byte) 0xE9, 0x20, 0x32, 0x30, 0x30, 0x31, },
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xC7, (byte) 0xAF, 0x35, (byte) 0xB7, (byte) 0xEE, 0x31, 0x30, (byte) 0xC6, (byte) 0xFC, },
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0x94, 0x4E, 0x35, (byte) 0x8C, (byte) 0x8E, 0x31, 0x30, (byte) 0x93, (byte) 0xFA, },
+        { 0x32, 0x30, 0x30, 0x31, (byte) 0xB3, (byte) 0xE2, 0x20, 0x35, (byte) 0xBF, (byte) 0xF9, 0x20, 0x31, 0x30, (byte) 0xC0, (byte) 0xCF, 0x20, (byte) 0xB8, (byte) 0xF1, (byte) 0xBF, (byte) 0xE4, (byte) 0xC0, (byte) 0xCF, },
+        { 0x67, 0x69, 0x6F, 0x76, 0x65, 0x64, (byte) 0xEC, 0x20, 0x31, 0x30, 0x20, 0x6D, 0x61, 0x67, 0x67, 0x69, 0x6F, 0x20, 0x32, 0x30, 0x30, 0x31, },
+        { 0x67, 0x69, 0x6F, 0x76, 0x65, 0x64, (byte) 0xEC, 0x20, 0x31, 0x30, 0x20, 0x6D, 0x61, 0x67, 0x67, 0x69, 0x6F, 0x20, 0x32, 0x30, 0x30, 0x31, },
+        { (byte) 0xC7, (byte) 0xD1, (byte) 0xB9, (byte) 0xBE, (byte) 0xC4, (byte) 0xCB, (byte) 0xD1, (byte) 0xCA, (byte) 0xBA, (byte) 0xB4, (byte) 0xD5, (byte) 0xB7, (byte) 0xD5, (byte) 0xE8, 0x20, 0x31, 0x30, 0x20, (byte) 0xBE, (byte) 0xC4, (byte) 0xC9, (byte) 0xC0, (byte) 0xD2, (byte) 0xA4, (byte) 0xC1, 0x20, (byte) 0xBE, 0x2E, (byte) 0xC8, 0x2E, 0x20, 0x32, 0x35, 0x34, 0x34, },
+    };
+    
+    
+    private static boolean testRequiredEncodings() {
+        boolean pass = true;
+        
+        for (int i = 0; i < requiredEncodings.length; i++) {
+            String encoding = requiredEncodings[i];
+            Locale sampleLocale = sampleLocales[i];
+            try {
+                int index = 0;
+                while (!sampleLocale.equals(requiredLocales[index])) {
+                    index++;
+                }
+                byte[] out = requiredLocaleDates[index].getBytes(encoding);
+                byte[] expected = expectedBytes[i];
+                if (out.length != expected.length) {
+                    reportConversionError(encoding, expected, out);
+                    pass = false;
+                } else {
+                    for (int j = 0; j < out.length; j++) {
+                        if (out[j] != expected[j]) {
+                            reportConversionError(encoding, expected, out);
+                            pass = false;
+                            break;
+                        }
+                    }
+                }
+            } catch (UnsupportedEncodingException e) {
+                System.out.println("Encoding not available: " + encoding);
+                pass = false;
+            }
+        }
+        return pass;
+    }
+    
+    private static void reportConversionError(String encoding,
+            byte[] expected, byte[] actual) {
+
+        System.out.println("Incorrect conversion for encoding: " + encoding);
+        System.out.println("Expected output:");
+        dumpBytes(expected);
+        System.out.println("Actual output:");
+        dumpBytes(actual);
+    }
+    
+    private static void dumpBytes(byte[] bytes) {
+        System.out.print("        { ");
+        for (int i = 0; i < bytes.length; i++) {
+             byte b = bytes[i];
+             if (b < 0) {
+                 System.out.print("(byte) ");
+             }
+             System.out.print("0x" + toHex((b & 0x00F0) >> 4)
+                     + toHex((b & 0x000F)) + ", ");
+        }
+        System.out.println("},");
+    }
+    
+    private static char toHex(int i) {
+        if (i <= 9) {
+            return (char) ('0' + i);
+        } else {
+            return (char) ('A' + i - 10);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/LocaleTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,953 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ * @test 1.56 07/04/12
+ * @bug 4052404 4052440 4084688 4092475 4101316 4105828 4107014 4107953 4110613 
+ * 4118587 4118595 4122371 4126371 4126880 4135316 4135752 4139504 4139940 4143951
+ * 4147315 4147317 4147552 4335196 4778440 5010672 6475525 6544471
+ * @summary test Locales
+ */
+/*
+ * @(#)LocaleTest.java	1.56 07/04/12
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+import java.text.*;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.Date;
+import java.util.Calendar;
+import java.io.*;
+
+public class LocaleTest extends LocaleTestFmwk {
+    public LocaleTest() {
+    }
+
+    private int ENGLISH = 0;
+    private int FRENCH = 1;
+    private int CROATIAN = 2;
+    private int GREEK = 3;
+    private int NORWEGIAN = 4;
+    private int ITALIAN = 5;
+    private int DUMMY = 6;
+    private int MAX_LOCALES = 6;
+
+    private int LANG = 0;
+    private int CTRY = 1;
+    private int VAR = 2;
+    private int NAME = 3;
+    private int LANG3 = 4;
+    private int CTRY3 = 5;
+    private int LCID = 6;
+    private int DLANG_EN = 7;
+    private int DCTRY_EN = 8;
+    private int DVAR_EN = 9;
+    private int DNAME_EN = 10;
+    private int DLANG_FR = 11;
+    private int DCTRY_FR = 12;
+    private int DVAR_FR = 13;
+    private int DNAME_FR = 14;
+    private int DLANG_HR = 15;
+    private int DCTRY_HR = 16;
+    private int DVAR_HR = 17;
+    private int DNAME_HR = 18;
+    private int DLANG_EL = 19;
+    private int DCTRY_EL = 20;
+    private int DVAR_EL = 21;
+    private int DNAME_EL = 22;
+    private int DLANG_ROOT = 23;
+    private int DCTRY_ROOT = 24;
+    private int DVAR_ROOT = 25;
+    private int DNAME_ROOT = 26;
+
+    private String[][] dataTable = {
+        // language code
+        {   "en",   "fr",   "hr",   "el",   "no",   "it",   "xx"    },
+        // country code
+        {   "US",   "FR",   "HR",   "GR",   "NO",   "",   "YY"    },
+        // variant code
+        {   "",     "",     "",     "",     "NY",   "",   ""    },
+        // full name
+        {   "en_US",    "fr_FR",    "hr_HR",    "el_GR",    "no_NO_NY", "it",   "xx_YY"  },
+        // ISO-3 language
+        {   "eng",  "fra",  "hrv",  "ell",  "nor",  "ita",  ""   },
+        // ISO-3 country
+        {   "USA",  "FRA",  "HRV",  "GRC",  "NOR",  "",     ""   },
+        // LCID (not currently public)
+        {   "0409", "040c", "041a", "0408", "0814", "",     ""  },
+
+        // display language (English)
+        {   "English",  "French",   "Croatian", "Greek",    "Norwegian",    "Italian",  "xx" },
+        // display country (English)
+        {   "United States",    "France",   "Croatia",  "Greece",   "Norway",   "",     "YY" },
+        // display variant (English)
+        {   "",     "",     "",     "",     "Nynorsk",   "",     ""},
+        // display name (English)
+        // Updated no_NO_NY English display name for new pattern-based algorithm
+        // (part of Euro support).
+        {   "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" },
+
+        // display langage (French)
+        {   "anglais",  "fran\u00e7ais",   "croate", "grec",    "norv\u00e9gien",    "italien", "xx" },
+        // display country (French)
+        {   "Etats-Unis",    "France",   "Croatie",  "Gr\u00e8ce",   "Norv\u00e8ge", "",     "YY" },
+        // display variant (French)
+        {   "",     "",     "",     "",     "",     "",    "" },
+        // display name (French)
+        {   "anglais (Etats-Unis)", "fran\u00e7ais (France)", "croate (Croatie)", "grec (Gr\u00e8ce)", "norv\u00e9gien (Norv\u00e8ge,Nynorsk)", "italien", "xx (YY)" },
+
+        // display langage (Croatian)
+        {   "",  "", "hrvatski", "",    "", "", "xx" },
+        // display country (Croatian)
+        {   "",    "",   "Hrvatska",  "",   "", "", "YY" },
+        // display variant (Croatian)
+        {   "",     "",     "",     "",     "", "", ""},
+        // display name (Croatian)
+        {   "", "", "hrvatski (Hrvatska)", "", "", "", "xx (YY)" },
+
+        // display langage (Greek)
+        {   "\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac",  "\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac", "\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac", "\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac",    "\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac", "\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac", "xx" },
+        // display country (Greek)
+        {   "\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2",    "\u0393\u03b1\u03bb\u03bb\u03af\u03b1",   "\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1",  "\u0395\u03bb\u03bb\u03ac\u03b4\u03b1",   "\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1", "", "YY" },
+        // display variant (Greek)
+        {   "",     "",     "",     "",     "", "", "" },
+        // display name (Greek)
+        {   "\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac (\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2)", "\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac (\u0393\u03b1\u03bb\u03bb\u03af\u03b1)", "\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac (\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1)", "\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac (\u0395\u03bb\u03bb\u03ac\u03b4\u03b1)", "\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac (\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1,Nynorsk)", "\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac", "xx (YY)" },
+
+        // display langage (<root>)
+        {   "English",  "French",   "Croatian", "Greek",    "Norwegian",  "Italian",  "xx" },
+        // display country (<root>)
+        {   "United States",    "France",   "Croatia",  "Greece",   "Norway",  "",     "YY" },
+        // display variant (<root>)
+        {   "",     "",     "",     "",     "Nynorsk",   "",     ""},
+        // display name (<root>)
+        {   "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" },
+    };
+
+    public static void main(String[] args) throws Exception {
+        new LocaleTest().run(args);
+    }
+
+    public void TestBasicGetters() {
+        for (int i = 0; i <= MAX_LOCALES; i++) {
+            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i], dataTable[VAR][i]);
+            logln("Testing " + testLocale + "...");
+
+            if (!testLocale.getLanguage().equals(dataTable[LANG][i]))
+                errln("  Language code mismatch: " + testLocale.getLanguage() + " versus "
+                            + dataTable[LANG][i]);
+            if (!testLocale.getCountry().equals(dataTable[CTRY][i]))
+                errln("  Country code mismatch: " + testLocale.getCountry() + " versus "
+                            + dataTable[CTRY][i]);
+            if (!testLocale.getVariant().equals(dataTable[VAR][i]))
+                errln("  Variant code mismatch: " + testLocale.getVariant() + " versus "
+                            + dataTable[VAR][i]);
+            if (!testLocale.toString().equals(dataTable[NAME][i]))
+                errln("  Locale name mismatch: " + testLocale.toString() + " versus "
+                            + dataTable[NAME][i]);
+        }
+
+        logln("Same thing without variant codes...");
+        for (int i = 0; i <= MAX_LOCALES; i++) {
+            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i]);
+            logln("Testing " + testLocale + "...");
+
+            if (!testLocale.getLanguage().equals(dataTable[LANG][i]))
+                errln("  Language code mismatch: " + testLocale.getLanguage() + " versus "
+                            + dataTable[LANG][i]);
+            if (!testLocale.getCountry().equals(dataTable[CTRY][i]))
+                errln("  Country code mismatch: " + testLocale.getCountry() + " versus "
+                            + dataTable[CTRY][i]);
+            if (!testLocale.getVariant().equals(""))
+                errln("  Variant code mismatch: " + testLocale.getVariant() + " versus \"\"");
+        }
+    }
+
+    public void TestSimpleResourceInfo() {
+        for (int i = 0; i <= MAX_LOCALES; i++) {
+            if (dataTable[LANG][i].equals("xx"))
+                continue;
+
+            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i], dataTable[VAR][i]);
+            logln("Testing " + testLocale + "...");
+
+            if (!testLocale.getISO3Language().equals(dataTable[LANG3][i]))
+                errln("  ISO-3 language code mismatch: " + testLocale.getISO3Language()
+                            + " versus " + dataTable[LANG3][i]);
+            if (!testLocale.getISO3Country().equals(dataTable[CTRY3][i]))
+                errln("  ISO-3 country code mismatch: " + testLocale.getISO3Country()
+                            + " versus " + dataTable[CTRY3][i]);
+/*
+            // getLCID() is currently private
+            if (!String.valueOf(testLocale.getLCID()).equals(dataTable[LCID][i]))
+                errln("  LCID mismatch: " + testLocale.getLCID() + " versus "
+                            + dataTable[LCID][i]);
+*/
+        }
+    }
+
+    /*
+     * @bug 4101316
+     * @bug 4084688 (This bug appears to be a duplicate of something, because it was fixed
+     *              between 1.1.5 and 1.1.6, but I included a new test for it anyway)
+     * @bug 4052440 Stop falling back to the default locale.
+     */
+    public void TestDisplayNames() {
+        Locale  saveDefault = Locale.getDefault();
+        Locale  english = new Locale("en", "US");
+        Locale  french = new Locale("fr", "FR");
+        Locale  croatian = new Locale("hr", "HR");
+        Locale  greek = new Locale("el", "GR");
+
+        Locale.setDefault(english);
+        logln("With default = en_US...");
+        logln("  In default locale...");
+        doTestDisplayNames(null, DLANG_EN, false);
+        logln("  In locale = en_US...");
+        doTestDisplayNames(english, DLANG_EN, false);
+        logln("  In locale = fr_FR...");
+        doTestDisplayNames(french, DLANG_FR, false);
+        logln("  In locale = hr_HR...");
+        doTestDisplayNames(croatian, DLANG_HR, false);
+        logln("  In locale = el_GR...");
+        doTestDisplayNames(greek, DLANG_EL, false);
+
+        Locale.setDefault(french);
+        logln("With default = fr_FR...");
+        logln("  In default locale...");
+        doTestDisplayNames(null, DLANG_FR, true);
+        logln("  In locale = en_US...");
+        doTestDisplayNames(english, DLANG_EN, true);
+        logln("  In locale = fr_FR...");
+        doTestDisplayNames(french, DLANG_FR, true);
+        logln("  In locale = hr_HR...");
+        doTestDisplayNames(croatian, DLANG_HR, true);
+        logln("  In locale = el_GR...");
+        doTestDisplayNames(greek, DLANG_EL, true);
+
+        Locale.setDefault(saveDefault);
+    }
+
+    private void doTestDisplayNames(Locale inLocale, int compareIndex, boolean defaultIsFrench) {
+        if (defaultIsFrench && !Locale.getDefault().getLanguage().equals("fr"))
+            errln("Default locale should be French, but it's really " + Locale.getDefault().getLanguage());
+        else if (!defaultIsFrench && !Locale.getDefault().getLanguage().equals("en"))
+            errln("Default locale should be English, but it's really " + Locale.getDefault().getLanguage());
+
+        for (int i = 0; i <= MAX_LOCALES; i++) {
+            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i], dataTable[VAR][i]);
+            logln("  Testing " + testLocale + "...");
+
+            String  testLang;
+            String  testCtry;
+            String  testVar;
+            String  testName;
+
+            if (inLocale == null) {
+                testLang = testLocale.getDisplayLanguage();
+                testCtry = testLocale.getDisplayCountry();
+                testVar = testLocale.getDisplayVariant();
+                testName = testLocale.getDisplayName();
+            }
+            else {
+                testLang = testLocale.getDisplayLanguage(inLocale);
+                testCtry = testLocale.getDisplayCountry(inLocale);
+                testVar = testLocale.getDisplayVariant(inLocale);
+                testName = testLocale.getDisplayName(inLocale);
+            }
+
+            String  expectedLang;
+            String  expectedCtry;
+            String  expectedVar;
+            String  expectedName;
+
+            expectedLang = dataTable[compareIndex][i];
+            if (expectedLang.equals("") && defaultIsFrench)
+                expectedLang = dataTable[DLANG_EN][i];
+            if (expectedLang.equals(""))
+                expectedLang = dataTable[DLANG_ROOT][i];
+
+            expectedCtry = dataTable[compareIndex + 1][i];
+            if (expectedCtry.equals("") && defaultIsFrench)
+                expectedCtry = dataTable[DCTRY_EN][i];
+            if (expectedCtry.equals(""))
+                expectedCtry = dataTable[DCTRY_ROOT][i];
+
+            expectedVar = dataTable[compareIndex + 2][i];
+            if (expectedVar.equals("") && defaultIsFrench)
+                expectedVar = dataTable[DVAR_EN][i];
+            if (expectedVar.equals(""))
+                expectedVar = dataTable[DVAR_ROOT][i];
+
+            expectedName = dataTable[compareIndex + 3][i];
+            if (expectedName.equals("") && defaultIsFrench)
+                expectedName = dataTable[DNAME_EN][i];
+            if (expectedName.equals(""))
+                expectedName = dataTable[DNAME_ROOT][i];
+
+            if (!testLang.equals(expectedLang))
+                errln("Display language mismatch: " + testLang + " versus " + expectedLang);
+            if (!testCtry.equals(expectedCtry))
+                errln("Display country mismatch: " + testCtry + " versus " + expectedCtry);
+            if (!testVar.equals(expectedVar))
+                errln("Display variant mismatch: " + testVar + " versus " + expectedVar);
+            if (!testName.equals(expectedName))
+                errln("Display name mismatch: " + testName + " versus " + expectedName);
+        }
+    }
+
+    public void TestSimpleObjectStuff() {
+        Locale  test1 = new Locale("aa", "AA");
+        Locale  test2 = new Locale("aa", "AA");
+        Locale  test3 = (Locale)test1.clone();
+        Locale  test4 = new Locale("zz", "ZZ");
+
+        if (test1 == test2 || test1 == test3 || test1 == test4 || test2 == test3)
+            errln("Some of the test variables point to the same locale!");
+
+        if (test3 == null)
+            errln("clone() failed to produce a valid object!");
+
+        if (!test1.equals(test2) || !test1.equals(test3) || !test2.equals(test3))
+            errln("clone() or equals() failed: objects that should compare equal don't");
+
+        if (test1.equals(test4) || test2.equals(test4) || test3.equals(test4))
+            errln("equals() failed: objects that shouldn't compare equal do");
+
+        int hash1 = test1.hashCode();
+        int hash2 = test2.hashCode();
+        int hash3 = test3.hashCode();
+
+        if (hash1 != hash2 || hash1 != hash3 || hash2 != hash3)
+            errln("hashCode() failed: objects that should have the same hash code don't");
+    }
+
+    /**
+     * @bug 4011756 4011380
+     */
+    public void TestISO3Fallback() {
+        Locale test = new Locale("xx", "YY", "");
+        boolean gotException = false;
+        String result = "";
+
+        try {
+            result = test.getISO3Language();
+        }
+        catch (MissingResourceException e) {
+            gotException = true;
+        }
+        if (!gotException)
+            errln("getISO3Language() on xx_YY returned " + result + " instead of throwing an exception");
+
+        gotException = false;
+        try {
+            result = test.getISO3Country();
+        }
+        catch (MissingResourceException e) {
+            gotException = true;
+        }
+        if (!gotException)
+            errln("getISO3Country() on xx_YY returned " + result + " instead of throwing an exception");
+    }
+
+    /**
+     * @bug 4106155 4118587
+     */
+    public void TestGetLangsAndCountries() {
+        // It didn't seem right to just do an exhaustive test of everything here, so I check
+        // for the following things:
+        // 1) Does each list have the right total number of entries?
+        // 2) Does each list contain certain language and country codes we think are important
+        //     (the G7 countries, plus a couple others)?
+        // 3) Does each list have every entry formatted correctly? (i.e., two characters,
+        //     all lower case for the language codes, all upper case for the country codes)
+        // 4) Is each list in sorted order?
+        String[] test = Locale.getISOLanguages();
+        String[] spotCheck1 = { "en", "es", "fr", "de", "it", "ja", "ko", "zh", "th",
+                                "he", "id", "iu", "ug", "yi", "za" };
+
+        if (test.length != 188)
+            errln("Expected getISOLanguages() to return 188 languages; it returned " + test.length);
+        else {
+            for (int i = 0; i < spotCheck1.length; i++) {
+                int j;
+                for (j = 0; j < test.length; j++)
+                    if (test[j].equals(spotCheck1[i]))
+                        break;
+                if (j == test.length || !test[j].equals(spotCheck1[i]))
+                    errln("Couldn't find " + spotCheck1[i] + " in language list.");
+            }
+        }
+        for (int i = 0; i < test.length; i++) {
+            if (!test[i].equals(test[i].toLowerCase()))
+                errln(test[i] + " is not all lower case.");
+            if (test[i].length() != 2)
+                errln(test[i] + " is not two characters long.");
+            if (i > 0 && test[i].compareTo(test[i - 1]) <= 0)
+                errln(test[i] + " appears in an out-of-order position in the list.");
+        }
+
+        test = Locale.getISOCountries();
+        String[] spotCheck2 = { "US", "CA", "GB", "FR", "DE", "IT", "JP", "KR", "CN", "TW", "TH" };
+
+
+        if (test.length != 245)
+            errln("Expected getISOCountries to return 245 countries; it returned " + test.length);
+        else {
+            for (int i = 0; i < spotCheck2.length; i++) {
+                int j;
+                for (j = 0; j < test.length; j++)
+                    if (test[j].equals(spotCheck2[i]))
+                        break;
+                if (j == test.length || !test[j].equals(spotCheck2[i]))
+                    errln("Couldn't find " + spotCheck2[i] + " in country list.");
+            }
+        }
+        for (int i = 0; i < test.length; i++) {
+            if (!test[i].equals(test[i].toUpperCase()))
+                errln(test[i] + " is not all upper case.");
+            if (test[i].length() != 2)
+                errln(test[i] + " is not two characters long.");
+            if (i > 0 && test[i].compareTo(test[i - 1]) <= 0)
+                errln(test[i] + " appears in an out-of-order position in the list.");
+        }
+    }
+
+    /**
+     * @bug 4126880
+     */
+    void Test4126880() {
+        String[] test;
+
+        test = Locale.getISOCountries();
+        test[0] = "SUCKER!!!";
+        test = Locale.getISOCountries();
+        if (test[0].equals("SUCKER!!!"))
+            errln("Changed internal country code list!");
+
+        test = Locale.getISOLanguages();
+        test[0] = "HAHAHAHA!!!";
+        test = Locale.getISOLanguages();
+        if (test[0].equals("HAHAHAHA!!!")) // Fixed typo
+            errln("Changes internal language code list!");
+    }
+
+    /**
+     * @bug 4107014
+     */
+    public void TestGetAvailableLocales() {
+        Locale[] locales = Locale.getAvailableLocales();
+        if (locales == null || locales.length == 0)
+            errln("Locale.getAvailableLocales() returned no installed locales!");
+        else {
+            logln("Locale.getAvailableLocales() returned a list of " + locales.length + " locales.");
+            for (int i = 0; i < locales.length; i++)
+                logln(locales[i].toString());
+        }
+    }
+
+    /**
+     * @bug 4135316
+     */
+    public void TestBug4135316() {
+        Locale[] locales1 = Locale.getAvailableLocales();
+        Locale[] locales2 = Locale.getAvailableLocales();
+        if (locales1 == locales2)
+            errln("Locale.getAvailableLocales() doesn't clone its internal storage!");
+    }
+
+    /**
+     * @bug 4107953
+     */
+/*
+test commented out pending API-change approval
+    public void TestGetLanguagesForCountry() {
+        String[] languages = Locale.getLanguagesForCountry("US");
+
+        if (!searchStringArrayFor("en", languages))
+            errln("Didn't get en as a language for US");
+
+        languages = Locale.getLanguagesForCountry("FR");
+        if (!searchStringArrayFor("fr", languages))
+            errln("Didn't get fr as a language for FR");
+
+        languages = Locale.getLanguagesForCountry("CH");
+        if (!searchStringArrayFor("fr", languages))
+            errln("Didn't get fr as a language for CH");
+        if (!searchStringArrayFor("it", languages))
+            errln("Didn't get it as a language for CH");
+        if (!searchStringArrayFor("de", languages))
+            errln("Didn't get de as a language for CH");
+
+        languages = Locale.getLanguagesForCountry("JP");
+        if (!searchStringArrayFor("ja", languages))
+            errln("Didn't get ja as a language for JP");
+    }
+*/
+
+    private boolean searchStringArrayFor(String s, String[] array) {
+        for (int i = 0; i < array.length; i++)
+            if (s.equals(array[i]))
+                return true;
+        return false;
+    }
+    /**
+     * @bug 4110613
+     */
+    public void TestSerialization() throws ClassNotFoundException, OptionalDataException,
+                    IOException, StreamCorruptedException
+    {
+        ObjectOutputStream ostream;
+        ByteArrayOutputStream obstream;
+        byte[] bytes = null;
+
+        obstream = new ByteArrayOutputStream();
+        ostream = new ObjectOutputStream(obstream);
+
+        Locale test1 = new Locale("zh", "TW", "");
+        int dummy = test1.hashCode();   // fill in the cached hash-code value
+        ostream.writeObject(test1);
+
+        bytes = obstream.toByteArray();
+
+        ObjectInputStream istream = new ObjectInputStream(new ByteArrayInputStream(bytes));
+
+        Locale test2 = (Locale)(istream.readObject());
+
+        if (!test1.equals(test2) || test1.hashCode() != test2.hashCode())
+            errln("Locale failed to deserialize correctly.");
+    }
+
+    /**
+     * @bug 4118587
+     */
+    public void TestSimpleDisplayNames() {
+        // This test is different from TestDisplayNames because TestDisplayNames checks
+        // fallback behavior, combination of language and country names to form locale
+        // names, and other stuff like that.  This test just checks specific language
+        // and country codes to make sure we have the correct names for them.
+        String[] languageCodes = { "he", "id", "iu", "ug", "yi", "za" };
+        String[] languageNames = { "Hebrew", "Indonesian", "Inuktitut", "Uighur", "Yiddish",
+                                   "Zhuang" };
+
+        for (int i = 0; i < languageCodes.length; i++) {
+            String test = (new Locale(languageCodes[i], "", "")).getDisplayLanguage(Locale.US);
+            if (!test.equals(languageNames[i]))
+                errln("Got wrong display name for " + languageCodes[i] + ": Expected \"" +
+                      languageNames[i] + "\", got \"" + test + "\".");
+        }
+    }
+
+    /**
+     * @bug 4118595
+     */
+    public void TestUninstalledISO3Names() {
+        // This test checks to make sure getISO3Language and getISO3Country work right
+        // even for locales that are not installed.
+        String[] iso2Languages = { "am", "ba", "fy", "mr", "rn", "ss", "tw", "zu" };
+        String[] iso3Languages = { "amh", "bak", "fry", "mar", "run", "ssw", "twi", "zul" };
+
+        for (int i = 0; i < iso2Languages.length; i++) {
+            String test = (new Locale(iso2Languages[i], "", "")).getISO3Language();
+            if (!test.equals(iso3Languages[i]))
+                errln("Got wrong ISO3 code for " + iso2Languages[i] + ": Expected \"" +
+                        iso3Languages[i] + "\", got \"" + test + "\".");
+        }
+
+        String[] iso2Countries = { "AF", "BW", "KZ", "MO", "MN", "SB", "TC", "ZW" };
+        String[] iso3Countries = { "AFG", "BWA", "KAZ", "MAC", "MNG", "SLB", "TCA", "ZWE" };
+
+        for (int i = 0; i < iso2Countries.length; i++) {
+            String test = (new Locale("", iso2Countries[i], "")).getISO3Country();
+            if (!test.equals(iso3Countries[i]))
+                errln("Got wrong ISO3 code for " + iso2Countries[i] + ": Expected \"" +
+                        iso3Countries[i] + "\", got \"" + test + "\".");
+        }
+    }
+
+    /**
+     * @bug 4052404 4778440
+     */
+    public void TestChangedISO639Codes() {
+        Locale hebrewOld = new Locale("iw", "IL", "");
+        Locale hebrewNew = new Locale("he", "IL", "");
+        Locale yiddishOld = new Locale("ji", "IL", "");
+        Locale yiddishNew = new Locale("yi", "IL", "");
+        Locale indonesianOld = new Locale("in", "", "");
+        Locale indonesianNew = new Locale("id", "", "");
+
+        if (!hebrewNew.getLanguage().equals("iw")) 
+            errln("Got back wrong language code for Hebrew: expected \"iw\", got \"" + 
+                            hebrewNew.getLanguage() + "\"");
+        if (!yiddishNew.getLanguage().equals("ji")) 
+            errln("Got back wrong language code for Yiddish: expected \"ji\", got \"" + 
+                            yiddishNew.getLanguage() + "\"");
+        if (!indonesianNew.getLanguage().equals("in")) 
+            errln("Got back wrong language code for Indonesian: expected \"in\", got \"" + 
+                            indonesianNew.getLanguage() + "\"");
+    }
+
+    /**
+     * @bug 4092475
+     * I could not reproduce this bug.  I'm pretty convinced it was fixed with the
+     * big locale-data reorg of 10/28/97.  The lookup logic for language and country
+     * display names was also changed at that time in that check-in.    --rtg 3/20/98
+
+     * This test is not designed to work in any other locale but en_US.
+     * Most of the LocaleElements do not contain display names for other languages,
+     * so this test fails (bug 4289223) when run under different locales. For example,
+     * LocaleElements_es as of kestrel does not have a localized name for Japanese, so
+     * the getDisplayName method asks the default locale for a display name. The Japanese
+     * localized name for "Japanese" does not equal "Japanese" so this test fails for es
+     * display names if run under a ja locale. Eventually, he LocaleElements should probably
+     * be updated to contain more localized language and region display names.
+     * 1999-11-19 joconner
+     *
+     */
+    public void TestAtypicalLocales() {
+        Locale[] localesToTest = { new Locale("de", "CA"),
+                                   new Locale("ja", "ZA"),
+                                   new Locale("ru", "MX"),
+                                   new Locale("en", "FR"),
+                                   new Locale("es", "DE"),
+                                   new Locale("", "HR"),
+                                   new Locale("", "SE"),
+                                   new Locale("", "DO"),
+                                   new Locale("", "BE") };
+        String[] englishDisplayNames = { "German (Canada)",
+                                         "Japanese (South Africa)",
+                                         "Russian (Mexico)",
+                                         "English (France)",
+                                         "Spanish (Germany)",
+                                         "Croatia",
+                                         "Sweden",
+                                         "Dominican Republic",
+                                         "Belgium" };
+        String[] frenchDisplayNames = { "allemand (Canada)",
+                                        "japonais (Afrique du Sud)",
+                                        "russe (Mexique)",
+                                         "anglais (France)",
+                                         "espagnol (Allemagne)",
+                                        "Croatie",
+                                        "Su\u00e8de",
+                                        "R\u00e9publique Dominicaine",
+                                        "Belgique" };
+        String[] spanishDisplayNames = { "alem\u00E1n (Canad\u00E1)",
+                                         "japon\u00E9s (Sud\u00E1frica)",
+                                         "ruso (M\u00e9xico)",
+                                         "ingl\u00E9s (Francia)",
+                                         "espa\u00f1ol (Alemania)",
+                                         "Croacia",
+                                         "Suecia",
+                                         "Rep\u00fablica Dominicana",
+                                         "B\u00E9lgica" };
+
+
+	// save the default locale and set to the new default to en_US
+	Locale defaultLocale = Locale.getDefault();
+	Locale.setDefault(Locale.US);
+
+        for (int i = 0; i < localesToTest.length; i++) {
+            String name = localesToTest[i].getDisplayName(Locale.US);
+            logln(name);
+            if (!name.equals(englishDisplayNames[i]))
+                errln("Lookup in English failed: expected \"" + englishDisplayNames[i]
+                            + "\", got \"" + name + "\"");
+        }
+
+        for (int i = 0; i < localesToTest.length; i++) {
+            String name = localesToTest[i].getDisplayName(new Locale("es", "ES"));
+            logln(name);
+            if (!name.equals(spanishDisplayNames[i]))
+                errln("Lookup in Spanish failed: expected \"" + spanishDisplayNames[i]
+                            + "\", got \"" + name + "\"");
+        }
+
+        for (int i = 0; i < localesToTest.length; i++) {
+            String name = localesToTest[i].getDisplayName(Locale.FRANCE);
+            logln(name);
+            if (!name.equals(frenchDisplayNames[i]))
+                errln("Lookup in French failed: expected \"" + frenchDisplayNames[i]
+                            + "\", got \"" + name + "\"");
+        }
+
+	// restore the default locale for other tests
+	Locale.setDefault(defaultLocale);
+    }
+
+    /**
+     * @bug 4126371
+     */
+    public void TestNullDefault() {
+        // why on earth anyone would ever try to do this is beyond me, but we should
+        // definitely make sure we don't let them
+        boolean gotException = false;
+        try {
+            Locale.setDefault(null);
+        }
+        catch (NullPointerException e) {
+            // all other exception types propagate through here back to the test harness
+            gotException = true;
+        }
+        if (Locale.getDefault() == null)
+            errln("Locale.getDefault() allowed us to set default to NULL!");
+        if (!gotException)
+            errln("Trying to set default locale to NULL didn't throw exception!");
+    }
+
+    /**
+     * @bug 4135752
+     * This would be better tested by the LocaleDataTest.  Will move it when I
+     * get the LocaleDataTest working again.
+     */
+    public void TestThaiCurrencyFormat() {
+        DecimalFormat thaiCurrency = (DecimalFormat)NumberFormat.getCurrencyInstance(
+                        new Locale("th", "TH"));
+        if (!thaiCurrency.getPositivePrefix().equals("\u0e3f"))
+            errln("Thai currency prefix wrong: expected \"\u0e3f\", got \"" +
+                            thaiCurrency.getPositivePrefix() + "\"");
+        if (!thaiCurrency.getPositiveSuffix().equals(""))
+            errln("Thai currency suffix wrong: expected \"\", got \"" +
+                            thaiCurrency.getPositiveSuffix() + "\"");
+    }
+
+    /**
+     * @bug 4122371
+     * Confirm that Euro support works.  This test is pretty rudimentary; all it does
+     * is check that any locales with the EURO variant format a number using the
+     * Euro currency symbol.
+     *
+     * ASSUME: All locales encode the Euro character "\u20AC".
+     * If this is changed to use the single-character Euro symbol, this
+     * test must be updated.
+     *
+     * DON'T ASSUME: Any specific countries support the Euro.  Instead,
+     * iterate through all locales.
+     */
+    public void TestEuroSupport() {
+        final String EURO_VARIANT  = "EURO";
+        final String EURO_CURRENCY = "\u20AC"; // Look for this string in formatted Euro currency
+
+        Locale[] locales = NumberFormat.getAvailableLocales();
+        for (int i=0; i<locales.length; ++i) {
+            Locale loc = locales[i];
+            if (loc.getVariant().indexOf(EURO_VARIANT) >= 0) {
+                NumberFormat nf = NumberFormat.getCurrencyInstance(loc);
+                String pos = nf.format(271828.182845);
+                String neg = nf.format(-271828.182845);
+                if (pos.indexOf(EURO_CURRENCY) >= 0 &&
+                    neg.indexOf(EURO_CURRENCY) >= 0) {
+                    logln("Ok: " + loc.toString() +
+                          ": " + pos + " / " + neg);
+                }
+                else {
+                    errln("Fail: " + loc.toString() +
+                          " formats without " + EURO_CURRENCY +
+                          ": " + pos + " / " + neg +
+                          "\n*** THIS FAILURE MAY ONLY MEAN THAT LOCALE DATA HAS CHANGED ***");
+                }
+            }
+        }
+    }
+
+    /**
+     * @bug 4139504
+     * toString() doesn't work with language_VARIANT.
+     */
+    public void TestToString() {
+        Object[] DATA = {
+            new Locale("xx", "", ""), "xx",
+            new Locale("", "YY", ""), "_YY",
+        new Locale("", "", "ZZ"), "",
+            new Locale("xx", "YY", ""), "xx_YY",
+            new Locale("xx", "", "ZZ"), "xx__ZZ",
+            new Locale("", "YY", "ZZ"), "_YY_ZZ",
+            new Locale("xx", "YY", "ZZ"), "xx_YY_ZZ",
+        };
+        for (int i=0; i<DATA.length; i+=2) {
+            Locale loc = (Locale)DATA[i];
+            String fmt = (String)DATA[i+1];
+            if (!loc.toString().equals(fmt)) {
+                errln("Fail: Locale.toString(" + fmt + ")=>" + loc);
+            }
+        }
+    }
+
+    /**
+     * @bug 4105828
+     * Currency symbol in zh is wrong.  We will test this at the NumberFormat
+     * end to test the whole pipe.
+     */
+    public void Test4105828() {
+        Locale[] LOC = { Locale.CHINESE, new Locale("zh", "CN", ""),
+                         new Locale("zh", "TW", ""), new Locale("zh", "HK", "") };
+        for (int i=0; i<LOC.length; ++i) {
+            NumberFormat fmt = NumberFormat.getPercentInstance(LOC[i]);
+            String result = fmt.format(1);
+            if (!result.equals("100%")) {
+                errln("Percent for " + LOC[i] + " should be 100%, got " + result);
+            }
+        }
+    }
+
+    /**
+     * @bug 4139940
+     * Couldn't reproduce this bug -- probably was fixed earlier.
+     *
+     * ORIGINAL BUG REPORT:
+     * -- basically, hungarian for monday shouldn't have an \u00f4
+     * (o circumflex)in it instead it should be an o with 2 inclined
+     * (right) lines over it..
+     *
+     * You may wonder -- why do all this -- why not just add a line to
+     * LocaleData?  Well, I could see by inspection that the locale file had the
+     * right character in it, so I wanted to check the rest of the pipeline -- a
+     * very remote possibility, but I wanted to be sure.  The other possibility
+     * is that something is wrong with the font mapping subsystem, but we can't
+     * test that here.
+     */
+    public void Test4139940() {
+        Locale mylocale=new Locale("hu", "", "");
+        Date mydate = new Date(98,3,13); // A Monday
+        DateFormat df_full = new SimpleDateFormat("EEEE", mylocale);
+        String str = df_full.format(mydate);
+        // Make sure that o circumflex (\u00F4) is NOT there, and
+        // o double acute (\u0151) IS.
+        if (str.indexOf('\u0151') < 0 || str.indexOf('\u00F4') >= 0)
+            errln("Fail: Monday in Hungarian is wrong");
+    }
+
+    /**
+     * @bug 4143951
+     * Russian first day of week should be Monday. Confirmed.
+     */
+    public void Test4143951() {
+        Calendar cal = Calendar.getInstance(new Locale("ru", "", ""));
+        if (cal.getFirstDayOfWeek() != Calendar.MONDAY) {
+            errln("Fail: First day of week in Russia should be Monday");
+        }
+    }
+
+    /**
+     * @bug 4147315
+     * java.util.Locale.getISO3Country() works wrong for non ISO-3166 codes.
+     * Should throw an exception for unknown locales
+     */
+    public void Test4147315() {
+        // Try with codes that are the wrong length but happen to match text
+        // at a valid offset in the mapping table
+        Locale locale = new Locale("aaa", "CCC");
+
+        try {
+            String result = locale.getISO3Country();
+
+            errln("ERROR: getISO3Country() returns: " + result +
+                " for locale '" + locale + "' rather than exception" );
+        } catch(MissingResourceException e) { }
+    }
+
+    /**
+     * @bug 4147317
+     * java.util.Locale.getISO3Language() works wrong for non ISO-3166 codes.
+     * Should throw an exception for unknown locales
+     */
+    public void Test4147317() {
+        // Try with codes that are the wrong length but happen to match text
+        // at a valid offset in the mapping table
+        Locale locale = new Locale("aaa", "CCC");
+
+        try {
+            String result = locale.getISO3Language();
+
+            errln("ERROR: getISO3Language() returns: " + result +
+                " for locale '" + locale + "' rather than exception" );
+        } catch(MissingResourceException e) { }
+    }
+
+    /*
+     * @bug 4147552 4778440
+     */
+    public void Test4147552() {
+        Locale[] locales = { new Locale("no", "NO"), new Locale("no", "NO", "B"), 
+                             new Locale("no", "NO", "NY") }; 
+        String[] englishDisplayNames = { "Norwegian (Norway)",
+                     "Norwegian (Norway,Bokm\u00e5l)",
+                     "Norwegian (Norway,Nynorsk)" }; 
+        String[] norwegianDisplayNames = { "norsk (Norge)",
+                     "norsk (Norge,bokm\u00e5l)", "norsk (Norge,nynorsk)" }; 
+
+        for (int i = 0; i < locales.length; i++) {
+            Locale loc = locales[i];
+            if (!loc.getDisplayName(Locale.US).equals(englishDisplayNames[i]))
+               errln("English display-name mismatch: expected " +
+                       englishDisplayNames[i] + ", got " + loc.getDisplayName());
+            if (!loc.getDisplayName(loc).equals(norwegianDisplayNames[i]))
+                errln("Norwegian display-name mismatch: expected " +
+                       norwegianDisplayNames[i] + ", got " +
+                       loc.getDisplayName(loc));
+        }
+    }
+
+    static String escapeUnicode(String s) {
+        StringBuffer buf = new StringBuffer();
+        for (int i=0; i<s.length(); ++i) {
+            char c = s.charAt(i);
+            if (c >= 0x20 && c <= 0x7F) buf.append(c);
+            else {
+                buf.append("\\u");
+                String h = "000" + Integer.toHexString(c);
+                if (h.length() > 4) h = h.substring(h.length() - 4);
+                buf.append(h);
+            }
+        }
+        return buf.toString();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/LocaleTestFmwk.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,259 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)LocaleTestFmwk.java	1.5 07/04/06
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1999 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+import java.lang.reflect.*;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.util.Vector;
+import java.io.*;
+import java.text.*;
+
+/**
+ * LocaleTestFmwk is a base class for tests that can be run conveniently from
+ * the command line as well as under the Java test harness.
+ * <p>
+ * Sub-classes implement a set of methods named Test<something>. Each
+ * of these methods performs some test. Test methods should indicate
+ * errors by calling either err or errln.  This will increment the
+ * errorCount field and may optionally print a message to the log.
+ * Debugging information may also be added to the log via the log
+ * and logln methods.  These methods will add their arguments to the
+ * log only if the test is being run in verbose mode.
+ */
+public class LocaleTestFmwk {
+    //------------------------------------------------------------------------
+    // Everything below here is boilerplate code that makes it possible
+    // to add a new test by simply adding a function to an existing class
+    //------------------------------------------------------------------------
+
+    protected LocaleTestFmwk() {
+        // Create a hashtable containing all the test methods.
+        testMethods = new Hashtable();
+        Method[] methods = getClass().getDeclaredMethods();
+        for( int i=0; i<methods.length; i++ ) {
+            if( methods[i].getName().startsWith("Test")
+                    || methods[i].getName().startsWith("test")) {
+                testMethods.put( methods[i].getName(), methods[i] );
+            }
+        }
+    }
+
+    protected void run(String[] args) throws Exception
+    {
+        System.out.println(getClass().getName() + " {");
+        indentLevel++;
+
+        // Set up the log and reference streams.  We use PrintWriters in order to
+        // take advantage of character conversion.  The JavaEsc converter will
+        // convert Unicode outside the ASCII range to Java's \\uxxxx notation.
+        log = new PrintWriter(System.out,true);
+
+        // Parse the test arguments.  They can be either the flag
+        // "-verbose" or names of test methods. Create a list of
+        // tests to be run.
+        Vector testsToRun = new Vector( args.length );
+        for( int i=0; i<args.length; i++ ) {
+            if( args[i].equals("-verbose") ) {
+                verbose = true;
+            }
+            else if( args[i].equals("-prompt") ) {
+                prompt = true;
+            } else if (args[i].equals("-nothrow")) {
+                nothrow = true;
+            } else {
+                Object m = testMethods.get( args[i] );
+                if( m != null ) {
+                    testsToRun.addElement( m );
+                }
+                else {
+                    usage();
+                    return;
+                }
+            }
+        }
+
+        // If no test method names were given explicitly, run them all.
+        if( testsToRun.size() == 0 ) {
+            Enumeration methodNames = testMethods.elements();
+            while( methodNames.hasMoreElements() ) {
+                testsToRun.addElement( methodNames.nextElement() );
+            }
+        }
+
+        // Run the list of tests given in the test arguments
+        for( int i=0; i<testsToRun.size(); i++ ) {
+            int oldCount = errorCount;
+
+            Method testMethod = (Method)testsToRun.elementAt(i);
+            writeTestName(testMethod.getName());
+
+            try {
+                testMethod.invoke(this, new Object[0]);
+            }
+            catch( IllegalAccessException e ) {
+                errln("Can't acces test method " + testMethod.getName());
+            }
+            catch( InvocationTargetException e ) {
+                errln("Uncaught exception thrown in test method "
+                               + testMethod.getName());
+                e.getTargetException().printStackTrace(this.log);
+            }
+            writeTestResult(errorCount - oldCount);
+        }
+        indentLevel--;
+        writeTestResult(errorCount);
+
+        if (prompt) {
+            System.out.println("Hit RETURN to exit...");
+            try {
+                System.in.read();
+            }
+            catch (IOException e) {
+                System.out.println("Exception: " + e.toString() + e.getMessage());
+            }
+        }
+        if (nothrow) {
+            System.exit(errorCount);
+        }
+    }
+
+    /**
+     * Adds given string to the log if we are in verbose mode.
+     */
+    protected void log( String message ) {
+        if( verbose ) {
+            indent(indentLevel + 1);
+            log.print( message );
+        }
+    }
+
+    protected void logln( String message ) {
+        log(message + System.getProperty("line.separator"));
+    }
+
+    /**
+     * Report an error
+     */
+    protected void err( String message ) {
+        errorCount++;
+        indent(indentLevel + 1);
+        log.print( message );
+        log.flush();
+
+        if (!nothrow) {
+            throw new RuntimeException(message);
+        }
+    }
+
+    protected void errln( String message ) {
+        err(message + System.getProperty("line.separator"));
+    }
+
+
+    protected void writeTestName(String testName) {
+        indent(indentLevel);
+        log.print(testName);
+        log.flush();
+        needLineFeed = true;
+    }
+
+    protected void writeTestResult(int count) {
+        if (!needLineFeed) {
+            indent(indentLevel);
+            log.print("}");
+        }
+        needLineFeed = false;
+
+        if (count != 0)
+            log.println(" FAILED");
+        else
+            log.println(" Passed");
+    }
+
+    private final void indent(int distance) {
+        if (needLineFeed) {
+            log.println(" {");
+            needLineFeed = false;
+        }
+        log.print(spaces.substring(0, distance * 2));
+    }
+
+    /**
+     * Print a usage message for this test class.
+     */
+    void usage() {
+        System.out.println(getClass().getName() +
+                            ": [-verbose] [-nothrow] [-prompt] [test names]");
+
+        System.out.println("test names:");
+        Enumeration methodNames = testMethods.keys();
+        while( methodNames.hasMoreElements() ) {
+            System.out.println("\t" + methodNames.nextElement() );
+        }
+    }
+
+    private boolean     prompt = false;
+    private boolean     nothrow = false;
+    protected boolean   verbose = false;
+
+    private PrintWriter log;
+    private int         indentLevel = 0;
+    private boolean     needLineFeed = false;
+    private int         errorCount = 0;
+
+    private Hashtable testMethods;
+    private final String spaces = "                                          ";
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/PrintDefaultLocale.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,238 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)PrintDefaultLocale.java	1.14 07/04/06
+ *
+ * (C) Copyright IBM Corp. 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+/*
+    @bug 4123370 4091969 4118731 4182108 4778440
+    
+    The "at-test" tag was removed from this file, because there's no way to
+    run this test in an automated test harness.  It depends on having various
+    different locales installed on the machine, and on Windows it depends
+    on the user going to the "Regional Settings" control panel and changing
+    the settings before running the test for each bug.  We can run this test
+    manually from time to time to ensure that there has been no regression,
+    but it's not automated. -- lwerner, 7/6/98
+    
+    INSTRUCTIONS FOR RUNNING THIS TEST
+    ==================================
+    This test is designed to check for problems in the JVM code that initializes the
+    default Java locale (the locale returned by Locale.getDefault()) from the system
+    locale settings (or from command-line arguments).  Since detecting a regression
+    usually requires setting the environment up in some way prior to running the test,
+    this is a manual test.
+
+    The test simply prints out the internal ID and display name of the default Java locale,
+    and the name of the default Java character encoding.  It passes if these are what
+    you expect them to be, and fails if they're not.
+
+    Bug #4091969:
+        To test for bug #4091969, run this test on a Korean-localized version of
+        Windows, with the default locale set to Korean.  You should get "ko_KR"
+        as the default locale.
+
+    Bug #4123370:
+        One part of bug #4123370 duplicates bug #4091969, which is covered by the
+        instructions above.
+
+        To test the unique part of bug #4123370, use the "Regional Settings" control
+        panel to set the currect locale to each of the different Spanish-language locales.
+        Run this test once for each Spanish-language locale.  You should see the appropriate
+        locale ID and name for each locale.  Both "Spanish - Traditional Sort" and
+        "Spanish - Modern Sort" should produce "es_ES" and "Spanish (Spain)".
+
+    Bug #4118731:
+        The basic issue here was that we had changed so that calling getDisplayName()
+        on a locale that didn't include a country code no longer included a country
+        name (instead of picking a default country name, as before), which is the
+        right answer.  The problem is we weren't always getting back a system default
+        locale from Solaris that includes a country code, even though we should.
+
+        To test this, set the system default locale to a locale that doesn't include
+        a country code, such as "fr" or "de", using (in the C shell) "setenv LC_ALL fr"
+        (or whatever the locale ID you want is).  Running PrintDefaultLocale should
+        still produce a locale ID, and a locale display name, that include a country
+        code (and country name).  [Remember to make sure the locale is actually installed
+        first.]
+
+        To test the specific complaint in the bug, use "setenv LC_ALL ja".  Also pay
+        special attention to Solaris locale IDs that don't match the corresponding java
+        locales, such as "su" (which should turn into "fi_FI"), "cz" (which should turn
+        into "cs_CZ"), and "en_UK" (which should turn into "en_GB").
+
+    Bug #4079167:
+        Test this bug the same way you test bug #4118731.  Set the locale to each of
+        the specified locale IDs (e.g., "setenv LC_ALL japanese"), and then run
+        PrintDefaultLocale.  You should get the following results:
+            Solaris ID  Java ID  Java display name     Encoding
+            ==========  =======  ====================  ========
+            japanese    ja_JP    Japanese (Japan)        --
+            korean      ko_KR    Korean (South Korea)    --
+            tchinese    zh_TW    Chinese (Taiwan)        --
+            big5        zh_TW    Chinese (Taiwan)      Big5
+        (Where "--" is marked for "encoding," the result isn't important-- it's the
+        default encoding for that locale, which we don't test.  It should be something
+        plausible.  Also note that this test presupposed you actually have locales
+        with these names installed on your system.)
+
+    Bug #4154559, 4778440:
+        Set the locale to Norwegian (Bokmal) and Norwegian (Nynorsk) using the
+        Regional Settings control panel on Windows.  For each setting, run this program.
+        You should see no_NO and no_NO_NY, respectively.
+
+    Bug #4182108:    
+        Test this bug the same way you test bug #4118731.  Set the locale to
+        each of the specified locale IDs (e.g., "setenv LC_ALL japanese"), and
+        then run PrintDefaultLocale.  You should get the following results:
+
+            Solaris ID          Java ID     Encoding
+            ==========          =======     ========
+            cz                  cs_CZ       --
+            su                  fi_FI       --
+            fr.ISO8859-15       fr_FR       ISO8859-15
+            fr.ISO8859-15@euro  fr_FR       ISO8859-15
+
+        Where "--" is marked for "encoding," the result isn't important-- it's
+        the default encoding for that locale, which we don't test.  It should be
+        something plausible.  Also note that this test presupposed you actually
+        have locales with these names installed on your system.
+
+        As of this writing, there is a bug in Solaris or in the 8859-15/euro
+        patch for 2.6 (Solaris patch 106842-01) which causes nl_langinfo() to
+        return the wrong value for 8859-15 locales.  As a result, the encoding
+        returned by this test is currency ISO8859-1 for 8859-15 locales.
+
+    Bug #4778440, 5005601, 5074060, 5107154:
+        Run the "deflocale" tool found in "data" directory (deflocale.sh on Unix, 
+	deflocale.exe on Windows), and check the following:
+
+	    4778440: Check that iw_IL is the default locale if the OS's locale is
+	    Hebrew,  and in_ID for Indonesian.
+	    5005601: For Norwegian locales, no_NO is selected for Bokmal, and no_NO_NY
+	    is selected for Nynorsk.
+	    5074060, 5107154: On Windows XP ServicePack 2, check the default locales for the
+	    following Windows locales.  Compare with the golden data (deflocale.win):
+                Bengali - India					
+                Croatian - Bosnia and Herzegovina		
+                Bosnian - Bosnia and Herzegovina		
+                Serbian (Latin) - Bosnia and Herzegovina	
+                Serbian (Cyrillic) - Bosnia and Herzegovina	
+                Welsh - United Kingdom				
+                Maori - New Zealand				
+                Malayalam - India				
+                Maltese - Malta					
+                Quechua - Bolivia				
+                Quechua - Ecuador				
+                Quechua - Peru					
+                Setswana (Tswana) - South Africa		
+                isiXhosa (Xhosa) - South Africa			
+                isiZulu ( Zulu) - South Africa			
+                Sesotho sa Leboa (Northern Sotho) - South Africa
+                Sami, Northern - Norway				
+                Sami, Northern - Sweden				
+                Sami, Northern - Finland			
+                Sami, Lule - Norway				
+                Sami, Lule - Sweden				
+                Sami, Southern - Norway				
+                Sami, Southern - Sweden				
+                Sami, Skolt - Finland				
+                Sami, Inari - Finland				
+
+    Bug # 6409997:
+        Run the "deflocale.exe" tool found in "data" directory on Windows Vista.
+	It contains the following new locales:
+                Tajik (Cyrillic) (Tajikistan) - 1251
+                Upper Sorbian (Germany) - 1252
+                Turkmen (Turkmenistan) - 1250
+                Oriya (India) - 0
+                Assamese (India) - 0
+                Tibetan (People's Republic of China) - 0
+                Khmer (Cambodia) - 0
+                Lao (Lao P.D.R.) - 0
+                Sinhala (Sri Lanka) - 0
+                Inuktitut (Canada) - 0
+                Amharic (Ethiopia) - 0
+                Hausa (Latin) (Nigeria) - 1252
+                Yoruba (Nigeria) - 1252
+                Bashkir (Russia) - 1251
+                Greenlandic (Greenland) - 1252
+                Igbo (Nigeria) - 1252
+                Yi (People's Republic of China) - 0
+                Breton (France) - 1252
+                Uighur (People's Republic of China) - 1256
+                Occitan (France) - 1252
+                Corsican (France) - 1252
+                Alsatian (France) - 1252
+                Yakut (Russia) - 1251
+                K'iche (Guatemala) - 1252
+                Kinyarwanda (Rwanda) - 1252
+                Wolof (Senegal) - 1252
+                Dari (Afghanistan) - 1256
+                Lower Sorbian (Germany) - 1252
+                Bengali (Bangladesh) - 0
+                Mongolian (Traditional Mongolian) (People's Republic of China) - 0
+                Tamazight (Latin) (Algeria) - 1252
+                English (India) - 1252
+                English (Malaysia) - 1252
+                English (Singapore) - 1252
+                Spanish (United States) - 1252
+	    
+*/
+import java.nio.charset.Charset;
+import java.util.Locale;
+
+public class PrintDefaultLocale {
+    public static void main(String[] args) {
+        System.out.println(Locale.getDefault().toString());
+        System.out.println(Locale.getDefault().getDisplayName(Locale.US));
+        System.out.println(Charset.defaultCharset());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/ThaiGov.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,141 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ * @test @(#)ThaiGov.java	1.5 07/04/06
+ * @bug 4474409
+ * @author John O'Conner
+ *
+ */
+
+import java.util.*;
+import java.text.*;
+
+public class ThaiGov {
+
+    char[] hex = {'0', '1', '2', '3',
+		  '4', '5', '6', '7',
+		  '8', '9', 'A', 'B',
+		  'C', 'D', 'E', 'F'};
+
+    ThaiGov() {
+	System.out.println("ThaiGov locale test...");
+
+    }
+
+    String toHex(String str) {
+	StringBuffer buff = new StringBuffer();
+	int y=0;
+	for(int x=0; x < str.length(); ++x) {
+	    buff.append("\\u");
+	    buff.append(toHex(str.charAt(x)));
+	}
+	return buff.toString();
+    }
+
+    String toHex(char ch) {
+	StringBuffer buff = new StringBuffer();
+	buff.append(hex[ch>>12]);
+	buff.append(hex[(ch>>8) & 0x0F]);
+	buff.append(hex[(ch>>4) & 0x0F]);
+	buff.append(hex[ch & 0x0F]);
+	return buff.toString();
+    }
+
+
+    void numberTest() throws RuntimeException {
+	final String strExpected = "\u0E51\u0E52\u002C\u0E53\u0E54\u0E55\u002C\u0E56\u0E57\u0E58\u002E\u0E52\u0E53\u0E54";
+	final double value =  12345678.234;
+
+	Locale locTH = new Locale("th", "TH", "TH");
+
+	// th_TH_TH test
+	NumberFormat nf = NumberFormat.getInstance(locTH);
+	String str = nf.format(value);
+
+	if (!strExpected.equals(str)) {
+	    throw new RuntimeException();
+	}
+
+    }
+
+    void currencyTest() throws RuntimeException {
+	final String strExpected = "\u0E3F\u0E51\u0E52\u002C\u0E53\u0E54\u0E55\u002C\u0E56\u0E57\u0E58\u002E\u0E52\u0E53";
+	final double value =  12345678.234;
+
+	Locale locTH = new Locale("th", "TH", "TH");
+
+	// th_TH_TH test
+	NumberFormat nf = NumberFormat.getCurrencyInstance(locTH);
+	String str = nf.format(value);
+
+	if (!strExpected.equals(str)) {
+	    throw new RuntimeException();
+	}
+
+    }
+
+    void dateTest() throws RuntimeException {
+	Locale locTH = new Locale("th", "TH", "TH");
+	TimeZone tz = TimeZone.getTimeZone("PST");
+
+	Calendar calGregorian = Calendar.getInstance(tz, Locale.US);
+       	calGregorian.clear();
+	calGregorian.set(2002, 4, 1, 8, 30);
+	final Date date = calGregorian.getTime();
+	Calendar cal = Calendar.getInstance(tz, locTH);
+       	cal.clear();
+	cal.setTime(date);
+
+
+	final String strExpected = "\u0E27\u0E31\u0E19\u0E1E\u0E38\u0E18\u0E17\u0E35\u0E48\u0020\u0E51\u0020\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21\u0020\u0E1E\u002E\u0E28\u002E\u0020\u0E52\u0E55\u0E54\u0E55\u002C\u0020\u0E58\u0020\u0E19\u0E32\u0E2C\u0E34\u0E01\u0E32\u0020\u0E53\u0E50\u0020\u0E19\u0E32\u0E17\u0E35\u0020\u0E50\u0E50\u0020\u0E27\u0E34\u0E19\u0E32\u0E17\u0E35";
+	Date value =  cal.getTime();
+
+	// th_TH_TH test
+	DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locTH);
+       	df.setTimeZone(tz);
+	String str = df.format(value);
+
+	if (!strExpected.equals(str)) {
+	    throw new RuntimeException();
+	}
+
+    }
+
+    public static void main(String[] args) {
+
+	ThaiGov app = new ThaiGov();
+	System.out.print("Running numberTest...");
+	app.numberTest();
+	System.out.print("Finished\n");
+	System.out.print("Running currencyTest...");
+	app.currencyTest();
+	System.out.print("Finished\n");
+	System.out.print("Running dateTest...");
+	app.dateTest();
+	System.out.print("Finished\n");
+	
+	System.out.println("PASSED");
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/bug4122700.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,60 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test @(#)bug4122700.java	1.5 07/04/06
+ * @bug 4122700
+ * @summary Verify that list of available locales is non-empty, and print the list
+ */
+
+import java.util.Locale;
+
+public class bug4122700 {
+    public static void main(String[] args) throws Exception {
+        Locale[] systemLocales = Locale.getAvailableLocales();
+        if (systemLocales.length == 0)
+            throw new Exception("Available locale list is empty!");
+        System.out.println("Found " + systemLocales.length + " locales:");
+        Locale[] locales = new Locale[systemLocales.length];
+        for (int i = 0; i < locales.length; i++) {
+            Locale lowest = null;
+            for (int j = 0; j < systemLocales.length; j++) {
+                if (i > 0 && locales[i - 1].toString().compareTo(systemLocales[j].toString()) >= 0)
+                    continue;
+                if (lowest == null || systemLocales[j].toString().compareTo(lowest.toString()) < 0)
+                    lowest = systemLocales[j];
+            }
+            locales[i] = lowest;
+        }
+        for (int i = 0; i < locales.length; i++) {
+            if (locales[i].getCountry().length() == 0)
+                System.out.println("    " + locales[i].getDisplayLanguage() + ":");
+            else {
+                if (locales[i].getVariant().length() == 0)
+                    System.out.println("        " + locales[i].getDisplayCountry());
+                else
+                    System.out.println("        " + locales[i].getDisplayCountry() + ", "
+                                    + locales[i].getDisplayVariant());
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/bug4123285.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,1 @@
+<APPLET CODE="bug4123285.class" CODEBASE="./" WIDTH="250" HEIGHT="325" ALIGN="TOP"></APPLET>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/bug4123285.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,60 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.util.Locale;
+
+public class bug4123285 extends java.applet.Applet {
+    public void start() {
+        System.out.println("Hello, world!");
+        Locale[] systemLocales = null;
+        try {
+            System.out.println("Default locale = " + Locale.getDefault());
+            systemLocales = Locale.getAvailableLocales();
+            System.out.println("Found " + systemLocales.length + " locales:");
+            Locale[] locales = new Locale[systemLocales.length];
+            for (int i = 0; i < locales.length; i++) {
+                Locale lowest = null;
+                for (int j = 0; j < systemLocales.length; j++) {
+                    if (i > 0 && locales[i - 1].toString().compareTo(systemLocales[j].toString()) >= 0)
+                       continue;
+                    if (lowest == null || systemLocales[j].toString().compareTo(lowest.toString()) < 0)
+                       lowest = systemLocales[j];
+                }
+                locales[i] = lowest;
+            }
+            for (int i = 0; i < locales.length; i++) {
+                if (locales[i].getCountry().length() == 0)
+                   System.out.println("    " + locales[i].getDisplayLanguage() + ":");
+                else {
+                    if (locales[i].getVariant().length() == 0)
+                       System.out.println("        " + locales[i].getDisplayCountry());
+                    else
+                        System.out.println("        " + locales[i].getDisplayCountry() + ", "
+                                    + locales[i].getDisplayVariant());
+                }
+            }
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/bug6277243.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,39 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test @(#)bug6277243.java	1.2 07/04/06
+ * @bug 6277243
+ * @summary Verify that there is Locale.ROOT constant, and it is equal to Locale("", "", "")
+ */
+
+import java.util.Locale;
+
+public class bug6277243 {
+
+    public static void main(String[] args) throws Exception {
+	Locale root = new Locale("", "", "");
+	if (!Locale.ROOT.equals(root)) {
+	    throw new RuntimeException("Locale.ROOT is not equal to Locale(\"\", \"\", \"\")");
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/bug6312358.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,82 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test @(#)bug6312358.java	1.2 07/04/06
+ * @bug 6312358 
+ * @summary Verify that an NPE is thrown by issueing Locale.getInstance() with
+ *      any argument being null.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Locale;
+
+public class bug6312358 {
+
+
+    public static void main(String[] args) throws Exception {
+
+	try {
+            // Locale.getInstance is not directly accessible.
+            Method getInstanceMethod = Locale.class.getDeclaredMethod(
+                "getInstance", String.class, String.class, String.class
+            );
+            getInstanceMethod.setAccessible(true);
+
+            getInstanceMethod.invoke(null, "null", "GB", "");
+	    try {
+                getInstanceMethod.invoke(null, null, "GB", "");
+                throw new RuntimeException("Should NPE with language set to null");
+            } catch (InvocationTargetException exc) {
+                Throwable cause = exc.getCause();
+		if (!(cause instanceof NullPointerException)) {
+                    throw new RuntimeException(cause+" is thrown with language set to null");
+		}
+	    }
+
+            getInstanceMethod.invoke(null, "en", "null", "");
+	    try {
+                getInstanceMethod.invoke(null, "en", null, "");
+                throw new RuntimeException("Should NPE with country set to null");
+            } catch (InvocationTargetException exc) {
+                Throwable cause = exc.getCause();
+		if (!(cause instanceof NullPointerException)) {
+                    throw new RuntimeException(cause+" is thrown with country set to null");
+		}
+	    }
+
+            getInstanceMethod.invoke(null, "en", "GB", "null");
+	    try {
+                getInstanceMethod.invoke(null, "en", "GB", null);
+                throw new RuntimeException("Should NPE with variant set to null");
+            } catch (InvocationTargetException exc) {
+                Throwable cause = exc.getCause();
+		if (!(cause instanceof NullPointerException)) {
+                    throw new RuntimeException(cause+" is thrown with variant set to null");
+		}
+	    }
+        } catch (java.lang.NoSuchMethodException exc) {
+            // method is not found.  consider it as a success
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/data/deflocale.c	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,128 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)deflocale.c	1.5 07/04/06
+ *
+ * A simple tool to output all the installed locales on a Windows machine, and 
+ * corresponding Java default locale/file.encoding using PrintDefaultLocale
+ *
+ * WARNING:  This tool directly modifies the locale info in the Windows registry.
+ * It may not work with the Windows versions after Windows XP SP2.  Also, 
+ * if the test did not complete or was manually killed, you will need to reset 
+ * the user default locale in the Control Panel manually.
+ *
+ * Usage: "deflocale.exe <java launcher> PrintDefaultLocale
+ *
+ * How to compile: "cl deflocale.c advapi32.lib"
+ */
+#include <windows.h>
+#include <stdio.h>
+#include <memory.h>
+
+char* launcher;
+char szBuffer[MAX_PATH];
+LCID LCIDArray[1024];
+int numLCIDs = 0;
+
+void testLCID(int anLCID) {
+    HKEY hk;
+
+    printf("\n");
+    printf("OS Locale (lcid: %x): ", anLCID);
+    GetLocaleInfo(anLCID, LOCALE_SENGLANGUAGE, szBuffer, MAX_PATH);  
+    printf("%s (", szBuffer);
+    GetLocaleInfo(anLCID, LOCALE_SENGCOUNTRY, szBuffer, MAX_PATH);   
+    printf("%s) - ", szBuffer);
+    GetLocaleInfo(anLCID, LOCALE_IDEFAULTANSICODEPAGE, szBuffer, MAX_PATH);    
+    printf("%s\n", szBuffer);
+    fflush(0);
+
+    if (RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\International", 0, KEY_READ | KEY_WRITE, &hk) == ERROR_SUCCESS) {
+        BYTE original[16];
+        BYTE test[16];
+        DWORD cb = 16;
+        STARTUPINFO si;
+        PROCESS_INFORMATION pi;
+
+	RegQueryValueEx(hk, "Locale", 0, 0, original, &cb);
+	sprintf(test, "%08x", anLCID);
+	RegSetValueEx(hk, "Locale", 0, REG_SZ, test, cb);
+
+        ZeroMemory(&si, sizeof(si));
+        si.cb = sizeof(si);
+        ZeroMemory(&pi, sizeof(pi));
+        if (CreateProcess(NULL, launcher, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)==0) {
+	    printf("CreateProcess failed with the error code: %x\n", GetLastError());
+	}
+
+        WaitForSingleObject( pi.hProcess, INFINITE );
+
+	RegSetValueEx(hk, "Locale", 0, REG_SZ, original, cb);
+	RegCloseKey(hk);
+    }
+}
+
+BOOL CALLBACK EnumLocaleProc(LPTSTR lpLocaleStr) {
+    sscanf(lpLocaleStr, "%08x", &LCIDArray[numLCIDs]);
+    numLCIDs ++;
+
+    return TRUE;
+}
+
+int sortLCIDs(LCID * pLCID1, LCID * pLCID2) {
+    if (*pLCID1 < *pLCID2) return (-1);
+    if (*pLCID1 == *pLCID2) return 0; 
+    if (*pLCID1 > *pLCID2) return 1; 
+}
+
+int main(int argc, char** argv) {
+    OSVERSIONINFO osvi;
+    LPTSTR commandline = GetCommandLine();
+    int i;
+
+    osvi.dwOSVersionInfoSize = sizeof(osvi);
+    GetVersionEx(&osvi);
+    printf("# OSVersionInfo\n");
+    printf("# MajorVersion: %d\n", osvi.dwMajorVersion);
+    printf("# MinorVersion: %d\n", osvi.dwMinorVersion);
+    printf("# BuildNumber: %d\n", osvi.dwBuildNumber);
+    printf("# CSDVersion: %s\n", osvi.szCSDVersion);
+    printf("\n");
+    fflush(0);
+    
+    launcher = strchr(commandline, ' ')+1;
+    while (*launcher == ' ') {
+	launcher++;
+    }
+
+    // Enumerate locales
+    EnumSystemLocales(EnumLocaleProc, LCID_INSTALLED);
+
+    // Sort LCIDs
+    qsort(LCIDArray, numLCIDs, sizeof(LCID), (void *)sortLCIDs);
+
+    // Execute enumeration of Java default locales
+    for (i = 0; i < numLCIDs; i ++) {
+	testLCID(LCIDArray[i]);
+    }
+}
Binary file j2se/test/java/util/Locale/data/deflocale.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/data/deflocale.jds3	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,1793 @@
+Sun Java Desktop System, Release 3 - build 36
+Assembled 23 May 2005
+Linux dnm-dtf-012 2.6.5-7.139-default #1 Fri Jan 14 15:41:33 UTC 2005 i686 i686 i386 GNU/Linux
+
+OS Locale:  aa_DJ
+aa_DJ
+Afar (Djibouti)
+ISO-8859-1
+
+OS Locale:  aa_ER
+aa_ER
+Afar (Eritrea)
+UTF-8
+
+OS Locale:  aa_ER.utf8
+aa_ER
+Afar (Eritrea)
+UTF-8
+
+OS Locale:  aa_ER@saaho
+aa_ER
+Afar (Eritrea)
+UTF-8
+
+OS Locale:  aa_ET
+aa_ET
+Afar (Ethiopia)
+UTF-8
+
+OS Locale:  aa_ET.utf8
+aa_ET
+Afar (Ethiopia)
+UTF-8
+
+OS Locale:  af_ZA
+af_ZA
+Afrikaans (South Africa)
+ISO-8859-1
+
+OS Locale:  am_ET
+am_ET
+Amharic (Ethiopia)
+UTF-8
+
+OS Locale:  am_ET.utf8
+am_ET
+Amharic (Ethiopia)
+UTF-8
+
+OS Locale:  an_ES
+an_ES
+Aragonese (Spain)
+ISO-8859-15
+
+OS Locale:  ar_AE
+ar_AE
+Arabic (United Arab Emirates)
+ISO-8859-6
+
+OS Locale:  ar_AE.utf8
+ar_AE
+Arabic (United Arab Emirates)
+UTF-8
+
+OS Locale:  ar_BH
+ar_BH
+Arabic (Bahrain)
+ISO-8859-6
+
+OS Locale:  ar_BH.utf8
+ar_BH
+Arabic (Bahrain)
+UTF-8
+
+OS Locale:  ar_DZ
+ar_DZ
+Arabic (Algeria)
+ISO-8859-6
+
+OS Locale:  ar_DZ.utf8
+ar_DZ
+Arabic (Algeria)
+UTF-8
+
+OS Locale:  ar_EG
+ar_EG
+Arabic (Egypt)
+ISO-8859-6
+
+OS Locale:  ar_EG.utf8
+ar_EG
+Arabic (Egypt)
+UTF-8
+
+OS Locale:  ar_IN
+ar_IN
+Arabic (India)
+UTF-8
+
+OS Locale:  ar_IN.utf8
+ar_IN
+Arabic (India)
+UTF-8
+
+OS Locale:  ar_IQ
+ar_IQ
+Arabic (Iraq)
+ISO-8859-6
+
+OS Locale:  ar_IQ.utf8
+ar_IQ
+Arabic (Iraq)
+UTF-8
+
+OS Locale:  ar_JO
+ar_JO
+Arabic (Jordan)
+ISO-8859-6
+
+OS Locale:  ar_JO.utf8
+ar_JO
+Arabic (Jordan)
+UTF-8
+
+OS Locale:  ar_KW
+ar_KW
+Arabic (Kuwait)
+ISO-8859-6
+
+OS Locale:  ar_KW.utf8
+ar_KW
+Arabic (Kuwait)
+UTF-8
+
+OS Locale:  ar_LB
+ar_LB
+Arabic (Lebanon)
+ISO-8859-6
+
+OS Locale:  ar_LB.utf8
+ar_LB
+Arabic (Lebanon)
+UTF-8
+
+OS Locale:  ar_LY
+ar_LY
+Arabic (Libya)
+ISO-8859-6
+
+OS Locale:  ar_LY.utf8
+ar_LY
+Arabic (Libya)
+UTF-8
+
+OS Locale:  ar_MA
+ar_MA
+Arabic (Morocco)
+ISO-8859-6
+
+OS Locale:  ar_MA.utf8
+ar_MA
+Arabic (Morocco)
+UTF-8
+
+OS Locale:  ar_OM
+ar_OM
+Arabic (Oman)
+ISO-8859-6
+
+OS Locale:  ar_OM.utf8
+ar_OM
+Arabic (Oman)
+UTF-8
+
+OS Locale:  ar_QA
+ar_QA
+Arabic (Qatar)
+ISO-8859-6
+
+OS Locale:  ar_QA.utf8
+ar_QA
+Arabic (Qatar)
+UTF-8
+
+OS Locale:  ar_SA
+ar_SA
+Arabic (Saudi Arabia)
+ISO-8859-6
+
+OS Locale:  ar_SA.utf8
+ar_SA
+Arabic (Saudi Arabia)
+UTF-8
+
+OS Locale:  ar_SD
+ar_SD
+Arabic (Sudan)
+ISO-8859-6
+
+OS Locale:  ar_SD.utf8
+ar_SD
+Arabic (Sudan)
+UTF-8
+
+OS Locale:  ar_SY
+ar_SY
+Arabic (Syria)
+ISO-8859-6
+
+OS Locale:  ar_SY.utf8
+ar_SY
+Arabic (Syria)
+UTF-8
+
+OS Locale:  ar_TN
+ar_TN
+Arabic (Tunisia)
+ISO-8859-6
+
+OS Locale:  ar_TN.utf8
+ar_TN
+Arabic (Tunisia)
+UTF-8
+
+OS Locale:  ar_YE
+ar_YE
+Arabic (Yemen)
+ISO-8859-6
+
+OS Locale:  ar_YE.utf8
+ar_YE
+Arabic (Yemen)
+UTF-8
+
+OS Locale:  az_AZ.utf8
+az_AZ
+Azerbaijani (Azerbaijan)
+UTF-8
+
+OS Locale:  be_BY
+be_BY
+Belarusian (Belarus)
+windows-1251
+
+OS Locale:  be_BY.utf8
+be_BY
+Belarusian (Belarus)
+UTF-8
+
+OS Locale:  bg_BG
+bg_BG
+Bulgarian (Bulgaria)
+windows-1251
+
+OS Locale:  bg_BG.utf8
+bg_BG
+Bulgarian (Bulgaria)
+UTF-8
+
+OS Locale:  bn_BD
+bn_BD
+Bengali (Bangladesh)
+UTF-8
+
+OS Locale:  bn_BD.utf8
+bn_BD
+Bengali (Bangladesh)
+UTF-8
+
+OS Locale:  bn_IN
+bn_IN
+Bengali (India)
+UTF-8
+
+OS Locale:  bn_IN.utf8
+bn_IN
+Bengali (India)
+UTF-8
+
+OS Locale:  br_FR
+br_FR
+Breton (France)
+ISO-8859-1
+
+OS Locale:  br_FR@euro
+br_FR
+Breton (France)
+ISO-8859-15
+
+OS Locale:  bs_BA
+bs_BA
+Bosnian (Bosnia and Herzegovina)
+ISO-8859-2
+
+OS Locale:  byn_ER
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  byn_ER.utf8
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  ca_ES
+ca_ES
+Catalan (Spain)
+ISO-8859-1
+
+OS Locale:  ca_ES.utf8
+ca_ES
+Catalan (Spain)
+UTF-8
+
+OS Locale:  ca_ES@euro
+ca_ES
+Catalan (Spain)
+ISO-8859-15
+
+OS Locale:  cs_CZ
+cs_CZ
+Czech (Czech Republic)
+ISO-8859-2
+
+OS Locale:  cs_CZ.utf8
+cs_CZ
+Czech (Czech Republic)
+UTF-8
+
+OS Locale:  cy_GB
+cy_GB
+Welsh (United Kingdom)
+UTF-8
+
+OS Locale:  cy_GB.utf8
+cy_GB
+Welsh (United Kingdom)
+UTF-8
+
+OS Locale:  da_DK
+da_DK
+Danish (Denmark)
+ISO-8859-1
+
+OS Locale:  da_DK.utf8
+da_DK
+Danish (Denmark)
+UTF-8
+
+OS Locale:  da_DK@euro
+da_DK
+Danish (Denmark)
+ISO-8859-1
+
+OS Locale:  de_AT
+de_AT
+German (Austria)
+ISO-8859-1
+
+OS Locale:  de_AT.utf8
+de_AT
+German (Austria)
+UTF-8
+
+OS Locale:  de_AT@euro
+de_AT
+German (Austria)
+ISO-8859-15
+
+OS Locale:  de_BE
+de_BE
+German (Belgium)
+ISO-8859-1
+
+OS Locale:  de_BE.utf8
+de_BE
+German (Belgium)
+UTF-8
+
+OS Locale:  de_BE@euro
+de_BE
+German (Belgium)
+ISO-8859-15
+
+OS Locale:  de_CH
+de_CH
+German (Switzerland)
+ISO-8859-1
+
+OS Locale:  de_CH.utf8
+de_CH
+German (Switzerland)
+UTF-8
+
+OS Locale:  de_DE
+de_DE
+German (Germany)
+ISO-8859-1
+
+OS Locale:  de_DE.utf8
+de_DE
+German (Germany)
+UTF-8
+
+OS Locale:  de_DE@euro
+de_DE
+German (Germany)
+ISO-8859-15
+
+OS Locale:  de_LU
+de_LU
+German (Luxembourg)
+ISO-8859-1
+
+OS Locale:  de_LU.utf8
+de_LU
+German (Luxembourg)
+UTF-8
+
+OS Locale:  de_LU@euro
+de_LU
+German (Luxembourg)
+ISO-8859-15
+
+OS Locale:  el_GR
+el_GR
+Greek (Greece)
+ISO-8859-7
+
+OS Locale:  el_GR.utf8
+el_GR
+Greek (Greece)
+UTF-8
+
+OS Locale:  en_AU
+en_AU
+English (Australia)
+ISO-8859-1
+
+OS Locale:  en_AU.utf8
+en_AU
+English (Australia)
+UTF-8
+
+OS Locale:  en_BE
+en_BE
+English (Belgium)
+ISO-8859-1
+
+OS Locale:  en_BE.utf8
+en_BE
+English (Belgium)
+UTF-8
+
+OS Locale:  en_BE@euro
+en_BE
+English (Belgium)
+ISO-8859-15
+
+OS Locale:  en_BW
+en_BW
+English (Botswana)
+ISO-8859-1
+
+OS Locale:  en_BW.utf8
+en_BW
+English (Botswana)
+UTF-8
+
+OS Locale:  en_CA
+en_CA
+English (Canada)
+ISO-8859-1
+
+OS Locale:  en_CA.utf8
+en_CA
+English (Canada)
+UTF-8
+
+OS Locale:  en_DK
+en_DK
+English (Denmark)
+ISO-8859-1
+
+OS Locale:  en_DK.utf8
+en_DK
+English (Denmark)
+UTF-8
+
+OS Locale:  en_GB
+en_GB
+English (United Kingdom)
+ISO-8859-1
+
+OS Locale:  en_GB.iso885915
+en_GB
+English (United Kingdom)
+ISO-8859-15
+
+OS Locale:  en_GB.utf8
+en_GB
+English (United Kingdom)
+UTF-8
+
+OS Locale:  en_HK
+en_HK
+English (Hong Kong)
+ISO-8859-1
+
+OS Locale:  en_HK.utf8
+en_HK
+English (Hong Kong)
+UTF-8
+
+OS Locale:  en_IE
+en_IE
+English (Ireland)
+ISO-8859-1
+
+OS Locale:  en_IE.utf8
+en_IE
+English (Ireland)
+UTF-8
+
+OS Locale:  en_IE@euro
+en_IE
+English (Ireland)
+ISO-8859-15
+
+OS Locale:  en_IN
+en_IN
+English (India)
+UTF-8
+
+OS Locale:  en_NZ
+en_NZ
+English (New Zealand)
+ISO-8859-1
+
+OS Locale:  en_NZ.utf8
+en_NZ
+English (New Zealand)
+UTF-8
+
+OS Locale:  en_PH
+en_PH
+English (Philippines)
+ISO-8859-1
+
+OS Locale:  en_PH.utf8
+en_PH
+English (Philippines)
+UTF-8
+
+OS Locale:  en_SG
+en_SG
+English (Singapore)
+ISO-8859-1
+
+OS Locale:  en_SG.utf8
+en_SG
+English (Singapore)
+UTF-8
+
+OS Locale:  en_US
+en_US
+English (United States)
+ISO-8859-1
+
+OS Locale:  en_US.iso885915
+en_US
+English (United States)
+ISO-8859-15
+
+OS Locale:  en_US.utf8
+en_US
+English (United States)
+UTF-8
+
+OS Locale:  en_ZA
+en_ZA
+English (South Africa)
+ISO-8859-1
+
+OS Locale:  en_ZA.utf8
+en_ZA
+English (South Africa)
+UTF-8
+
+OS Locale:  en_ZW
+en_ZW
+English (Zimbabwe)
+ISO-8859-1
+
+OS Locale:  en_ZW.utf8
+en_ZW
+English (Zimbabwe)
+UTF-8
+
+OS Locale:  es_AR
+es_AR
+Spanish (Argentina)
+ISO-8859-1
+
+OS Locale:  es_AR.utf8
+es_AR
+Spanish (Argentina)
+UTF-8
+
+OS Locale:  es_BO
+es_BO
+Spanish (Bolivia)
+ISO-8859-1
+
+OS Locale:  es_BO.utf8
+es_BO
+Spanish (Bolivia)
+UTF-8
+
+OS Locale:  es_CL
+es_CL
+Spanish (Chile)
+ISO-8859-1
+
+OS Locale:  es_CL.utf8
+es_CL
+Spanish (Chile)
+UTF-8
+
+OS Locale:  es_CO
+es_CO
+Spanish (Colombia)
+ISO-8859-1
+
+OS Locale:  es_CO.utf8
+es_CO
+Spanish (Colombia)
+UTF-8
+
+OS Locale:  es_CR
+es_CR
+Spanish (Costa Rica)
+ISO-8859-1
+
+OS Locale:  es_CR.utf8
+es_CR
+Spanish (Costa Rica)
+UTF-8
+
+OS Locale:  es_DO
+es_DO
+Spanish (Dominican Republic)
+ISO-8859-1
+
+OS Locale:  es_DO.utf8
+es_DO
+Spanish (Dominican Republic)
+UTF-8
+
+OS Locale:  es_EC
+es_EC
+Spanish (Ecuador)
+ISO-8859-1
+
+OS Locale:  es_EC.utf8
+es_EC
+Spanish (Ecuador)
+UTF-8
+
+OS Locale:  es_ES
+es_ES
+Spanish (Spain)
+ISO-8859-1
+
+OS Locale:  es_ES.utf8
+es_ES
+Spanish (Spain)
+UTF-8
+
+OS Locale:  es_ES@euro
+es_ES
+Spanish (Spain)
+ISO-8859-15
+
+OS Locale:  es_GT
+es_GT
+Spanish (Guatemala)
+ISO-8859-1
+
+OS Locale:  es_GT.utf8
+es_GT
+Spanish (Guatemala)
+UTF-8
+
+OS Locale:  es_HN
+es_HN
+Spanish (Honduras)
+ISO-8859-1
+
+OS Locale:  es_HN.utf8
+es_HN
+Spanish (Honduras)
+UTF-8
+
+OS Locale:  es_MX
+es_MX
+Spanish (Mexico)
+ISO-8859-1
+
+OS Locale:  es_MX.utf8
+es_MX
+Spanish (Mexico)
+UTF-8
+
+OS Locale:  es_NI
+es_NI
+Spanish (Nicaragua)
+ISO-8859-1
+
+OS Locale:  es_NI.utf8
+es_NI
+Spanish (Nicaragua)
+UTF-8
+
+OS Locale:  es_PA
+es_PA
+Spanish (Panama)
+ISO-8859-1
+
+OS Locale:  es_PA.utf8
+es_PA
+Spanish (Panama)
+UTF-8
+
+OS Locale:  es_PE
+es_PE
+Spanish (Peru)
+ISO-8859-1
+
+OS Locale:  es_PE.utf8
+es_PE
+Spanish (Peru)
+UTF-8
+
+OS Locale:  es_PR
+es_PR
+Spanish (Puerto Rico)
+ISO-8859-1
+
+OS Locale:  es_PR.utf8
+es_PR
+Spanish (Puerto Rico)
+UTF-8
+
+OS Locale:  es_PY
+es_PY
+Spanish (Paraguay)
+ISO-8859-1
+
+OS Locale:  es_PY.utf8
+es_PY
+Spanish (Paraguay)
+UTF-8
+
+OS Locale:  es_SV
+es_SV
+Spanish (El Salvador)
+ISO-8859-1
+
+OS Locale:  es_SV.utf8
+es_SV
+Spanish (El Salvador)
+UTF-8
+
+OS Locale:  es_US
+es_US
+Spanish (United States)
+ISO-8859-1
+
+OS Locale:  es_US.utf8
+es_US
+Spanish (United States)
+UTF-8
+
+OS Locale:  es_UY
+es_UY
+Spanish (Uruguay)
+ISO-8859-1
+
+OS Locale:  es_UY.utf8
+es_UY
+Spanish (Uruguay)
+UTF-8
+
+OS Locale:  es_VE
+es_VE
+Spanish (Venezuela)
+ISO-8859-1
+
+OS Locale:  es_VE.utf8
+es_VE
+Spanish (Venezuela)
+UTF-8
+
+OS Locale:  et_EE
+et_EE
+Estonian (Estonia)
+ISO-8859-1
+
+OS Locale:  et_EE.iso885915
+et_EE
+Estonian (Estonia)
+ISO-8859-15
+
+OS Locale:  et_EE.utf8
+et_EE
+Estonian (Estonia)
+UTF-8
+
+OS Locale:  eu_ES
+eu_ES
+Basque (Spain)
+ISO-8859-1
+
+OS Locale:  eu_ES.utf8
+eu_ES
+Basque (Spain)
+UTF-8
+
+OS Locale:  eu_ES@euro
+eu_ES
+Basque (Spain)
+ISO-8859-15
+
+OS Locale:  fa_IR
+fa_IR
+Persian (Iran)
+UTF-8
+
+OS Locale:  fa_IR.utf8
+fa_IR
+Persian (Iran)
+UTF-8
+
+OS Locale:  fi_FI
+fi_FI
+Finnish (Finland)
+ISO-8859-1
+
+OS Locale:  fi_FI.utf8
+fi_FI
+Finnish (Finland)
+UTF-8
+
+OS Locale:  fi_FI@euro
+fi_FI
+Finnish (Finland)
+ISO-8859-15
+
+OS Locale:  fo_FO
+fo_FO
+Faroese (Faroe Islands)
+ISO-8859-1
+
+OS Locale:  fo_FO.utf8
+fo_FO
+Faroese (Faroe Islands)
+UTF-8
+
+OS Locale:  fr_BE
+fr_BE
+French (Belgium)
+ISO-8859-1
+
+OS Locale:  fr_BE.utf8
+fr_BE
+French (Belgium)
+UTF-8
+
+OS Locale:  fr_BE@euro
+fr_BE
+French (Belgium)
+ISO-8859-15
+
+OS Locale:  fr_CA
+fr_CA
+French (Canada)
+ISO-8859-1
+
+OS Locale:  fr_CA.utf8
+fr_CA
+French (Canada)
+UTF-8
+
+OS Locale:  fr_CH
+fr_CH
+French (Switzerland)
+ISO-8859-1
+
+OS Locale:  fr_CH.utf8
+fr_CH
+French (Switzerland)
+UTF-8
+
+OS Locale:  fr_FR
+fr_FR
+French (France)
+ISO-8859-1
+
+OS Locale:  fr_FR.utf8
+fr_FR
+French (France)
+UTF-8
+
+OS Locale:  fr_FR@euro
+fr_FR
+French (France)
+ISO-8859-15
+
+OS Locale:  fr_LU
+fr_LU
+French (Luxembourg)
+ISO-8859-1
+
+OS Locale:  fr_LU.utf8
+fr_LU
+French (Luxembourg)
+UTF-8
+
+OS Locale:  fr_LU@euro
+fr_LU
+French (Luxembourg)
+ISO-8859-15
+
+OS Locale:  ga_IE
+ga_IE
+Irish (Ireland)
+ISO-8859-1
+
+OS Locale:  ga_IE.utf8
+ga_IE
+Irish (Ireland)
+UTF-8
+
+OS Locale:  ga_IE@euro
+ga_IE
+Irish (Ireland)
+ISO-8859-15
+
+OS Locale:  gd_GB
+gd_GB
+Scottish Gaelic (United Kingdom)
+ISO-8859-15
+
+OS Locale:  gez_ER
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  gez_ER@abegede
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  gez_ET
+en_ET
+English (Ethiopia)
+UTF-8
+
+OS Locale:  gez_ET@abegede
+en_ET
+English (Ethiopia)
+UTF-8
+
+OS Locale:  gl_ES
+gl_ES
+Gallegan (Spain)
+ISO-8859-1
+
+OS Locale:  gl_ES.utf8
+gl_ES
+Gallegan (Spain)
+UTF-8
+
+OS Locale:  gl_ES@euro
+gl_ES
+Gallegan (Spain)
+ISO-8859-15
+
+OS Locale:  gu_IN
+gu_IN
+Gujarati (India)
+UTF-8
+
+OS Locale:  gv_GB
+gv_GB
+Manx (United Kingdom)
+ISO-8859-1
+
+OS Locale:  gv_GB.utf8
+gv_GB
+Manx (United Kingdom)
+UTF-8
+
+OS Locale:  he_IL
+iw_IL
+Hebrew (Israel)
+ISO-8859-8
+
+OS Locale:  he_IL.utf8
+iw_IL
+Hebrew (Israel)
+UTF-8
+
+OS Locale:  hi_IN
+hi_IN
+Hindi (India)
+UTF-8
+
+OS Locale:  hi_IN.utf8
+hi_IN
+Hindi (India)
+UTF-8
+
+OS Locale:  hr_HR
+hr_HR
+Croatian (Croatia)
+ISO-8859-2
+
+OS Locale:  hr_HR.utf8
+hr_HR
+Croatian (Croatia)
+UTF-8
+
+OS Locale:  hu_HU
+hu_HU
+Hungarian (Hungary)
+ISO-8859-2
+
+OS Locale:  hu_HU.utf8
+hu_HU
+Hungarian (Hungary)
+UTF-8
+
+OS Locale:  id_ID
+in_ID
+Indonesian (Indonesia)
+ISO-8859-1
+
+OS Locale:  id_ID.utf8
+in_ID
+Indonesian (Indonesia)
+UTF-8
+
+OS Locale:  is_IS
+is_IS
+Icelandic (Iceland)
+ISO-8859-1
+
+OS Locale:  is_IS.utf8
+is_IS
+Icelandic (Iceland)
+UTF-8
+
+OS Locale:  it_CH
+it_CH
+Italian (Switzerland)
+ISO-8859-1
+
+OS Locale:  it_CH.utf8
+it_CH
+Italian (Switzerland)
+UTF-8
+
+OS Locale:  it_IT
+it_IT
+Italian (Italy)
+ISO-8859-1
+
+OS Locale:  it_IT.utf8
+it_IT
+Italian (Italy)
+UTF-8
+
+OS Locale:  it_IT@euro
+it_IT
+Italian (Italy)
+ISO-8859-15
+
+OS Locale:  iw_IL
+iw_IL
+Hebrew (Israel)
+ISO-8859-8
+
+OS Locale:  iw_IL.utf8
+iw_IL
+Hebrew (Israel)
+UTF-8
+
+OS Locale:  ja_JP.eucjp
+ja_JP
+Japanese (Japan)
+x-euc-jp-linux
+
+OS Locale:  ja_JP.sjis
+ja_JP
+Japanese (Japan)
+Shift_JIS
+
+OS Locale:  ja_JP.utf8
+ja_JP
+Japanese (Japan)
+UTF-8
+
+OS Locale:  ka_GE
+ka_GE
+Georgian (Georgia)
+UTF-8
+
+OS Locale:  kk_KZ
+kk_KZ
+Kazakh (Kazakhstan)
+UTF-8
+
+OS Locale:  kl_GL
+kl_GL
+Greenlandic (Greenland)
+ISO-8859-1
+
+OS Locale:  kl_GL.utf8
+kl_GL
+Greenlandic (Greenland)
+UTF-8
+
+OS Locale:  kn_IN
+kn_IN
+Kannada (India)
+UTF-8
+
+OS Locale:  ko_KR.euckr
+ko_KR
+Korean (South Korea)
+EUC-KR
+
+OS Locale:  ko_KR.utf8
+ko_KR
+Korean (South Korea)
+UTF-8
+
+OS Locale:  kw_GB
+kw_GB
+Cornish (United Kingdom)
+ISO-8859-1
+
+OS Locale:  kw_GB.utf8
+kw_GB
+Cornish (United Kingdom)
+UTF-8
+
+OS Locale:  lg_UG
+lg_UG
+Ganda (Uganda)
+UTF-8
+
+OS Locale:  lo_LA
+lo_LA
+Lao (Laos)
+UTF-8
+
+OS Locale:  lt_LT
+lt_LT
+Lithuanian (Lithuania)
+ISO-8859-13
+
+OS Locale:  lt_LT.utf8
+lt_LT
+Lithuanian (Lithuania)
+UTF-8
+
+OS Locale:  lv_LV
+lv_LV
+Latvian (Latvia)
+ISO-8859-13
+
+OS Locale:  lv_LV.utf8
+lv_LV
+Latvian (Latvia)
+UTF-8
+
+OS Locale:  mi_NZ
+mi_NZ
+Maori (New Zealand)
+ISO-8859-13
+
+OS Locale:  mk_MK
+mk_MK
+Macedonian (Macedonia)
+ISO-8859-5
+
+OS Locale:  mk_MK.utf8
+mk_MK
+Macedonian (Macedonia)
+UTF-8
+
+OS Locale:  ml_IN
+ml_IN
+Malayalam (India)
+UTF-8
+
+OS Locale:  ml_IN.utf8
+ml_IN
+Malayalam (India)
+UTF-8
+
+OS Locale:  mn_MN
+mn_MN
+Mongolian (Mongolia)
+UTF-8
+
+OS Locale:  mn_MN.utf8
+mn_MN
+Mongolian (Mongolia)
+UTF-8
+
+OS Locale:  mr_IN
+mr_IN
+Marathi (India)
+UTF-8
+
+OS Locale:  mr_IN.utf8
+mr_IN
+Marathi (India)
+UTF-8
+
+OS Locale:  ms_MY
+ms_MY
+Malay (Malaysia)
+ISO-8859-1
+
+OS Locale:  ms_MY.utf8
+ms_MY
+Malay (Malaysia)
+UTF-8
+
+OS Locale:  mt_MT
+mt_MT
+Maltese (Malta)
+ISO-8859-3
+
+OS Locale:  mt_MT.utf8
+mt_MT
+Maltese (Malta)
+UTF-8
+
+OS Locale:  nb_NO
+nb_NO
+Norwegian Bokmål (Norway)
+ISO-8859-1
+
+OS Locale:  nb_NO.utf8
+nb_NO
+Norwegian Bokmål (Norway)
+UTF-8
+
+OS Locale:  ne_NP
+ne_NP
+Nepali (Nepal)
+UTF-8
+
+OS Locale:  ne_NP.utf8
+ne_NP
+Nepali (Nepal)
+UTF-8
+
+OS Locale:  nl_BE
+nl_BE
+Dutch (Belgium)
+ISO-8859-1
+
+OS Locale:  nl_BE.utf8
+nl_BE
+Dutch (Belgium)
+UTF-8
+
+OS Locale:  nl_BE@euro
+nl_BE
+Dutch (Belgium)
+ISO-8859-15
+
+OS Locale:  nl_NL
+nl_NL
+Dutch (Netherlands)
+ISO-8859-1
+
+OS Locale:  nl_NL.utf8
+nl_NL
+Dutch (Netherlands)
+UTF-8
+
+OS Locale:  nl_NL@euro
+nl_NL
+Dutch (Netherlands)
+ISO-8859-15
+
+OS Locale:  nn_NO
+nn_NO
+Norwegian Nynorsk (Norway)
+ISO-8859-1
+
+OS Locale:  nn_NO.utf8
+nn_NO
+Norwegian Nynorsk (Norway)
+UTF-8
+
+OS Locale:  no_NO
+no_NO
+Norwegian (Norway)
+ISO-8859-1
+
+OS Locale:  no_NO.utf8
+no_NO
+Norwegian (Norway)
+UTF-8
+
+OS Locale:  oc_FR
+oc_FR
+Occitan (France)
+ISO-8859-1
+
+OS Locale:  om_ET
+om_ET
+Oromo (Ethiopia)
+UTF-8
+
+OS Locale:  om_ET.utf8
+om_ET
+Oromo (Ethiopia)
+UTF-8
+
+OS Locale:  om_KE
+om_KE
+Oromo (Kenya)
+ISO-8859-1
+
+OS Locale:  pa_IN
+pa_IN
+Panjabi (India)
+UTF-8
+
+OS Locale:  pa_IN.utf8
+pa_IN
+Panjabi (India)
+UTF-8
+
+OS Locale:  pl_PL
+pl_PL
+Polish (Poland)
+ISO-8859-2
+
+OS Locale:  pl_PL.utf8
+pl_PL
+Polish (Poland)
+UTF-8
+
+OS Locale:  pt_BR
+pt_BR
+Portuguese (Brazil)
+ISO-8859-1
+
+OS Locale:  pt_BR.utf8
+pt_BR
+Portuguese (Brazil)
+UTF-8
+
+OS Locale:  pt_PT
+pt_PT
+Portuguese (Portugal)
+ISO-8859-1
+
+OS Locale:  pt_PT.utf8
+pt_PT
+Portuguese (Portugal)
+UTF-8
+
+OS Locale:  pt_PT@euro
+pt_PT
+Portuguese (Portugal)
+ISO-8859-15
+
+OS Locale:  ro_RO
+ro_RO
+Romanian (Romania)
+ISO-8859-2
+
+OS Locale:  ro_RO.utf8
+ro_RO
+Romanian (Romania)
+UTF-8
+
+OS Locale:  ru_RU
+ru_RU
+Russian (Russia)
+ISO-8859-5
+
+OS Locale:  ru_RU.koi8r
+ru_RU
+Russian (Russia)
+KOI8-R
+
+OS Locale:  ru_RU.utf8
+ru_RU
+Russian (Russia)
+UTF-8
+
+OS Locale:  ru_UA
+ru_UA
+Russian (Ukraine)
+KOI8-U
+
+OS Locale:  ru_UA.utf8
+ru_UA
+Russian (Ukraine)
+UTF-8
+
+OS Locale:  se_NO
+se_NO
+Northern Sami (Norway)
+UTF-8
+
+OS Locale:  se_NO.utf8
+se_NO
+Northern Sami (Norway)
+UTF-8
+
+OS Locale:  sh_YU
+sr_CS
+Serbian (Serbia and Montenegro)
+ISO-8859-2
+
+OS Locale:  sh_YU.utf8
+sr_CS
+Serbian (Serbia and Montenegro)
+UTF-8
+
+OS Locale:  sid_ET
+en_ET
+English (Ethiopia)
+UTF-8
+
+OS Locale:  sid_ET.utf8
+en_ET
+English (Ethiopia)
+UTF-8
+
+OS Locale:  sk_SK
+sk_SK
+Slovak (Slovakia)
+ISO-8859-2
+
+OS Locale:  sk_SK.utf8
+sk_SK
+Slovak (Slovakia)
+UTF-8
+
+OS Locale:  sl_SI
+sl_SI
+Slovenian (Slovenia)
+ISO-8859-2
+
+OS Locale:  sl_SI.utf8
+sl_SI
+Slovenian (Slovenia)
+UTF-8
+
+OS Locale:  so_DJ
+so_DJ
+Somali (Djibouti)
+ISO-8859-1
+
+OS Locale:  so_ET
+so_ET
+Somali (Ethiopia)
+UTF-8
+
+OS Locale:  so_ET.utf8
+so_ET
+Somali (Ethiopia)
+UTF-8
+
+OS Locale:  so_KE
+so_KE
+Somali (Kenya)
+ISO-8859-1
+
+OS Locale:  so_SO
+so_SO
+Somali (Somalia)
+ISO-8859-1
+
+OS Locale:  sq_AL
+sq_AL
+Albanian (Albania)
+ISO-8859-1
+
+OS Locale:  sq_AL.utf8
+sq_AL
+Albanian (Albania)
+UTF-8
+
+OS Locale:  sr_YU
+sr_CS
+Serbian (Serbia and Montenegro)
+ISO-8859-2
+
+OS Locale:  sr_YU.utf8
+sr_CS
+Serbian (Serbia and Montenegro)
+UTF-8
+
+OS Locale:  sr_YU.utf8@cyrillic
+sr_CS
+Serbian (Serbia and Montenegro)
+UTF-8
+
+OS Locale:  sr_YU@cyrillic
+sr_CS
+Serbian (Serbia and Montenegro)
+ISO-8859-5
+
+OS Locale:  st_ZA
+st_ZA
+Southern Sotho (South Africa)
+ISO-8859-1
+
+OS Locale:  st_ZA.utf8
+st_ZA
+Southern Sotho (South Africa)
+UTF-8
+
+OS Locale:  sv_FI
+sv_FI
+Swedish (Finland)
+ISO-8859-1
+
+OS Locale:  sv_FI.utf8
+sv_FI
+Swedish (Finland)
+UTF-8
+
+OS Locale:  sv_FI@euro
+sv_FI
+Swedish (Finland)
+ISO-8859-15
+
+OS Locale:  sv_SE
+sv_SE
+Swedish (Sweden)
+ISO-8859-1
+
+OS Locale:  sv_SE.iso885915
+sv_SE
+Swedish (Sweden)
+ISO-8859-15
+
+OS Locale:  sv_SE.utf8
+sv_SE
+Swedish (Sweden)
+UTF-8
+
+OS Locale:  ta_IN
+ta_IN
+Tamil (India)
+UTF-8
+
+OS Locale:  ta_IN.utf8
+ta_IN
+Tamil (India)
+UTF-8
+
+OS Locale:  te_IN
+te_IN
+Telugu (India)
+UTF-8
+
+OS Locale:  te_IN.utf8
+te_IN
+Telugu (India)
+UTF-8
+
+OS Locale:  tg_TJ
+tg_TJ
+Tajik (Tajikistan)
+UTF-8
+
+OS Locale:  th_TH
+th_TH
+Thai (Thailand)
+TIS-620
+
+OS Locale:  th_TH.utf8
+th_TH
+Thai (Thailand)
+UTF-8
+
+OS Locale:  ti_ER
+ti_ER
+Tigrinya (Eritrea)
+UTF-8
+
+OS Locale:  ti_ER.utf8
+ti_ER
+Tigrinya (Eritrea)
+UTF-8
+
+OS Locale:  ti_ET
+ti_ET
+Tigrinya (Ethiopia)
+UTF-8
+
+OS Locale:  ti_ET.utf8
+ti_ET
+Tigrinya (Ethiopia)
+UTF-8
+
+OS Locale:  tig_ER
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  tig_ER.utf8
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  tl_PH
+tl_PH
+Tagalog (Philippines)
+ISO-8859-1
+
+OS Locale:  tr_TR
+tr_TR
+Turkish (Turkey)
+ISO-8859-9
+
+OS Locale:  tr_TR.utf8
+tr_TR
+Turkish (Turkey)
+UTF-8
+
+OS Locale:  tt_RU.utf8
+tt_RU
+Tatar (Russia)
+UTF-8
+
+OS Locale:  uk_UA
+uk_UA
+Ukrainian (Ukraine)
+KOI8-U
+
+OS Locale:  uk_UA.utf8
+uk_UA
+Ukrainian (Ukraine)
+UTF-8
+
+OS Locale:  ur_PK
+ur_PK
+Urdu (Pakistan)
+UTF-8
+
+OS Locale:  ur_PK.utf8
+ur_PK
+Urdu (Pakistan)
+UTF-8
+
+OS Locale:  uz_UZ
+uz_UZ
+Uzbek (Uzbekistan)
+ISO-8859-1
+
+OS Locale:  uz_UZ@cyrillic
+uz_UZ
+Uzbek (Uzbekistan)
+UTF-8
+
+OS Locale:  vi_VN
+vi_VN
+Vietnamese (Vietnam)
+UTF-8
+
+OS Locale:  vi_VN.tcvn
+vi_VN
+Vietnamese (Vietnam)
+UTF-8
+
+OS Locale:  vi_VN.utf8
+vi_VN
+Vietnamese (Vietnam)
+UTF-8
+
+OS Locale:  wa_BE
+wa_BE
+Walloon (Belgium)
+ISO-8859-1
+
+OS Locale:  wa_BE.utf8
+wa_BE
+Walloon (Belgium)
+UTF-8
+
+OS Locale:  wa_BE@euro
+wa_BE
+Walloon (Belgium)
+ISO-8859-15
+
+OS Locale:  xh_ZA
+xh_ZA
+Xhosa (South Africa)
+ISO-8859-1
+
+OS Locale:  xh_ZA.utf8
+xh_ZA
+Xhosa (South Africa)
+UTF-8
+
+OS Locale:  yi_US
+ji_US
+Yiddish (United States)
+windows-1255
+
+OS Locale:  zh_CN
+zh_CN
+Chinese (China)
+GB2312
+
+OS Locale:  zh_CN.gb18030
+zh_CN
+Chinese (China)
+GB18030
+
+OS Locale:  zh_CN.gbk
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale:  zh_CN.utf8
+zh_CN
+Chinese (China)
+UTF-8
+
+OS Locale:  zh_HK
+zh_HK
+Chinese (Hong Kong)
+Big5-HKSCS
+
+OS Locale:  zh_HK.utf8
+zh_HK
+Chinese (Hong Kong)
+UTF-8
+
+OS Locale:  zh_SG
+zh_SG
+Chinese (Singapore)
+GB2312
+
+OS Locale:  zh_SG.gbk
+zh_SG
+Chinese (Singapore)
+GBK
+
+OS Locale:  zh_TW
+zh_TW
+Chinese (Taiwan)
+Big5
+
+OS Locale:  zh_TW.euctw
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.utf8
+zh_TW
+Chinese (Taiwan)
+UTF-8
+
+OS Locale:  zu_ZA
+zu_ZA
+Zulu (South Africa)
+ISO-8859-1
+
+OS Locale:  zu_ZA.utf8
+zu_ZA
+Zulu (South Africa)
+UTF-8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/data/deflocale.rhel4	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,1623 @@
+LSB_VERSION="1.3"
+Red Hat Enterprise Linux AS release 4 (Nahant Update 1)
+Linux i18n-hp733-6.sfbay.sun.com 2.6.9-6.37.EL #1 Tue Mar 29 15:34:14 EST 2005 i686 i686 i386 GNU/Linux
+
+OS Locale:  aa_DJ
+aa_DJ
+Afar (Djibouti)
+ISO-8859-1
+
+OS Locale:  aa_ER
+aa_ER
+Afar (Eritrea)
+UTF-8
+
+OS Locale:  aa_ER@saaho
+aa_ER
+Afar (Eritrea)
+UTF-8
+
+OS Locale:  aa_ET
+aa_ET
+Afar (Ethiopia)
+UTF-8
+
+OS Locale:  af_ZA
+af_ZA
+Afrikaans (South Africa)
+ISO-8859-1
+
+OS Locale:  am_ET
+am_ET
+Amharic (Ethiopia)
+UTF-8
+
+OS Locale:  an_ES
+an_ES
+Aragonese (Spain)
+ISO-8859-15
+
+OS Locale:  ar_AE
+ar_AE
+Arabic (United Arab Emirates)
+ISO-8859-6
+
+OS Locale:  ar_AE.utf8
+ar_AE
+Arabic (United Arab Emirates)
+UTF-8
+
+OS Locale:  ar_BH
+ar_BH
+Arabic (Bahrain)
+ISO-8859-6
+
+OS Locale:  ar_BH.utf8
+ar_BH
+Arabic (Bahrain)
+UTF-8
+
+OS Locale:  ar_DZ
+ar_DZ
+Arabic (Algeria)
+ISO-8859-6
+
+OS Locale:  ar_DZ.utf8
+ar_DZ
+Arabic (Algeria)
+UTF-8
+
+OS Locale:  ar_EG
+ar_EG
+Arabic (Egypt)
+ISO-8859-6
+
+OS Locale:  ar_EG.utf8
+ar_EG
+Arabic (Egypt)
+UTF-8
+
+OS Locale:  ar_IN
+ar_IN
+Arabic (India)
+UTF-8
+
+OS Locale:  ar_IQ
+ar_IQ
+Arabic (Iraq)
+ISO-8859-6
+
+OS Locale:  ar_IQ.utf8
+ar_IQ
+Arabic (Iraq)
+UTF-8
+
+OS Locale:  ar_JO
+ar_JO
+Arabic (Jordan)
+ISO-8859-6
+
+OS Locale:  ar_JO.utf8
+ar_JO
+Arabic (Jordan)
+UTF-8
+
+OS Locale:  ar_KW
+ar_KW
+Arabic (Kuwait)
+ISO-8859-6
+
+OS Locale:  ar_KW.utf8
+ar_KW
+Arabic (Kuwait)
+UTF-8
+
+OS Locale:  ar_LB
+ar_LB
+Arabic (Lebanon)
+ISO-8859-6
+
+OS Locale:  ar_LB.utf8
+ar_LB
+Arabic (Lebanon)
+UTF-8
+
+OS Locale:  ar_LY
+ar_LY
+Arabic (Libya)
+ISO-8859-6
+
+OS Locale:  ar_LY.utf8
+ar_LY
+Arabic (Libya)
+UTF-8
+
+OS Locale:  ar_MA
+ar_MA
+Arabic (Morocco)
+ISO-8859-6
+
+OS Locale:  ar_MA.utf8
+ar_MA
+Arabic (Morocco)
+UTF-8
+
+OS Locale:  ar_OM
+ar_OM
+Arabic (Oman)
+ISO-8859-6
+
+OS Locale:  ar_OM.utf8
+ar_OM
+Arabic (Oman)
+UTF-8
+
+OS Locale:  ar_QA
+ar_QA
+Arabic (Qatar)
+ISO-8859-6
+
+OS Locale:  ar_QA.utf8
+ar_QA
+Arabic (Qatar)
+UTF-8
+
+OS Locale:  ar_SA
+ar_SA
+Arabic (Saudi Arabia)
+ISO-8859-6
+
+OS Locale:  ar_SA.utf8
+ar_SA
+Arabic (Saudi Arabia)
+UTF-8
+
+OS Locale:  ar_SD
+ar_SD
+Arabic (Sudan)
+ISO-8859-6
+
+OS Locale:  ar_SD.utf8
+ar_SD
+Arabic (Sudan)
+UTF-8
+
+OS Locale:  ar_SY
+ar_SY
+Arabic (Syria)
+ISO-8859-6
+
+OS Locale:  ar_SY.utf8
+ar_SY
+Arabic (Syria)
+UTF-8
+
+OS Locale:  ar_TN
+ar_TN
+Arabic (Tunisia)
+ISO-8859-6
+
+OS Locale:  ar_TN.utf8
+ar_TN
+Arabic (Tunisia)
+UTF-8
+
+OS Locale:  ar_YE
+ar_YE
+Arabic (Yemen)
+ISO-8859-6
+
+OS Locale:  ar_YE.utf8
+ar_YE
+Arabic (Yemen)
+UTF-8
+
+OS Locale:  az_AZ.utf8
+az_AZ
+Azerbaijani (Azerbaijan)
+UTF-8
+
+OS Locale:  be_BY
+be_BY
+Belarusian (Belarus)
+windows-1251
+
+OS Locale:  be_BY.utf8
+be_BY
+Belarusian (Belarus)
+UTF-8
+
+OS Locale:  bg_BG
+bg_BG
+Bulgarian (Bulgaria)
+windows-1251
+
+OS Locale:  bg_BG.utf8
+bg_BG
+Bulgarian (Bulgaria)
+UTF-8
+
+OS Locale:  bn_BD
+bn_BD
+Bengali (Bangladesh)
+UTF-8
+
+OS Locale:  bn_IN
+bn_IN
+Bengali (India)
+UTF-8
+
+OS Locale:  br_FR
+br_FR
+Breton (France)
+ISO-8859-1
+
+OS Locale:  br_FR@euro
+br_FR
+Breton (France)
+ISO-8859-15
+
+OS Locale:  bs_BA
+bs_BA
+Bosnian (Bosnia and Herzegovina)
+ISO-8859-2
+
+OS Locale:  byn_ER
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  ca_ES
+ca_ES
+Catalan (Spain)
+ISO-8859-1
+
+OS Locale:  ca_ES.utf8
+ca_ES
+Catalan (Spain)
+UTF-8
+
+OS Locale:  ca_ES@euro
+ca_ES
+Catalan (Spain)
+ISO-8859-15
+
+OS Locale:  cs_CZ
+cs_CZ
+Czech (Czech Republic)
+ISO-8859-2
+
+OS Locale:  cs_CZ.utf8
+cs_CZ
+Czech (Czech Republic)
+UTF-8
+
+OS Locale:  cy_GB
+cy_GB
+Welsh (United Kingdom)
+UTF-8
+
+OS Locale:  cy_GB.utf8
+cy_GB
+Welsh (United Kingdom)
+UTF-8
+
+OS Locale:  da_DK
+da_DK
+Danish (Denmark)
+ISO-8859-1
+
+OS Locale:  da_DK.iso885915
+da_DK
+Danish (Denmark)
+ISO-8859-15
+
+OS Locale:  da_DK.utf8
+da_DK
+Danish (Denmark)
+UTF-8
+
+OS Locale:  de_AT
+de_AT
+German (Austria)
+ISO-8859-1
+
+OS Locale:  de_AT.utf8
+de_AT
+German (Austria)
+UTF-8
+
+OS Locale:  de_AT@euro
+de_AT
+German (Austria)
+ISO-8859-15
+
+OS Locale:  de_BE
+de_BE
+German (Belgium)
+ISO-8859-1
+
+OS Locale:  de_BE.utf8
+de_BE
+German (Belgium)
+UTF-8
+
+OS Locale:  de_BE@euro
+de_BE
+German (Belgium)
+ISO-8859-15
+
+OS Locale:  de_CH
+de_CH
+German (Switzerland)
+ISO-8859-1
+
+OS Locale:  de_CH.utf8
+de_CH
+German (Switzerland)
+UTF-8
+
+OS Locale:  de_DE
+de_DE
+German (Germany)
+ISO-8859-1
+
+OS Locale:  de_DE.utf8
+de_DE
+German (Germany)
+UTF-8
+
+OS Locale:  de_DE@euro
+de_DE
+German (Germany)
+ISO-8859-15
+
+OS Locale:  de_LU
+de_LU
+German (Luxembourg)
+ISO-8859-1
+
+OS Locale:  de_LU.utf8
+de_LU
+German (Luxembourg)
+UTF-8
+
+OS Locale:  de_LU@euro
+de_LU
+German (Luxembourg)
+ISO-8859-15
+
+OS Locale:  el_GR
+el_GR
+Greek (Greece)
+ISO-8859-7
+
+OS Locale:  el_GR.utf8
+el_GR
+Greek (Greece)
+UTF-8
+
+OS Locale:  en_AU
+en_AU
+English (Australia)
+ISO-8859-1
+
+OS Locale:  en_AU.utf8
+en_AU
+English (Australia)
+UTF-8
+
+OS Locale:  en_BW
+en_BW
+English (Botswana)
+ISO-8859-1
+
+OS Locale:  en_BW.utf8
+en_BW
+English (Botswana)
+UTF-8
+
+OS Locale:  en_CA
+en_CA
+English (Canada)
+ISO-8859-1
+
+OS Locale:  en_CA.utf8
+en_CA
+English (Canada)
+UTF-8
+
+OS Locale:  en_DK
+en_DK
+English (Denmark)
+ISO-8859-1
+
+OS Locale:  en_DK.utf8
+en_DK
+English (Denmark)
+UTF-8
+
+OS Locale:  en_GB
+en_GB
+English (United Kingdom)
+ISO-8859-1
+
+OS Locale:  en_GB.iso885915
+en_GB
+English (United Kingdom)
+ISO-8859-15
+
+OS Locale:  en_GB.utf8
+en_GB
+English (United Kingdom)
+UTF-8
+
+OS Locale:  en_HK
+en_HK
+English (Hong Kong)
+ISO-8859-1
+
+OS Locale:  en_HK.utf8
+en_HK
+English (Hong Kong)
+UTF-8
+
+OS Locale:  en_IE
+en_IE
+English (Ireland)
+ISO-8859-1
+
+OS Locale:  en_IE.utf8
+en_IE
+English (Ireland)
+UTF-8
+
+OS Locale:  en_IE@euro
+en_IE
+English (Ireland)
+ISO-8859-15
+
+OS Locale:  en_IN
+en_IN
+English (India)
+UTF-8
+
+OS Locale:  en_NZ
+en_NZ
+English (New Zealand)
+ISO-8859-1
+
+OS Locale:  en_NZ.utf8
+en_NZ
+English (New Zealand)
+UTF-8
+
+OS Locale:  en_PH
+en_PH
+English (Philippines)
+ISO-8859-1
+
+OS Locale:  en_PH.utf8
+en_PH
+English (Philippines)
+UTF-8
+
+OS Locale:  en_SG
+en_SG
+English (Singapore)
+ISO-8859-1
+
+OS Locale:  en_SG.utf8
+en_SG
+English (Singapore)
+UTF-8
+
+OS Locale:  en_US
+en_US
+English (United States)
+ISO-8859-1
+
+OS Locale:  en_US.iso885915
+en_US
+English (United States)
+ISO-8859-15
+
+OS Locale:  en_US.utf8
+en_US
+English (United States)
+UTF-8
+
+OS Locale:  en_ZA
+en_ZA
+English (South Africa)
+ISO-8859-1
+
+OS Locale:  en_ZA.utf8
+en_ZA
+English (South Africa)
+UTF-8
+
+OS Locale:  en_ZW
+en_ZW
+English (Zimbabwe)
+ISO-8859-1
+
+OS Locale:  en_ZW.utf8
+en_ZW
+English (Zimbabwe)
+UTF-8
+
+OS Locale:  es_AR
+es_AR
+Spanish (Argentina)
+ISO-8859-1
+
+OS Locale:  es_AR.utf8
+es_AR
+Spanish (Argentina)
+UTF-8
+
+OS Locale:  es_BO
+es_BO
+Spanish (Bolivia)
+ISO-8859-1
+
+OS Locale:  es_BO.utf8
+es_BO
+Spanish (Bolivia)
+UTF-8
+
+OS Locale:  es_CL
+es_CL
+Spanish (Chile)
+ISO-8859-1
+
+OS Locale:  es_CL.utf8
+es_CL
+Spanish (Chile)
+UTF-8
+
+OS Locale:  es_CO
+es_CO
+Spanish (Colombia)
+ISO-8859-1
+
+OS Locale:  es_CO.utf8
+es_CO
+Spanish (Colombia)
+UTF-8
+
+OS Locale:  es_CR
+es_CR
+Spanish (Costa Rica)
+ISO-8859-1
+
+OS Locale:  es_CR.utf8
+es_CR
+Spanish (Costa Rica)
+UTF-8
+
+OS Locale:  es_DO
+es_DO
+Spanish (Dominican Republic)
+ISO-8859-1
+
+OS Locale:  es_DO.utf8
+es_DO
+Spanish (Dominican Republic)
+UTF-8
+
+OS Locale:  es_EC
+es_EC
+Spanish (Ecuador)
+ISO-8859-1
+
+OS Locale:  es_EC.utf8
+es_EC
+Spanish (Ecuador)
+UTF-8
+
+OS Locale:  es_ES
+es_ES
+Spanish (Spain)
+ISO-8859-1
+
+OS Locale:  es_ES.utf8
+es_ES
+Spanish (Spain)
+UTF-8
+
+OS Locale:  es_ES@euro
+es_ES
+Spanish (Spain)
+ISO-8859-15
+
+OS Locale:  es_GT
+es_GT
+Spanish (Guatemala)
+ISO-8859-1
+
+OS Locale:  es_GT.utf8
+es_GT
+Spanish (Guatemala)
+UTF-8
+
+OS Locale:  es_HN
+es_HN
+Spanish (Honduras)
+ISO-8859-1
+
+OS Locale:  es_HN.utf8
+es_HN
+Spanish (Honduras)
+UTF-8
+
+OS Locale:  es_MX
+es_MX
+Spanish (Mexico)
+ISO-8859-1
+
+OS Locale:  es_MX.utf8
+es_MX
+Spanish (Mexico)
+UTF-8
+
+OS Locale:  es_NI
+es_NI
+Spanish (Nicaragua)
+ISO-8859-1
+
+OS Locale:  es_NI.utf8
+es_NI
+Spanish (Nicaragua)
+UTF-8
+
+OS Locale:  es_PA
+es_PA
+Spanish (Panama)
+ISO-8859-1
+
+OS Locale:  es_PA.utf8
+es_PA
+Spanish (Panama)
+UTF-8
+
+OS Locale:  es_PE
+es_PE
+Spanish (Peru)
+ISO-8859-1
+
+OS Locale:  es_PE.utf8
+es_PE
+Spanish (Peru)
+UTF-8
+
+OS Locale:  es_PR
+es_PR
+Spanish (Puerto Rico)
+ISO-8859-1
+
+OS Locale:  es_PR.utf8
+es_PR
+Spanish (Puerto Rico)
+UTF-8
+
+OS Locale:  es_PY
+es_PY
+Spanish (Paraguay)
+ISO-8859-1
+
+OS Locale:  es_PY.utf8
+es_PY
+Spanish (Paraguay)
+UTF-8
+
+OS Locale:  es_SV
+es_SV
+Spanish (El Salvador)
+ISO-8859-1
+
+OS Locale:  es_SV.utf8
+es_SV
+Spanish (El Salvador)
+UTF-8
+
+OS Locale:  es_US
+es_US
+Spanish (United States)
+ISO-8859-1
+
+OS Locale:  es_US.utf8
+es_US
+Spanish (United States)
+UTF-8
+
+OS Locale:  es_UY
+es_UY
+Spanish (Uruguay)
+ISO-8859-1
+
+OS Locale:  es_UY.utf8
+es_UY
+Spanish (Uruguay)
+UTF-8
+
+OS Locale:  es_VE
+es_VE
+Spanish (Venezuela)
+ISO-8859-1
+
+OS Locale:  es_VE.utf8
+es_VE
+Spanish (Venezuela)
+UTF-8
+
+OS Locale:  et_EE
+et_EE
+Estonian (Estonia)
+ISO-8859-1
+
+OS Locale:  et_EE.iso885915
+et_EE
+Estonian (Estonia)
+ISO-8859-15
+
+OS Locale:  et_EE.utf8
+et_EE
+Estonian (Estonia)
+UTF-8
+
+OS Locale:  eu_ES
+eu_ES
+Basque (Spain)
+ISO-8859-1
+
+OS Locale:  eu_ES.utf8
+eu_ES
+Basque (Spain)
+UTF-8
+
+OS Locale:  eu_ES@euro
+eu_ES
+Basque (Spain)
+ISO-8859-15
+
+OS Locale:  fa_IR
+fa_IR
+Persian (Iran)
+UTF-8
+
+OS Locale:  fi_FI
+fi_FI
+Finnish (Finland)
+ISO-8859-1
+
+OS Locale:  fi_FI.utf8
+fi_FI
+Finnish (Finland)
+UTF-8
+
+OS Locale:  fi_FI@euro
+fi_FI
+Finnish (Finland)
+ISO-8859-15
+
+OS Locale:  fo_FO
+fo_FO
+Faroese (Faroe Islands)
+ISO-8859-1
+
+OS Locale:  fo_FO.utf8
+fo_FO
+Faroese (Faroe Islands)
+UTF-8
+
+OS Locale:  fr_BE
+fr_BE
+French (Belgium)
+ISO-8859-1
+
+OS Locale:  fr_BE.utf8
+fr_BE
+French (Belgium)
+UTF-8
+
+OS Locale:  fr_BE@euro
+fr_BE
+French (Belgium)
+ISO-8859-15
+
+OS Locale:  fr_CA
+fr_CA
+French (Canada)
+ISO-8859-1
+
+OS Locale:  fr_CA.utf8
+fr_CA
+French (Canada)
+UTF-8
+
+OS Locale:  fr_CH
+fr_CH
+French (Switzerland)
+ISO-8859-1
+
+OS Locale:  fr_CH.utf8
+fr_CH
+French (Switzerland)
+UTF-8
+
+OS Locale:  fr_FR
+fr_FR
+French (France)
+ISO-8859-1
+
+OS Locale:  fr_FR.utf8
+fr_FR
+French (France)
+UTF-8
+
+OS Locale:  fr_FR@euro
+fr_FR
+French (France)
+ISO-8859-15
+
+OS Locale:  fr_LU
+fr_LU
+French (Luxembourg)
+ISO-8859-1
+
+OS Locale:  fr_LU.utf8
+fr_LU
+French (Luxembourg)
+UTF-8
+
+OS Locale:  fr_LU@euro
+fr_LU
+French (Luxembourg)
+ISO-8859-15
+
+OS Locale:  ga_IE
+ga_IE
+Irish (Ireland)
+ISO-8859-1
+
+OS Locale:  ga_IE.utf8
+ga_IE
+Irish (Ireland)
+UTF-8
+
+OS Locale:  ga_IE@euro
+ga_IE
+Irish (Ireland)
+ISO-8859-15
+
+OS Locale:  gd_GB
+gd_GB
+Scottish Gaelic (United Kingdom)
+ISO-8859-15
+
+OS Locale:  gez_ER
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  gez_ER@abegede
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  gez_ET
+en_ET
+English (Ethiopia)
+UTF-8
+
+OS Locale:  gez_ET@abegede
+en_ET
+English (Ethiopia)
+UTF-8
+
+OS Locale:  gl_ES
+gl_ES
+Gallegan (Spain)
+ISO-8859-1
+
+OS Locale:  gl_ES.utf8
+gl_ES
+Gallegan (Spain)
+UTF-8
+
+OS Locale:  gl_ES@euro
+gl_ES
+Gallegan (Spain)
+ISO-8859-15
+
+OS Locale:  gu_IN
+gu_IN
+Gujarati (India)
+UTF-8
+
+OS Locale:  gv_GB
+gv_GB
+Manx (United Kingdom)
+ISO-8859-1
+
+OS Locale:  gv_GB.utf8
+gv_GB
+Manx (United Kingdom)
+UTF-8
+
+OS Locale:  he_IL
+iw_IL
+Hebrew (Israel)
+ISO-8859-8
+
+OS Locale:  he_IL.utf8
+iw_IL
+Hebrew (Israel)
+UTF-8
+
+OS Locale:  hi_IN
+hi_IN
+Hindi (India)
+UTF-8
+
+OS Locale:  hr_HR
+hr_HR
+Croatian (Croatia)
+ISO-8859-2
+
+OS Locale:  hr_HR.utf8
+hr_HR
+Croatian (Croatia)
+UTF-8
+
+OS Locale:  hu_HU
+hu_HU
+Hungarian (Hungary)
+ISO-8859-2
+
+OS Locale:  hu_HU.utf8
+hu_HU
+Hungarian (Hungary)
+UTF-8
+
+OS Locale:  id_ID
+in_ID
+Indonesian (Indonesia)
+ISO-8859-1
+
+OS Locale:  id_ID.utf8
+in_ID
+Indonesian (Indonesia)
+UTF-8
+
+OS Locale:  is_IS
+is_IS
+Icelandic (Iceland)
+ISO-8859-1
+
+OS Locale:  is_IS.utf8
+is_IS
+Icelandic (Iceland)
+UTF-8
+
+OS Locale:  it_CH
+it_CH
+Italian (Switzerland)
+ISO-8859-1
+
+OS Locale:  it_CH.utf8
+it_CH
+Italian (Switzerland)
+UTF-8
+
+OS Locale:  it_IT
+it_IT
+Italian (Italy)
+ISO-8859-1
+
+OS Locale:  it_IT.utf8
+it_IT
+Italian (Italy)
+UTF-8
+
+OS Locale:  it_IT@euro
+it_IT
+Italian (Italy)
+ISO-8859-15
+
+OS Locale:  iw_IL
+iw_IL
+Hebrew (Israel)
+ISO-8859-8
+
+OS Locale:  iw_IL.utf8
+iw_IL
+Hebrew (Israel)
+UTF-8
+
+OS Locale:  ja_JP.eucjp
+ja_JP
+Japanese (Japan)
+x-euc-jp-linux
+
+OS Locale:  ja_JP.utf8
+ja_JP
+Japanese (Japan)
+UTF-8
+
+OS Locale:  ka_GE
+ka_GE
+Georgian (Georgia)
+UTF-8
+
+OS Locale:  kk_KZ
+kk_KZ
+Kazakh (Kazakhstan)
+UTF-8
+
+OS Locale:  kl_GL
+kl_GL
+Greenlandic (Greenland)
+ISO-8859-1
+
+OS Locale:  kl_GL.utf8
+kl_GL
+Greenlandic (Greenland)
+UTF-8
+
+OS Locale:  kn_IN
+kn_IN
+Kannada (India)
+UTF-8
+
+OS Locale:  ko_KR.euckr
+ko_KR
+Korean (South Korea)
+EUC-KR
+
+OS Locale:  ko_KR.utf8
+ko_KR
+Korean (South Korea)
+UTF-8
+
+OS Locale:  kw_GB
+kw_GB
+Cornish (United Kingdom)
+ISO-8859-1
+
+OS Locale:  kw_GB.utf8
+kw_GB
+Cornish (United Kingdom)
+UTF-8
+
+OS Locale:  lg_UG
+lg_UG
+Ganda (Uganda)
+UTF-8
+
+OS Locale:  lo_LA
+lo_LA
+Lao (Laos)
+UTF-8
+
+OS Locale:  locale-archive
+en_US
+English (United States)
+US-ASCII
+
+OS Locale:  lt_LT
+lt_LT
+Lithuanian (Lithuania)
+ISO-8859-13
+
+OS Locale:  lt_LT.utf8
+lt_LT
+Lithuanian (Lithuania)
+UTF-8
+
+OS Locale:  lv_LV
+lv_LV
+Latvian (Latvia)
+ISO-8859-13
+
+OS Locale:  lv_LV.utf8
+lv_LV
+Latvian (Latvia)
+UTF-8
+
+OS Locale:  mi_NZ
+mi_NZ
+Maori (New Zealand)
+ISO-8859-13
+
+OS Locale:  mk_MK
+mk_MK
+Macedonian (Macedonia)
+ISO-8859-5
+
+OS Locale:  mk_MK.utf8
+mk_MK
+Macedonian (Macedonia)
+UTF-8
+
+OS Locale:  ml_IN
+ml_IN
+Malayalam (India)
+UTF-8
+
+OS Locale:  mn_MN
+mn_MN
+Mongolian (Mongolia)
+UTF-8
+
+OS Locale:  mr_IN
+mr_IN
+Marathi (India)
+UTF-8
+
+OS Locale:  ms_MY
+ms_MY
+Malay (Malaysia)
+ISO-8859-1
+
+OS Locale:  ms_MY.utf8
+ms_MY
+Malay (Malaysia)
+UTF-8
+
+OS Locale:  mt_MT
+mt_MT
+Maltese (Malta)
+ISO-8859-3
+
+OS Locale:  mt_MT.utf8
+mt_MT
+Maltese (Malta)
+UTF-8
+
+OS Locale:  nb_NO
+nb_NO
+Norwegian Bokmål (Norway)
+ISO-8859-1
+
+OS Locale:  nb_NO.utf8
+nb_NO
+Norwegian Bokmål (Norway)
+UTF-8
+
+OS Locale:  ne_NP
+ne_NP
+Nepali (Nepal)
+UTF-8
+
+OS Locale:  nl_BE
+nl_BE
+Dutch (Belgium)
+ISO-8859-1
+
+OS Locale:  nl_BE.utf8
+nl_BE
+Dutch (Belgium)
+UTF-8
+
+OS Locale:  nl_BE@euro
+nl_BE
+Dutch (Belgium)
+ISO-8859-15
+
+OS Locale:  nl_NL
+nl_NL
+Dutch (Netherlands)
+ISO-8859-1
+
+OS Locale:  nl_NL.utf8
+nl_NL
+Dutch (Netherlands)
+UTF-8
+
+OS Locale:  nl_NL@euro
+nl_NL
+Dutch (Netherlands)
+ISO-8859-15
+
+OS Locale:  nn_NO
+nn_NO
+Norwegian Nynorsk (Norway)
+ISO-8859-1
+
+OS Locale:  nn_NO.utf8
+nn_NO
+Norwegian Nynorsk (Norway)
+UTF-8
+
+OS Locale:  no_NO
+no_NO
+Norwegian (Norway)
+ISO-8859-1
+
+OS Locale:  no_NO.utf8
+no_NO
+Norwegian (Norway)
+UTF-8
+
+OS Locale:  oc_FR
+oc_FR
+Occitan (France)
+ISO-8859-1
+
+OS Locale:  om_ET
+om_ET
+Oromo (Ethiopia)
+UTF-8
+
+OS Locale:  om_KE
+om_KE
+Oromo (Kenya)
+ISO-8859-1
+
+OS Locale:  pa_IN
+pa_IN
+Panjabi (India)
+UTF-8
+
+OS Locale:  pl_PL
+pl_PL
+Polish (Poland)
+ISO-8859-2
+
+OS Locale:  pl_PL.utf8
+pl_PL
+Polish (Poland)
+UTF-8
+
+OS Locale:  pt_BR
+pt_BR
+Portuguese (Brazil)
+ISO-8859-1
+
+OS Locale:  pt_BR.utf8
+pt_BR
+Portuguese (Brazil)
+UTF-8
+
+OS Locale:  pt_PT
+pt_PT
+Portuguese (Portugal)
+ISO-8859-1
+
+OS Locale:  pt_PT.utf8
+pt_PT
+Portuguese (Portugal)
+UTF-8
+
+OS Locale:  pt_PT@euro
+pt_PT
+Portuguese (Portugal)
+ISO-8859-15
+
+OS Locale:  ro_RO
+ro_RO
+Romanian (Romania)
+ISO-8859-2
+
+OS Locale:  ro_RO.utf8
+ro_RO
+Romanian (Romania)
+UTF-8
+
+OS Locale:  ru_RU
+ru_RU
+Russian (Russia)
+ISO-8859-5
+
+OS Locale:  ru_RU.koi8r
+ru_RU
+Russian (Russia)
+KOI8-R
+
+OS Locale:  ru_RU.utf8
+ru_RU
+Russian (Russia)
+UTF-8
+
+OS Locale:  ru_UA
+ru_UA
+Russian (Ukraine)
+KOI8-U
+
+OS Locale:  ru_UA.utf8
+ru_UA
+Russian (Ukraine)
+UTF-8
+
+OS Locale:  se_NO
+se_NO
+Northern Sami (Norway)
+UTF-8
+
+OS Locale:  sid_ET
+en_ET
+English (Ethiopia)
+UTF-8
+
+OS Locale:  sk_SK
+sk_SK
+Slovak (Slovakia)
+ISO-8859-2
+
+OS Locale:  sk_SK.utf8
+sk_SK
+Slovak (Slovakia)
+UTF-8
+
+OS Locale:  sl_SI
+sl_SI
+Slovenian (Slovenia)
+ISO-8859-2
+
+OS Locale:  sl_SI.utf8
+sl_SI
+Slovenian (Slovenia)
+UTF-8
+
+OS Locale:  so_DJ
+so_DJ
+Somali (Djibouti)
+ISO-8859-1
+
+OS Locale:  so_ET
+so_ET
+Somali (Ethiopia)
+UTF-8
+
+OS Locale:  so_KE
+so_KE
+Somali (Kenya)
+ISO-8859-1
+
+OS Locale:  so_SO
+so_SO
+Somali (Somalia)
+ISO-8859-1
+
+OS Locale:  sq_AL
+sq_AL
+Albanian (Albania)
+ISO-8859-1
+
+OS Locale:  sq_AL.utf8
+sq_AL
+Albanian (Albania)
+UTF-8
+
+OS Locale:  st_ZA
+st_ZA
+Southern Sotho (South Africa)
+ISO-8859-1
+
+OS Locale:  st_ZA.utf8
+st_ZA
+Southern Sotho (South Africa)
+UTF-8
+
+OS Locale:  sv_FI
+sv_FI
+Swedish (Finland)
+ISO-8859-1
+
+OS Locale:  sv_FI.utf8
+sv_FI
+Swedish (Finland)
+UTF-8
+
+OS Locale:  sv_FI@euro
+sv_FI
+Swedish (Finland)
+ISO-8859-15
+
+OS Locale:  sv_SE
+sv_SE
+Swedish (Sweden)
+ISO-8859-1
+
+OS Locale:  sv_SE.iso885915
+sv_SE
+Swedish (Sweden)
+ISO-8859-15
+
+OS Locale:  sv_SE.utf8
+sv_SE
+Swedish (Sweden)
+UTF-8
+
+OS Locale:  ta_IN
+ta_IN
+Tamil (India)
+UTF-8
+
+OS Locale:  te_IN
+te_IN
+Telugu (India)
+UTF-8
+
+OS Locale:  tg_TJ
+tg_TJ
+Tajik (Tajikistan)
+UTF-8
+
+OS Locale:  th_TH
+th_TH
+Thai (Thailand)
+TIS-620
+
+OS Locale:  th_TH.utf8
+th_TH
+Thai (Thailand)
+UTF-8
+
+OS Locale:  ti_ER
+ti_ER
+Tigrinya (Eritrea)
+UTF-8
+
+OS Locale:  ti_ET
+ti_ET
+Tigrinya (Ethiopia)
+UTF-8
+
+OS Locale:  tig_ER
+en_ER
+English (Eritrea)
+UTF-8
+
+OS Locale:  tl_PH
+tl_PH
+Tagalog (Philippines)
+ISO-8859-1
+
+OS Locale:  tr_TR
+tr_TR
+Turkish (Turkey)
+ISO-8859-9
+
+OS Locale:  tr_TR.utf8
+tr_TR
+Turkish (Turkey)
+UTF-8
+
+OS Locale:  tt_RU.utf8
+tt_RU
+Tatar (Russia)
+UTF-8
+
+OS Locale:  uk_UA
+uk_UA
+Ukrainian (Ukraine)
+KOI8-U
+
+OS Locale:  uk_UA.utf8
+uk_UA
+Ukrainian (Ukraine)
+UTF-8
+
+OS Locale:  ur_PK
+ur_PK
+Urdu (Pakistan)
+UTF-8
+
+OS Locale:  uz_UZ
+uz_UZ
+Uzbek (Uzbekistan)
+ISO-8859-1
+
+OS Locale:  uz_UZ@cyrillic
+uz_UZ
+Uzbek (Uzbekistan)
+UTF-8
+
+OS Locale:  vi_VN
+vi_VN
+Vietnamese (Vietnam)
+UTF-8
+
+OS Locale:  vi_VN.tcvn
+vi_VN
+Vietnamese (Vietnam)
+UTF-8
+
+OS Locale:  wa_BE
+wa_BE
+Walloon (Belgium)
+ISO-8859-1
+
+OS Locale:  wa_BE.utf8
+wa_BE
+Walloon (Belgium)
+UTF-8
+
+OS Locale:  wa_BE@euro
+wa_BE
+Walloon (Belgium)
+ISO-8859-15
+
+OS Locale:  xh_ZA
+xh_ZA
+Xhosa (South Africa)
+ISO-8859-1
+
+OS Locale:  xh_ZA.utf8
+xh_ZA
+Xhosa (South Africa)
+UTF-8
+
+OS Locale:  yi_US
+ji_US
+Yiddish (United States)
+windows-1255
+
+OS Locale:  zh_CN
+zh_CN
+Chinese (China)
+GB2312
+
+OS Locale:  zh_CN.gb18030
+zh_CN
+Chinese (China)
+GB18030
+
+OS Locale:  zh_CN.gbk
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale:  zh_CN.utf8
+zh_CN
+Chinese (China)
+UTF-8
+
+OS Locale:  zh_HK
+zh_HK
+Chinese (Hong Kong)
+Big5-HKSCS
+
+OS Locale:  zh_HK.utf8
+zh_HK
+Chinese (Hong Kong)
+UTF-8
+
+OS Locale:  zh_SG
+zh_SG
+Chinese (Singapore)
+GB2312
+
+OS Locale:  zh_SG.gbk
+zh_SG
+Chinese (Singapore)
+GBK
+
+OS Locale:  zh_TW
+zh_TW
+Chinese (Taiwan)
+Big5
+
+OS Locale:  zh_TW.euctw
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.utf8
+zh_TW
+Chinese (Taiwan)
+UTF-8
+
+OS Locale:  zu_ZA
+zu_ZA
+Zulu (South Africa)
+ISO-8859-1
+
+OS Locale:  zu_ZA.utf8
+zu_ZA
+Zulu (South Africa)
+UTF-8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/data/deflocale.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,38 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @(#)deflocale.sh	1.3 07/04/06
+#
+# A simple tool to output all the installed locales on a Unix machine, and 
+# corresponding Java default locale/file.encoding using PrintDefaultLocale
+#
+# Usage: "deflocale.sh <java launcher>
+#
+cat /etc/*release
+uname -a
+env LC_COLLATE=C ls /usr/lib/locale | while read line; do
+    echo ""
+    echo "OS Locale: " $line
+    env LANG=$line LC_ALL=$line $1 PrintDefaultLocale
+done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/data/deflocale.sol10	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,1450 @@
+                         Solaris 10 3/05 s10_74L2a SPARC
+           Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+                        Use is subject to license terms.
+                            Assembled 22 January 2005
+SunOS deltas4 5.10 Generic_118833-03 sun4u sparc SUNW,Sun-Blade-2500
+
+OS Locale:  C
+en
+English
+US-ASCII
+
+OS Locale:  POSIX
+en
+English
+US-ASCII
+
+OS Locale:  ar
+ar_EG
+Arabic (Egypt)
+ISO-8859-6
+
+OS Locale:  ar_EG.UTF-8
+ar_EG
+Arabic (Egypt)
+UTF-8
+
+OS Locale:  ar_SA.UTF-8
+ar_SA
+Arabic (Saudi Arabia)
+UTF-8
+
+OS Locale:  bg_BG
+bg_BG
+Bulgarian (Bulgaria)
+ISO-8859-5
+
+OS Locale:  bg_BG.ISO8859-5
+bg_BG
+Bulgarian (Bulgaria)
+ISO-8859-5
+
+OS Locale:  ca
+ca_ES
+Catalan (Spain)
+ISO-8859-1
+
+OS Locale:  ca_ES
+ca_ES
+Catalan (Spain)
+ISO-8859-1
+
+OS Locale:  ca_ES.ISO8859-1
+ca_ES
+Catalan (Spain)
+ISO-8859-1
+
+OS Locale:  ca_ES.ISO8859-15
+ca_ES
+Catalan (Spain)
+ISO-8859-15
+
+OS Locale:  ca_ES.ISO8859-15@euro
+ca_ES
+Catalan (Spain)
+ISO-8859-15
+
+OS Locale:  common
+en
+English
+ISO-8859-1
+
+OS Locale:  cs_CZ
+cs_CZ
+Czech (Czech Republic)
+ISO-8859-2
+
+OS Locale:  cs_CZ.ISO8859-2
+cs_CZ
+Czech (Czech Republic)
+ISO-8859-2
+
+OS Locale:  cs_CZ.UTF-8
+cs_CZ
+Czech (Czech Republic)
+UTF-8
+
+OS Locale:  cs_CZ.UTF-8@euro
+cs_CZ
+Czech (Czech Republic)
+UTF-8
+
+OS Locale:  cz
+cs_CZ
+Czech (Czech Republic)
+ISO-8859-2
+
+OS Locale:  da
+da_DK
+Danish (Denmark)
+ISO-8859-1
+
+OS Locale:  da.ISO8859-15
+da_DK
+Danish (Denmark)
+ISO-8859-15
+
+OS Locale:  da_DK
+da_DK
+Danish (Denmark)
+ISO-8859-1
+
+OS Locale:  da_DK.ISO8859-1
+da_DK
+Danish (Denmark)
+ISO-8859-1
+
+OS Locale:  da_DK.ISO8859-15
+da_DK
+Danish (Denmark)
+ISO-8859-15
+
+OS Locale:  da_DK.ISO8859-15@euro
+da_DK
+Danish (Denmark)
+ISO-8859-15
+
+OS Locale:  de
+de_DE
+German (Germany)
+ISO-8859-1
+
+OS Locale:  de.ISO8859-15
+de_DE
+German (Germany)
+ISO-8859-15
+
+OS Locale:  de.UTF-8
+de_DE
+German (Germany)
+UTF-8
+
+OS Locale:  de_AT
+de_AT
+German (Austria)
+ISO-8859-1
+
+OS Locale:  de_AT.ISO8859-1
+de_AT
+German (Austria)
+ISO-8859-1
+
+OS Locale:  de_AT.ISO8859-15
+de_AT
+German (Austria)
+ISO-8859-15
+
+OS Locale:  de_AT.ISO8859-15@euro
+de_AT
+German (Austria)
+ISO-8859-15
+
+OS Locale:  de_CH
+de_CH
+German (Switzerland)
+ISO-8859-1
+
+OS Locale:  de_CH.ISO8859-1
+de_CH
+German (Switzerland)
+ISO-8859-1
+
+OS Locale:  de_DE
+de_DE
+German (Germany)
+ISO-8859-1
+
+OS Locale:  de_DE.ISO8859-1
+de_DE
+German (Germany)
+ISO-8859-1
+
+OS Locale:  de_DE.ISO8859-15
+de_DE
+German (Germany)
+ISO-8859-15
+
+OS Locale:  de_DE.ISO8859-15@euro
+de_DE
+German (Germany)
+ISO-8859-15
+
+OS Locale:  de_DE.UTF-8
+de_DE
+German (Germany)
+UTF-8
+
+OS Locale:  de_DE.UTF-8@euro
+de_DE
+German (Germany)
+UTF-8
+
+OS Locale:  el
+el_GR
+Greek (Greece)
+ISO-8859-7
+
+OS Locale:  el.sun_eu_greek
+el_GR
+Greek (Greece)
+ISO-8859-7
+
+OS Locale:  el_GR
+el_GR
+Greek (Greece)
+ISO-8859-7
+
+OS Locale:  el_GR.ISO8859-7
+el_GR
+Greek (Greece)
+ISO-8859-7
+
+OS Locale:  el_GR.ISO8859-7@euro
+el_GR
+Greek (Greece)
+ISO-8859-7
+
+OS Locale:  en_AU
+en_AU
+English (Australia)
+ISO-8859-1
+
+OS Locale:  en_AU.ISO8859-1
+en_AU
+English (Australia)
+ISO-8859-1
+
+OS Locale:  en_CA
+en_CA
+English (Canada)
+ISO-8859-1
+
+OS Locale:  en_CA.ISO8859-1
+en_CA
+English (Canada)
+ISO-8859-1
+
+OS Locale:  en_GB
+en_GB
+English (United Kingdom)
+ISO-8859-1
+
+OS Locale:  en_GB.ISO8859-1
+en_GB
+English (United Kingdom)
+ISO-8859-1
+
+OS Locale:  en_GB.ISO8859-15
+en_GB
+English (United Kingdom)
+ISO-8859-15
+
+OS Locale:  en_GB.ISO8859-15@euro
+en_GB
+English (United Kingdom)
+ISO-8859-15
+
+OS Locale:  en_IE
+en_IE
+English (Ireland)
+ISO-8859-1
+
+OS Locale:  en_IE.ISO8859-1
+en_IE
+English (Ireland)
+ISO-8859-1
+
+OS Locale:  en_IE.ISO8859-15
+en_IE
+English (Ireland)
+ISO-8859-15
+
+OS Locale:  en_IE.ISO8859-15@euro
+en_IE
+English (Ireland)
+ISO-8859-15
+
+OS Locale:  en_NZ
+en_NZ
+English (New Zealand)
+ISO-8859-1
+
+OS Locale:  en_NZ.ISO8859-1
+en_NZ
+English (New Zealand)
+ISO-8859-1
+
+OS Locale:  en_US
+en_US
+English (United States)
+ISO-8859-1
+
+OS Locale:  en_US.ISO8859-1
+en_US
+English (United States)
+ISO-8859-1
+
+OS Locale:  en_US.ISO8859-15
+en_US
+English (United States)
+ISO-8859-15
+
+OS Locale:  en_US.ISO8859-15@euro
+en_US
+English (United States)
+ISO-8859-15
+
+OS Locale:  en_US.UTF-8
+en_US
+English (United States)
+UTF-8
+
+OS Locale:  es
+es_ES
+Spanish (Spain)
+ISO-8859-1
+
+OS Locale:  es.ISO8859-15
+es_ES
+Spanish (Spain)
+ISO-8859-15
+
+OS Locale:  es.UTF-8
+es_ES
+Spanish (Spain)
+UTF-8
+
+OS Locale:  es_AR
+es_AR
+Spanish (Argentina)
+ISO-8859-1
+
+OS Locale:  es_AR.ISO8859-1
+es_AR
+Spanish (Argentina)
+ISO-8859-1
+
+OS Locale:  es_BO
+es_BO
+Spanish (Bolivia)
+ISO-8859-1
+
+OS Locale:  es_BO.ISO8859-1
+es_BO
+Spanish (Bolivia)
+ISO-8859-1
+
+OS Locale:  es_CL
+es_CL
+Spanish (Chile)
+ISO-8859-1
+
+OS Locale:  es_CL.ISO8859-1
+es_CL
+Spanish (Chile)
+ISO-8859-1
+
+OS Locale:  es_CO
+es_CO
+Spanish (Colombia)
+ISO-8859-1
+
+OS Locale:  es_CO.ISO8859-1
+es_CO
+Spanish (Colombia)
+ISO-8859-1
+
+OS Locale:  es_CR
+es_CR
+Spanish (Costa Rica)
+ISO-8859-1
+
+OS Locale:  es_CR.ISO8859-1
+es_CR
+Spanish (Costa Rica)
+ISO-8859-1
+
+OS Locale:  es_EC
+es_EC
+Spanish (Ecuador)
+ISO-8859-1
+
+OS Locale:  es_EC.ISO8859-1
+es_EC
+Spanish (Ecuador)
+ISO-8859-1
+
+OS Locale:  es_ES
+es_ES
+Spanish (Spain)
+ISO-8859-1
+
+OS Locale:  es_ES.ISO8859-1
+es_ES
+Spanish (Spain)
+ISO-8859-1
+
+OS Locale:  es_ES.ISO8859-15
+es_ES
+Spanish (Spain)
+ISO-8859-15
+
+OS Locale:  es_ES.ISO8859-15@euro
+es_ES
+Spanish (Spain)
+ISO-8859-15
+
+OS Locale:  es_ES.UTF-8
+es_ES
+Spanish (Spain)
+UTF-8
+
+OS Locale:  es_ES.UTF-8@euro
+es_ES
+Spanish (Spain)
+UTF-8
+
+OS Locale:  es_GT
+es_GT
+Spanish (Guatemala)
+ISO-8859-1
+
+OS Locale:  es_GT.ISO8859-1
+es_GT
+Spanish (Guatemala)
+ISO-8859-1
+
+OS Locale:  es_MX
+es_MX
+Spanish (Mexico)
+ISO-8859-1
+
+OS Locale:  es_MX.ISO8859-1
+es_MX
+Spanish (Mexico)
+ISO-8859-1
+
+OS Locale:  es_NI
+es_NI
+Spanish (Nicaragua)
+ISO-8859-1
+
+OS Locale:  es_NI.ISO8859-1
+es_NI
+Spanish (Nicaragua)
+ISO-8859-1
+
+OS Locale:  es_PA
+es_PA
+Spanish (Panama)
+ISO-8859-1
+
+OS Locale:  es_PA.ISO8859-1
+es_PA
+Spanish (Panama)
+ISO-8859-1
+
+OS Locale:  es_PE
+es_PE
+Spanish (Peru)
+ISO-8859-1
+
+OS Locale:  es_PE.ISO8859-1
+es_PE
+Spanish (Peru)
+ISO-8859-1
+
+OS Locale:  es_PY
+es_PY
+Spanish (Paraguay)
+ISO-8859-1
+
+OS Locale:  es_PY.ISO8859-1
+es_PY
+Spanish (Paraguay)
+ISO-8859-1
+
+OS Locale:  es_SV
+es_SV
+Spanish (El Salvador)
+ISO-8859-1
+
+OS Locale:  es_SV.ISO8859-1
+es_SV
+Spanish (El Salvador)
+ISO-8859-1
+
+OS Locale:  es_UY
+es_UY
+Spanish (Uruguay)
+ISO-8859-1
+
+OS Locale:  es_UY.ISO8859-1
+es_UY
+Spanish (Uruguay)
+ISO-8859-1
+
+OS Locale:  es_VE
+es_VE
+Spanish (Venezuela)
+ISO-8859-1
+
+OS Locale:  es_VE.ISO8859-1
+es_VE
+Spanish (Venezuela)
+ISO-8859-1
+
+OS Locale:  et
+et_EE
+Estonian (Estonia)
+ISO-8859-15
+
+OS Locale:  et_EE
+et_EE
+Estonian (Estonia)
+ISO-8859-15
+
+OS Locale:  et_EE.ISO8859-15
+et_EE
+Estonian (Estonia)
+ISO-8859-15
+
+OS Locale:  fi
+fi_FI
+Finnish (Finland)
+ISO-8859-1
+
+OS Locale:  fi.ISO8859-15
+fi_FI
+Finnish (Finland)
+ISO-8859-15
+
+OS Locale:  fi_FI
+fi_FI
+Finnish (Finland)
+ISO-8859-1
+
+OS Locale:  fi_FI.ISO8859-1
+fi_FI
+Finnish (Finland)
+ISO-8859-1
+
+OS Locale:  fi_FI.ISO8859-15
+fi_FI
+Finnish (Finland)
+ISO-8859-15
+
+OS Locale:  fi_FI.ISO8859-15@euro
+fi_FI
+Finnish (Finland)
+ISO-8859-15
+
+OS Locale:  fi_FI.UTF-8
+fi_FI
+Finnish (Finland)
+UTF-8
+
+OS Locale:  fr
+fr_FR
+French (France)
+ISO-8859-1
+
+OS Locale:  fr.ISO8859-15
+fr_FR
+French (France)
+ISO-8859-15
+
+OS Locale:  fr.UTF-8
+fr_FR
+French (France)
+UTF-8
+
+OS Locale:  fr_BE
+fr_BE
+French (Belgium)
+ISO-8859-1
+
+OS Locale:  fr_BE.ISO8859-1
+fr_BE
+French (Belgium)
+ISO-8859-1
+
+OS Locale:  fr_BE.ISO8859-15
+fr_BE
+French (Belgium)
+ISO-8859-15
+
+OS Locale:  fr_BE.ISO8859-15@euro
+fr_BE
+French (Belgium)
+ISO-8859-15
+
+OS Locale:  fr_BE.UTF-8
+fr_BE
+French (Belgium)
+UTF-8
+
+OS Locale:  fr_BE.UTF-8@euro
+fr_BE
+French (Belgium)
+UTF-8
+
+OS Locale:  fr_CA
+fr_CA
+French (Canada)
+ISO-8859-1
+
+OS Locale:  fr_CA.ISO8859-1
+fr_CA
+French (Canada)
+ISO-8859-1
+
+OS Locale:  fr_CH
+fr_CH
+French (Switzerland)
+ISO-8859-1
+
+OS Locale:  fr_CH.ISO8859-1
+fr_CH
+French (Switzerland)
+ISO-8859-1
+
+OS Locale:  fr_FR
+fr_FR
+French (France)
+ISO-8859-1
+
+OS Locale:  fr_FR.ISO8859-1
+fr_FR
+French (France)
+ISO-8859-1
+
+OS Locale:  fr_FR.ISO8859-15
+fr_FR
+French (France)
+ISO-8859-15
+
+OS Locale:  fr_FR.ISO8859-15@euro
+fr_FR
+French (France)
+ISO-8859-15
+
+OS Locale:  fr_FR.UTF-8
+fr_FR
+French (France)
+UTF-8
+
+OS Locale:  fr_FR.UTF-8@euro
+fr_FR
+French (France)
+UTF-8
+
+OS Locale:  geo
+en
+English
+ISO-8859-1
+
+OS Locale:  he
+iw_IL
+Hebrew (Israel)
+ISO-8859-8
+
+OS Locale:  he_IL
+iw_IL
+Hebrew (Israel)
+ISO-8859-8
+
+OS Locale:  he_IL.UTF-8
+iw_IL
+Hebrew (Israel)
+UTF-8
+
+OS Locale:  hi_IN.UTF-8
+hi_IN
+Hindi (India)
+UTF-8
+
+OS Locale:  hr_HR
+hr_HR
+Croatian (Croatia)
+ISO-8859-2
+
+OS Locale:  hr_HR.ISO8859-2
+hr_HR
+Croatian (Croatia)
+ISO-8859-2
+
+OS Locale:  hu
+hu_HU
+Hungarian (Hungary)
+ISO-8859-2
+
+OS Locale:  hu_HU
+hu_HU
+Hungarian (Hungary)
+ISO-8859-2
+
+OS Locale:  hu_HU.ISO8859-2
+hu_HU
+Hungarian (Hungary)
+ISO-8859-2
+
+OS Locale:  hu_HU.UTF-8
+hu_HU
+Hungarian (Hungary)
+UTF-8
+
+OS Locale:  is_IS
+is_IS
+Icelandic (Iceland)
+ISO-8859-1
+
+OS Locale:  is_IS.ISO8859-1
+is_IS
+Icelandic (Iceland)
+ISO-8859-1
+
+OS Locale:  iso_8859_1
+en_8859_1
+English (8859_1)
+ISO-8859-1
+
+OS Locale:  iso_8859_13
+en
+English
+ISO-8859-1
+
+OS Locale:  iso_8859_15
+en
+English
+ISO-8859-1
+
+OS Locale:  iso_8859_2
+en
+English
+ISO-8859-1
+
+OS Locale:  iso_8859_5
+en
+English
+ISO-8859-1
+
+OS Locale:  iso_8859_7
+en
+English
+ISO-8859-1
+
+OS Locale:  iso_8859_9
+en
+English
+ISO-8859-1
+
+OS Locale:  it
+it_IT
+Italian (Italy)
+ISO-8859-1
+
+OS Locale:  it.ISO8859-15
+it_IT
+Italian (Italy)
+ISO-8859-15
+
+OS Locale:  it.UTF-8
+it_IT
+Italian (Italy)
+UTF-8
+
+OS Locale:  it_IT
+it_IT
+Italian (Italy)
+ISO-8859-1
+
+OS Locale:  it_IT.ISO8859-1
+it_IT
+Italian (Italy)
+ISO-8859-1
+
+OS Locale:  it_IT.ISO8859-15
+it_IT
+Italian (Italy)
+ISO-8859-15
+
+OS Locale:  it_IT.ISO8859-15@euro
+it_IT
+Italian (Italy)
+ISO-8859-15
+
+OS Locale:  it_IT.UTF-8
+it_IT
+Italian (Italy)
+UTF-8
+
+OS Locale:  it_IT.UTF-8@euro
+it_IT
+Italian (Italy)
+UTF-8
+
+OS Locale:  ja
+ja_JP
+Japanese (Japan)
+x-eucJP-Open
+
+OS Locale:  ja_JP.PCK
+ja_JP
+Japanese (Japan)
+x-PCK
+
+OS Locale:  ja_JP.UTF-8
+ja_JP
+Japanese (Japan)
+UTF-8
+
+OS Locale:  ja_JP.eucJP
+ja_JP
+Japanese (Japan)
+x-eucJP-Open
+
+OS Locale:  ko
+ko_KR
+Korean (South Korea)
+EUC-KR
+
+OS Locale:  ko.UTF-8
+ko_KR
+Korean (South Korea)
+UTF-8
+
+OS Locale:  ko_KR.EUC
+ko_KR
+Korean (South Korea)
+EUC-KR
+
+OS Locale:  ko_KR.EUC@dict
+ko_KR
+Korean (South Korea)
+EUC-KR
+
+OS Locale:  ko_KR.UTF-8
+ko_KR
+Korean (South Korea)
+UTF-8
+
+OS Locale:  ko_KR.UTF-8@dict
+ko_KR
+Korean (South Korea)
+UTF-8
+
+OS Locale:  lcttab
+en
+English
+ISO-8859-1
+
+OS Locale:  lt
+lt_LT
+Lithuanian (Lithuania)
+ISO-8859-13
+
+OS Locale:  lt_LT
+lt_LT
+Lithuanian (Lithuania)
+ISO-8859-13
+
+OS Locale:  lt_LT.ISO8859-13
+lt_LT
+Lithuanian (Lithuania)
+ISO-8859-13
+
+OS Locale:  lv
+lv_LV
+Latvian (Latvia)
+ISO-8859-13
+
+OS Locale:  lv_LV
+lv_LV
+Latvian (Latvia)
+ISO-8859-13
+
+OS Locale:  lv_LV.ISO8859-13
+lv_LV
+Latvian (Latvia)
+ISO-8859-13
+
+OS Locale:  mk_MK
+mk_MK
+Macedonian (Macedonia)
+ISO-8859-5
+
+OS Locale:  mk_MK.ISO8859-5
+mk_MK
+Macedonian (Macedonia)
+ISO-8859-5
+
+OS Locale:  nl
+nl_NL
+Dutch (Netherlands)
+ISO-8859-1
+
+OS Locale:  nl.ISO8859-15
+nl_NL
+Dutch (Netherlands)
+ISO-8859-15
+
+OS Locale:  nl_BE
+nl_BE
+Dutch (Belgium)
+ISO-8859-1
+
+OS Locale:  nl_BE.ISO8859-1
+nl_BE
+Dutch (Belgium)
+ISO-8859-1
+
+OS Locale:  nl_BE.ISO8859-15
+nl_BE
+Dutch (Belgium)
+ISO-8859-15
+
+OS Locale:  nl_BE.ISO8859-15@euro
+nl_BE
+Dutch (Belgium)
+ISO-8859-15
+
+OS Locale:  nl_NL
+nl_NL
+Dutch (Netherlands)
+ISO-8859-1
+
+OS Locale:  nl_NL.ISO8859-1
+nl_NL
+Dutch (Netherlands)
+ISO-8859-1
+
+OS Locale:  nl_NL.ISO8859-15
+nl_NL
+Dutch (Netherlands)
+ISO-8859-15
+
+OS Locale:  nl_NL.ISO8859-15@euro
+nl_NL
+Dutch (Netherlands)
+ISO-8859-15
+
+OS Locale:  no
+no_NO
+Norwegian (Norway)
+ISO-8859-1
+
+OS Locale:  no_NO
+no_NO
+Norwegian (Norway)
+ISO-8859-1
+
+OS Locale:  no_NO.ISO8859-1@bokmal
+no_NO
+Norwegian (Norway)
+ISO-8859-1
+
+OS Locale:  no_NO.ISO8859-1@nynorsk
+no_NO_NY
+Norwegian (Norway,Nynorsk)
+ISO-8859-1
+
+OS Locale:  no_NY
+no_NY
+Norwegian (NY)
+ISO-8859-1
+
+OS Locale:  nr
+nr
+South Ndebele
+ISO-8859-2
+
+OS Locale:  pl
+pl_PL
+Polish (Poland)
+ISO-8859-2
+
+OS Locale:  pl.UTF-8
+pl_PL
+Polish (Poland)
+UTF-8
+
+OS Locale:  pl_PL
+pl_PL
+Polish (Poland)
+ISO-8859-2
+
+OS Locale:  pl_PL.ISO8859-2
+pl_PL
+Polish (Poland)
+ISO-8859-2
+
+OS Locale:  pl_PL.UTF-8
+pl_PL
+Polish (Poland)
+UTF-8
+
+OS Locale:  pt
+pt_PT
+Portuguese (Portugal)
+ISO-8859-1
+
+OS Locale:  pt.ISO8859-15
+pt_PT
+Portuguese (Portugal)
+ISO-8859-15
+
+OS Locale:  pt_BR
+pt_BR
+Portuguese (Brazil)
+ISO-8859-1
+
+OS Locale:  pt_BR.ISO8859-1
+pt_BR
+Portuguese (Brazil)
+ISO-8859-1
+
+OS Locale:  pt_BR.UTF-8
+pt_BR
+Portuguese (Brazil)
+UTF-8
+
+OS Locale:  pt_PT
+pt_PT
+Portuguese (Portugal)
+ISO-8859-1
+
+OS Locale:  pt_PT.ISO8859-1
+pt_PT
+Portuguese (Portugal)
+ISO-8859-1
+
+OS Locale:  pt_PT.ISO8859-15
+pt_PT
+Portuguese (Portugal)
+ISO-8859-15
+
+OS Locale:  pt_PT.ISO8859-15@euro
+pt_PT
+Portuguese (Portugal)
+ISO-8859-15
+
+OS Locale:  ro_RO
+ro_RO
+Romanian (Romania)
+ISO-8859-2
+
+OS Locale:  ro_RO.ISO8859-2
+ro_RO
+Romanian (Romania)
+ISO-8859-2
+
+OS Locale:  ru
+ru_RU
+Russian (Russia)
+ISO-8859-5
+
+OS Locale:  ru.UTF-8
+ru_RU
+Russian (Russia)
+UTF-8
+
+OS Locale:  ru.koi8-r
+ru_RU
+Russian (Russia)
+KOI8-R
+
+OS Locale:  ru_RU
+ru_RU
+Russian (Russia)
+ISO-8859-5
+
+OS Locale:  ru_RU.ANSI1251
+ru_RU
+Russian (Russia)
+windows-1251
+
+OS Locale:  ru_RU.ISO8859-5
+ru_RU
+Russian (Russia)
+ISO-8859-5
+
+OS Locale:  ru_RU.KOI8-R
+ru_RU
+Russian (Russia)
+KOI8-R
+
+OS Locale:  ru_RU.UTF-8
+ru_RU
+Russian (Russia)
+UTF-8
+
+OS Locale:  sh_BA
+sr_BA
+Serbian (Bosnia and Herzegovina)
+ISO-8859-2
+
+OS Locale:  sh_BA.ISO8859-2@bosnia
+sr_BA
+Serbian (Bosnia and Herzegovina)
+ISO-8859-2
+
+OS Locale:  sk_SK
+sk_SK
+Slovak (Slovakia)
+ISO-8859-2
+
+OS Locale:  sk_SK.ISO8859-2
+sk_SK
+Slovak (Slovakia)
+ISO-8859-2
+
+OS Locale:  sl_SI
+sl_SI
+Slovenian (Slovenia)
+ISO-8859-2
+
+OS Locale:  sl_SI.ISO8859-2
+sl_SI
+Slovenian (Slovenia)
+ISO-8859-2
+
+OS Locale:  sq_AL
+sq_AL
+Albanian (Albania)
+ISO-8859-2
+
+OS Locale:  sq_AL.ISO8859-2
+sq_AL
+Albanian (Albania)
+ISO-8859-2
+
+OS Locale:  sr_SP
+sr_SP
+Serbian (SP)
+ISO-8859-5
+
+OS Locale:  sr_YU
+sr_CS
+Serbian (Serbia and Montenegro)
+ISO-8859-5
+
+OS Locale:  sr_YU.ISO8859-5
+sr_CS
+Serbian (Serbia and Montenegro)
+ISO-8859-5
+
+OS Locale:  sv
+sv_SE
+Swedish (Sweden)
+ISO-8859-1
+
+OS Locale:  sv.ISO8859-15
+sv_SE
+Swedish (Sweden)
+ISO-8859-15
+
+OS Locale:  sv.UTF-8
+sv_SE
+Swedish (Sweden)
+UTF-8
+
+OS Locale:  sv_SE
+sv_SE
+Swedish (Sweden)
+ISO-8859-1
+
+OS Locale:  sv_SE.ISO8859-1
+sv_SE
+Swedish (Sweden)
+ISO-8859-1
+
+OS Locale:  sv_SE.ISO8859-15
+sv_SE
+Swedish (Sweden)
+ISO-8859-15
+
+OS Locale:  sv_SE.ISO8859-15@euro
+sv_SE
+Swedish (Sweden)
+ISO-8859-15
+
+OS Locale:  sv_SE.UTF-8
+sv_SE
+Swedish (Sweden)
+UTF-8
+
+OS Locale:  sv_SE.UTF-8@euro
+sv_SE
+Swedish (Sweden)
+UTF-8
+
+OS Locale:  th
+th_TH
+Thai (Thailand)
+TIS-620
+
+OS Locale:  th_TH
+th_TH
+Thai (Thailand)
+TIS-620
+
+OS Locale:  th_TH.ISO8859-11
+th_TH
+Thai (Thailand)
+TIS-620
+
+OS Locale:  th_TH.TIS620
+th_TH
+Thai (Thailand)
+TIS-620
+
+OS Locale:  th_TH.UTF-8
+th_TH
+Thai (Thailand)
+UTF-8
+
+OS Locale:  tr
+tr_TR
+Turkish (Turkey)
+ISO-8859-9
+
+OS Locale:  tr_TR
+tr_TR
+Turkish (Turkey)
+ISO-8859-9
+
+OS Locale:  tr_TR.ISO8859-9
+tr_TR
+Turkish (Turkey)
+ISO-8859-9
+
+OS Locale:  tr_TR.UTF-8
+tr_TR
+Turkish (Turkey)
+UTF-8
+
+OS Locale:  zh
+zh_CN
+Chinese (China)
+GB2312
+
+OS Locale:  zh.GBK
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale:  zh.UTF-8
+zh_CN
+Chinese (China)
+UTF-8
+
+OS Locale:  zh_CN.EUC
+zh_CN
+Chinese (China)
+GB2312
+
+OS Locale:  zh_CN.EUC@pinyin
+zh_CN
+Chinese (China)
+GB2312
+
+OS Locale:  zh_CN.EUC@radical
+zh_CN
+Chinese (China)
+GB2312
+
+OS Locale:  zh_CN.EUC@stroke
+zh_CN
+Chinese (China)
+GB2312
+
+OS Locale:  zh_CN.GB18030
+zh_CN
+Chinese (China)
+GB18030
+
+OS Locale:  zh_CN.GB18030@pinyin
+zh_CN
+Chinese (China)
+GB18030
+
+OS Locale:  zh_CN.GB18030@radical
+zh_CN
+Chinese (China)
+GB18030
+
+OS Locale:  zh_CN.GB18030@stroke
+zh_CN
+Chinese (China)
+GB18030
+
+OS Locale:  zh_CN.GBK
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale:  zh_CN.GBK@pinyin
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale:  zh_CN.GBK@radical
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale:  zh_CN.GBK@stroke
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale:  zh_CN.UTF-8
+zh_CN
+Chinese (China)
+UTF-8
+
+OS Locale:  zh_CN.UTF-8@pinyin
+zh_CN
+Chinese (China)
+UTF-8
+
+OS Locale:  zh_CN.UTF-8@radical
+zh_CN
+Chinese (China)
+UTF-8
+
+OS Locale:  zh_CN.UTF-8@stroke
+zh_CN
+Chinese (China)
+UTF-8
+
+OS Locale:  zh_HK.BIG5HK
+zh_HK
+Chinese (Hong Kong)
+Big5-HKSCS
+
+OS Locale:  zh_HK.BIG5HK@radical
+zh_HK
+Chinese (Hong Kong)
+Big5-HKSCS
+
+OS Locale:  zh_HK.BIG5HK@stroke
+zh_HK
+Chinese (Hong Kong)
+Big5-HKSCS
+
+OS Locale:  zh_HK.UTF-8
+zh_HK
+Chinese (Hong Kong)
+UTF-8
+
+OS Locale:  zh_HK.UTF-8@radical
+zh_HK
+Chinese (Hong Kong)
+UTF-8
+
+OS Locale:  zh_HK.UTF-8@stroke
+zh_HK
+Chinese (Hong Kong)
+UTF-8
+
+OS Locale:  zh_TW
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.BIG5
+zh_TW
+Chinese (Taiwan)
+Big5
+
+OS Locale:  zh_TW.BIG5@pinyin
+zh_TW
+Chinese (Taiwan)
+Big5
+
+OS Locale:  zh_TW.BIG5@radical
+zh_TW
+Chinese (Taiwan)
+Big5
+
+OS Locale:  zh_TW.BIG5@stroke
+zh_TW
+Chinese (Taiwan)
+Big5
+
+OS Locale:  zh_TW.BIG5@zhuyin
+zh_TW
+Chinese (Taiwan)
+Big5
+
+OS Locale:  zh_TW.EUC
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.EUC@pinyin
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.EUC@radical
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.EUC@stroke
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.EUC@zhuyin
+zh_TW
+Chinese (Taiwan)
+x-EUC-TW
+
+OS Locale:  zh_TW.UTF-8
+zh_TW
+Chinese (Taiwan)
+UTF-8
+
+OS Locale:  zh_TW.UTF-8@pinyin
+zh_TW
+Chinese (Taiwan)
+UTF-8
+
+OS Locale:  zh_TW.UTF-8@radical
+zh_TW
+Chinese (Taiwan)
+UTF-8
+
+OS Locale:  zh_TW.UTF-8@stroke
+zh_TW
+Chinese (Taiwan)
+UTF-8
+
+OS Locale:  zh_TW.UTF-8@zhuyin
+zh_TW
+Chinese (Taiwan)
+UTF-8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/data/deflocale.winvista	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,1031 @@
+# OSVersionInfo
+# MajorVersion: 6
+# MinorVersion: 0
+# BuildNumber: 5456
+# CSDVersion: Service Pack 0 v. 
+
+
+OS Locale (lcid: 401): Arabic (Saudi Arabia) - 1256
+ar_SA
+Arabic (Saudi Arabia)
+windows-1256
+
+OS Locale (lcid: 402): Bulgarian (Bulgaria) - 1251
+bg_BG
+Bulgarian (Bulgaria)
+windows-1251
+
+OS Locale (lcid: 403): Catalan (Spain) - 1252
+ca_ES
+Catalan (Spain)
+windows-1252
+
+OS Locale (lcid: 404): Chinese (Taiwan) - 950
+zh_TW
+Chinese (Taiwan)
+x-windows-950
+
+OS Locale (lcid: 405): Czech (Czech Republic) - 1250
+cs_CZ
+Czech (Czech Republic)
+windows-1250
+
+OS Locale (lcid: 406): Danish (Denmark) - 1252
+da_DK
+Danish (Denmark)
+windows-1252
+
+OS Locale (lcid: 407): German (Germany) - 1252
+de_DE
+German (Germany)
+windows-1252
+
+OS Locale (lcid: 408): Greek (Greece) - 1253
+el_GR
+Greek (Greece)
+windows-1253
+
+OS Locale (lcid: 409): English (United States) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 40b): Finnish (Finland) - 1252
+fi_FI
+Finnish (Finland)
+windows-1252
+
+OS Locale (lcid: 40c): French (France) - 1252
+fr_FR
+French (France)
+windows-1252
+
+OS Locale (lcid: 40d): Hebrew (Israel) - 1255
+iw_IL
+Hebrew (Israel)
+windows-1255
+
+OS Locale (lcid: 40e): Hungarian (Hungary) - 1250
+hu_HU
+Hungarian (Hungary)
+windows-1250
+
+OS Locale (lcid: 40f): Icelandic (Iceland) - 1252
+is_IS
+Icelandic (Iceland)
+windows-1252
+
+OS Locale (lcid: 410): Italian (Italy) - 1252
+it_IT
+Italian (Italy)
+windows-1252
+
+OS Locale (lcid: 411): Japanese (Japan) - 932
+ja_JP
+Japanese (Japan)
+windows-31j
+
+OS Locale (lcid: 412): Korean (Korea) - 949
+ko_KR
+Korean (South Korea)
+x-windows-949
+
+OS Locale (lcid: 413): Dutch (Netherlands) - 1252
+nl_NL
+Dutch (Netherlands)
+windows-1252
+
+OS Locale (lcid: 414): Norwegian (Bokmål) (Norway) - 1252
+no_NO
+Norwegian (Norway)
+windows-1252
+
+OS Locale (lcid: 415): Polish (Poland) - 1250
+pl_PL
+Polish (Poland)
+windows-1250
+
+OS Locale (lcid: 416): Portuguese (Brazil) - 1252
+pt_BR
+Portuguese (Brazil)
+windows-1252
+
+OS Locale (lcid: 417): Romansh (Switzerland) - 1252
+rm_CH
+Raeto-Romance (Switzerland)
+windows-1252
+
+OS Locale (lcid: 418): Romanian (Romania) - 1250
+ro_RO
+Romanian (Romania)
+windows-1250
+
+OS Locale (lcid: 419): Russian (Russia) - 1251
+ru_RU
+Russian (Russia)
+windows-1251
+
+OS Locale (lcid: 41a): Croatian (Croatia) - 1250
+hr_HR
+Croatian (Croatia)
+windows-1250
+
+OS Locale (lcid: 41b): Slovak (Slovakia) - 1250
+sk_SK
+Slovak (Slovakia)
+windows-1250
+
+OS Locale (lcid: 41c): Albanian (Albania) - 1250
+sq_AL
+Albanian (Albania)
+windows-1250
+
+OS Locale (lcid: 41d): Swedish (Sweden) - 1252
+sv_SE
+Swedish (Sweden)
+windows-1252
+
+OS Locale (lcid: 41e): Thai (Thailand) - 874
+th_TH
+Thai (Thailand)
+x-windows-874
+
+OS Locale (lcid: 41f): Turkish (Turkey) - 1254
+tr_TR
+Turkish (Turkey)
+windows-1254
+
+OS Locale (lcid: 420): Urdu (Islamic Republic of Pakistan) - 0
+ur_PK
+Urdu (Pakistan)
+windows-1256
+
+OS Locale (lcid: 421): Indonesian (Indonesia) - 1252
+in_ID
+Indonesian (Indonesia)
+windows-1252
+
+OS Locale (lcid: 422): Ukrainian (Ukraine) - 1251
+uk_UA
+Ukrainian (Ukraine)
+windows-1251
+
+OS Locale (lcid: 423): Belarusian (Belarus) - 1251
+be_BY
+Belarusian (Belarus)
+windows-1251
+
+OS Locale (lcid: 424): Slovenian (Slovenia) - 1250
+sl_SI
+Slovenian (Slovenia)
+windows-1250
+
+OS Locale (lcid: 425): Estonian (Estonia) - 1257
+et_EE
+Estonian (Estonia)
+windows-1257
+
+OS Locale (lcid: 426): Latvian (Latvia) - 1257
+lv_LV
+Latvian (Latvia)
+windows-1257
+
+OS Locale (lcid: 427): Lithuanian (Lithuania) - 1257
+lt_LT
+Lithuanian (Lithuania)
+windows-1257
+
+OS Locale (lcid: 428): Tajik (Cyrillic) (Tajikistan) - 1251
+tg_TJ
+Tajik (Tajikistan)
+windows-1251
+
+OS Locale (lcid: 429): Persian (Iran) - 1256
+fa_IR
+Persian (Iran)
+windows-1256
+
+OS Locale (lcid: 42a): Vietnamese (Vietnam) - 1258
+vi_VN
+Vietnamese (Vietnam)
+windows-1258
+
+OS Locale (lcid: 42b): Armenian (Armenia) - 0
+hy_AM
+Armenian (Armenia)
+UTF-8
+
+OS Locale (lcid: 42c): Azeri (Latin) (Azerbaijan) - 1254
+az_AZ
+Azerbaijani (Azerbaijan)
+windows-1254
+
+OS Locale (lcid: 42d): Basque (Spain) - 1252
+eu_ES
+Basque (Spain)
+windows-1252
+
+OS Locale (lcid: 42e): Upper Sorbian (Germany) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 42f): Macedonian (FYROM) (Macedonia (FYROM)) - 1251
+mk_MK
+Macedonian (Macedonia)
+windows-1251
+
+OS Locale (lcid: 432): Setswana (South Africa) - 1252
+tn_ZA
+Tswana (South Africa)
+windows-1252
+
+OS Locale (lcid: 434): isiXhosa (South Africa) - 1252
+xh_ZA
+Xhosa (South Africa)
+windows-1252
+
+OS Locale (lcid: 435): isiZulu (South Africa) - 1252
+zu_ZA
+Zulu (South Africa)
+windows-1252
+
+OS Locale (lcid: 436): Afrikaans (South Africa) - 1252
+af_ZA
+Afrikaans (South Africa)
+windows-1252
+
+OS Locale (lcid: 437): Georgian (Georgia) - 0
+ka_GE
+Georgian (Georgia)
+UTF-8
+
+OS Locale (lcid: 438): Faroese (Faroe Islands) - 1252
+fo_FO
+Faroese (Faroe Islands)
+windows-1252
+
+OS Locale (lcid: 439): Hindi (India) - 0
+hi_IN
+Hindi (India)
+UTF-8
+
+OS Locale (lcid: 43a): Maltese (Malta) - 0
+mt_MT
+Maltese (Malta)
+UTF-8
+
+OS Locale (lcid: 43b): Sami (Northern) (Norway) - 1252
+se_NO
+Northern Sami (Norway)
+windows-1252
+
+OS Locale (lcid: 43e): Malay (Malaysia) - 1252
+ms_MY
+Malay (Malaysia)
+windows-1252
+
+OS Locale (lcid: 43f): Kazakh (Kazakhstan) - 0
+kk_KZ
+Kazakh (Kazakhstan)
+windows-1251
+
+OS Locale (lcid: 440): Kyrgyz (Kyrgyzstan) - 1251
+ky_KG
+Kirghiz (Kyrgyzstan)
+windows-1251
+
+OS Locale (lcid: 441): Kiswahili (Kenya) - 1252
+sw_KE
+Swahili (Kenya)
+windows-1252
+
+OS Locale (lcid: 442): Turkmen (Turkmenistan) - 1250
+tk_TM
+Turkmen (Turkmenistan)
+windows-1250
+
+OS Locale (lcid: 443): Uzbek (Latin) (Uzbekistan) - 1254
+uz_UZ
+Uzbek (Uzbekistan)
+windows-1254
+
+OS Locale (lcid: 444): Tatar (Russia) - 1251
+tt_RU
+Tatar (Russia)
+windows-1251
+
+OS Locale (lcid: 445): Bengali (India) - 0
+bn_IN
+Bengali (India)
+UTF-8
+
+OS Locale (lcid: 446): Punjabi (India) - 0
+pa_IN
+Panjabi (India)
+UTF-8
+
+OS Locale (lcid: 447): Gujarati (India) - 0
+gu_IN
+Gujarati (India)
+UTF-8
+
+OS Locale (lcid: 448): Oriya (India) - 0
+or_IN
+Oriya (India)
+UTF-8
+
+OS Locale (lcid: 449): Tamil (India) - 0
+ta_IN
+Tamil (India)
+UTF-8
+
+OS Locale (lcid: 44a): Telugu (India) - 0
+te_IN
+Telugu (India)
+UTF-8
+
+OS Locale (lcid: 44b): Kannada (India) - 0
+kn_IN
+Kannada (India)
+UTF-8
+
+OS Locale (lcid: 44c): Malayalam (India) - 0
+ml_IN
+Malayalam (India)
+UTF-8
+
+OS Locale (lcid: 44d): Assamese (India) - 0
+as_IN
+Assamese (India)
+UTF-8
+
+OS Locale (lcid: 44e): Marathi (India) - 0
+mr_IN
+Marathi (India)
+UTF-8
+
+OS Locale (lcid: 44f): Sanskrit (India) - 0
+sa_IN
+Sanskrit (India)
+UTF-8
+
+OS Locale (lcid: 450): Mongolian (Cyrillic) (Mongolia) - 1251
+mn_MN
+Mongolian (Mongolia)
+windows-1251
+
+OS Locale (lcid: 451): Tibetan (People's Republic of China) - 0
+bo_CN
+Tibetan (China)
+UTF-8
+
+OS Locale (lcid: 452): Welsh (United Kingdom) - 1252
+cy_GB
+Welsh (United Kingdom)
+windows-1252
+
+OS Locale (lcid: 453): Khmer (Cambodia) - 0
+km_KH
+Khmer (Cambodia)
+UTF-8
+
+OS Locale (lcid: 454): Lao (Lao P.D.R.) - 0
+lo_LA
+Lao (Laos)
+UTF-8
+
+OS Locale (lcid: 456): Galician (Spain) - 1252
+gl_ES
+Gallegan (Spain)
+windows-1252
+
+OS Locale (lcid: 457): Konkani (India) - 0
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 45a): Syriac (Syria) - 0
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 45b): Sinhala (Sri Lanka) - 0
+si_LK
+Sinhalese (Sri Lanka)
+UTF-8
+
+OS Locale (lcid: 45d): Inuktitut (Canada) - 0
+iu_CA
+Inuktitut (Canada)
+UTF-8
+
+OS Locale (lcid: 45e): Amharic (Ethiopia) - 0
+am_ET
+Amharic (Ethiopia)
+UTF-8
+
+OS Locale (lcid: 461): Nepali (Nepal) - 0
+ne_NP
+Nepali (Nepal)
+UTF-8
+
+OS Locale (lcid: 462): Frisian (Netherlands) - 1252
+fy_NL
+Frisian (Netherlands)
+windows-1252
+
+OS Locale (lcid: 463): Pashto (Afghanistan) - 0
+ps_AF
+Pushto (Afghanistan)
+windows-1256
+
+OS Locale (lcid: 464): Filipino (Philippines) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 465): Divehi (Maldives) - 0
+dv_MV
+Divehi (Maldives)
+UTF-8
+
+OS Locale (lcid: 468): Hausa (Latin) (Nigeria) - 1252
+ha_NG
+Hausa (Nigeria)
+windows-1252
+
+OS Locale (lcid: 46a): Yoruba (Nigeria) - 1252
+yo_NG
+Yoruba (Nigeria)
+windows-1252
+
+OS Locale (lcid: 46b): Quechua (Bolivia) - 1252
+qu_BO
+Quechua (Bolivia)
+windows-1252
+
+OS Locale (lcid: 46c): Sesotho sa Leboa (South Africa) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 46d): Bashkir (Russia) - 1251
+ba_RU
+Bashkir (Russia)
+windows-1251
+
+OS Locale (lcid: 46e): Luxembourgish (Luxembourg) - 1252
+lb_LU
+Luxembourgish (Luxembourg)
+windows-1252
+
+OS Locale (lcid: 46f): Greenlandic (Greenland) - 1252
+kl_GL
+Greenlandic (Greenland)
+windows-1252
+
+OS Locale (lcid: 470): Igbo (Nigeria) - 1252
+ig_NG
+Igbo (Nigeria)
+windows-1252
+
+OS Locale (lcid: 478): Yi (People's Republic of China) - 0
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 47a): Mapudungun (Chile) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 47c): Mohawk (Canada) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 47e): Breton (France) - 1252
+br_FR
+Breton (France)
+windows-1252
+
+OS Locale (lcid: 480): Uighur (People's Republic of China) - 1256
+ug_CN
+Uighur (China)
+windows-1256
+
+OS Locale (lcid: 481): Maori (New Zealand) - 0
+mi_NZ
+Maori (New Zealand)
+UTF-8
+
+OS Locale (lcid: 482): Occitan (France) - 1252
+oc_FR
+Occitan (France)
+windows-1252
+
+OS Locale (lcid: 483): Corsican (France) - 1252
+co_FR
+Corsican (France)
+windows-1252
+
+OS Locale (lcid: 484): Alsatian (France) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 485): Yakut (Russia) - 1251
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 486): K'iche (Guatemala) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 487): Kinyarwanda (Rwanda) - 1252
+rw_RW
+Kinyarwanda (Rwanda)
+windows-1252
+
+OS Locale (lcid: 488): Wolof (Senegal) - 1252
+wo_SN
+Wolof (Senegal)
+windows-1252
+
+OS Locale (lcid: 48c): Dari (Afghanistan) - 1256
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 801): Arabic (Iraq) - 1256
+ar_IQ
+Arabic (Iraq)
+windows-1256
+
+OS Locale (lcid: 804): Chinese (People's Republic of China) - 936
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale (lcid: 807): German (Switzerland) - 1252
+de_CH
+German (Switzerland)
+windows-1252
+
+OS Locale (lcid: 809): English (United Kingdom) - 1252
+en_GB
+English (United Kingdom)
+windows-1252
+
+OS Locale (lcid: 80a): Spanish (Mexico) - 1252
+es_MX
+Spanish (Mexico)
+windows-1252
+
+OS Locale (lcid: 80c): French (Belgium) - 1252
+fr_BE
+French (Belgium)
+windows-1252
+
+OS Locale (lcid: 810): Italian (Switzerland) - 1252
+it_CH
+Italian (Switzerland)
+windows-1252
+
+OS Locale (lcid: 813): Dutch (Belgium) - 1252
+nl_BE
+Dutch (Belgium)
+windows-1252
+
+OS Locale (lcid: 814): Norwegian (Nynorsk) (Norway) - 1252
+no_NO_NY
+Norwegian (Norway,Nynorsk)
+windows-1252
+
+OS Locale (lcid: 816): Portuguese (Portugal) - 1252
+pt_PT
+Portuguese (Portugal)
+windows-1252
+
+OS Locale (lcid: 81a): Serbian (Latin) (Serbia and Montenegro) - 1250
+sr_CS
+Serbian (Serbia and Montenegro)
+windows-1250
+
+OS Locale (lcid: 81d): Swedish (Finland) - 1252
+sv_FI
+Swedish (Finland)
+windows-1252
+
+OS Locale (lcid: 82c): Azeri (Cyrillic) (Azerbaijan) - 1251
+az_AZ
+Azerbaijani (Azerbaijan)
+windows-1251
+
+OS Locale (lcid: 82e): Lower Sorbian (Germany) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 83b): Sami (Northern) (Sweden) - 1252
+se_SE
+Northern Sami (Sweden)
+windows-1252
+
+OS Locale (lcid: 83c): Irish (Ireland) - 1252
+ga_IE
+Irish (Ireland)
+windows-1252
+
+OS Locale (lcid: 83e): Malay (Brunei Darussalam) - 1252
+ms_BN
+Malay (Brunei)
+windows-1252
+
+OS Locale (lcid: 843): Uzbek (Cyrillic) (Uzbekistan) - 1251
+uz_UZ
+Uzbek (Uzbekistan)
+windows-1251
+
+OS Locale (lcid: 845): Bengali (Bangladesh) - 0
+bn_BD
+Bengali (Bangladesh)
+UTF-8
+
+OS Locale (lcid: 850): Mongolian (Traditional Mongolian) (People's Republic of China) - 0
+mn_CN
+Mongolian (China)
+UTF-8
+
+OS Locale (lcid: 85d): Inuktitut (Latin) (Canada) - 1252
+iu_CA
+Inuktitut (Canada)
+windows-1252
+
+OS Locale (lcid: 85f): Tamazight (Latin) (Algeria) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 86b): Quechua (Ecuador) - 1252
+qu_EC
+Quechua (Ecuador)
+windows-1252
+
+OS Locale (lcid: c01): Arabic (Egypt) - 1256
+ar_EG
+Arabic (Egypt)
+windows-1256
+
+OS Locale (lcid: c04): Chinese (Hong Kong S.A.R.) - 950
+zh_HK
+Chinese (Hong Kong)
+x-windows-950
+
+OS Locale (lcid: c07): German (Austria) - 1252
+de_AT
+German (Austria)
+windows-1252
+
+OS Locale (lcid: c09): English (Australia) - 1252
+en_AU
+English (Australia)
+windows-1252
+
+OS Locale (lcid: c0a): Spanish (Spain) - 1252
+es_ES
+Spanish (Spain)
+windows-1252
+
+OS Locale (lcid: c0c): French (Canada) - 1252
+fr_CA
+French (Canada)
+windows-1252
+
+OS Locale (lcid: c1a): Serbian (Cyrillic) (Serbia and Montenegro) - 1251
+sr_CS
+Serbian (Serbia and Montenegro)
+windows-1251
+
+OS Locale (lcid: c3b): Sami (Northern) (Finland) - 1252
+se_FI
+Northern Sami (Finland)
+windows-1252
+
+OS Locale (lcid: c6b): Quechua (Peru) - 1252
+qu_PE
+Quechua (Peru)
+windows-1252
+
+OS Locale (lcid: 1001): Arabic (Libya) - 1256
+ar_LY
+Arabic (Libya)
+windows-1256
+
+OS Locale (lcid: 1004): Chinese (Singapore) - 936
+zh_SG
+Chinese (Singapore)
+GBK
+
+OS Locale (lcid: 1007): German (Luxembourg) - 1252
+de_LU
+German (Luxembourg)
+windows-1252
+
+OS Locale (lcid: 1009): English (Canada) - 1252
+en_CA
+English (Canada)
+windows-1252
+
+OS Locale (lcid: 100a): Spanish (Guatemala) - 1252
+es_GT
+Spanish (Guatemala)
+windows-1252
+
+OS Locale (lcid: 100c): French (Switzerland) - 1252
+fr_CH
+French (Switzerland)
+windows-1252
+
+OS Locale (lcid: 101a): Croatian (Latin) (Bosnia and Herzegovina) - 1250
+hr_BA
+Croatian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 103b): Sami (Lule) (Norway) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 1401): Arabic (Algeria) - 1256
+ar_DZ
+Arabic (Algeria)
+windows-1256
+
+OS Locale (lcid: 1404): Chinese (Macao S.A.R.) - 950
+zh_MO
+Chinese (Macao)
+x-windows-950
+
+OS Locale (lcid: 1407): German (Liechtenstein) - 1252
+de_LI
+German (Liechtenstein)
+windows-1252
+
+OS Locale (lcid: 1409): English (New Zealand) - 1252
+en_NZ
+English (New Zealand)
+windows-1252
+
+OS Locale (lcid: 140a): Spanish (Costa Rica) - 1252
+es_CR
+Spanish (Costa Rica)
+windows-1252
+
+OS Locale (lcid: 140c): French (Luxembourg) - 1252
+fr_LU
+French (Luxembourg)
+windows-1252
+
+OS Locale (lcid: 141a): Bosnian (Latin) (Bosnia and Herzegovina) - 1250
+bs_BA
+Bosnian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 143b): Sami (Lule) (Sweden) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 1801): Arabic (Morocco) - 1256
+ar_MA
+Arabic (Morocco)
+windows-1256
+
+OS Locale (lcid: 1809): English (Ireland) - 1252
+en_IE
+English (Ireland)
+windows-1252
+
+OS Locale (lcid: 180a): Spanish (Panama) - 1252
+es_PA
+Spanish (Panama)
+windows-1252
+
+OS Locale (lcid: 180c): French (Principality of Monaco) - 1252
+fr_MC
+French (Monaco)
+windows-1252
+
+OS Locale (lcid: 181a): Serbian (Latin) (Bosnia and Herzegovina) - 1250
+sr_BA
+Serbian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 183b): Sami (Southern) (Norway) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 1c01): Arabic (Tunisia) - 1256
+ar_TN
+Arabic (Tunisia)
+windows-1256
+
+OS Locale (lcid: 1c09): English (South Africa) - 1252
+en_ZA
+English (South Africa)
+windows-1252
+
+OS Locale (lcid: 1c0a): Spanish (Dominican Republic) - 1252
+es_DO
+Spanish (Dominican Republic)
+windows-1252
+
+OS Locale (lcid: 1c1a): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251
+sr_BA
+Serbian (Bosnia and Herzegovina)
+windows-1251
+
+OS Locale (lcid: 1c3b): Sami (Southern) (Sweden) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 2001): Arabic (Oman) - 1256
+ar_OM
+Arabic (Oman)
+windows-1256
+
+OS Locale (lcid: 2009): English (Jamaica) - 1252
+en_JM
+English (Jamaica)
+windows-1252
+
+OS Locale (lcid: 200a): Spanish (Venezuela) - 1252
+es_VE
+Spanish (Venezuela)
+windows-1252
+
+OS Locale (lcid: 201a): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251
+bs_BA
+Bosnian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 203b): Sami (Skolt) (Finland) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 2401): Arabic (Yemen) - 1256
+ar_YE
+Arabic (Yemen)
+windows-1256
+
+OS Locale (lcid: 2409): English (Caribbean) - 1252
+en
+English
+windows-1252
+
+OS Locale (lcid: 240a): Spanish (Colombia) - 1252
+es_CO
+Spanish (Colombia)
+windows-1252
+
+OS Locale (lcid: 243b): Sami (Inari) (Finland) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 2801): Arabic (Syria) - 1256
+ar_SY
+Arabic (Syria)
+windows-1256
+
+OS Locale (lcid: 2809): English (Belize) - 1252
+en_BZ
+English (Belize)
+windows-1252
+
+OS Locale (lcid: 280a): Spanish (Peru) - 1252
+es_PE
+Spanish (Peru)
+windows-1252
+
+OS Locale (lcid: 2c01): Arabic (Jordan) - 1256
+ar_JO
+Arabic (Jordan)
+windows-1256
+
+OS Locale (lcid: 2c09): English (Trinidad and Tobago) - 1252
+en_TT
+English (Trinidad and Tobago)
+windows-1252
+
+OS Locale (lcid: 2c0a): Spanish (Argentina) - 1252
+es_AR
+Spanish (Argentina)
+windows-1252
+
+OS Locale (lcid: 3001): Arabic (Lebanon) - 1256
+ar_LB
+Arabic (Lebanon)
+windows-1256
+
+OS Locale (lcid: 3009): English (Zimbabwe) - 1252
+en_ZW
+English (Zimbabwe)
+windows-1252
+
+OS Locale (lcid: 300a): Spanish (Ecuador) - 1252
+es_EC
+Spanish (Ecuador)
+windows-1252
+
+OS Locale (lcid: 3401): Arabic (Kuwait) - 1256
+ar_KW
+Arabic (Kuwait)
+windows-1256
+
+OS Locale (lcid: 3409): English (Republic of the Philippines) - 1252
+en_PH
+English (Philippines)
+windows-1252
+
+OS Locale (lcid: 340a): Spanish (Chile) - 1252
+es_CL
+Spanish (Chile)
+windows-1252
+
+OS Locale (lcid: 3801): Arabic (U.A.E.) - 1256
+ar_AE
+Arabic (United Arab Emirates)
+windows-1256
+
+OS Locale (lcid: 380a): Spanish (Uruguay) - 1252
+es_UY
+Spanish (Uruguay)
+windows-1252
+
+OS Locale (lcid: 3c01): Arabic (Bahrain) - 1256
+ar_BH
+Arabic (Bahrain)
+windows-1256
+
+OS Locale (lcid: 3c0a): Spanish (Paraguay) - 1252
+es_PY
+Spanish (Paraguay)
+windows-1252
+
+OS Locale (lcid: 4001): Arabic (Qatar) - 1256
+ar_QA
+Arabic (Qatar)
+windows-1256
+
+OS Locale (lcid: 4009): English (India) - 1252
+en_IN
+English (India)
+windows-1252
+
+OS Locale (lcid: 400a): Spanish (Bolivia) - 1252
+es_BO
+Spanish (Bolivia)
+windows-1252
+
+OS Locale (lcid: 4409): English (Malaysia) - 1252
+en_MY
+English (Malaysia)
+windows-1252
+
+OS Locale (lcid: 440a): Spanish (El Salvador) - 1252
+es_SV
+Spanish (El Salvador)
+windows-1252
+
+OS Locale (lcid: 4809): English (Singapore) - 1252
+en_SG
+English (Singapore)
+windows-1252
+
+OS Locale (lcid: 480a): Spanish (Honduras) - 1252
+es_HN
+Spanish (Honduras)
+windows-1252
+
+OS Locale (lcid: 4c0a): Spanish (Nicaragua) - 1252
+es_NI
+Spanish (Nicaragua)
+windows-1252
+
+OS Locale (lcid: 500a): Spanish (Puerto Rico) - 1252
+es_PR
+Spanish (Puerto Rico)
+windows-1252
+
+OS Locale (lcid: 540a): Spanish (United States) - 1252
+es_US
+Spanish (United States)
+windows-1252
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Locale/data/deflocale.winxp	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,861 @@
+# OSVersionInfo
+# MajorVersion: 5
+# MinorVersion: 1
+# BuildNumber: 2600
+# CSDVersion: Service Pack 2
+
+
+OS Locale (lcid: 401): Arabic (Saudi Arabia) - 1256
+ar_SA
+Arabic (Saudi Arabia)
+windows-1256
+
+OS Locale (lcid: 402): Bulgarian (Bulgaria) - 1251
+bg_BG
+Bulgarian (Bulgaria)
+windows-1251
+
+OS Locale (lcid: 403): Catalan (Spain) - 1252
+ca_ES
+Catalan (Spain)
+windows-1252
+
+OS Locale (lcid: 404): Chinese (Taiwan) - 950
+zh_TW
+Chinese (Taiwan)
+x-windows-950
+
+OS Locale (lcid: 405): Czech (Czech Republic) - 1250
+cs_CZ
+Czech (Czech Republic)
+windows-1250
+
+OS Locale (lcid: 406): Danish (Denmark) - 1252
+da_DK
+Danish (Denmark)
+windows-1252
+
+OS Locale (lcid: 407): German (Germany) - 1252
+de_DE
+German (Germany)
+windows-1252
+
+OS Locale (lcid: 408): Greek (Greece) - 1253
+el_GR
+Greek (Greece)
+windows-1253
+
+OS Locale (lcid: 409): English (United States) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 40a): Spanish (Spain) - 1252
+es_ES
+Spanish (Spain)
+windows-1252
+
+OS Locale (lcid: 40b): Finnish (Finland) - 1252
+fi_FI
+Finnish (Finland)
+windows-1252
+
+OS Locale (lcid: 40c): French (France) - 1252
+fr_FR
+French (France)
+windows-1252
+
+OS Locale (lcid: 40d): Hebrew (Israel) - 1255
+iw_IL
+Hebrew (Israel)
+windows-1255
+
+OS Locale (lcid: 40e): Hungarian (Hungary) - 1250
+hu_HU
+Hungarian (Hungary)
+windows-1250
+
+OS Locale (lcid: 40f): Icelandic (Iceland) - 1252
+is_IS
+Icelandic (Iceland)
+windows-1252
+
+OS Locale (lcid: 410): Italian (Italy) - 1252
+it_IT
+Italian (Italy)
+windows-1252
+
+OS Locale (lcid: 411): Japanese (Japan) - 932
+ja_JP
+Japanese (Japan)
+windows-31j
+
+OS Locale (lcid: 412): Korean (Korea) - 949
+ko_KR
+Korean (South Korea)
+x-windows-949
+
+OS Locale (lcid: 413): Dutch (Netherlands) - 1252
+nl_NL
+Dutch (Netherlands)
+windows-1252
+
+OS Locale (lcid: 414): Norwegian (Bokmål) (Norway) - 1252
+no_NO
+Norwegian (Norway)
+windows-1252
+
+OS Locale (lcid: 415): Polish (Poland) - 1250
+pl_PL
+Polish (Poland)
+windows-1250
+
+OS Locale (lcid: 416): Portuguese (Brazil) - 1252
+pt_BR
+Portuguese (Brazil)
+windows-1252
+
+OS Locale (lcid: 417): Romansh (Switzerland) - 1252
+rm_CH
+Raeto-Romance (Switzerland)
+windows-1252
+
+OS Locale (lcid: 418): Romanian (Romania) - 1250
+ro_RO
+Romanian (Romania)
+windows-1250
+
+OS Locale (lcid: 419): Russian (Russia) - 1251
+ru_RU
+Russian (Russia)
+windows-1251
+
+OS Locale (lcid: 41a): Croatian (Croatia) - 1250
+hr_HR
+Croatian (Croatia)
+windows-1250
+
+OS Locale (lcid: 41b): Slovak (Slovakia) - 1250
+sk_SK
+Slovak (Slovakia)
+windows-1250
+
+OS Locale (lcid: 41c): Albanian (Albania) - 1250
+sq_AL
+Albanian (Albania)
+windows-1250
+
+OS Locale (lcid: 41d): Swedish (Sweden) - 1252
+sv_SE
+Swedish (Sweden)
+windows-1252
+
+OS Locale (lcid: 41e): Thai (Thailand) - 874
+th_TH
+Thai (Thailand)
+x-windows-874
+
+OS Locale (lcid: 41f): Turkish (Turkey) - 1254
+tr_TR
+Turkish (Turkey)
+windows-1254
+
+OS Locale (lcid: 420): Urdu (Islamic Republic of Pakistan) - 1256
+ur_PK
+Urdu (Pakistan)
+windows-1256
+
+OS Locale (lcid: 421): Indonesian (Indonesia) - 1252
+in_ID
+Indonesian (Indonesia)
+windows-1252
+
+OS Locale (lcid: 422): Ukrainian (Ukraine) - 1251
+uk_UA
+Ukrainian (Ukraine)
+windows-1251
+
+OS Locale (lcid: 423): Belarusian (Belarus) - 1251
+be_BY
+Belarusian (Belarus)
+windows-1251
+
+OS Locale (lcid: 424): Slovenian (Slovenia) - 1250
+sl_SI
+Slovenian (Slovenia)
+windows-1250
+
+OS Locale (lcid: 425): Estonian (Estonia) - 1257
+et_EE
+Estonian (Estonia)
+windows-1257
+
+OS Locale (lcid: 426): Latvian (Latvia) - 1257
+lv_LV
+Latvian (Latvia)
+windows-1257
+
+OS Locale (lcid: 427): Lithuanian (Lithuania) - 1257
+lt_LT
+Lithuanian (Lithuania)
+windows-1257
+
+OS Locale (lcid: 429): Farsi (Iran) - 1256
+fa_IR
+Persian (Iran)
+windows-1256
+
+OS Locale (lcid: 42a): Vietnamese (Viet Nam) - 1258
+vi_VN
+Vietnamese (Vietnam)
+windows-1258
+
+OS Locale (lcid: 42b): Armenian (Armenia) - 0
+hy_AM
+Armenian (Armenia)
+UTF-8
+
+OS Locale (lcid: 42c): Azeri (Latin) (Azerbaijan) - 1254
+az_AZ
+Azerbaijani (Azerbaijan)
+windows-1254
+
+OS Locale (lcid: 42d): Basque (Spain) - 1252
+eu_ES
+Basque (Spain)
+windows-1252
+
+OS Locale (lcid: 42f): FYRO Macedonian (Former Yugoslav Republic of Macedonia) - 1251
+mk_MK
+Macedonian (Macedonia)
+windows-1251
+
+OS Locale (lcid: 432): Tswana (South Africa) - 1252
+tn_ZA
+Tswana (South Africa)
+windows-1252
+
+OS Locale (lcid: 434): Xhosa (South Africa) - 1252
+xh_ZA
+Xhosa (South Africa)
+windows-1252
+
+OS Locale (lcid: 435): Zulu (South Africa) - 1252
+zu_ZA
+Zulu (South Africa)
+windows-1252
+
+OS Locale (lcid: 436): Afrikaans (South Africa) - 1252
+af_ZA
+Afrikaans (South Africa)
+windows-1252
+
+OS Locale (lcid: 437): Georgian (Georgia) - 0
+ka_GE
+Georgian (Georgia)
+UTF-8
+
+OS Locale (lcid: 438): Faroese (Faroe Islands) - 1252
+fo_FO
+Faroese (Faroe Islands)
+windows-1252
+
+OS Locale (lcid: 439): Hindi (India) - 0
+hi_IN
+Hindi (India)
+UTF-8
+
+OS Locale (lcid: 43a): Maltese (Malta) - 0
+mt_MT
+Maltese (Malta)
+UTF-8
+
+OS Locale (lcid: 43b): Sami (Northern) (Norway) - 1252
+se_NO
+Northern Sami (Norway)
+windows-1252
+
+OS Locale (lcid: 43e): Malay (Malaysia) - 1252
+ms_MY
+Malay (Malaysia)
+windows-1252
+
+OS Locale (lcid: 43f): Kazakh (Kazakhstan) - 1251
+kk_KZ
+Kazakh (Kazakhstan)
+windows-1251
+
+OS Locale (lcid: 440): Kyrgyz (Kyrgyzstan) - 1251
+ky_KG
+Kirghiz (Kyrgyzstan)
+windows-1251
+
+OS Locale (lcid: 441): Swahili (Kenya) - 1252
+sw_KE
+Swahili (Kenya)
+windows-1252
+
+OS Locale (lcid: 443): Uzbek (Latin) (Uzbekistan) - 1254
+uz_UZ
+Uzbek (Uzbekistan)
+windows-1254
+
+OS Locale (lcid: 444): Tatar (Russia) - 1251
+tt_RU
+Tatar (Russia)
+windows-1251
+
+OS Locale (lcid: 445): Bengali (India) - 0
+bn_IN
+Bengali (India)
+UTF-8
+
+OS Locale (lcid: 446): Punjabi (India) - 0
+pa_IN
+Panjabi (India)
+UTF-8
+
+OS Locale (lcid: 447): Gujarati (India) - 0
+gu_IN
+Gujarati (India)
+UTF-8
+
+OS Locale (lcid: 449): Tamil (India) - 0
+ta_IN
+Tamil (India)
+UTF-8
+
+OS Locale (lcid: 44a): Telugu (India) - 0
+te_IN
+Telugu (India)
+UTF-8
+
+OS Locale (lcid: 44b): Kannada (India) - 0
+kn_IN
+Kannada (India)
+UTF-8
+
+OS Locale (lcid: 44c): Malayalam (India) - 0
+ml_IN
+Malayalam (India)
+UTF-8
+
+OS Locale (lcid: 44e): Marathi (India) - 0
+mr_IN
+Marathi (India)
+UTF-8
+
+OS Locale (lcid: 44f): Sanskrit (India) - 0
+sa_IN
+Sanskrit (India)
+UTF-8
+
+OS Locale (lcid: 450): Mongolian (Mongolia) - 1251
+mn_MN
+Mongolian (Mongolia)
+windows-1251
+
+OS Locale (lcid: 452): Welsh (United Kingdom) - 1252
+cy_GB
+Welsh (United Kingdom)
+windows-1252
+
+OS Locale (lcid: 456): Galician (Spain) - 1252
+gl_ES
+Gallegan (Spain)
+windows-1252
+
+OS Locale (lcid: 457): Konkani (India) - 0
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 45a): Syriac (Syria) - 0
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 461): Nepali (Nepal) - 0
+ne_NP
+Nepali (Nepal)
+UTF-8
+
+OS Locale (lcid: 462): Frisian (Netherlands) - 1252
+fy_NL
+Frisian (Netherlands)
+windows-1252
+
+OS Locale (lcid: 463): Pashto (Afghanistan) - 1256
+ps_AF
+Pushto (Afghanistan)
+windows-1256
+
+OS Locale (lcid: 464): Filipino (Philippines) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 465): Divehi (Maldives) - 0
+dv_MV
+Divehi (Maldives)
+UTF-8
+
+OS Locale (lcid: 46b): Quechua (Bolivia) - 1252
+qu_BO
+Quechua (Bolivia)
+windows-1252
+
+OS Locale (lcid: 46c): Northern Sotho (South Africa) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 46e): Luxembourgish (Luxembourg) - 1252
+lb_LU
+Luxembourgish (Luxembourg)
+windows-1252
+
+OS Locale (lcid: 47a): Mapudungun (Chile) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 47c): Mohawk (Canada) - 1252
+en_US
+English (United States)
+windows-1252
+
+OS Locale (lcid: 481): Maori (New Zealand) - 0
+mi_NZ
+Maori (New Zealand)
+UTF-8
+
+OS Locale (lcid: 801): Arabic (Iraq) - 1256
+ar_IQ
+Arabic (Iraq)
+windows-1256
+
+OS Locale (lcid: 804): Chinese (People's Republic of China) - 936
+zh_CN
+Chinese (China)
+GBK
+
+OS Locale (lcid: 807): German (Switzerland) - 1252
+de_CH
+German (Switzerland)
+windows-1252
+
+OS Locale (lcid: 809): English (United Kingdom) - 1252
+en_GB
+English (United Kingdom)
+windows-1252
+
+OS Locale (lcid: 80a): Spanish (Mexico) - 1252
+es_MX
+Spanish (Mexico)
+windows-1252
+
+OS Locale (lcid: 80c): French (Belgium) - 1252
+fr_BE
+French (Belgium)
+windows-1252
+
+OS Locale (lcid: 810): Italian (Switzerland) - 1252
+it_CH
+Italian (Switzerland)
+windows-1252
+
+OS Locale (lcid: 813): Dutch (Belgium) - 1252
+nl_BE
+Dutch (Belgium)
+windows-1252
+
+OS Locale (lcid: 814): Norwegian (Nynorsk) (Norway) - 1252
+no_NO_NY
+Norwegian (Norway,Nynorsk)
+windows-1252
+
+OS Locale (lcid: 816): Portuguese (Portugal) - 1252
+pt_PT
+Portuguese (Portugal)
+windows-1252
+
+OS Locale (lcid: 81a): Serbian (Latin) (Serbia and Montenegro) - 1250
+sr_CS
+Serbian (Serbia and Montenegro)
+windows-1250
+
+OS Locale (lcid: 81d): Swedish (Finland) - 1252
+sv_FI
+Swedish (Finland)
+windows-1252
+
+OS Locale (lcid: 82c): Azeri (Cyrillic) (Azerbaijan) - 1251
+az_AZ
+Azerbaijani (Azerbaijan)
+windows-1251
+
+OS Locale (lcid: 83b): Sami (Northern) (Sweden) - 1252
+se_SE
+Northern Sami (Sweden)
+windows-1252
+
+OS Locale (lcid: 83c): Irish (Ireland) - 1252
+ga_IE
+Irish (Ireland)
+windows-1252
+
+OS Locale (lcid: 83e): Malay (Brunei Darussalam) - 1252
+ms_BN
+Malay (Brunei)
+windows-1252
+
+OS Locale (lcid: 843): Uzbek (Cyrillic) (Uzbekistan) - 1251
+uz_UZ
+Uzbek (Uzbekistan)
+windows-1251
+
+OS Locale (lcid: 85d): Inuktitut (Latin) (Canada) - 1252
+iu_CA
+Inuktitut (Canada)
+windows-1252
+
+OS Locale (lcid: 86b): Quechua (Ecuador) - 1252
+qu_EC
+Quechua (Ecuador)
+windows-1252
+
+OS Locale (lcid: c01): Arabic (Egypt) - 1256
+ar_EG
+Arabic (Egypt)
+windows-1256
+
+OS Locale (lcid: c04): Chinese (Hong Kong S.A.R.) - 950
+zh_HK
+Chinese (Hong Kong)
+x-windows-950
+
+OS Locale (lcid: c07): German (Austria) - 1252
+de_AT
+German (Austria)
+windows-1252
+
+OS Locale (lcid: c09): English (Australia) - 1252
+en_AU
+English (Australia)
+windows-1252
+
+OS Locale (lcid: c0a): Spanish (Spain) - 1252
+es_ES
+Spanish (Spain)
+windows-1252
+
+OS Locale (lcid: c0c): French (Canada) - 1252
+fr_CA
+French (Canada)
+windows-1252
+
+OS Locale (lcid: c1a): Serbian (Cyrillic) (Serbia and Montenegro) - 1251
+sr_CS
+Serbian (Serbia and Montenegro)
+windows-1251
+
+OS Locale (lcid: c3b): Sami (Northern) (Finland) - 1252
+se_FI
+Northern Sami (Finland)
+windows-1252
+
+OS Locale (lcid: c6b): Quechua (Peru) - 1252
+qu_PE
+Quechua (Peru)
+windows-1252
+
+OS Locale (lcid: 1001): Arabic (Libya) - 1256
+ar_LY
+Arabic (Libya)
+windows-1256
+
+OS Locale (lcid: 1004): Chinese (Singapore) - 936
+zh_SG
+Chinese (Singapore)
+GBK
+
+OS Locale (lcid: 1007): German (Luxembourg) - 1252
+de_LU
+German (Luxembourg)
+windows-1252
+
+OS Locale (lcid: 1009): English (Canada) - 1252
+en_CA
+English (Canada)
+windows-1252
+
+OS Locale (lcid: 100a): Spanish (Guatemala) - 1252
+es_GT
+Spanish (Guatemala)
+windows-1252
+
+OS Locale (lcid: 100c): French (Switzerland) - 1252
+fr_CH
+French (Switzerland)
+windows-1252
+
+OS Locale (lcid: 101a): Croatian (Bosnia and Herzegovina) - 1250
+hr_BA
+Croatian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 103b): Sami (Lule) (Norway) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 1401): Arabic (Algeria) - 1256
+ar_DZ
+Arabic (Algeria)
+windows-1256
+
+OS Locale (lcid: 1404): Chinese (Macau S.A.R.) - 950
+zh_MO
+Chinese (Macao)
+x-windows-950
+
+OS Locale (lcid: 1407): German (Liechtenstein) - 1252
+de_LI
+German (Liechtenstein)
+windows-1252
+
+OS Locale (lcid: 1409): English (New Zealand) - 1252
+en_NZ
+English (New Zealand)
+windows-1252
+
+OS Locale (lcid: 140a): Spanish (Costa Rica) - 1252
+es_CR
+Spanish (Costa Rica)
+windows-1252
+
+OS Locale (lcid: 140c): French (Luxembourg) - 1252
+fr_LU
+French (Luxembourg)
+windows-1252
+
+OS Locale (lcid: 141a): Bosnian (Bosnia and Herzegovina) - 1250
+bs_BA
+Bosnian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 143b): Sami (Lule) (Sweden) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 1801): Arabic (Morocco) - 1256
+ar_MA
+Arabic (Morocco)
+windows-1256
+
+OS Locale (lcid: 1809): English (Ireland) - 1252
+en_IE
+English (Ireland)
+windows-1252
+
+OS Locale (lcid: 180a): Spanish (Panama) - 1252
+es_PA
+Spanish (Panama)
+windows-1252
+
+OS Locale (lcid: 180c): French (Principality of Monaco) - 1252
+fr_MC
+French (Monaco)
+windows-1252
+
+OS Locale (lcid: 181a): Serbian (Latin) (Bosnia and Herzegovina) - 1250
+sr_BA
+Serbian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 183b): Sami (Southern) (Norway) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 1c01): Arabic (Tunisia) - 1256
+ar_TN
+Arabic (Tunisia)
+windows-1256
+
+OS Locale (lcid: 1c09): English (South Africa) - 1252
+en_ZA
+English (South Africa)
+windows-1252
+
+OS Locale (lcid: 1c0a): Spanish (Dominican Republic) - 1252
+es_DO
+Spanish (Dominican Republic)
+windows-1252
+
+OS Locale (lcid: 1c1a): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251
+sr_BA
+Serbian (Bosnia and Herzegovina)
+windows-1251
+
+OS Locale (lcid: 1c3b): Sami (Southern) (Sweden) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 2001): Arabic (Oman) - 1256
+ar_OM
+Arabic (Oman)
+windows-1256
+
+OS Locale (lcid: 2009): English (Jamaica) - 1252
+en_JM
+English (Jamaica)
+windows-1252
+
+OS Locale (lcid: 200a): Spanish (Venezuela) - 1252
+es_VE
+Spanish (Venezuela)
+windows-1252
+
+OS Locale (lcid: 201a): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1250
+bs_BA
+Bosnian (Bosnia and Herzegovina)
+windows-1250
+
+OS Locale (lcid: 203b): Sami (Skolt) (Finland) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 2401): Arabic (Yemen) - 1256
+ar_YE
+Arabic (Yemen)
+windows-1256
+
+OS Locale (lcid: 2409): English (Caribbean) - 1252
+en
+English
+windows-1252
+
+OS Locale (lcid: 240a): Spanish (Colombia) - 1252
+es_CO
+Spanish (Colombia)
+windows-1252
+
+OS Locale (lcid: 243b): Sami (Inari) (Finland) - 1252
+se
+Northern Sami
+windows-1252
+
+OS Locale (lcid: 2801): Arabic (Syria) - 1256
+ar_SY
+Arabic (Syria)
+windows-1256
+
+OS Locale (lcid: 2809): English (Belize) - 1252
+en_BZ
+English (Belize)
+windows-1252
+
+OS Locale (lcid: 280a): Spanish (Peru) - 1252
+es_PE
+Spanish (Peru)
+windows-1252
+
+OS Locale (lcid: 2c01): Arabic (Jordan) - 1256
+ar_JO
+Arabic (Jordan)
+windows-1256
+
+OS Locale (lcid: 2c09): English (Trinidad and Tobago) - 1252
+en_TT
+English (Trinidad and Tobago)
+windows-1252
+
+OS Locale (lcid: 2c0a): Spanish (Argentina) - 1252
+es_AR
+Spanish (Argentina)
+windows-1252
+
+OS Locale (lcid: 3001): Arabic (Lebanon) - 1256
+ar_LB
+Arabic (Lebanon)
+windows-1256
+
+OS Locale (lcid: 3009): English (Zimbabwe) - 1252
+en_ZW
+English (Zimbabwe)
+windows-1252
+
+OS Locale (lcid: 300a): Spanish (Ecuador) - 1252
+es_EC
+Spanish (Ecuador)
+windows-1252
+
+OS Locale (lcid: 3401): Arabic (Kuwait) - 1256
+ar_KW
+Arabic (Kuwait)
+windows-1256
+
+OS Locale (lcid: 3409): English (Republic of the Philippines) - 1252
+en_PH
+English (Philippines)
+windows-1252
+
+OS Locale (lcid: 340a): Spanish (Chile) - 1252
+es_CL
+Spanish (Chile)
+windows-1252
+
+OS Locale (lcid: 3801): Arabic (U.A.E.) - 1256
+ar_AE
+Arabic (United Arab Emirates)
+windows-1256
+
+OS Locale (lcid: 380a): Spanish (Uruguay) - 1252
+es_UY
+Spanish (Uruguay)
+windows-1252
+
+OS Locale (lcid: 3c01): Arabic (Bahrain) - 1256
+ar_BH
+Arabic (Bahrain)
+windows-1256
+
+OS Locale (lcid: 3c0a): Spanish (Paraguay) - 1252
+es_PY
+Spanish (Paraguay)
+windows-1252
+
+OS Locale (lcid: 4001): Arabic (Qatar) - 1256
+ar_QA
+Arabic (Qatar)
+windows-1256
+
+OS Locale (lcid: 400a): Spanish (Bolivia) - 1252
+es_BO
+Spanish (Bolivia)
+windows-1252
+
+OS Locale (lcid: 440a): Spanish (El Salvador) - 1252
+es_SV
+Spanish (El Salvador)
+windows-1252
+
+OS Locale (lcid: 480a): Spanish (Honduras) - 1252
+es_HN
+Spanish (Honduras)
+windows-1252
+
+OS Locale (lcid: 4c0a): Spanish (Nicaragua) - 1252
+es_NI
+Spanish (Nicaragua)
+windows-1252
+
+OS Locale (lcid: 500a): Spanish (Puerto Rico) - 1252
+es_PR
+Spanish (Puerto Rico)
+windows-1252
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/BreakIteratorProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,103 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)BreakIteratorProviderTest.java	1.3 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.text.resources.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class BreakIteratorProviderTest extends ProviderTest {
+    
+    com.foo.BreakIteratorProviderImpl bip = new com.foo.BreakIteratorProviderImpl();
+    List<Locale> availloc = Arrays.asList(BreakIterator.getAvailableLocales());
+    List<Locale> providerloc = Arrays.asList(bip.getAvailableLocales());
+    List<Locale> jreloc = Arrays.asList(LocaleData.getAvailableLocales());
+
+    private static final int CHARACTER_INDEX = 0;
+    private static final int WORD_INDEX = 1;
+    private static final int LINE_INDEX = 2;
+    private static final int SENTENCE_INDEX = 3;
+
+    public static void main(String[] s) {
+        new BreakIteratorProviderTest();
+    }
+
+    BreakIteratorProviderTest() {
+        availableLocalesTest();
+        objectValidityTest();
+    }
+
+    void availableLocalesTest() {
+        Set<Locale> localesFromAPI = new HashSet<Locale>(availloc);
+        Set<Locale> localesExpected = new HashSet<Locale>(jreloc);
+        localesExpected.addAll(providerloc);
+        if (localesFromAPI.equals(localesExpected)) {
+            System.out.println("availableLocalesTest passed.");
+        } else {
+            throw new RuntimeException("availableLocalesTest failed");
+        }
+    }
+
+    void objectValidityTest() {
+
+        for (Locale target: availloc) {
+            // pure JRE implementation
+            ResourceBundle rb = ResourceBundle.getBundle(
+                        "sun.text.resources.BreakIteratorInfo", target);
+            String[] classNames = rb.getStringArray("BreakIteratorClasses");
+            boolean jreSupportsLocale = jreloc.contains(target);
+
+            // result object
+            String[] result = new String[4];
+            result[0] = BreakIterator.getCharacterInstance(target).getClass().getName();
+            result[1] = BreakIterator.getWordInstance(target).getClass().getName();
+            result[2] = BreakIterator.getLineInstance(target).getClass().getName();
+            result[3] = BreakIterator.getSentenceInstance(target).getClass().getName();
+ 
+            // provider's object (if any)
+            String[] providersResult = new String[4];
+            if (providerloc.contains(target)) {
+                providersResult[0] = bip.getCharacterInstance(target).getClass().getName();
+                providersResult[1] = bip.getWordInstance(target).getClass().getName();
+                providersResult[2] = bip.getLineInstance(target).getClass().getName();
+                providersResult[3] = bip.getSentenceInstance(target).getClass().getName();
+            }
+ 
+            // JRE 
+            String[] jresResult = new String[4];
+            if (jreSupportsLocale) {
+                for (int i = 0; i < 4; i++) {
+                    jresResult[i] = "java.text."+classNames[i];
+                }
+            }
+
+            for (int i = 0; i < 4; i++) {
+                checkValidity(target, jresResult[i], providersResult[i], result[i], jreSupportsLocale);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/BreakIteratorProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)BreakIteratorProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary BreakIteratorProvider tests
+# @run shell ExecTest.sh foo BreakIteratorProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/ClasspathTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,48 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)ClasspathTest.java	1.2 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.resources.*;
+
+public class ClasspathTest {
+
+    public static void main(String[] s) {
+        new ClasspathTest();
+    }
+
+    ClasspathTest() {
+        /*
+	 * Since providers can only be loaded from the extension directory, 
+	 * this test will fail if they are loaded from classpath.
+	 */
+	Locale OSAKA = new Locale("ja", "JP", "osaka");
+	List<Locale> availableLocales = Arrays.asList(Locale.getAvailableLocales());
+	if (availableLocales.contains(OSAKA)) {
+	    throw new RuntimeException("LSS providers were loaded from the class path.");
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/ClasspathTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,29 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)ClasspathTest.sh	1.2 07/04/06
+# @bug 6388652
+# @summary  Checks whether providers can only be loaded from extension directories, 
+#     not from classpath.
+# @run shell ExecTest.sh bar ClasspathTest false
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/CollatorProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,92 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)CollatorProviderTest.java	1.3 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class CollatorProviderTest extends ProviderTest {
+
+    com.foo.CollatorProviderImpl cp = new com.foo.CollatorProviderImpl();
+    List<Locale> availloc = Arrays.asList(Collator.getAvailableLocales());
+    List<Locale> providerloc = Arrays.asList(cp.getAvailableLocales());
+    List<Locale> jreloc = Arrays.asList(LocaleData.getAvailableLocales());
+
+    public static void main(String[] s) {
+        new CollatorProviderTest();
+    }
+
+    CollatorProviderTest() {
+        availableLocalesTest();
+        objectValidityTest();
+    }
+
+    void availableLocalesTest() {
+        Set<Locale> localesFromAPI = new HashSet<Locale>(availloc);
+        Set<Locale> localesExpected = new HashSet<Locale>(jreloc);
+        localesExpected.addAll(providerloc);
+        if (localesFromAPI.equals(localesExpected)) {
+            System.out.println("availableLocalesTest passed.");
+        } else {
+            throw new RuntimeException("availableLocalesTest failed");
+        }
+    }
+
+    void objectValidityTest() {
+        Collator def = Collator.getInstance(new Locale(""));
+        String defrules = ((RuleBasedCollator)def).getRules();
+
+        for (Locale target: availloc) {
+            // pure JRE implementation
+            ResourceBundle rb = LocaleData.getCollationData(target);
+            boolean jreSupportsLocale = jreloc.contains(target);
+
+            // result object
+            Collator result = Collator.getInstance(target);
+ 
+            // provider's object (if any)
+            Collator providersResult = null;
+            if (providerloc.contains(target)) {
+                providersResult = cp.getInstance(target);
+            }
+ 
+            // JRE rule
+            Collator jresResult = null;
+            if (jreSupportsLocale) {
+                try {
+                    String rules = rb.getString("Rule");
+                    jresResult = new RuleBasedCollator(defrules+rules);
+                    jresResult.setDecomposition(Collator.NO_DECOMPOSITION);
+                } catch (MissingResourceException mre) {
+                } catch (ParseException pe) {
+                }
+            }
+
+            checkValidity(target, jresResult, providersResult, result, jreSupportsLocale);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/CollatorProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)CollatorProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary CollatorProvider tests
+# @run shell ExecTest.sh foo CollatorProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/CurrencyNameProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,123 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)CurrencyNameProviderTest.java	1.3 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class CurrencyNameProviderTest extends ProviderTest {
+
+    public static void main(String[] s) {
+        new CurrencyNameProviderTest();
+    }
+
+    CurrencyNameProviderTest() {
+        test1();
+        test2();
+    }
+
+    void test1() {
+        com.bar.CurrencyNameProviderImpl cnp = new com.bar.CurrencyNameProviderImpl();
+        Locale[] availloc = Locale.getAvailableLocales();
+        Locale[] testloc = availloc.clone();
+        List<Locale> providerloc = Arrays.asList(cnp.getAvailableLocales());
+
+        for (Locale target: availloc) {
+            // pure JRE implementation
+            ResourceBundle rb = LocaleData.getCurrencyNames(target);
+            boolean jreHasBundle = rb.getLocale().equals(target);
+
+            for (Locale test: testloc) {
+                // get a Currency instance
+                Currency c = null;
+                try {
+                    c = Currency.getInstance(test);
+                } catch (IllegalArgumentException iae) {}
+
+                if (c == null) {
+                    continue;
+                }
+
+                // the localized symbol for the target locale
+                String currencyresult = c.getSymbol(target);
+
+                // provider's name (if any)
+                String providerscurrency = null;
+                if (providerloc.contains(target)) {
+                    providerscurrency = cnp.getSymbol(c.getCurrencyCode(), target);
+                }
+
+                // JRE's name (if any)
+                String jrescurrency = null;
+                if (jreHasBundle) {
+		    try {
+                        jrescurrency = rb.getString(c.getCurrencyCode());
+		    } catch (MissingResourceException mre) {
+		        // JRE does not have any resource, "jrescurrency" should remain null
+		    }
+                }
+
+                checkValidity(target, jrescurrency, providerscurrency, currencyresult, jrescurrency!=null);
+            }
+        }
+    }
+
+
+    final String pattern = "###,###\u00A4";
+    final String YEN_IN_OSAKA = "100,000\u5186\u3084\u3002";
+    final String YEN_IN_KYOTO = "100,000\u5186\u3069\u3059\u3002";
+    final Locale OSAKA = new Locale("ja", "JP", "osaka");
+    final Locale KYOTO = new Locale("ja", "JP", "kyoto");
+    Integer i = new Integer(100000);
+    String formatted;
+    DecimalFormat df;
+
+    void test2() {
+        try {
+            df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance(OSAKA)); 
+            System.out.println(formatted = df.format(i));
+            if(!formatted.equals(YEN_IN_OSAKA)) {
+                throw new RuntimeException("formatted zone names mismatch. " +
+                    "Should match with " + YEN_IN_OSAKA);
+            }
+            
+            df.parse(YEN_IN_OSAKA);
+
+            Locale.setDefault(KYOTO);
+            df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance());
+            System.out.println(formatted = df.format(i));                        
+            if(!formatted.equals(YEN_IN_KYOTO)) {
+                throw new RuntimeException("formatted zone names mismatch. " +
+                    "Should match with " + YEN_IN_KYOTO);
+            }
+
+            df.parse(YEN_IN_KYOTO);
+        } catch (ParseException pe) {
+            throw new RuntimeException("parse error occured" + pe);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)CurrencyNameProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary CurrencyNameProvider tests
+# @run shell ExecTest.sh bar CurrencyNameProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/DateFormatProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,121 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)DateFormatProviderTest.java	1.4 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class DateFormatProviderTest extends ProviderTest {
+
+    com.foo.DateFormatProviderImpl dfp = new com.foo.DateFormatProviderImpl();
+    List<Locale> availloc = Arrays.asList(DateFormat.getAvailableLocales());
+    List<Locale> providerloc = Arrays.asList(dfp.getAvailableLocales());
+    List<Locale> jreloc = Arrays.asList(LocaleData.getAvailableLocales());
+
+    public static void main(String[] s) {
+        new DateFormatProviderTest();
+    }
+
+    DateFormatProviderTest() {
+        availableLocalesTest();
+        objectValidityTest();
+	extendedVariantTest();
+    }
+
+    void availableLocalesTest() {
+        Set<Locale> localesFromAPI = new HashSet<Locale>(availloc);
+        Set<Locale> localesExpected = new HashSet<Locale>(jreloc);
+        localesExpected.addAll(providerloc);
+        if (localesFromAPI.equals(localesExpected)) {
+            System.out.println("availableLocalesTest passed.");
+        } else {
+            throw new RuntimeException("availableLocalesTest failed");
+        }
+    }
+
+    void objectValidityTest() {
+
+        for (Locale target: availloc) {
+	    // Get the key for the date/time patterns which is
+	    // specific to each calendar system.
+	    Calendar cal = Calendar.getInstance(target);
+	    String key = "DateTimePatterns";
+	    if (!cal.getClass().getName().equals("java.util.GregorianCalendar")) {
+		// e.g., "java.util.JapaneseImperialCalendar.DateTimePatterns"
+	        key = cal.getClass().getName() + "." + key;
+	    }
+            // pure JRE implementation
+            ResourceBundle rb = LocaleData.getDateFormatData(target);
+            boolean jreSupportsLocale = jreloc.contains(target);
+
+            // JRE string arrays
+            String[] jreDateTimePatterns = null;
+            if (jreSupportsLocale) {
+                try {
+                    jreDateTimePatterns = (String[])rb.getObject(key);
+                } catch (MissingResourceException mre) {}
+            }
+
+            for (int style = DateFormat.FULL; style <= DateFormat.SHORT; style ++) {
+                // result object
+                DateFormat result = DateFormat.getDateTimeInstance(style, style, target);
+ 
+                // provider's object (if any)
+                DateFormat providersResult = null;
+                if (providerloc.contains(target)) {
+                    providersResult = dfp.getDateTimeInstance(style, style, target);
+                }
+ 
+                // JRE's object (if any)
+                DateFormat jresResult = null;
+                if (jreSupportsLocale) {
+                    Object[] dateTimeArgs = {jreDateTimePatterns[style],
+                                             jreDateTimePatterns[style + 4]};
+                    String pattern = MessageFormat.format(jreDateTimePatterns[8], dateTimeArgs);
+                    jresResult = new SimpleDateFormat(pattern, target);
+                }
+
+                checkValidity(target, jresResult, providersResult, result, jreSupportsLocale);
+            }
+        }
+    }
+
+    // Check that fallback correctly occurs with locales with variant including '_'s
+    // This test assumes that the provider supports the ja_JP_osaka locale, and JRE does not.
+    void extendedVariantTest() {
+        Locale[] testlocs = {new Locale("ja", "JP", "osaka_extended"),
+	                     new Locale("ja", "JP", "osaka_extended_further"),
+	                     new Locale("ja", "JP", "osaka_")};
+	for (Locale test: testlocs) {
+	    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, test);
+	    DateFormat provider = dfp.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, test);
+            if (!df.equals(provider)) {
+	        throw new RuntimeException("variant fallback failed. test locale: "+test);
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/DateFormatProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)DateFormatProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary DateFormatProvider tests
+# @run shell ExecTest.sh foo DateFormatProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,125 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)DateFormatSymbolsProviderTest.java	1.3 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class DateFormatSymbolsProviderTest extends ProviderTest {
+
+    com.foo.DateFormatSymbolsProviderImpl dfsp = new com.foo.DateFormatSymbolsProviderImpl();
+    List<Locale> availloc = Arrays.asList(DateFormatSymbols.getAvailableLocales());
+    List<Locale> providerloc = Arrays.asList(dfsp.getAvailableLocales());
+    List<Locale> jreloc = Arrays.asList(LocaleData.getAvailableLocales());
+
+    public static void main(String[] s) {
+        new DateFormatSymbolsProviderTest();
+    }
+
+    DateFormatSymbolsProviderTest() {
+        availableLocalesTest();
+        objectValidityTest();
+    }
+
+    void availableLocalesTest() {
+        Set<Locale> localesFromAPI = new HashSet<Locale>(availloc);
+        Set<Locale> localesExpected = new HashSet<Locale>(jreloc);
+        localesExpected.addAll(providerloc);
+        if (localesFromAPI.equals(localesExpected)) {
+            System.out.println("availableLocalesTest passed.");
+        } else {
+            throw new RuntimeException("availableLocalesTest failed");
+        }
+    }
+
+    void objectValidityTest() {
+
+        for (Locale target: availloc) {
+            // pure JRE implementation
+            ResourceBundle rb = LocaleData.getDateFormatData(target);
+            boolean jreSupportsLocale = jreloc.contains(target);
+
+            // JRE string arrays
+            String[][] jres = new String[6][];
+            if (jreSupportsLocale) {
+                try {
+                    jres[0] = (String[])rb.getObject("MonthNames");
+                    jres[1] = (String[])rb.getObject("MonthAbbreviations");
+                    jres[2] = (String[])rb.getObject("DayNames");
+                    jres[3] = (String[])rb.getObject("DayAbbreviations");
+                    jres[4] = (String[])rb.getObject("AmPmMarkers");
+                    jres[5] = (String[])rb.getObject("Eras");
+                } catch (MissingResourceException mre) {}
+            }
+
+            // result object
+            DateFormatSymbols dfs = DateFormatSymbols.getInstance(target);
+            String[][] result = new String[6][];
+            result[0] = dfs.getMonths();
+            result[1] = dfs.getShortMonths();
+            // note that weekdays are 1-based
+            String[] tmp = dfs.getWeekdays();
+            result[2] = new String[7];
+            System.arraycopy(tmp, 1, result[2], 0, result[2].length);
+            tmp = dfs.getShortWeekdays();
+            result[3] = new String[7];
+            System.arraycopy(tmp, 1, result[3], 0, result[3].length);
+            result[4] = dfs.getAmPmStrings();
+            result[5] = dfs.getEras();
+ 
+            // provider's object (if any)
+            DateFormatSymbols providersDfs= null;
+            String[][] providers = new String[6][];
+            if (providerloc.contains(target)) {
+                providersDfs = dfsp.getInstance(target);
+                providers[0] = providersDfs.getMonths();
+                providers[1] = providersDfs.getShortMonths();
+                // note that weekdays are 1-based
+                tmp = dfs.getWeekdays();
+                providers[2] = new String[7];
+                System.arraycopy(tmp, 1, providers[2], 0, providers[2].length);
+                tmp = dfs.getShortWeekdays();
+                providers[3] = new String[7];
+                System.arraycopy(tmp, 1, providers[3], 0, providers[3].length);
+                providers[4] = providersDfs.getAmPmStrings();
+                providers[5] = providersDfs.getEras();
+            }
+
+            for (int i = 0; i < result.length; i ++) {
+                for (int j = 0; j < result[i].length; j++) {
+                    String jresStr =
+                        (jres[i] != null ? jres[i][j] : null);
+                    String providersStr =
+                        (providers[i] != null ? providers[i][j] : null);
+                    String resultStr =
+                        (result[i] != null ? result[i][j] : null);
+                    checkValidity(target, jresStr, providersStr, resultStr, jreSupportsLocale);
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)DateFormatSymbolsProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary DateFormatSymbolsProvider tests
+# @run shell ExecTest.sh foo DateFormatSymbolsProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,96 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)DecimalFormatSymbolsProviderTest.java	1.3 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class DecimalFormatSymbolsProviderTest extends ProviderTest {
+
+    com.foo.DecimalFormatSymbolsProviderImpl dfsp = new com.foo.DecimalFormatSymbolsProviderImpl();
+    List<Locale> availloc = Arrays.asList(DecimalFormatSymbols.getAvailableLocales());
+    List<Locale> providerloc = Arrays.asList(dfsp.getAvailableLocales());
+    List<Locale> jreloc = Arrays.asList(LocaleData.getAvailableLocales());
+
+    public static void main(String[] s) {
+        new DecimalFormatSymbolsProviderTest();
+    }
+
+    DecimalFormatSymbolsProviderTest() {
+        availableLocalesTest();
+        objectValidityTest();
+    }
+
+    void availableLocalesTest() {
+        Set<Locale> localesFromAPI = new HashSet<Locale>(availloc);
+        Set<Locale> localesExpected = new HashSet<Locale>(jreloc);
+        localesExpected.addAll(providerloc);
+        if (localesFromAPI.equals(localesExpected)) {
+            System.out.println("availableLocalesTest passed.");
+        } else {
+            throw new RuntimeException("availableLocalesTest failed");
+        }
+    }
+
+    void objectValidityTest() {
+
+        for (Locale target: availloc) {
+            // pure JRE implementation
+            ResourceBundle rb = LocaleData.getNumberFormatData(target);
+            boolean jreSupportsLocale = jreloc.contains(target);
+
+            // JRE string arrays
+            String[] jres = new String[2];
+            if (jreSupportsLocale) {
+                try {
+                    String[] tmp = rb.getStringArray("NumberElements");
+                    jres[0] = tmp[9]; // infinity
+                    jres[1] = tmp[10]; // NaN
+                } catch (MissingResourceException mre) {}
+            }
+
+            // result object
+            DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(target);
+            String[] result = new String[2];
+            result[0] = dfs.getInfinity();
+            result[1] = dfs.getNaN();
+ 
+            // provider's object (if any)
+            DecimalFormatSymbols providersDfs= null;
+            String[] providers = new String[2];
+            if (providerloc.contains(target)) {
+                providersDfs = dfsp.getInstance(target);
+                providers[0] = providersDfs.getInfinity();
+                providers[1] = providersDfs.getNaN();
+            }
+
+            for (int i = 0; i < result.length; i ++) {
+                checkValidity(target, jres[i], providers[i], result[i], jreSupportsLocale);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)DecimalFormatSymbolsProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary DecimalFormatSymbolsProvider tests
+# @run shell ExecTest.sh foo DecimalFormatSymbolsProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/ExecTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,143 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @(#)ExecTest.sh	1.6 07/04/06
+#
+# This script is the actual launcher of each locale service provider test.
+# fooprovider.jar contains localized object providers and barprovider.jar
+# contains localized name providers.  This way, we can test providers that
+# can relate to each other (such as, DateFormatSymbolsProvider and 
+# TimeZoneNameProvider) separately.
+# 
+# Parameters:
+#    providersToTest: [foo|bar|foobar]
+#    java class name: <class name>
+#    providersInExtDir: [true|false]
+
+if [ "${TESTSRC}" = "" ]
+then
+  echo "TESTSRC not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+echo "TESTSRC=${TESTSRC}"
+if [ "${TESTJAVA}" = "" ]
+then
+  echo "TESTJAVA not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+echo "TESTJAVA=${TESTJAVA}"
+if [ "${TESTCLASSES}" = "" ]
+then
+  echo "TESTCLASSES not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+echo "TESTCLASSES=${TESTCLASSES}"
+echo "CLASSPATH=${CLASSPATH}"
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+  SunOS | Linux )
+    PS=":"
+    FS="/"
+    ;;
+  Windows* )
+    PS=";"
+    FS="\\"
+    ;;
+  * )
+    echo "Unrecognized system!"
+    exit 1;
+    ;;
+esac
+
+# set classpath and extension directory variables
+if [ -d ${TESTJAVA}${FS}lib${FS}ext ]
+then
+    EXTDIRS="${TESTJAVA}${FS}lib${FS}ext${PS}${TESTCLASSES}"
+else
+    EXTDIRS="${TESTJAVA}${FS}jre${FS}lib${FS}ext${PS}${TESTCLASSES}"
+fi
+
+case "$1" in 
+  "foo" )
+    cp ${TESTSRC}${FS}fooprovider.jar ${TESTCLASSES}
+    CLASSPATHARG=".${PS}${TESTSRC}${PS}${TESTSRC}${FS}fooprovider.jar"
+    ;;
+  "bar" )
+    cp ${TESTSRC}${FS}barprovider.jar ${TESTCLASSES}
+    CLASSPATHARG=".${PS}${TESTSRC}${PS}${TESTSRC}${FS}barprovider.jar"
+    ;;
+  "foobar" )
+    cp ${TESTSRC}${FS}fooprovider.jar ${TESTCLASSES}
+    cp ${TESTSRC}${FS}barprovider.jar ${TESTCLASSES}
+    CLASSPATHARG=".${PS}${TESTSRC}${PS}${TESTSRC}${FS}fooprovider.jar${PS}${TESTSRC}${PS}${TESTSRC}${FS}barprovider.jar"
+    ;;
+esac
+    
+# compile
+cp ${TESTSRC}${FS}ProviderTest.java .
+cp ${TESTSRC}${FS}$2.java .
+COMPILE="${TESTJAVA}${FS}bin${FS}javac -XDignore.symbol.file -d . -classpath ${CLASSPATHARG} $2.java"
+echo ${COMPILE}
+${COMPILE}
+result=$?
+
+if [ $result -eq 0 ]
+then
+  echo "Compilation of the test case was successful."
+else 
+  echo "Compilation of the test case failed."
+  # Cleanup
+  rm -f ${TESTCLASSES}${FS}$2*.class
+  rm -f ${TESTCLASSES}${FS}fooprovider.jar
+  rm -f ${TESTCLASSES}${FS}barprovider.jar
+  exit $result
+fi
+
+# run
+if [ "$3" = "true" ]
+then
+  RUNCMD="${TESTJAVA}${FS}bin${FS}java -Djava.ext.dirs=${EXTDIRS} $2 "
+else
+  RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${CLASSPATHARG} $2 "
+fi
+
+echo ${RUNCMD}
+${RUNCMD}
+result=$?
+
+if [ $result -eq 0 ]
+then
+  echo "Execution successful"
+else
+  echo "Execution of the test case failed."
+fi
+
+# Cleanup
+rm -f ${TESTCLASSES}${FS}$2*.class
+rm -f ${TESTCLASSES}${FS}fooprovider.jar
+rm -f ${TESTCLASSES}${FS}barprovider.jar
+
+exit $result
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/GenericTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,92 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)GenericTest.java	1.3 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.resources.*;
+
+public class GenericTest {
+
+    // test providers
+    com.foo.BreakIteratorProviderImpl breakIP = new com.foo.BreakIteratorProviderImpl();
+    com.foo.CollatorProviderImpl collatorP = new com.foo.CollatorProviderImpl();
+    com.foo.DateFormatProviderImpl dateFP = new com.foo.DateFormatProviderImpl();
+    com.foo.DateFormatSymbolsProviderImpl dateFSP = new com.foo.DateFormatSymbolsProviderImpl();
+    com.foo.DecimalFormatSymbolsProviderImpl decimalFSP = new com.foo.DecimalFormatSymbolsProviderImpl();
+    com.foo.NumberFormatProviderImpl numberFP = new com.foo.NumberFormatProviderImpl();
+    com.bar.CurrencyNameProviderImpl currencyNP = new com.bar.CurrencyNameProviderImpl();
+    com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl();
+    com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl();
+
+    public static void main(String[] s) {
+        new GenericTest();
+    }
+
+    GenericTest() {
+        availableLocalesTest();
+        localeFallbackTest();
+    }
+
+    /**
+     * Make sure that all the locales are available from the existing providers
+     */
+    void availableLocalesTest() {
+        // Check that Locale.getAvailableLocales() returns the union of the JRE supported
+        // locales and providers' locales
+        HashSet<Locale> result = 
+            new HashSet<Locale>(Arrays.asList(Locale.getAvailableLocales()));
+        HashSet<Locale> expected = 
+            new HashSet<Locale>(Arrays.asList(LocaleData.getAvailableLocales()));
+        expected.addAll(Arrays.asList(breakIP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(collatorP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(dateFP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(dateFSP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(decimalFSP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(numberFP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(currencyNP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(localeNP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(tzNP.getAvailableLocales()));
+        if (!result.equals(expected)) {
+            throw new RuntimeException("Locale.getAvailableLocales() does not return the union of locales");
+        }
+    }
+
+    /**
+     * test with "xx_YY_ZZ", which is an example locale not contained 
+     * in Locale.getAvailableLocales().  Fallback tests for supported locales
+     * are done in each xxxProviderTest test cases.
+     */
+    void localeFallbackTest() {
+        Locale xx = new Locale("xx");
+        Locale dispLocale = new Locale ("xx", "YY", "ZZ");
+
+        String xxname = xx.getDisplayLanguage(xx);
+        String expected = localeNP.getDisplayLanguage(xx.getLanguage(), dispLocale);
+        if (!xxname.equals(expected)) {
+            throw new RuntimeException("Locale fallback did not perform correctly. got: "+xxname+" expected: "+expected);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/GenericTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)GenericTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary Generic tests for the pluggable locales feature
+# @run shell ExecTest.sh foobar GenericTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/LocaleNameProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,101 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)LocaleNameProviderTest.java	1.2 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class LocaleNameProviderTest extends ProviderTest {
+
+    public static void main(String[] s) {
+        new LocaleNameProviderTest();
+    }
+
+    LocaleNameProviderTest() {
+        com.bar.LocaleNameProviderImpl lnp = new com.bar.LocaleNameProviderImpl();
+        Locale[] availloc = Locale.getAvailableLocales();
+        Locale[] testloc = availloc.clone();
+        List<Locale> providerloc = Arrays.asList(lnp.getAvailableLocales());
+
+        for (Locale target: availloc) {
+            // pure JRE implementation
+            OpenListResourceBundle rb = LocaleData.getLocaleNames(target);
+            boolean jreHasBundle = rb.getLocale().equals(target);
+
+            for (Locale test: testloc) {
+                // codes
+                String lang = test.getLanguage();
+                String ctry = test.getCountry();
+                String vrnt = test.getVariant();
+
+                // the localized name
+                String langresult = test.getDisplayLanguage(target);
+                String ctryresult = test.getDisplayCountry(target);
+                String vrntresult = test.getDisplayVariant(target);
+
+                // provider's name (if any)
+                String providerslang = null;
+                String providersctry = null;
+                String providersvrnt = null;
+                if (providerloc.contains(target)) {
+                    providerslang = lnp.getDisplayLanguage(lang, target);
+                    providersctry = lnp.getDisplayCountry(ctry, target);
+                    providersvrnt = lnp.getDisplayVariant(vrnt, target);
+                }
+
+                // JRE's name (if any)
+                String jreslang = null;
+                String jresctry = null;
+                String jresvrnt = null;
+                if (!lang.equals("")) {
+                    try {
+                        jreslang = rb.getString(lang);
+                    } catch (MissingResourceException mre) {}
+                }
+                if (!ctry.equals("")) {
+                    try {
+                        jresctry = rb.getString(ctry);
+                    } catch (MissingResourceException mre) {}
+                }
+                if (!vrnt.equals("")) {
+                    try {
+                        jresvrnt = rb.getString("%%"+vrnt);
+                    } catch (MissingResourceException mre) {
+                        jresvrnt = vrnt;
+                    }
+                }
+
+                checkValidity(target, jreslang, providerslang, langresult, 
+                    jreHasBundle && rb.handleGetKeys().contains(lang));
+                checkValidity(target, jresctry, providersctry, ctryresult,
+                    jreHasBundle && rb.handleGetKeys().contains(ctry));
+                checkValidity(target, jresvrnt, providersvrnt, vrntresult,
+                    jreHasBundle && rb.handleGetKeys().contains("%%"+vrnt));
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/LocaleNameProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)LocaleNameProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary LocaleNameProvider tests
+# @run shell ExecTest.sh bar LocaleNameProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/NumberFormatProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,177 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)NumberFormatProviderTest.java	1.3 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class NumberFormatProviderTest extends ProviderTest {
+
+    com.foo.NumberFormatProviderImpl nfp = new com.foo.NumberFormatProviderImpl();
+    List<Locale> availloc = Arrays.asList(NumberFormat.getAvailableLocales());
+    List<Locale> providerloc = Arrays.asList(nfp.getAvailableLocales());
+    List<Locale> jreloc = Arrays.asList(LocaleData.getAvailableLocales());
+
+    public static void main(String[] s) {
+        new NumberFormatProviderTest();
+    }
+
+    NumberFormatProviderTest() {
+        availableLocalesTest();
+        objectValidityTest();
+    }
+
+    void availableLocalesTest() {
+        Set<Locale> localesFromAPI = new HashSet<Locale>(availloc);
+        Set<Locale> localesExpected = new HashSet<Locale>(jreloc);
+        localesExpected.addAll(providerloc);
+        if (localesFromAPI.equals(localesExpected)) {
+            System.out.println("availableLocalesTest passed.");
+        } else {
+            throw new RuntimeException("availableLocalesTest failed");
+        }
+    }
+
+    void objectValidityTest() {
+
+        for (Locale target: availloc) {
+            // pure JRE implementation
+            ResourceBundle rb = LocaleData.getNumberFormatData(target);
+            boolean jreSupportsLocale = jreloc.contains(target);
+
+            // JRE string arrays
+            String[] jreNumberPatterns = null;
+            if (jreSupportsLocale) {
+                try {
+                    jreNumberPatterns = rb.getStringArray("NumberPatterns");
+                } catch (MissingResourceException mre) {}
+            }
+
+            // result object
+            String resultCur = 
+                ((DecimalFormat)NumberFormat.getCurrencyInstance(target)).toPattern();
+            String resultInt = 
+                ((DecimalFormat)NumberFormat.getIntegerInstance(target)).toPattern();
+            String resultNum = 
+                ((DecimalFormat)NumberFormat.getNumberInstance(target)).toPattern();
+            String resultPer = 
+                ((DecimalFormat)NumberFormat.getPercentInstance(target)).toPattern();
+ 
+            // provider's object (if any)
+            String providersCur = null;
+            String providersInt = null;
+            String providersNum = null;
+            String providersPer = null;
+            if (providerloc.contains(target)) {
+                DecimalFormat dfCur = (DecimalFormat)nfp.getCurrencyInstance(target);
+                if (dfCur != null) {
+                    providersCur = dfCur.toPattern();
+                }
+                DecimalFormat dfInt = (DecimalFormat)nfp.getIntegerInstance(target);
+                if (dfInt != null) {
+                    providersInt = dfInt.toPattern();
+                }
+                DecimalFormat dfNum = (DecimalFormat)nfp.getNumberInstance(target);
+                if (dfNum != null) {
+                    providersNum = dfNum.toPattern();
+                }
+                DecimalFormat dfPer = (DecimalFormat)nfp.getPercentInstance(target);
+                if (dfPer != null) {
+                    providersPer = dfPer.toPattern();
+                }
+            }
+ 
+            // JRE's object (if any)
+            // note that this totally depends on the current implementation
+            String jresCur = null;
+            String jresInt = null;
+            String jresNum = null;
+            String jresPer = null;
+            if (jreSupportsLocale) {
+                DecimalFormat dfCur = new DecimalFormat(jreNumberPatterns[1],
+                    DecimalFormatSymbols.getInstance(target));
+                if (dfCur != null) {
+                    adjustForCurrencyDefaultFractionDigits(dfCur);
+                    jresCur = dfCur.toPattern();
+                }
+                DecimalFormat dfInt = new DecimalFormat(jreNumberPatterns[0],
+                    DecimalFormatSymbols.getInstance(target));
+                if (dfInt != null) {
+                    dfInt.setMaximumFractionDigits(0);
+                    dfInt.setDecimalSeparatorAlwaysShown(false);
+                    dfInt.setParseIntegerOnly(true);
+                    jresInt = dfInt.toPattern();
+                }
+                DecimalFormat dfNum = new DecimalFormat(jreNumberPatterns[0],
+                    DecimalFormatSymbols.getInstance(target));
+                if (dfNum != null) {
+                    jresNum = dfNum.toPattern();
+                }
+                DecimalFormat dfPer = new DecimalFormat(jreNumberPatterns[2],
+                    DecimalFormatSymbols.getInstance(target));
+                if (dfPer != null) {
+                    jresPer = dfPer.toPattern();
+                }
+            }
+
+            checkValidity(target, jresCur, providersCur, resultCur, jreSupportsLocale);
+            checkValidity(target, jresInt, providersInt, resultInt, jreSupportsLocale);
+            checkValidity(target, jresNum, providersNum, resultNum, jreSupportsLocale);
+            checkValidity(target, jresPer, providersPer, resultPer, jreSupportsLocale);
+        }
+    }
+
+    /**
+     * Adjusts the minimum and maximum fraction digits to values that
+     * are reasonable for the currency's default fraction digits.
+     */
+    void adjustForCurrencyDefaultFractionDigits(DecimalFormat df) {
+        DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
+        Currency currency = dfs.getCurrency();
+        if (currency == null) {
+            try {
+                currency = Currency.getInstance(dfs.getInternationalCurrencySymbol());
+            } catch (IllegalArgumentException e) {
+            }
+        }
+        if (currency != null) {
+            int digits = currency.getDefaultFractionDigits();
+            if (digits != -1) {
+                int oldMinDigits = df.getMinimumFractionDigits();
+                // Common patterns are "#.##", "#.00", "#".
+                // Try to adjust all of them in a reasonable way.
+                if (oldMinDigits == df.getMaximumFractionDigits()) {
+                    df.setMinimumFractionDigits(digits);
+                    df.setMaximumFractionDigits(digits);
+                } else {
+                    df.setMinimumFractionDigits(Math.min(digits, oldMinDigits));
+                    df.setMaximumFractionDigits(digits);
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/NumberFormatProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)NumberFormatProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary NumberFormatProvider tests
+# @run shell ExecTest.sh foo NumberFormatProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/ProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,46 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)ProviderTest.java	1.2 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.text.resources.*;
+import sun.util.*;
+
+public class ProviderTest {
+    void checkValidity(Locale target, Object jres, Object providers, Object result, boolean jresPreferred) {
+        if (jresPreferred) {
+            if ((result==null && jres!=null) || !result.equals(jres)) {
+                throw new RuntimeException(
+                    "result do not match with jre's result. target: "+target+" result: "+result+" jre's: "+jres);
+            }
+        } else {
+            if (providers!=null && !result.equals(providers)) {
+                throw new RuntimeException(
+                    "result do not match with provider's result. target: "+target+" result: "+result+" providers: "+providers);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,205 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TimeZoneNameProviderTest.java	1.4 07/04/06
+ */
+
+import java.text.*;
+import java.util.*;
+import sun.util.*;
+import sun.util.resources.*;
+
+public class TimeZoneNameProviderTest extends ProviderTest {
+
+    com.bar.TimeZoneNameProviderImpl tznp = new com.bar.TimeZoneNameProviderImpl();
+
+    public static void main(String[] s) {
+        new TimeZoneNameProviderTest();
+    }
+
+    TimeZoneNameProviderTest() {
+        test1();
+        test2();
+        aliasTest();
+    }
+
+    void test1() {
+        Locale[] available = Locale.getAvailableLocales();
+        List<Locale> providerLocales = Arrays.asList(tznp.getAvailableLocales());
+        String[] ids = TimeZone.getAvailableIDs();
+
+        for (Locale target: available) {
+            // pure JRE implementation
+            OpenListResourceBundle rb = LocaleData.getTimeZoneNames(target);
+            boolean jreHasBundle = rb.getLocale().equals(target);
+
+            for (String id: ids) {
+                // the time zone
+                TimeZone tz = TimeZone.getTimeZone(id);
+
+                // JRE string array for the id
+                String[] jrearray = null;
+                if (jreHasBundle) {
+                    try {
+                        jrearray = rb.getStringArray(id);
+                    } catch (MissingResourceException mre) {}
+                }
+
+                for (int i = 1; i <=(tz.useDaylightTime()?4:2); i++) {
+                    // the localized name
+                    String name = tz.getDisplayName(i>=3, i%2, target);
+
+                    // provider's name (if any)
+                    String providersname = null;
+                    if (providerLocales.contains(target)) {
+                        providersname = tznp.getDisplayName(id, i>=3, i%2, target);
+                    }
+
+                    // JRE's name (if any)
+                    String jresname = null;
+                    if (jrearray != null) {
+                        jresname = jrearray[i];
+                    }
+
+                    checkValidity(target, jresname, providersname, name,
+                        jreHasBundle && rb.handleGetKeys().contains(id));
+                }
+            }
+        }
+    }
+
+    final String pattern = "z";
+    final Locale OSAKA = new Locale("ja", "JP", "osaka");
+    final Locale KYOTO = new Locale("ja", "JP", "kyoto");
+
+    final String[] TIMEZONES = {
+        "GMT", "America/Los_Angeles", "SystemV/PST8",
+        "SystemV/PST8PDT", "PST8PDT",
+    };
+    final String[] DISPLAY_NAMES_OSAKA = {
+        tznp.getDisplayName(TIMEZONES[0], false, TimeZone.SHORT, OSAKA),
+        tznp.getDisplayName(TIMEZONES[1], false, TimeZone.SHORT, OSAKA),
+        tznp.getDisplayName(TIMEZONES[2], false, TimeZone.SHORT, OSAKA),
+        tznp.getDisplayName(TIMEZONES[3], false, TimeZone.SHORT, OSAKA),
+        tznp.getDisplayName(TIMEZONES[4], false, TimeZone.SHORT, OSAKA)
+    };
+    final String[] DISPLAY_NAMES_KYOTO = {
+        tznp.getDisplayName(TIMEZONES[0], false, TimeZone.SHORT, KYOTO),
+        tznp.getDisplayName(TIMEZONES[1], false, TimeZone.SHORT, KYOTO),
+        tznp.getDisplayName(TIMEZONES[2], false, TimeZone.SHORT, KYOTO),
+        tznp.getDisplayName(TIMEZONES[3], false, TimeZone.SHORT, KYOTO),
+        tznp.getDisplayName(TIMEZONES[4], false, TimeZone.SHORT, KYOTO)
+    };
+
+    void test2() {
+        Locale defaultLocale = Locale.getDefault();
+        Date d = new Date(2005-1900, Calendar.DECEMBER, 22);
+        String formatted;
+
+        TimeZone tz;
+        SimpleDateFormat df;
+
+        try {
+            for (int i = 0; i < TIMEZONES.length; i++) {
+                tz = TimeZone.getTimeZone(TIMEZONES[i]);
+                TimeZone.setDefault(tz);
+                df = new SimpleDateFormat(pattern, DateFormatSymbols.getInstance(OSAKA)); 
+                Locale.setDefault(defaultLocale);
+                System.out.println(formatted = df.format(d));
+                if(!formatted.equals(DISPLAY_NAMES_OSAKA[i])) {
+                    throw new RuntimeException("TimeZone " + TIMEZONES[i] +
+                        ": formatted zone names mismatch. " +
+                        formatted + " should match with " +
+                        DISPLAY_NAMES_OSAKA[i]);
+                }
+
+                df.parse(DISPLAY_NAMES_OSAKA[i]);
+
+                Locale.setDefault(KYOTO);
+                df = new SimpleDateFormat(pattern, DateFormatSymbols.getInstance());
+                System.out.println(formatted = df.format(d));                        
+                if(!formatted.equals(DISPLAY_NAMES_KYOTO[i])) {
+                    Locale.setDefault(defaultLocale);
+                    throw new RuntimeException("Timezone " + TIMEZONES[i] +
+                        ": formatted zone names mismatch. " +
+                        formatted + " should match with " +
+                        DISPLAY_NAMES_KYOTO[i]);
+                }
+                df.parse(DISPLAY_NAMES_KYOTO[i]);
+            }
+        } catch (ParseException pe) {
+            Locale.setDefault(defaultLocale);
+            throw new RuntimeException("parse error occured" + pe);
+        }  
+        Locale.setDefault(defaultLocale);
+    }
+
+    final String LATIME = "America/Los_Angeles";
+    final String PST = "PST";
+    final String PST8PDT = "PST8PDT";
+    final String US_PACIFIC = "US/Pacific";
+    final String LATIME_IN_OSAKA =
+        tznp.getDisplayName(LATIME, false, TimeZone.LONG, OSAKA);
+
+    final String TOKYOTIME = "Asia/Tokyo";
+    final String JST = "JST";
+    final String JAPAN = "Japan";
+    final String JST_IN_OSAKA =
+        tznp.getDisplayName(JST, false, TimeZone.LONG, OSAKA);
+
+    void aliasTest() {
+        // Check that provider's name for a standard id (America/Los_Angeles) is
+        // propagated to its aliases
+        String latime = TimeZone.getTimeZone(LATIME).getDisplayName(OSAKA);
+        if (!LATIME_IN_OSAKA.equals(latime)) {
+            throw new RuntimeException("Could not get provider's localized name.  result: "+latime+" expected: "+LATIME_IN_OSAKA);
+        }
+
+        String pst = TimeZone.getTimeZone(PST).getDisplayName(OSAKA);
+        if (!LATIME_IN_OSAKA.equals(pst)) {
+            throw new RuntimeException("Provider's localized name is not available for an alias ID: "+PST+".  result: "+pst+" expected: "+LATIME_IN_OSAKA);
+        }
+
+        String us_pacific = TimeZone.getTimeZone(US_PACIFIC).getDisplayName(OSAKA);
+        if (!LATIME_IN_OSAKA.equals(us_pacific)) {
+            throw new RuntimeException("Provider's localized name is not available for an alias ID: "+US_PACIFIC+".  result: "+us_pacific+" expected: "+LATIME_IN_OSAKA);
+        }
+
+        // Check that provider's name for an alias id (JST) is
+        // propagated to its standard id and alias ids.
+        String jstime = TimeZone.getTimeZone(JST).getDisplayName(OSAKA);
+        if (!JST_IN_OSAKA.equals(jstime)) {
+            throw new RuntimeException("Could not get provider's localized name.  result: "+jstime+" expected: "+JST_IN_OSAKA);
+        }
+
+        String tokyotime = TimeZone.getTimeZone(TOKYOTIME).getDisplayName(OSAKA);
+        if (!JST_IN_OSAKA.equals(tokyotime)) {
+            throw new RuntimeException("Provider's localized name is not available for a standard ID: "+TOKYOTIME+".  result: "+tokyotime+" expected: "+JST_IN_OSAKA);
+        }
+
+        String japan = TimeZone.getTimeZone(JAPAN).getDisplayName(OSAKA);
+        if (!JST_IN_OSAKA.equals(japan)) {
+            throw new RuntimeException("Provider's localized name is not available for an alias ID: "+JAPAN+".  result: "+japan+" expected: "+JST_IN_OSAKA);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/TimeZoneNameProviderTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)TimeZoneNameProviderTest.sh	1.3 07/04/06
+# @bug 4052440
+# @summary TimeZoneNameProvider tests
+# @run shell ExecTest.sh bar TimeZoneNameProviderTest true
Binary file j2se/test/java/util/PluggableLocale/barprovider.jar has changed
Binary file j2se/test/java/util/PluggableLocale/fooprovider.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/BreakIteratorProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,140 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)BreakIteratorProviderImpl.java	1.3 07/04/06
+ */
+
+package com.foo;
+
+import java.text.*;
+import java.text.spi.*;
+import java.util.*;
+import com.foobar.Utils;
+
+public class BreakIteratorProviderImpl extends BreakIteratorProvider {
+
+    static Locale[] avail = {
+        Locale.JAPAN,
+        new Locale("ja", "JP", "osaka"),
+        new Locale("ja", "JP", "kyoto"),
+        new Locale("xx", "YY")};
+
+    static String[] dialect = {
+        "\u3067\u3059\u3002",
+        "\u3084\u3002",
+        "\u3069\u3059\u3002",
+        "-xx-YY"
+    };
+
+    static enum Type {CHARACTER, LINE, SENTENCE, WORD};
+
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public BreakIterator getCharacterInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                return new FooBreakIterator(Type.CHARACTER, i);
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public BreakIterator getLineInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                return new FooBreakIterator(Type.LINE, i);
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public BreakIterator getSentenceInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                return new FooBreakIterator(Type.SENTENCE, i);
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public BreakIterator getWordInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                return new FooBreakIterator(Type.WORD, i);
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    // dummy implementation
+    class FooBreakIterator extends BreakIterator {
+        public FooBreakIterator(Type t, int index) {
+            super();
+        }
+
+        public int current() {
+            return 0;
+        }
+
+        public int first() {
+            return 0;
+        }
+
+        public int following(int offset) {
+            return 0;
+        }
+
+        public CharacterIterator getText() {
+            return null;
+        }
+
+        public boolean isBoundary(int offset) {
+            return true;
+        }
+
+        public int last() {
+            return 0;
+        }
+
+        public int next() {
+            return 0;
+        }
+
+        public int next(int n) {
+            return 0;
+        }
+
+        public int preceding(int offset) {
+            return 0;
+        }
+
+        public int previous() {
+            return 0;
+        }
+
+        public void setText(CharacterIterator ci) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/CollatorProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,68 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)CollatorProviderImpl.java	1.3 07/04/06
+ */
+
+package com.foo;
+
+import java.text.*;
+import java.text.spi.*;
+import java.util.*;
+
+import com.foobar.Utils;
+
+public class CollatorProviderImpl extends CollatorProvider {
+
+    static Locale[] avail = {
+        Locale.JAPAN,
+        new Locale("ja", "JP", "osaka"),
+        new Locale("ja", "JP", "kyoto"),
+        new Locale("xx", "YY", "ZZZZ")};
+
+    static String[] dialect = {
+        "\u3067\u3059\u3002",
+        "\u3084\u3002",
+        "\u3069\u3059\u3002",
+        "-xx-YY-ZZZZ"
+    };
+
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public Collator getInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                RuleBasedCollator ja = (RuleBasedCollator)Collator.getInstance(Locale.JAPANESE);
+                try {
+                    return new RuleBasedCollator(ja.getRules()+"& Z < "+dialect[i]);
+                } catch (ParseException pe) {
+System.err.println(pe+ja.getRules()+"& Z < "+dialect[i]);
+                    return ja;
+                }
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,62 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)CurrencyNameProviderImpl.java	1.3 07/04/06
+ */
+
+package com.bar;
+
+import java.util.*;
+import java.util.spi.*;
+
+import com.foobar.Utils;
+
+public class CurrencyNameProviderImpl extends CurrencyNameProvider {
+    static Locale[] avail = {new Locale("ja", "JP", "osaka"), 
+        new Locale("ja", "JP", "kyoto"),
+        Locale.JAPAN,
+        new Locale("xx")};
+
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public String getSymbol(String c, Locale locale) {
+        if (!Utils.supportsLocale(Arrays.asList(avail), locale)) {
+            throw new IllegalArgumentException("locale is not supported: "+locale);    
+        }
+
+	if (c.equals("JPY")) {
+            if (Utils.supportsLocale(avail[0], locale)) {
+	        return "\u5186\u3084\u3002";
+            } else if (Utils.supportsLocale(avail[1], locale)) {
+	        return "\u5186\u3069\u3059\u3002";
+            } else if (Utils.supportsLocale(avail[2], locale)) {
+	        return "\u5186\u3067\u3059\u3002";
+            } else if (Utils.supportsLocale(avail[3], locale)) {
+	        return "\u5186\u3070\u3064\u3070\u3064\u3002";
+            }
+	}
+	return null; 
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/DateFormatProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,95 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)DateFormatProviderImpl.java	1.3 07/04/06
+ */
+
+package com.foo;
+
+import java.text.*;
+import java.text.spi.*;
+import java.util.*;
+
+import com.foobar.Utils;
+
+public class DateFormatProviderImpl extends DateFormatProvider {
+
+    static Locale[] avail = {
+        Locale.JAPAN,
+        new Locale("ja", "JP", "osaka"),
+        new Locale("ja", "JP", "kyoto"),
+        new Locale("yy")};
+
+    static String[] datePattern = {
+        "yyyy'\u5e74'M'\u6708'd'\u65e5'", // full date pattern
+        "yyyy/MM/dd", // long date pattern
+        "yyyy/MM/dd", // medium date pattern
+        "yy/MM/dd" // short date pattern
+    };
+
+    static String[] timePattern = {
+        "H'\u6642'mm'\u5206'ss'\u79d2' z", // full time pattern
+        "H:mm:ss z", // long time pattern
+        "H:mm:ss", // medium time pattern
+        "H:mm" // short time pattern
+    };
+
+    static String[] dialect = {
+        "\u3067\u3059\u3002",
+        "\u3084\u3002",
+        "\u3069\u3059\u3002",
+        "\u308f\u3044\u308f\u3044"
+    };
+
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public DateFormat getDateInstance(int style, Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                return new SimpleDateFormat(datePattern[style]+dialect[i], locale);
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public DateFormat getTimeInstance(int style, Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                return new SimpleDateFormat(timePattern[style]+dialect[i], locale);
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+	        return new SimpleDateFormat(
+                    datePattern[dateStyle]+" "+timePattern[timeStyle]+dialect[i], locale);
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/DateFormatSymbolsProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,225 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)DateFormatSymbolsProviderImpl.java	1.3 07/04/06
+ */
+
+package com.foo;
+
+import java.text.*;
+import java.text.spi.*;
+import java.util.*;
+
+import com.foobar.Utils;
+
+public class DateFormatSymbolsProviderImpl extends DateFormatSymbolsProvider {
+
+    static Locale[] avail = {
+        new Locale("ja", "JP", "osaka"),
+        new Locale("ja", "JP", "kyoto"),
+        Locale.JAPAN,
+        new Locale("yy", "ZZ")
+    };
+    static List<Locale> availList = Arrays.asList(avail);
+
+    static String[] dialect = {
+        "\u3084\u3002",
+        "\u3069\u3059\u3002",
+        "\u3067\u3059\u3002",
+        "-yy-ZZ"
+    };
+
+    static Map<Locale, FooDateFormatSymbols> symbols = new HashMap<Locale, FooDateFormatSymbols>(4);
+
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public DateFormatSymbols getInstance(Locale locale) {
+        if (!Utils.supportsLocale(availList, locale)) {
+            throw new IllegalArgumentException("locale is not supported: "+locale);    
+        }
+
+        FooDateFormatSymbols fdfs = symbols.get(locale);
+        if (fdfs == null) {
+	    for (int index = 0; index < avail.length; index ++) {
+	        if (Utils.supportsLocale(avail[index], locale)) {
+	            fdfs = new FooDateFormatSymbols(index);
+                    symbols.put(locale, fdfs);
+		    break;
+		}
+	    }
+        }
+        return fdfs;
+    }
+
+    class FooDateFormatSymbols extends DateFormatSymbols {
+        String dialect = "";
+
+        String[] eras = null;
+        String[] months = null;
+        String[] shortMonths = null;
+        String[] weekdays = null;
+        String[] shortWeekdays = null;
+        String[] ampms = null;
+
+	public FooDateFormatSymbols(int index) {
+	    super(DateFormatSymbolsProviderImpl.this.avail[index]);
+            dialect = DateFormatSymbolsProviderImpl.this.dialect[index];
+	}
+
+        public String[] getEras() {
+            if (eras == null) {
+                eras = super.getEras();
+                for (int i = 0; i < eras.length; i++) {
+                    eras[i] = eras[i]+dialect;
+                }
+            }
+            return eras;
+        }
+    
+        /**
+         * Sets era strings. For example: "AD" and "BC".
+         * @param newEras the new era strings.
+         */
+        public void setEras(String[] newEras) {
+            eras = newEras;
+        }
+    
+        /**
+         * Gets month strings. For example: "January", "February", etc.
+         * @return the month strings.
+         */
+        public String[] getMonths() {
+            if (months == null) {
+                months = super.getMonths();
+                for (int i = 0; i < months.length; i++) {
+                    months[i] = months[i]+dialect;
+                }
+            }
+            return months;
+        }
+    
+        /**
+         * Sets month strings. For example: "January", "February", etc.
+         * @param newMonths the new month strings.
+         */
+        public void setMonths(String[] newMonths) {
+            months = newMonths;
+        }
+    
+        /**
+         * Gets short month strings. For example: "Jan", "Feb", etc.
+         * @return the short month strings.
+         */
+        public String[] getShortMonths() {
+            if (shortMonths == null) {
+                shortMonths = super.getShortMonths();
+                for (int i = 0; i < shortMonths.length; i++) {
+                    shortMonths[i] = shortMonths[i]+dialect;
+                }
+            }
+            return shortMonths;
+        }
+    
+        /**
+         * Sets short month strings. For example: "Jan", "Feb", etc.
+         * @param newShortMonths the new short month strings.
+         */
+        public void setShortMonths(String[] newShortMonths) {
+            shortMonths = newShortMonths;
+        }
+    
+        /**
+         * Gets weekday strings. For example: "Sunday", "Monday", etc.
+         * @return the weekday strings. Use <code>Calendar.SUNDAY</code>,
+         * <code>Calendar.MONDAY</code>, etc. to index the result array.
+         */
+        public String[] getWeekdays() {
+            if (weekdays == null) {
+                weekdays = super.getWeekdays();
+                for (int i = 0; i < weekdays.length; i++) {
+                    weekdays[i] = weekdays[i]+dialect;
+                }
+            }
+            return weekdays;
+        }
+    
+        /**
+         * Sets weekday strings. For example: "Sunday", "Monday", etc.
+         * @param newWeekdays the new weekday strings. The array should
+         * be indexed by <code>Calendar.SUNDAY</code>,
+         * <code>Calendar.MONDAY</code>, etc.
+         */
+        public void setWeekdays(String[] newWeekdays) {
+            weekdays = newWeekdays;
+        }
+    
+        /**
+         * Gets short weekday strings. For example: "Sun", "Mon", etc.
+         * @return the short weekday strings. Use <code>Calendar.SUNDAY</code>,
+         * <code>Calendar.MONDAY</code>, etc. to index the result array.
+         */
+        public String[] getShortWeekdays() {
+            if (shortWeekdays == null) {
+                shortWeekdays = super.getShortWeekdays();
+                for (int i = 0; i < shortWeekdays.length; i++) {
+                    shortWeekdays[i] = shortWeekdays[i]+dialect;
+                }
+            }
+            return shortWeekdays;
+        }
+    
+        /**
+         * Sets short weekday strings. For example: "Sun", "Mon", etc.
+         * @param newShortWeekdays the new short weekday strings. The array should
+         * be indexed by <code>Calendar.SUNDAY</code>,
+         * <code>Calendar.MONDAY</code>, etc.
+         */
+        public void setShortWeekdays(String[] newShortWeekdays) {
+            shortWeekdays = newShortWeekdays;
+        }
+    
+        /**
+         * Gets ampm strings. For example: "AM" and "PM".
+         * @return the ampm strings.
+         */
+        public String[] getAmPmStrings() {
+            if (ampms == null) {
+                ampms = super.getAmPmStrings();
+                for (int i = 0; i < ampms.length; i++) {
+                    ampms[i] = ampms[i]+dialect;
+                }
+            }
+            return ampms;
+        }
+    
+        /**
+         * Sets ampm strings. For example: "AM" and "PM".
+         * @param newAmpms the new ampm strings.
+         */
+        public void setAmPmStrings(String[] newAmpms) {
+            ampms = newAmpms;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/DecimalFormatSymbolsProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,110 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)DecimalFormatSymbolsProviderImpl.java	1.3 07/04/06
+ */
+
+package com.foo;
+
+import java.text.*;
+import java.text.spi.*;
+import java.util.*;
+
+import com.foobar.Utils;
+
+public class DecimalFormatSymbolsProviderImpl extends DecimalFormatSymbolsProvider {
+
+    static Locale[] avail = {
+        new Locale("ja", "JP", "osaka"),
+        new Locale("ja", "JP", "kyoto"),
+        Locale.JAPAN,
+        new Locale("yy", "ZZ", "UUU")
+    };
+    static List<Locale> availList = Arrays.asList(avail);
+
+    static String[] dialect = {
+        "\u3084\u3002",
+        "\u3069\u3059\u3002",
+        "\u3067\u3059\u3002",
+        "-yy-ZZ-UUU"
+    };
+
+    static HashMap<Locale, FooDecimalFormatSymbols> symbols = new HashMap<Locale, FooDecimalFormatSymbols>(4);
+
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public DecimalFormatSymbols getInstance(Locale locale) {
+        if (!Utils.supportsLocale(availList, locale)) {
+            throw new IllegalArgumentException("locale is not supported: "+locale);    
+        }
+
+        FooDecimalFormatSymbols fdfs = symbols.get(locale);
+        if (fdfs == null) {
+	    for (int index = 0; index < avail.length; index ++) {
+	        if (Utils.supportsLocale(avail[index], locale)) {
+	            fdfs = new FooDecimalFormatSymbols(index);
+                    symbols.put(locale, fdfs);
+		    break;
+		}
+	    }
+        }
+        return fdfs;
+    }
+
+    class FooDecimalFormatSymbols extends DecimalFormatSymbols {
+        String dialect = "";
+
+        String infinity = null;
+        String nan = null;
+
+	public FooDecimalFormatSymbols(int index) {
+	    super(DecimalFormatSymbolsProviderImpl.this.avail[index]);
+            dialect = DecimalFormatSymbolsProviderImpl.this.dialect[index];
+	}
+
+        // overrides methods only returns Strings
+        public String getInfinity() {
+            if (infinity == null) {
+                infinity = super.getInfinity() + dialect;
+            }
+            return infinity;
+        }
+
+        public void setInfinity(String infinity) {
+            this.infinity = infinity;
+        }
+
+        public String getNaN() {
+            if (nan == null) {
+                nan = super.getNaN() + dialect;
+            }
+            return nan;
+        }
+
+        public void setNaN(String nan) {
+            this.nan = nan;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/LocaleNameProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,93 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)LocaleNameProviderImpl.java	1.3 07/04/06
+ */
+
+package com.bar;
+
+import java.text.*;
+import java.util.*;
+import java.util.spi.*;
+
+import com.foobar.Utils;
+
+public class LocaleNameProviderImpl extends LocaleNameProvider {
+    static Locale[] avail = {Locale.JAPANESE, 
+                             Locale.JAPAN,
+                             new Locale("ja", "JP", "osaka"), 
+                             new Locale("ja", "JP", "kyoto"), 
+                             new Locale("xx")};
+    static List<Locale> availList = Arrays.asList(avail);
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public String getDisplayLanguage(String lang, Locale target) {
+        if (!Utils.supportsLocale(availList, target)) {
+            throw new IllegalArgumentException("locale is not supported: "+target);    
+        }
+
+	String ret = null;
+
+	try {
+	    ResourceBundle rb = ResourceBundle.getBundle("com.bar.LocaleNames", target);
+	    ret = rb.getString(lang);
+	} catch (MissingResourceException mre) {
+	}
+
+	return ret;
+    }
+
+    public String getDisplayCountry(String ctry, Locale target) {
+        if (!Utils.supportsLocale(availList, target)) {
+            throw new IllegalArgumentException("locale is not supported: "+target);    
+        }
+
+	String ret = null;
+
+	try {
+	    ResourceBundle rb = ResourceBundle.getBundle("LocaleNames", target);
+	    ret = rb.getString(ctry);
+	} catch (MissingResourceException mre) {
+	}
+
+	return ret;
+    }
+
+    public String getDisplayVariant(String vrnt, Locale target) {
+        if (!Utils.supportsLocale(availList, target)) {
+            throw new IllegalArgumentException("locale is not supported: "+target);    
+        }
+
+	String ret = null;
+
+	try {
+	    ResourceBundle rb = ResourceBundle.getBundle("LocaleNames", target);
+	    ret = rb.getString(vrnt);
+	} catch (MissingResourceException mre) {
+	}
+
+	return ret;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/LocaleNames.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,25 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+osaka=Osaka
+kyoto=Kyoto
+xx=batsubatsu
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_ja.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,30 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+ja=\u65e5\u672c\u8a9e\u3067\u3059\u3002
+JP=\u65e5\u672c\u3067\u3059\u3002
+#
+# added ones
+#
+osaka=\u5927\u962a\u3067\u3059\u3002
+kyoto=\u4eac\u90fd\u3067\u3059\u3002
+xx=\u3070\u3064\u3070\u3064\u3067\u3059\u3002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_ja_JP_kyoto.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+ja=\u65e5\u672c\u8a9e\u3069\u3059\u3002
+JP=\u65e5\u672c\u3069\u3059\u3002
+#
+osaka=\u5927\u962a\u3069\u3059\u3002
+kyoto=\u4eac\u90fd\u3069\u3059\u3002
+xx=\u307a\u3051\u307a\u3051\u3069\u3059\u3002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_ja_JP_osaka.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+ja=\u7956\u56fd\u8a9e\u3084\u3002
+JP=\u3084\u307e\u3068\u3084\u3002
+#
+osaka=\u5927\u962a\u3084\u3002
+kyoto=\u4eac\u90fd\u3084\u3002
+xx=\u307a\u3051\u307a\u3051\u3084\u3002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/LocaleNames_xx.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+xx=batsubatsu
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/Makefile	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,65 @@
+#
+# @(#)Makefile	1.2 05/11/03
+#
+
+DESTDIR=..
+FOODIR=foo-contents
+BARDIR=bar-contents
+
+all: $(DESTDIR)/fooprovider.jar $(DESTDIR)/barprovider.jar
+
+FOOSERVICES = \
+        java.text.spi.BreakIteratorProvider \
+        java.text.spi.CollatorProvider \
+        java.text.spi.DateFormatProvider \
+	java.text.spi.DateFormatSymbolsProvider \
+	java.text.spi.DecimalFormatSymbolsProvider \
+	java.text.spi.NumberFormatProvider 
+
+BARSERVICES = \
+	java.util.spi.CurrencyNameProvider \
+	java.util.spi.TimeZoneNameProvider \
+	java.util.spi.LocaleNameProvider 
+
+FOOFILES_JAVA = \
+    BreakIteratorProviderImpl.java \
+    CollatorProviderImpl.java \
+    DateFormatProviderImpl.java \
+    DateFormatSymbolsProviderImpl.java \
+    DecimalFormatSymbolsProviderImpl.java \
+    NumberFormatProviderImpl.java \
+    Utils.java
+
+BARFILES_JAVA = \
+    CurrencyNameProviderImpl.java \
+    TimeZoneNameProviderImpl.java \
+    LocaleNameProviderImpl.java \
+    Utils.java
+
+BARFILES_PROPERTIES = \
+    LocaleNames.properties \
+    LocaleNames_ja.properties \
+    LocaleNames_ja_JP_osaka.properties \
+    LocaleNames_ja_JP_kyoto.properties \
+    LocaleNames_xx.properties
+
+$(DESTDIR)/fooprovider.jar: $(FOOSERVICES) $(FOOFILES_JAVA)
+	rm -rf $(FOODIR)
+	mkdir -p $(FOODIR)
+	mkdir -p $(FOODIR)/META-INF
+	mkdir -p $(FOODIR)/META-INF/services
+	$(BINDIR)/javac -d $(FOODIR) $(FOOFILES_JAVA)
+	cp $(FOOSERVICES) $(FOODIR)/META-INF/services
+	rm -f $(DESTDIR)/fooprovider.jar
+	$(BINDIR)/jar  cvf $(DESTDIR)/fooprovider.jar -C $(FOODIR) .
+
+$(DESTDIR)/barprovider.jar: $(BARSERVICES) $(BARFILES_JAVA) $(BARFILES_PROPERTIES)
+	rm -rf $(BARDIR)
+	mkdir -p $(BARDIR)
+	mkdir -p $(BARDIR)/META-INF
+	mkdir -p $(BARDIR)/META-INF/services
+	$(BINDIR)/javac -d $(BARDIR) $(BARFILES_JAVA)
+	cp $(BARSERVICES) $(BARDIR)/META-INF/services
+	cp $(BARFILES_PROPERTIES) $(BARDIR)/com/bar
+	rm -f $(DESTDIR)/barprovider.jar
+	$(BINDIR)/jar  cvf $(DESTDIR)/barprovider.jar -C $(BARDIR) .
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/NumberFormatProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,154 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)NumberFormatProviderImpl.java	1.3 07/04/06
+ */
+
+package com.foo;
+
+import java.text.*;
+import java.text.spi.*;
+import java.util.*;
+
+import com.foobar.Utils;
+
+public class NumberFormatProviderImpl extends NumberFormatProvider {
+
+    static Locale[] avail = {
+        Locale.JAPAN,
+        new Locale("ja", "JP", "osaka"),
+        new Locale("ja", "JP", "kyoto"),
+        new Locale("zz")};
+
+    static String[] dialect = {
+        "\u3067\u3059\u3002",
+        "\u3084\u3002",
+        "\u3069\u3059\u3002",
+        "-zz"
+    };
+
+    static String[] patterns = {
+        "#,##0.###{0};-#,##0.###{1}", // decimal pattern
+        "\u00A4#,##0{0};-\u00A4#,##0{1}", // currency pattern
+        "#,##0%{0}" // percent pattern
+    };
+    // Constants used by factory methods to specify a style of format.
+    static final int NUMBERSTYLE = 0;
+    static final int CURRENCYSTYLE = 1;
+    static final int PERCENTSTYLE = 2;
+    
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public NumberFormat getCurrencyInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                String pattern = 
+                    MessageFormat.format(patterns[CURRENCYSTYLE], 
+                                         dialect[i], 
+                                         dialect[i]); 
+	        DecimalFormat df = new DecimalFormat(pattern,
+                    DecimalFormatSymbols.getInstance(locale));
+                adjustForCurrencyDefaultFractionDigits(df);
+                return df;
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public NumberFormat getIntegerInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                String pattern = 
+                    MessageFormat.format(patterns[NUMBERSTYLE], 
+                                         dialect[i], 
+                                         dialect[i]); 
+	        DecimalFormat df = new DecimalFormat(pattern,
+                    DecimalFormatSymbols.getInstance(locale));
+                df.setMaximumFractionDigits(0);
+                df.setDecimalSeparatorAlwaysShown(false);
+                df.setParseIntegerOnly(true);
+                return df;
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public NumberFormat getNumberInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                String pattern = 
+                    MessageFormat.format(patterns[NUMBERSTYLE], 
+                                         dialect[i], 
+                                         dialect[i]); 
+	        return new DecimalFormat(pattern,
+                    DecimalFormatSymbols.getInstance(locale));
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    public NumberFormat getPercentInstance(Locale locale) {
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], locale)) {
+                String pattern = 
+                    MessageFormat.format(patterns[PERCENTSTYLE], 
+                                         dialect[i]); 
+	        return new DecimalFormat(pattern,
+                    DecimalFormatSymbols.getInstance(locale));
+            }
+        }
+        throw new IllegalArgumentException("locale is not supported: "+locale);    
+    }
+
+    /**
+     * Adjusts the minimum and maximum fraction digits to values that
+     * are reasonable for the currency's default fraction digits.
+     */
+    void adjustForCurrencyDefaultFractionDigits(DecimalFormat df) {
+        DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
+        Currency currency = dfs.getCurrency();
+        if (currency == null) {
+            try {
+                currency = Currency.getInstance(dfs.getInternationalCurrencySymbol());
+            } catch (IllegalArgumentException e) {
+            }
+        }
+        if (currency != null) {
+            int digits = currency.getDefaultFractionDigits();
+            if (digits != -1) {
+                int oldMinDigits = df.getMinimumFractionDigits();
+                // Common patterns are "#.##", "#.00", "#".
+                // Try to adjust all of them in a reasonable way.
+                if (oldMinDigits == df.getMaximumFractionDigits()) {
+                    df.setMinimumFractionDigits(digits);
+                    df.setMaximumFractionDigits(digits);
+                } else {
+                    df.setMinimumFractionDigits(Math.min(digits, oldMinDigits));
+                    df.setMaximumFractionDigits(digits);
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/TimeZoneNameProviderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,150 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TimeZoneNameProviderImpl.java	1.5 07/04/06
+ */
+
+package com.bar;
+
+import java.util.*;
+import java.util.spi.*;
+
+import com.foobar.Utils;
+
+public class TimeZoneNameProviderImpl extends TimeZoneNameProvider {
+    static Locale[] avail = {new Locale("ja", "JP", "osaka"), 
+                        new Locale("ja", "JP", "kyoto"), 
+                        new Locale("xx"),
+                        Locale.JAPAN};
+
+    static String[][] zoneOsaka = { 
+	{"GMT", 
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "G_M_T_\u3084_\u3002",
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "G_M_T_\u3084_\u3002"},
+	{"JST", 
+         "\u3084_\u307e_\u3068_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "J_S_T_\u3084_\u3002", 
+         "\u3084_\u307e_\u3068_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "J_S_T_\u3084_\u3002"},
+	{"America/Los_Angeles", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "P_S_T_\u3084_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3084_\u3002", 
+         "P_D_T_\u3084_\u3002"},
+	{"SystemV/PST8", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "P_S_T_\u3084_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3084_\u3002", 
+         "P_D_T_\u3084_\u3002"},
+	{"SystemV/PST8PDT", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "P_S_T_\u3084_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3084_\u3002", 
+         "P_D_T_\u3084_\u3002"},
+	{"PST8PDT", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3084_\u3002", 
+         "P_S_T_\u3084_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3084_\u3002", 
+         "P_D_T_\u3084_\u3002"},
+    };
+
+    static String[][] zoneKyoto = {
+	{"GMT", 
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642_\u3069_\u3059_\u3002", 
+         "G_M_T_\u3069_\u3059_\u3002", 
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642_\u3069_\u3059_\u3002", 
+         "G_M_T_\u3069_\u3059_\u3002"},
+	{"America/Los_Angeles", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3069_\u3059_\u3002", 
+         "P_S_T_\u3069_\u3059_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3069_\u3059_\u3002", 
+         "P_D_T_\u3069_\u3059_\u3002"},
+	{"SystemV/PST8", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3069_\u3059_\u3002", 
+         "P_S_T_\u3069_\u3059_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3069_\u3059_\u3002", 
+         "P_D_T_\u3069_\u3059_\u3002"},
+	{"SystemV/PST8PDT", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3069_\u3059_\u3002", 
+         "P_S_T_\u3069_\u3059_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3069_\u3059_\u3002", 
+         "P_D_T_\u3069_\u3059_\u3002"},
+	{"PST8PDT", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3069_\u3059_\u3002", 
+         "P_S_T_\u3069_\u3059_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3069_\u3059_\u3002", 
+         "P_D_T_\u3069_\u3059_\u3002"},
+    };
+
+    static String[][] zoneXX = { 
+	{"GMT",
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642\u3070\u3064\u3070\u3064\u3002", 
+         "G_M_T_\u3070\u3064\u3070\u3064\u3002",
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642\u3070\u3064\u3070\u3064\u3002", 
+         "G_M_T_\u3070\u3064\u3070\u3064\u3002"},
+	{"America/Los_Angeles", 
+         "\u592a_\u5e73_\u6d0b_\u6a19_\u6e96_\u6642_\u3070\u3064\u3070\u3064\u3002", 
+         "P_S_T_\u3070\u3064\u3070\u3064\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3070\u3064\u3070\u3064\u3002", 
+         "P_D_T_\u3070\u3064\u3070\u3064\u3002"}};
+
+    static String[][] zoneJaJP = {
+	{"GMT", 
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642_\u3067_\u3059_\u3002", 
+         "G_M_T_\u3067_\u3059_\u3002",
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642_\u3067_\u3059_\u3002", 
+         "G_M_T_\u3067_\u3059_\u3002"},
+	{"America/Los_Angeles", 
+         "\u30b0_\u30ea_\u30cb_\u30c3_\u30b8_\u6a19_\u6e96_\u6642_\u3067_\u3059_\u3002", 
+         "P_S_T_\u3067_\u3059_\u3002", 
+         "\u592a_\u5e73_\u6d0b_\u590f_\u6642_\u9593_\u3067_\u3059_\u3002", 
+         "P_D_T_\u3067_\u3059_\u3002"}};
+
+    static String[][][] names = {zoneOsaka, zoneKyoto, zoneXX, zoneJaJP};
+
+    public Locale[] getAvailableLocales() {
+	return avail;
+    }
+
+    public String getDisplayName(String id, boolean dst, int style, Locale language) {
+        if (!Utils.supportsLocale(Arrays.asList(avail), language)) {
+            throw new IllegalArgumentException("locale is not one of available locales: "+language);
+        }
+
+        for (int i = 0; i < avail.length; i ++) {
+            if (Utils.supportsLocale(avail[i], language)) {
+                String[][] namesForALocale = names[i];
+                for (int j = 0; j < namesForALocale.length; j++) {
+                    String[] array = namesForALocale[j];
+                    if (id.equals(array[0])) {
+                        String ret = array[(style==TimeZone.LONG?0:1)+(dst?2:0)+1];
+                        return ret;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/Utils.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,68 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Utils.java	1.2 07/04/06
+ */
+package com.foobar;
+import java.util.*;
+
+public class Utils {
+    public static boolean supportsLocale(Locale supported, Locale requested) {
+	if (supported.getLanguage() == "") {
+	    return true;
+	} else if (supported.getLanguage() != requested.getLanguage()) {
+	    return false;
+	}
+
+	if (supported.getCountry() == "") {
+	    return true;
+	} else if (supported.getCountry() != requested.getCountry()) {
+	    return false;
+	}
+
+	String supVar = supported.getVariant();
+	String reqVar = requested.getVariant();
+
+	if (supVar == "") {
+	    return true;
+	} else {
+	    int underIndex;
+	    while ((underIndex = reqVar.lastIndexOf('_')) != (-1)) {
+	        reqVar = reqVar.substring(0, underIndex);
+	        if (supVar.equals(reqVar)) {
+		    return true;
+	        }
+	    }
+	    return supVar.equals(reqVar);
+	}
+    }
+
+    public static boolean supportsLocale(List<Locale> supported, Locale requested) {
+        for (Locale l : supported) {
+	    if (supportsLocale(l, requested)) {
+	        return true;
+	    }
+	}
+	return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.BreakIteratorProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.text.spi.BreakIteratorProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.text.spi.BreakIteratorProvider
+# implementation class
+#
+com.foo.BreakIteratorProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.CollatorProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.text.spi.CollatorProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.text.spi.CollatorProvider
+# implementation class
+#
+com.foo.CollatorProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.DateFormatProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.text.spi.DateFormatProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.text.spi.DateFormatProvider
+# implementation class
+#
+com.foo.DateFormatProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.DateFormatSymbolsProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.text.spi.DateFormatSymbolsProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.text.spi.DateFormatProvider
+# implementation class
+#
+com.foo.DateFormatSymbolsProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.DecimalFormatSymbolsProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.text.spi.DecimalFormatSymbolsProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.text.spi.DecimalFormatProvider
+# implementation class
+#
+com.foo.DecimalFormatSymbolsProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.text.spi.NumberFormatProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.text.spi.NumberFormatProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.text.spi.NumberFormatProvider
+# implementation class
+#
+com.foo.NumberFormatProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.util.spi.CurrencyNameProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.util.spi.LocaleNameProvider
+# implementation class
+#
+com.bar.CurrencyNameProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.util.spi.LocaleNameProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.util.spi.LocaleNameProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.util.spi.LocaleNameProvider
+# implementation class
+#
+com.bar.LocaleNameProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/PluggableLocale/providersrc/java.util.spi.TimeZoneNameProvider	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,7 @@
+#
+# @(#)java.util.spi.TimeZoneNameProvider	1.1 05/05/18
+#
+# fully-qualified name of the java.util.spi.LocaleNameProvider
+# implementation class
+#
+com.bar.TimeZoneNameProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4083270Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,89 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test 1.4 07/04/09
+    @summary test Bug 4083270
+    @run main Bug4083270Test
+    @bug 4083270
+*/
+/*
+ * @(#)Bug4083270Test.java	1.4 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.*;
+
+/*
+ * Bug: ResourceBundle.geBundle does not check for subclass of ResourceBundle.
+ * This test tries to load a properties file that has a class file with the
+ * same name that isn't a subclass of ResourceBundle.  If the properties
+ * file is found, that means that getBundle ignored the class file because
+ * it wasn't a subclass of ResourceBundle.
+ */
+public class Bug4083270Test extends RBTestFmwk {
+    public static void main(String[] args) throws Exception {
+        new Bug4083270Test(true).run(args);
+    }
+
+    public Bug4083270Test(boolean dummy) {
+    }
+
+    public Bug4083270Test() throws Exception {
+        //If we get here, it means getBundle tried to instantiate this
+        //class.  It shouldn't since this class does not subclass
+        //ResourceBundle.
+        errln("ResourceBundle loaded a non-ResourceBundle class");
+    }
+
+    public void testRecursiveResourceLoads() throws Exception {
+        final String className = getClass().getName();
+        try {
+            ResourceBundle bundle = ResourceBundle.getBundle(className, Locale.getDefault());
+            if (bundle == null) {
+                errln("ResourceBundle did not find properties file");
+            } else if (!(bundle instanceof PropertyResourceBundle)) {
+                errln("ResourceBundle loaded a non-ResourceBundle class");
+            }
+        } catch (MissingResourceException e) {
+            errln("ResourceBundle threw a MissingResourceException");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4083270Test.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+Bug4179221Test=Bug4179221Test
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4165815Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,87 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    The fix for 4165815 has been backed out because of compatibility issues.
+    Disabled this test temporarily until a better fix is found by removing
+    the at-signs.
+    test 1.4 07/04/09
+    summary test Bug 4165815
+    run main Bug4165815Test
+    bug 4165815
+*/
+/*
+ * @(#)Bug4165815Test.java	1.4 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.MissingResourceException;
+
+/**
+ *  This is a regression test for the following bug:
+ *  "If the path specified by the baseName argument to
+ *  ResourceBundle.getBundle() begins with a leading slash, then the bundle
+ *  is not found relative to the classpath.
+ *
+ *  Clearly, the leading slash was inappropriate, however this did work
+ *  previously (pre 1.2) and should continue to work in the same fashion."
+ *
+ *  A Bundle base name should never contain a "/" and thus an
+ *  IllegalArgumentException should be thrown.
+ */
+public class Bug4165815Test extends RBTestFmwk {
+    public static void main(String[] args) throws Exception {
+        new Bug4165815Test().run(args);
+    }
+
+    private static final String bundleName = "/Bug4165815Bundle";
+    public void testIt() throws Exception {
+        try {
+            ResourceBundle bundle = ResourceBundle.getBundle(bundleName, new Locale("en", "US"));
+            errln("ResourceBundle returned a bundle when it should not have.");
+        } catch (IllegalArgumentException e) {
+            //This is what we should get when the base name contains a "/" character.
+        } catch (MissingResourceException e) {
+            errln("ResourceBundle threw a MissingResourceException when it should have thrown an IllegalArgumentException.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Class.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,64 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Class.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+import java.util.ResourceBundle;
+import java.util.MissingResourceException;
+import java.util.Locale;
+
+/**
+ * Class loaded by custom class loader to load resources.
+ * This call is called through the ResourceGetter interface
+ * by the test.  The ResourceGetter interface is loaded
+ * by the system loader to avoid ClassCastsExceptions.
+ */
+public class Bug4168625Class implements Bug4168625Getter {
+        /** return the specified resource or null if not found */
+    public ResourceBundle getResourceBundle(String resource, Locale locale) {
+        try {
+            return ResourceBundle.getBundle(resource, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Getter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,64 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Getter.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ResourceBundle;
+import java.util.Locale;
+
+/**
+ * Interface loaded by system class loader allowing
+ * Bug4168625Class instances to be called by
+ * test class.  This class provides a common base class
+ * for classes loaded by different loaders.  Both the system
+ * loader and the custom loader used by the Bug4168625Test
+ * class load this same interface class using the system class
+ * loader.  The custom loader then loads a subclass that is
+ * then passed back to the caller.  The fact that the caller
+ * and loader share a common base class allows the caller
+ * to cast the object without causing a ClassCastException.
+ */
+public interface Bug4168625Getter {
+    /** return the specified resource or null if not found */
+    public ResourceBundle getResourceBundle(String resource, Locale locale);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,57 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource2.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,59 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource2.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource2 extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource2" },
+            { "baseName", "Bug4168625Resource2" },
+            { "Bug4168625Resource2", "Bug4168625Resource2" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource2_en_US.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,58 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource2_en_US.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource2_en_US extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource2_en_US" },
+            { "Bug4168625Resource2_en_US", "Bug4168625Resource2_en_US" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource3.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,58 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource3.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource3 extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource3" },
+            { "Bug4168625Resource3", "Bug4168625Resource3" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,58 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource3_en.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource3_en extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource3_en" },
+            { "Bug4168625Resource3_en", "Bug4168625Resource3_en" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en_CA.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,57 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource3_en_CA.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource3_en_CA extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource3_en_CA" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en_IE.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,57 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource3_en_IE.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource3_en_IE extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource3_en_IE" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Resource3_en_US.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,58 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4168625Resource3_en_US.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.ListResourceBundle;
+
+public class Bug4168625Resource3_en_US extends ListResourceBundle {
+    /**
+     * Overrides ListResourceBundle
+     */
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "name", "Bug4168625Resource3" },
+            { "Bug4168625Resource3_en_US", "Bug4168625Resource3_en_US" },
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4168625Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,667 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test 1.8 07/04/09
+    @summary test Resource Bundle for bug 4168625
+    @build Bug4168625Class Bug4168625Getter Bug4168625Resource Bug4168625Resource3 Bug4168625Resource3_en Bug4168625Resource3_en_CA Bug4168625Resource3_en_IE Bug4168625Resource3_en_US Bug4168625Resource2_en_US Bug4168625Resource2
+    @run main/timeout=600 Bug4168625Test
+    @bug 4168625
+*/
+/*
+ * @(#)Bug4168625Test.java	1.8 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.*;
+import java.io.*;
+
+/**
+ *  This test tries to correct three efficiency problems with the caching
+ *  mechanism of ResourceBundle.  All tests assume that none of the bundles
+ *  have been previously loaded and cached.  It also allows concurrent loads
+ *  of resource bundles to be performed if the bundles are unrelated (ex. a
+ *  load of a local system resource by one thread while another thread is
+ *  doing a slow load over a network).
+ */
+public class Bug4168625Test extends RBTestFmwk {
+    public static void main(String[] args) throws Exception {
+	new Bug4168625Test().run(args);
+    }
+
+    /**
+     * Verify that getBundle will do something reasonable when part of the
+     * resource hierarchy is missing.
+     */
+    public void testMissingParent() throws Exception {
+        final Locale oldDefault = Locale.getDefault();
+        Locale.setDefault(new Locale("en", "US"));
+        try {
+            final Locale loc = new Locale("jf", "jf");
+            ResourceBundle bundle = ResourceBundle.getBundle("Bug4168625Resource2", loc);
+            final String s1 = bundle.getString("name");
+            if (!s1.equals("Bug4168625Resource2_en_US")) {
+                errln("getBundle did not find leaf bundle: "+bundle.getClass().getName());
+            }
+            final String s2 = bundle.getString("baseName");
+            if (!s2.equals("Bug4168625Resource2")) {
+                errln("getBundle did not set up proper inheritance chain");
+            }
+        } finally {
+            Locale.setDefault(oldDefault);
+        }
+    }
+
+    /**
+     *  Previous versions of ResourceBundle have had the following
+     *  caching behavior.  Assume the classes
+     *  Bug4168625Resource_fr_FR, Bug4168625Resource_fr,
+     *  Bug4168625Resource_en_US, and Bug4168625Resource_en don't
+     *  exist.  The class Bug4168625Resource does.  Assume the default
+     *  locale is en_US.
+     *  <P>
+     *  <pre>
+     *  getBundle("Bug4168625Resource", new Locale("fr", "FR"));
+     *      -->try to load Bug4168625Resource_fr_FR
+     *      -->try to load Bug4168625Resource_fr
+     *      -->try to load Bug4168625Resource_en_US
+     *      -->try to load Bug4168625Resource_en
+     *      -->load Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en_US
+     *      -->return Bug4168625Resource
+     *  getBundle("Bug4168625Resource", new Locale("fr", "FR"));
+     *      -->try to load Bug4168625Resource_fr_FR
+     *      -->try to load Bug4168625Resource_fr
+     *      -->find cached Bug4168625Resource_en_US
+     *      -->return Bug4168625Resource_en_US (which is realy Bug4168625Resource)
+     *  </pre>
+     *  <P>
+     *  The second call causes two loads for Bug4168625Resource_fr_FR and
+     *  Bug4168625Resource_en which have already been tried and failed.  These
+     *  two loads should have been cached as Bug4168625Resource by the first
+     *  call.
+     *
+     *  The following, more efficient behavior is desired:
+     *  <P>
+     *  <pre>
+     *  getBundle("Bug4168625Resource", new Locale("fr", "FR"));
+     *      -->try to load Bug4168625Resource_fr_FR
+     *      -->try to load Bug4168625Resource_fr
+     *      -->try to load Bug4168625Resource_en_US
+     *      -->try to load Bug4168625Resource_en
+     *      -->load Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en_US
+     *      -->cache Bug4168625Resource as Bug4168625Resource_fr
+     *      -->cache Bug4168625Resource as Bug4168625Resource_fr_FR
+     *      -->return Bug4168625Resource
+     *  getBundle("Bug4168625Resource", new Locale("fr", "FR"));
+     *      -->find cached Bug4168625Resource_fr_FR
+     *      -->return Bug4168625Resource_en_US (which is realy Bug4168625Resource)
+     *  </pre>
+     *  <P>
+     *
+     */
+    public void testCacheFailures() throws Exception {
+        checkResourceLoading("Bug4168625Resource", new Locale("fr", "FR"));
+    }
+
+    /**
+     *  Previous versions of ResourceBundle have had the following
+     *  caching behavior.  Assume the current locale is locale is en_US.
+     *  The classes Bug4168625Resource_en_US, and Bug4168625Resource_en don't
+     *  exist.  The class Bug4168625Resource does.
+     *  <P>
+     *  <pre>
+     *  getBundle("Bug4168625Resource", new Locale("en", "US"));
+     *      -->try to load Bug4168625Resource_en_US
+     *      -->try to load Bug4168625Resource_en
+     *      -->try to load Bug4168625Resource_en_US
+     *      -->try to load Bug4168625Resource_en
+     *      -->load Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en_US
+     *      -->return Bug4168625Resource
+     *  </pre>
+     *  <P>
+     *  The redundant loads of Bug4168625Resource_en_US and Bug4168625Resource_en
+     *  should not occur.  The desired behavior is as follows:
+     *  <P>
+     *  <pre>
+     *  getBundle("Bug4168625Resource", new Locale("en", "US"));
+     *      -->try to load Bug4168625Resource_en_US
+     *      -->try to load Bug4168625Resource_en
+     *      -->load Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en
+     *      -->cache Bug4168625Resource as Bug4168625Resource_en_US
+     *      -->return Bug4168625Resource
+     *  </pre>
+     *  <P>
+     */
+    public void testRedundantLoads() throws Exception {
+        checkResourceLoading("Bug4168625Resource", Locale.getDefault());
+    }
+
+    /**
+     * Ensure that resources are only loaded once and are cached correctly
+     */
+    private void checkResourceLoading(String resName, Locale l) throws Exception {
+        final Loader loader = new Loader( new String[] { "Bug4168625Class" }, new String[] { "Bug4168625Resource3_en_US", "Bug4168625Resource3_en_CA" });
+        final Class c = loader.loadClass("Bug4168625Class");
+        Bug4168625Getter test = (Bug4168625Getter)c.newInstance();
+        final String resClassName;
+        if (l.toString().length() > 0) {
+            resClassName = resName+"_"+l;
+        } else {
+            resClassName = resName;
+        }
+
+        Object bundle = test.getResourceBundle(resName, l);
+        loader.logClasses("Initial lookup of "+resClassName+" generated the following loads:");
+
+        final Vector lastLoad = new Vector(loader.loadedClasses.size());
+        boolean dups = false;
+        for (int i = loader.loadedClasses.size() - 1; i >= 0 ; i--) {
+            final Object item = loader.loadedClasses.elementAt(i);
+            loader.loadedClasses.removeElementAt(i);
+            if (loader.loadedClasses.contains(item)) {
+                logln("Resource loaded more than once: "+item);
+                dups = true;
+            } else {
+                lastLoad.addElement(item);
+            }
+        }
+        if (dups) {
+            errln("ResourceBundle loaded some classes multiple times");
+        }
+
+        loader.loadedClasses.removeAllElements();
+        bundle = test.getResourceBundle(resName, l);
+        loader.logClasses("Second lookup of "+resClassName+" generated the following loads:");
+
+        dups = false;
+        for (int i = 0; i < loader.loadedClasses.size(); i++) {
+            Object item = loader.loadedClasses.elementAt(i);
+            if (lastLoad.contains(item)) {
+                logln("ResourceBundle did not cache "+item+" correctly");
+                dups = true;
+            }
+        }
+        if (dups) {
+            errln("Resource bundle not caching some classes properly");
+        }
+    }
+
+    /**
+     *  Previous versions of ResourceBundle exhibited the following caching behavior.
+     *  Assume the class Bug4168625Resource_en exists. Bug4168625Resource_en_US does
+     *  not.  Two threads, ThreadA and ThreadB both try to get the same bundle.
+     *  <P>
+     *  <pre>
+     *  ThreadA.getBundle("Bug4168625Resource", new Locale("en", "US"));
+     *      A-->try to load Bug4168625Resource_en_US
+     *  ThreadB.getBundle("Bug4168625Resource", new Locale("en", "US"));
+     *      B-->try to load Bug4168625Resource_en_US
+     *      B-->load Bug4168625Resource_en (#1)
+     *      A-->load Bug4168625Resource_en (#2)
+     *      A-->cache Bug4168625Resource_en (#2) as Bug4168625Resource_en
+     *      A-->cache Bug4168625Resource_en (#2) as Bug4168625Resource_en_US
+     *      A-->return Bug4168625Resource_en (#2)
+     *      B-->cache Bug4168625Resource_en (#1) as Bug4168625Resource_en
+     *      B-->cache Bug4168625Resource_en (#1) as Bug4168625Resource_en_US
+     *      B-->return Bug4168625Resource_en (#1)
+     *  </pre>
+     *  <P>
+     *  Both threads try and fail to load Bug4168625Resource_en_US.  Both
+     *  threads load Bug4168625Resource_en.  Both threads get their own copy
+     *  of the Bug4168625Resource_en resource.
+     *
+     *  The desired behavior is as follows:
+     *  <P>
+     *  <pre>
+     *  ThreadA.getBundle("Bug4168625Resource", new Locale("en", "US"));
+     *      A-->try to load Bug4168625Resource_en_US
+     *  ThreadB.getBundle("Bug4168625Resource", new Locale("en", "US"));
+     *      B-->try to load Bug4168625Resource_en_US
+     *      B-->load Bug4168625Resource_en
+     *      A-->load Bug4168625Resource_en (block in ResourceBundle.getBundle)
+     *      B-->cache Bug4168625Resource_en as Bug4168625Resource_en
+     *      B-->cache Bug4168625Resource_en as Bug4168625Resource_en_US
+     *      A-->return Bug4168625Resource_en
+     *      B-->return Bug4168625Resource_en
+     *  </pre>
+     *  <P>
+     *  Note that both threads return the same bundle object.
+     */
+    public void testConcurrentLoading1() throws Exception {
+        final Loader loader = new Loader( new String[] { "Bug4168625Class" }, new String[] { "Bug4168625Resource3_en_US", "Bug4168625Resource3_en_CA" });
+        final Class c = loader.loadClass("Bug4168625Class");
+        final Bug4168625Getter test = (Bug4168625Getter)c.newInstance();
+
+            //both threads want the same resource
+        ConcurrentLoadingThread thread1 = new ConcurrentLoadingThread(loader, test, new Locale("en", "US"));
+        ConcurrentLoadingThread thread2 = new ConcurrentLoadingThread(loader, test, new Locale("en", "US"));
+
+        thread1.start();            //start thread 1
+        loader.waitForNotify(1);    //wait for thread1 to do getBundle & block in loader
+        thread2.start();            //start second thread
+        loader.waitForNotify(2, 1000);  //wait until thread2 blocks somewhere in getBundle
+        thread1.ping();             //continue both threads
+        thread2.ping();
+
+        thread1.join();             //wait unitl both threads complete
+        thread2.join();
+
+            //Now, examine the class loads that were done.
+        loader.logClasses("Classes loaded after completion of both threads:");
+
+        boolean dups = false;
+        for (int i = loader.loadedClasses.size() - 1; i >= 0 ; i--) {
+            final Object item = loader.loadedClasses.elementAt(i);
+            loader.loadedClasses.removeElementAt(i);
+            if (loader.loadedClasses.contains(item)) {
+                logln("Resource loaded more than once: "+item);
+                dups = true;
+            }
+        }
+        if (dups) {
+            errln("ResourceBundle loaded some classes multiple times");
+        }
+    }
+
+    private class ConcurrentLoadingThread extends Thread {
+        private Loader loader;
+        public Object bundle;
+        private Bug4168625Getter test;
+        private Locale locale;
+        private String resourceName = "Bug4168625Resource3";
+        public ConcurrentLoadingThread(Loader loader, Bug4168625Getter test, Locale l, String resourceName) {
+            this.loader = loader;
+            this.test = test;
+            this.locale = l;
+            this.resourceName = resourceName;
+        }
+        public ConcurrentLoadingThread(Loader loader, Bug4168625Getter test, Locale l) {
+            this.loader = loader;
+            this.test = test;
+            this.locale = l;
+        }
+        public void run() {
+            try {
+                logln(">>"+threadName()+">run");
+                bundle = test.getResourceBundle(resourceName, locale);
+            } catch (Exception e) {
+                errln("TEST CAUGHT UNEXPECTED EXCEPTION: "+e);
+            } finally {
+                logln("<<"+threadName()+"<run");
+            }
+        }
+        public synchronized void waitUntilPinged() {
+            logln(">>"+threadName()+">waitUntilPinged");
+            loader.notifyEveryone();
+            try {
+                wait(30000);    //wait 30 seconds max.
+            } catch (InterruptedException e) {
+                logln("Test deadlocked.");
+            }
+            logln("<<"+threadName()+"<waitUntilPinged");
+        }
+        public synchronized void ping() {
+            logln(">>"+threadName()+">ping "+threadName(this));
+            notifyAll();
+            logln("<<"+threadName()+"<ping "+threadName(this));
+        }
+    };
+
+    /**
+     * This test ensures that multiple resources can be loading at the same
+     * time as long as they don't depend on each other in some way.
+     */
+    public void testConcurrentLoading2() throws Exception {
+        final Loader loader = new Loader( new String[] { "Bug4168625Class" }, new String[] { "Bug4168625Resource3_en_US", "Bug4168625Resource3_en_CA" });
+        final Class c = loader.loadClass("Bug4168625Class");
+        final Bug4168625Getter test = (Bug4168625Getter)c.newInstance();
+
+        ConcurrentLoadingThread thread1 = new ConcurrentLoadingThread(loader, test, new Locale("en", "CA"));
+        ConcurrentLoadingThread thread2 = new ConcurrentLoadingThread(loader, test, new Locale("en", "IE"));
+
+        thread1.start();            //start thread 1
+        loader.waitForNotify(1);    //wait for thread1 to do getBundle & block in loader
+        thread2.start();            //start second thread
+        thread2.join(1000);         //wait until thread2 blocks somewhere in getBundle
+
+            //Thread1 should be blocked inside getBundle at the class loader
+            //Thread2 should have completed its getBundle call and terminated
+        if (!thread1.isAlive() || thread2.isAlive()) {
+            errln("ResourceBundle.getBundle not allowing legal concurrent loads");
+        }
+
+        thread1.ping();             //continue thread1
+        thread1.join();
+        thread2.join();
+    }
+
+    /**
+     * This test ensures that a resource loads correctly (with all its parents)
+     * when memory is very low (ex. the cache gets purged during a load).
+     */
+    public void testLowMemoryLoad() throws Exception {
+        final String[] classToLoad = { "Bug4168625Class" };
+        final String[] classToWait = { "Bug4168625Resource3_en_US","Bug4168625Resource3_en","Bug4168625Resource3" };
+        final Loader loader = new Loader(classToLoad, classToWait);
+        final Class c = loader.loadClass("Bug4168625Class");
+        final Bug4168625Getter test = (Bug4168625Getter)c.newInstance();
+        causeResourceBundleCacheFlush();
+
+        ConcurrentLoadingThread thread1 = new ConcurrentLoadingThread(loader, test, new Locale("en", "US"));
+        thread1.start();            //start thread 1
+        loader.waitForNotify(1);    //wait for thread1 to do getBundle(en_US) & block in loader
+        causeResourceBundleCacheFlush();    //cause a cache flush
+        thread1.ping();             //kick thread 1
+        loader.waitForNotify(2);    //wait for thread1 to do getBundle(en) & block in loader
+        causeResourceBundleCacheFlush();    //cause a cache flush
+        thread1.ping();             //kick thread 1
+        loader.waitForNotify(3);    //wait for thread1 to do getBundle(en) & block in loader
+        causeResourceBundleCacheFlush();    //cause a cache flush
+        thread1.ping();             //kick thread 1
+        thread1.ping();             //kick thread 1
+        thread1.join(1000);         //wait until thread2 blocks somewhere in getBundle
+
+        ResourceBundle bundle = (ResourceBundle)thread1.bundle;
+        String s1 = bundle.getString("Bug4168625Resource3_en_US");
+        String s2 = bundle.getString("Bug4168625Resource3_en");
+        String s3 = bundle.getString("Bug4168625Resource3");
+        if ((s1 == null) || (s2 == null) || (s3 == null)) {
+            errln("Bundle not constructed correctly.  The parent chain is incorrect.");
+        }
+    }
+
+    /**
+     * A simple class loader that loads classes from the current
+     * working directory.  The loader will block the current thread
+     * of execution before it returns when it tries to load
+     * the class "Bug4168625Resource3_en_US".
+     */
+    private static final String CLASS_PREFIX = "";
+    private static final String CLASS_SUFFIX = ".class";
+
+    private static final class SimpleLoader extends ClassLoader {
+        private boolean network = false;
+
+        public SimpleLoader() {
+            this.network = false;
+        }
+        public SimpleLoader(boolean simulateNetworkLoad) {
+            this.network = simulateNetworkLoad;
+        }
+        public Class loadClass(final String className, final boolean resolveIt)
+                throws ClassNotFoundException {
+            Class result;
+            synchronized (this) {
+                result = findLoadedClass(className);
+                if (result == null) {
+                    if (network) {
+                        try {
+                             Thread.sleep(100);
+                        } catch (java.lang.InterruptedException e) {
+                        }
+                    }
+                    result = super.findSystemClass(className);
+                    if ((result != null) && resolveIt) {
+                        resolveClass(result);
+                    }
+                }
+            }
+            return result;
+        }
+    }
+
+    private final class Loader extends ClassLoader {
+        public final Vector loadedClasses = new Vector();
+        private String[] classesToLoad;
+        private String[] classesToWaitFor;
+
+        public Loader() {
+            classesToLoad = new String[0];
+            classesToWaitFor = new String[0];
+        }
+
+        public Loader(final String[] classesToLoadIn, final String[] classesToWaitForIn) {
+            classesToLoad = classesToLoadIn;
+            classesToWaitFor = classesToWaitForIn;
+        }
+
+        /**
+         * Load a class.  Files we can load take preference over ones the system
+         * can load.
+         */
+        private byte[] getClassData(final String className) {
+            boolean shouldLoad = false;
+            for (int i = classesToLoad.length-1; i >= 0; --i) {
+                if (className.equals(classesToLoad[i])) {
+                    shouldLoad = true;
+                    break;
+                }
+            }
+
+            if (shouldLoad) {
+                final String name = CLASS_PREFIX+className+CLASS_SUFFIX;
+                try {
+                    final InputStream fi = this.getClass().getClassLoader().getResourceAsStream(name);
+                    final byte[] result = new byte[fi.available()];
+                    fi.read(result);
+                    return result;
+                } catch (Exception e) {
+                    logln("Error loading test class: "+name);
+                    logln(e.toString());
+                    return null;
+                }
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Load a class.  Files we can load take preference over ones the system
+         * can load.
+         */
+        public Class loadClass(final String className, final boolean resolveIt)
+                throws ClassNotFoundException {
+            Class result;
+            synchronized (this) {
+                logln(">>"+threadName()+">load "+className);
+                loadedClasses.addElement(className);
+
+                result = findLoadedClass(className);
+                if (result == null) {
+                    final byte[] classData = getClassData(className);
+                    if (classData == null) {
+                        //we don't have a local copy of this one
+			logln("Loading system class: "+className);
+                        result = loadFromSystem(className);
+                    } else {
+                        result = defineClass(classData, 0, classData.length);
+                        if (result == null) {
+                            //there was an error defining the class
+                            result = loadFromSystem(className);
+                        }
+                    }
+                    if ((result != null) && resolveIt) {
+                        resolveClass(result);
+                    }
+                }
+            }
+            for (int i = classesToWaitFor.length-1; i >= 0; --i) {
+                if (className.equals(classesToWaitFor[i])) {
+                    rendezvous();
+                    break;
+                }
+            }
+            logln("<<"+threadName()+"<load "+className);
+            return result;
+        }
+
+        /**
+         * Delegate loading to the system loader
+         */
+        private Class loadFromSystem(String className) throws ClassNotFoundException {
+            return super.findSystemClass(className);
+        }
+
+        public void logClasses(String title) {
+            logln(title);
+            for (int i = 0; i < loadedClasses.size(); i++) {
+                logln("    "+loadedClasses.elementAt(i));
+            }
+            logln("");
+        }
+
+        public int notifyCount = 0;
+        public int waitForNotify(int count) {
+            return waitForNotify(count, 0);
+        }
+        public synchronized int waitForNotify(int count, long time) {
+            logln(">>"+threadName()+">waitForNotify");
+            if (count > notifyCount) {
+                try {
+                    wait(time);
+                } catch (InterruptedException e) {
+                }
+            } else {
+                logln("  count("+count+") > notifyCount("+notifyCount+")");
+            }
+            logln("<<"+threadName()+"<waitForNotify");
+            return notifyCount;
+        }
+        private synchronized void notifyEveryone() {
+            logln(">>"+threadName()+">notifyEveryone");
+            notifyCount++;
+            notifyAll();
+            logln("<<"+threadName()+"<notifyEveryone");
+        }
+        private void rendezvous() {
+            final Thread current = Thread.currentThread();
+            if (current instanceof ConcurrentLoadingThread) {
+                ((ConcurrentLoadingThread)current).waitUntilPinged();
+            }
+        }
+    }
+
+    private static String threadName() {
+        return threadName(Thread.currentThread());
+    }
+
+    private static String threadName(Thread t) {
+        String temp = t.toString();
+        int ndx = temp.indexOf("Thread[");
+        temp = temp.substring(ndx + "Thread[".length());
+        ndx = temp.indexOf(',');
+        temp = temp.substring(0, ndx);
+        return temp;
+    }
+
+    /** Fill memory to force all SoftReferences to be GCed */
+    private void causeResourceBundleCacheFlush() {
+        logln("Filling memory...");
+	int allocationSize = 1024;
+        Vector memoryHog = new Vector();
+        try {
+            while (true) {
+                memoryHog.addElement(new byte[allocationSize]);
+		allocationSize *= 2;
+            }
+	} catch (Throwable e) {
+            logln("Caught "+e+" filling memory");
+        } finally{
+            memoryHog = null;
+	    System.gc();
+        }
+        logln("last allocation size: " + allocationSize);
+    }
+
+    /**
+     *  NOTE: this problem is not externally testable and can only be
+     *  verified through code inspection unless special code to force
+     *  a task switch is inserted into ResourceBundle.
+     *  The class Bug4168625Resource_sp exists.  It's parent bundle
+     *  (Bug4168625Resource) contains a resource string with the tag
+     *  "language" but Bug4168625Resource_sp does not.
+     *  Assume two threads are executing, ThreadA and ThreadB and they both
+     *  load a resource Bug4168625Resource with from sp locale.
+     *  ResourceBundle.getBundle adds a bundle to the bundle cache (in
+     *  findBundle) before it sets the bundle's parent (in getBundle after
+     *  returning from findBundle).
+     *  <P>
+     *  <pre>
+     *  ThreadA.getBundle("Bug4168625Resource", new Locale("sp"));
+     *      A-->load Bug4168625Resource_sp
+     *      A-->find cached Bug4168625Resource
+     *      A-->cache Bug4168625Resource_sp as Bug4168625Resource_sp
+     *  ThreadB.getBundle("Bug4168625Resource", new Locale("sp"));
+     *      B-->find cached Bug4168625Resource_sp
+     *      B-->return Bug4168625Resource_sp
+     *  ThreadB.bundle.getString("language");
+     *      B-->try to find "language" in Bug4168625Resource_sp
+     *      B-->Bug4168625Resource_sp does not have a parent, so return null;
+     *  ThreadB.System.out.println("Some unknown country");
+     *      A-->set parent of Bug4168625Resource_sp to Bug4168625Resource
+     *      A-->return Bug4168625Resource_sp (the same bundle ThreadB got)
+     *  ThreadA.bundle.getString("language");
+     *      A-->try to find "language" in Bug4168625Resource_sp
+     *      A-->try to find "language" in Bug4168625Resource (parent of Bug4168625Resource_sp)
+     *      A-->return the string
+     *  ThreadA.System.out.println("Langauge = "+country);
+     *  ThreadB.bundle.getString("language");
+     *      B-->try to find "language" in Bug4168625Resource_sp
+     *      B-->try to find "language" in Bug4168625Resource (parent of Bug4168625Resource_sp)
+     *      B-->return the string
+     *  ThreadB.System.out.println("Langauge = "+country);
+     *  </pre>
+     *  <P>
+     *  Note that the first call to getString() by ThreadB returns null, but the second
+     *  returns a value.  Thus to ThreadB, the bundle appears to change.  ThreadA gets
+     *  the expected results right away.
+     */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4177489Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,80 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test 1.5 07/04/09
+    @summary test Resource Bundle for bug 4177489
+    @build Bug4177489_Resource Bug4177489_Resource_jf
+    @run main Bug4177489Test
+    @bug 4177489
+*/
+/*
+ * @(#)Bug4177489Test.java	1.5 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.*;
+import java.io.*;
+
+public class Bug4177489Test extends RBTestFmwk {
+    public static void main(String[] args) throws Exception {
+        new Bug4177489Test().run(args);
+    }
+
+    public void testIt() throws Exception {
+	ResourceBundle rb = ResourceBundle.getBundle( "Bug4177489_Resource" );
+        Locale l = rb.getLocale();
+        if (l.toString().length() > 0) {
+            errln("ResourceBundle didn't handle resource class name with '_' in it.");
+        }
+
+        Locale loc = new Locale("jf", "");
+        ResourceBundle rb2 = ResourceBundle.getBundle( "Bug4177489_Resource", loc );
+        if (!loc.equals(rb2.getLocale())) {
+            errln("ResourceBundle didn't return proper locale name:"+rb2.getLocale());
+        }
+
+        loc = new Locale("jf", "JF");
+        ResourceBundle rb3 = ResourceBundle.getBundle("Bug4177489_Resource", loc);
+        if (!loc.equals(rb3.getLocale())) {
+            errln("ResourceBundle didn't return proper locale name for property bundle:"+rb3.getLocale());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4177489_Resource.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,55 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4177489_Resource.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.*;
+
+public class Bug4177489_Resource extends ListResourceBundle {
+    public Object[][] getContents() {
+       return contents;
+    }
+    static final Object[][] contents = {
+       {"key1", "value1"}
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4177489_Resource_jf.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,55 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4177489_Resource_jf.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1999 - All Rights Reserved
+ *
+ * Portions Copyright 2007 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ *
+ * The original version of this source code and documentation is
+ * copyrighted and owned by IBM. These materials are provided
+ * under terms of a License Agreement between IBM and Sun.
+ * This technology is protected by multiple US and International
+ * patents. This notice and attribution to IBM may not be removed.
+ *
+ */
+
+import java.util.*;
+
+public class Bug4177489_Resource_jf extends ListResourceBundle {
+    public Object[][] getContents() {
+       return contents;
+    }
+    static final Object[][] contents = {
+       {"keyJF", "valueJF"}
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4177489_Resource_jf_JF.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+Bug4177489Test=Bug4177489Test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4179766Class.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,72 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4179766Class.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1996 - 1999 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+import java.util.ResourceBundle;
+import java.util.MissingResourceException;
+
+/**
+ * Class loaded by custom class loader to load resources.
+ * This call is called through the ResourceGetter interface
+ * by the test.  The ResourceGetter interface is loaded
+ * by the system loader to avoid ClassCastsExceptions.
+ */
+public class Bug4179766Class implements Bug4179766Getter { 
+        /** return the specified resource or null if not found */
+    public ResourceBundle getResourceBundle(String resource) {
+        try {
+            return ResourceBundle.getBundle(resource);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4179766Getter.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,72 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4179766Getter.java	1.4 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1996 - 1999 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+import java.util.ResourceBundle;
+
+/**
+ * Interface loaded by system class loader allowing
+ * Bug4179766Class instances to be called by
+ * test class.  This class provides a common base class
+ * for classes loaded by different loaders.  Both the system
+ * loader and the custom loader used by the TestBug4179766
+ * class load this same interface class using the system class
+ * loader.  The custom loader then loads a subclass that is
+ * then passed back to the caller.  The fact that the caller
+ * and loader share a common base class allows the caller
+ * to cast the object without causing a ClassCastException.
+ */
+public interface Bug4179766Getter {
+    /** return the specified resource or null if not found */
+    public ResourceBundle getResourceBundle(String resource);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4179766Resource.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,93 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug4179766Resource.java	1.3 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1996 - 1999 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+import java.util.ListResourceBundle;
+
+/**
+ * A dummy resource to be loaded by the custom class loader.
+ * The contents are unimportant.
+ */
+public class Bug4179766Resource extends ListResourceBundle {
+    public Object[][] getContents() {
+        return new Object[][] {
+            { "MonthNames",
+                new String[] {
+                    "January",
+                    "February",
+                    "March",
+                    "April",
+                    "May",
+                    "June",
+                    "July",
+                    "August",
+                    "September",
+                    "October",
+                    "November",
+                    "December",
+                    "",
+                }
+            },
+            { "DayNames",
+                new String[] {
+                    "Sunday",
+                    "Monday",
+                    "Tuesday",
+                    "Wednesday",
+                    "Thursday",
+                    "Friday",
+                    "Saturday",
+                }
+            }
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4195978Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,76 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ * @test @(#)Bug4195978Test.java	1.2 07/04/09
+ * @bug 4195978
+ * @summary Verifies that resource bundle names have case distinction.
+ * @author joconner
+ */
+import java.util.*;
+
+public class Bug4195978Test extends ListResourceBundle {
+
+    public static void main(final String args[]) throws Exception {
+        new Bug4195978Test().test();
+    }
+
+    public void test() throws Exception {
+        try {
+            // load a property resourcebundle
+            final ResourceBundle bundle = ResourceBundle.getBundle("bug4195978Test");
+            // load this file as a ListResourceBundle
+            final ResourceBundle bundle2 = ResourceBundle.getBundle("Bug4195978Test");
+
+            // get the "test" keyid from both bundles
+            String b1 = bundle.getString("test");
+            String b2 = bundle2.getString("test");
+
+            // one should be lowercase, the other is uppercase
+            // each bundle can be used seperately because their names
+            // are distinguished by case.
+            if (b1.equals("test") && b2.equals("TEST")) {
+                System.out.println("Passed");
+            }
+        } catch (Exception e) {
+            System.err.println("Failed");
+            System.err.println(e);
+            throw e;
+        }
+
+
+    }
+
+    public Object[][] getContents() {
+        return contents;
+    }
+
+    Object[][] contents = {
+        {"test", "TEST"},
+    };
+
+
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4257318.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,62 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ * @test @(#)Bug4257318.java	1.5 07/04/09
+ * @bug 4257318
+ * @author John O'Conner
+ * @build Bug4257318Res Bug4257318Res_en
+ * @run main Bug4257318
+ */
+
+import java.util.ResourceBundle;
+
+
+public class Bug4257318 {
+  ResourceBundle res;
+  boolean passed;
+
+  public Bug4257318() {
+    passed = false;
+    res = ResourceBundle.getBundle("Bug4257318Res", new java.util.Locale("","",""));
+  }
+
+  boolean run() {
+    String str = res.getString("Hello");
+    passed = str.equals("Hello from the root bundle!");
+    System.out.println("Root bundle string: " + str);
+    return passed;
+  }
+
+  public static void main(String[] args) throws Exception {
+    boolean passed;
+    Bug4257318 test = new Bug4257318();
+    passed = test.run();
+    if (!passed) {
+      throw new Exception("Bug4257318 Test: FAILED");
+    }
+    
+  }
+}    
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4257318Res.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,41 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+  @(#)Bug4257318Res.java	1.2 07/04/09
+  @bug 4257318
+  @author John O'Conner
+  */
+
+import java.util.ListResourceBundle;
+
+public class Bug4257318Res extends ListResourceBundle {
+
+  public Object[][] getContents() {
+    return contents;
+  }
+
+  static Object[][] contents = {
+    {"Hello", "Hello from the root bundle!"},
+  };
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4257318Res_en.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,40 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+  @(#)Bug4257318Res_en.java	1.2 07/04/09
+  @bug 4257318
+  @author John O'Conner
+  */
+
+import java.util.ListResourceBundle;
+
+public class Bug4257318Res_en extends ListResourceBundle {
+
+  public Object[][] getContents() {
+    return contents;
+  }
+
+  static Object[][] contents = {
+    {"Hello", "Hello from the en bundle!"},
+  };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4353454.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,52 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 4353454
+ * @summary Test if the second getBundle call finds a bundle in the default Locale search path.
+ */
+
+import java.util.ResourceBundle;
+import java.util.Locale;
+
+public class Bug4353454 {
+
+    public static void main(String[] args) {
+	Locale l = Locale.getDefault();
+	try {
+	    Locale.setDefault(Locale.US);
+	    test();
+	    test();
+	} finally {
+	    Locale.setDefault(l);
+	}
+    }
+    
+    private static void test() {
+        ResourceBundle myResources = ResourceBundle.getBundle("RB4353454", new Locale(""));
+	if (!"Got it!".equals(myResources.getString("text"))) {
+	    throw new RuntimeException("returned wrong resource for key 'text': "
+				       + myResources.getString("text"));
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4396021.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,52 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 04/09/07
+ * @bug 4396021
+ * @summary Verify that a resource bundle can override its parent.
+ * @build Bug4396021GeneralMessages Bug4396021SpecialMessages
+ * @run main Bug4396021
+ */
+
+import java.util.ResourceBundle;
+
+public class Bug4396021 {
+
+    private static ResourceBundle bundle;
+
+    public static void main(String[] args) throws Exception {
+        bundle = ResourceBundle.getBundle("Bug4396021SpecialMessages");
+	
+	checkValue("special_key", "special_value");
+	checkValue("general_key", "general_value");
+    }
+    
+    private static void checkValue(String key, String expected) throws Exception {
+        String result = bundle.getString(key);
+	if (!result.equals(expected)) {
+	    throw new RuntimeException("Got wrong value from resource bundle"
+                    + " - key: " + key + ", expected: " + expected
+                    + ", got: " + result);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4396021GeneralMessages.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,38 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.util.ListResourceBundle;
+
+public class Bug4396021GeneralMessages extends ListResourceBundle {
+
+    private static final Object[][] contents = {
+	{"general_key", "general_value"},
+    };
+
+    public Bug4396021GeneralMessages() {
+        super();
+    }
+
+    protected Object[][] getContents() {
+        return contents;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug4396021SpecialMessages.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,38 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.util.ListResourceBundle;
+
+public class Bug4396021SpecialMessages extends ListResourceBundle {
+
+    private static final Object[][] contents = {
+        {"special_key", "special_value"},
+    };
+
+    public Bug4396021SpecialMessages() {
+        setParent(getBundle("Bug4396021GeneralMessages"));
+    }
+
+    protected Object[][] getContents() {
+        return contents;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6190861.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,70 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 6190861
+ * @summary Make sure to always load the default locale's bundle when
+ * there's no bundle for the requested locale.
+ */
+
+import java.util.*;
+
+public class Bug6190861 {
+
+    static public void main(String[] args) {
+	Locale.setDefault(new Locale("en", "US"));
+
+	List localeList = new ArrayList();
+	localeList.add(Locale.ENGLISH);
+	localeList.add(Locale.KOREA);
+	localeList.add(Locale.UK);
+	localeList.add(new Locale("en", "CA"));
+	localeList.add(Locale.ENGLISH);
+
+	Iterator iter = localeList.iterator();
+	while (iter.hasNext()){
+	    Locale currentLocale = (Locale) iter.next();
+	    System.out.println("\ncurrentLocale = " 
+			       + currentLocale.getDisplayName());
+
+	    ResourceBundle messages = ResourceBundle.getBundle("Bug6190861Data",currentLocale);
+
+	    Locale messagesLocale = messages.getLocale();
+	    System.out.println("messagesLocale = " 
+			       + messagesLocale.getDisplayName());
+	    checkMessages(messages);
+	}
+    }
+
+    static void checkMessages(ResourceBundle messages) {
+	String greetings = messages.getString("greetings");
+	String inquiry = messages.getString("inquiry");
+	String farewell = messages.getString("farewell");
+	System.out.println(greetings);
+	System.out.println(inquiry);
+	System.out.println(farewell);
+	if (!greetings.equals("Hiya.")) {
+	    throw new RuntimeException("got wrong resource bundle");
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6190861Data.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)Bug6190861Data.properties	1.2 07/04/09
+#
+greetings = Hello.
+farewell = Goodbye.
+inquiry = How are you?
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6190861Data_en_US.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)Bug6190861Data_en_US.properties	1.2 07/04/09
+#
+greetings = Hiya.
+farewell = Seeya.
+inquiry = Howdy?
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6204853.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,90 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test @(#)Bug6204853.java	1.2 07/04/09
+ * @bug 6204853
+ * @summary tests PropertyResourceBundle(Reader) constructor.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.PropertyResourceBundle;
+
+public final class Bug6204853 {
+
+    public Bug6204853() {
+	try {
+	    String srcDir = System.getProperty("test.src", ".");
+	    FileInputStream  fis8859_1 = 
+	        new FileInputStream(new File(srcDir, "Bug6204853.properties"));
+	    FileInputStream fisUtf8 = 
+	        new FileInputStream(new File(srcDir, "Bug6204853_Utf8.properties"));
+	    InputStreamReader isrUtf8 = new InputStreamReader(fisUtf8, "UTF-8");
+
+	    PropertyResourceBundle bundleUtf8 = new PropertyResourceBundle(isrUtf8);
+	    PropertyResourceBundle bundle = new PropertyResourceBundle(fis8859_1);
+
+	    String[] arrayUtf8 = createKeyValueArray(bundleUtf8);
+	    String[] array = createKeyValueArray(bundle);
+
+	    isrUtf8.close();
+	    fisUtf8.close();
+	    fis8859_1.close();
+
+	    if (!Arrays.equals(arrayUtf8, array)) {
+	        throw new RuntimeException("PropertyResourceBundle constructed from a UTF-8 encoded property file is not equal to the one constructed from ISO-8859-1 encoded property file.");
+	    }
+	} catch (FileNotFoundException fnfe) {
+	    throw new RuntimeException(fnfe);
+	} catch (IOException ioe) {
+	    throw new RuntimeException(ioe);
+	}
+    }
+
+    private final String[] createKeyValueArray(PropertyResourceBundle b) {
+        List<String> keyValueList = new ArrayList<String>();
+	StringBuilder sb = new StringBuilder();
+
+	for (String key : b.keySet()) {
+	    sb.setLength(0);
+	    sb.append(key);
+	    sb.append(" = ");
+	    sb.append(b.getString(key));
+	    keyValueList.add(sb.toString());
+	}
+
+	String[] keyValueArray = keyValueList.toArray(new String[0]);
+	Arrays.sort(keyValueArray);
+	return keyValueArray;
+    }
+
+    public final static void main(String[] args) {
+        new Bug6204853();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6204853.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @(#)Bug6204853.properties	1.2 07/04/09
+
+key1 = \u30b5\u30f3\u30bf\u30af\u30e9\u30e9
+key2 = \u30ab\u30ea\u30d5\u30a9\u30eb\u30cb\u30a2
+key3 = \u30a2\u30e1\u30ea\u30ab\u5408\u8846\u56fd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6204853_Utf8.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @(#)Bug6204853_Utf8.properties	1.2 07/04/09
+
+key1 = サンタクララ
+key2 = カリフォルニア
+key3 = アメリカåˆè¡†å›½
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6287579.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,107 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 6287579
+ * @summary Make sure that getContents() of ListResourceBundle subclasses is 'protected'
+ *          and returns a different Object[]][] instance in each invocation.
+ */
+
+import java.lang.reflect.*;
+import java.util.*;
+
+public class Bug6287579 {
+    static final Locale ROOT = new Locale("");
+
+    static final String[] baseNames = {
+	"sun.text.resources.BreakIteratorInfo",
+	"sun.text.resources.FormatData",
+	"sun.text.resources.CollationData",
+	"sun.util.resources.LocaleNames",
+	"sun.util.resources.TimeZoneNames",
+
+	// Make sure the properties-to-class conversion tool generates
+	// the proper getContents().
+	"sun.awt.resources.awt",
+    };
+
+    public static void main(String[] args) throws Exception {
+	int errors = 0;
+
+	List<Locale> locales = new ArrayList<Locale>();
+	locales.addAll(Arrays.asList(Locale.getAvailableLocales()));
+	locales.add(ROOT);
+
+	for (Locale locale : locales) {
+	    for (String base : baseNames) {
+		String className = getResourceName(base, locale);
+		errors += checkGetContents(className);
+	    }
+	}
+	if (errors > 0) {
+	    throw new RuntimeException(errors + " errors found");
+	}
+    }
+
+    static int checkGetContents(String className) throws Exception {
+	int err = 0;
+	try {
+	    Class clazz = Class.forName(className);
+	    Method getContentsMethod = clazz.getDeclaredMethod("getContents",
+							       (Class[]) null);
+	    if (!Modifier.isProtected(getContentsMethod.getModifiers())) {
+		System.err.println(className + ": not protected");
+		err++;
+	    }
+	    getContentsMethod.setAccessible(true);
+	    Object bundle = clazz.newInstance();
+	    Object o1 = getContentsMethod.invoke(bundle, (Object[]) null);
+	    Object o2 = getContentsMethod.invoke(bundle, (Object[]) null);
+	    if (o1 == o2) {
+		System.err.println(className + ": same instance returned");
+		err++;
+	    }
+	} catch (ClassNotFoundException ce) {
+	    // Skip nonexistent classes
+	} catch (NoSuchMethodException me) {
+	    System.out.println(className + ": no declared getContents()");
+	}
+	return err;
+    }
+
+    static String getResourceName(String base, Locale locale) {
+	if (locale.equals(ROOT)) {
+	    return base;
+	}
+	StringBuilder sb = new StringBuilder(base);
+	sb.append('_').append(locale.getLanguage());
+	if (locale.getCountry().length() > 0
+	    || locale.getVariant().length() > 0) {
+	    sb.append('_').append(locale.getCountry());
+	}
+	if (locale.getVariant().length() > 0) {
+	    sb.append('_').append(locale.getVariant());
+	}
+	return sb.toString();
+    }	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6299235Test.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,62 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Bug6299235Test.java	1.3 07/04/09
+ */
+import java.io.File;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import sun.util.CoreResourceBundleControl;
+
+/*
+ * After introducing CoreResourceBundleControl for Awt/Swing resources
+ * loading, non-existent resources won't be actually searched from
+ * bootclasspath and extension directory. But we should still fallback
+ * to the current behavior which allows the third-part to provide their
+ * own version of awt resources, for example even though we never claim
+ * we support it yet.
+ * Look into bug 6299235 for more details.
+ */
+
+public class Bug6299235Test {
+
+    public static void main(String args[]) throws Exception {
+	/* Try to load "sun.awt.resources.awt_ru_RU.properties which
+	 * is in awtres.jar.
+	 */
+	ResourceBundle russionAwtRes = ResourceBundle.getBundle("sun.awt.resources.awt",
+								new Locale("ru", "RU"),
+								CoreResourceBundleControl.getRBControlInstance());
+
+	/* If this call throws MissingResourceException, the test fails. */
+	if (russionAwtRes != null) {
+	    String result = russionAwtRes.getString("foo");
+	    if (result.equals("bar")) {
+		System.out.println("Bug6299235Test passed");
+	    } else {
+		System.err.println("Bug6299235Test failed");
+		throw new Exception("Resource found, but value of key foo is not correct\n");
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6299235Test.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,86 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#!/bin/sh
+#
+# @test @(#)Bug6299235Test.sh	1.2 07/04/09
+# @bug 6299235
+# @summary test Bug 6299235 to make sure the third-party provided sun resources could be picked up.
+# @build Bug6299235Test
+# @run shell Bug6299235Test.sh
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+  SunOS | Linux )
+    PATHSEP=":"
+    FILESEP="/"
+    ;;
+  Windows* )
+    PATHSEP=";"
+    FILESEP="\\"
+    ;;
+  * )
+    echo "${OS} is unrecognized system!"
+    exit 1;
+    ;;
+esac
+
+if [ -z "${TESTSRC}" ]; then
+  echo "TESTSRC undefined: defaulting to ."
+  TESTSRC=.
+fi
+
+if [ -z "${TESTJAVA}" ]; then
+  echo "TESTJAVA undefined: can't continue."
+  exit 1
+fi
+
+# See if TESTJAVA points to JRE or JDK
+if [ -d "${TESTJAVA}${FILESEP}jre" ]; then
+    JRE_EXT_DIR=${TESTJAVA}${FILESEP}jre${FILESEP}lib${FILESEP}ext
+else
+    JRE_EXT_DIR=${TESTJAVA}${FILESEP}lib${FILESEP}ext
+fi
+
+if [ -d "${JRE_EXT_DIR}" ]; then
+    NEW_EXT_DIR=${JRE_EXT_DIR}${PATHSEP}${TESTSRC}
+else
+    NEW_EXT_DIR=${TESTSRC}
+fi
+
+echo "TESTJAVA=${TESTJAVA}"
+echo "TESTSRC=${TESTSRC}"
+echo "TESTCLASSES=${TESTCLASSES}"
+echo "NEW_EXT_DIR=${NEW_EXT_DIR}"
+
+cd ${TESTSRC}
+
+${TESTJAVA}/bin/java -cp ${TESTCLASSES} -Djava.ext.dirs=${NEW_EXT_DIR} Bug6299235Test
+
+if [ $? -ne 0 ]
+    then
+      echo "Test fails: exception thrown!"
+      exit 1
+fi
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6355009.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,51 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 6355009
+ * @summary Make sure not to have too many causes for MissingResourceException
+ */
+
+import java.util.ResourceBundle;
+import java.util.MissingResourceException;
+
+public final strictfp class Bug6355009 {
+    private final ResourceBundle bundle = ResourceBundle.getBundle(Bug6355009.class.getName());
+    
+    public final static void main(String[] args) {
+    	try {
+	    new Bug6355009();
+	} catch (MissingResourceException e) {
+	    Throwable cause = e;
+	    int count = 0;
+	    while ((cause = cause.getCause()) != null) {
+		if (cause instanceof MissingResourceException) {
+		    count++;
+		}
+	    }
+	    if (count > 0) {
+	    	throw new RuntimeException("too many causes: " + count);
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6356571.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,47 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 6356571
+ * @summary Make sure that non-ResourceBundle classes are ignored and
+ * properties files are loaded correctly.
+ */
+
+import java.util.ResourceBundle;
+
+public class Bug6356571 {
+    // Bug6356571.class is not a ResourceBundle class, so it will be
+    // ignored and Bug6356571.properties will be loaded.
+    private ResourceBundle bundle = ResourceBundle.getBundle("Bug6356571");
+
+    void check() {
+	String id = bundle.getString("id");
+	if (!"6356571".equals(id)) {
+	    throw new RuntimeException("wrong id: " + id);
+	}
+    }
+
+    public final static void main(String[] args) {
+        new Bug6356571().check();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6356571.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,25 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# 1.2 07/04/09
+
+id=6356571
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Bug6359330.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,51 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 6359330
+ * @summary Make sure that getBundle doesn't cause a security error
+ * with a security manager when instantialing RBClassLoader (internal
+ * classloader).
+ */
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.SAXNotRecognizedException;
+
+public class Bug6359330 {
+
+    public static void main(String[] args) throws Throwable {
+	System.setSecurityManager(new SecurityManager());
+	try {
+	    SAXParserFactory spf = SAXParserFactory.newInstance();
+	    spf.setNamespaceAware(true);
+	    spf.setValidating(true);
+	    SAXParser sp = spf.newSAXParser();
+	    // The following line shouldn't throw a
+	    // java.security.AccessControlException.
+	    sp.setProperty("foo", "bar");
+	} catch (SAXNotRecognizedException e) {
+	    // Ignore this expected exception.
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/AbstractRB.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,35 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)AbstractRB.java	1.2 07/04/09
+ */
+
+import java.util.*;
+
+public abstract class AbstractRB extends ListResourceBundle {
+    public Object[][] getContents() {
+	return new Object[][] {
+	    { "type", "class (abstract)" }
+	};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/BadControlsTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,111 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 5102289
+ * @summary Test if ResourceBundle.getBundle detects bad Control implementations.
+ */
+
+import java.io.*;
+import java.util.*;
+import static java.util.ResourceBundle.Control.*;
+
+public class BadControlsTest {
+    public static void main(String[] args) {
+	ResourceBundle.Control control;
+
+	control = new ResourceBundle.Control() {
+		public List<String> getFormats(String name) {
+		    return null;
+		}
+	    };
+	testControl(control, "getFormats returns null");
+
+	control = new ResourceBundle.Control() {
+		public List<String> getFormats(String name) {
+		    return Arrays.asList("java.class", null, "java.properties");
+		}
+	    };
+	testControl(control, "getFormats returns a List containing null");
+
+	control = new ResourceBundle.Control() {
+		public List<Locale> getCandidateLocales(String name, Locale loc) {
+		    return null;
+		}
+	    };
+	testControl(control, "getCandidateLocales returns null");
+
+	control = new ResourceBundle.Control() {
+		public List<Locale> getCandidateLocales(String name, Locale loc) {
+		    return Arrays.asList(Locale.US, null, Locale.ENGLISH);
+		}
+	    };
+	testControl(control, "getCandidateLocales returns a List containing null");
+
+	long[] badTtls = {
+	    TTL_NO_EXPIRATION_CONTROL - 1,
+	    -10000,
+	    Long.MIN_VALUE
+	};
+	for (final long ttl : badTtls) {
+	    control = new ResourceBundle.Control() {
+		    public long getTimeToLive(String name, Locale loc) {
+			return ttl;
+		    }
+		};
+	    testControl(control, "getTimeToLive returns " + ttl);
+	}
+
+	control = new ResourceBundle.Control() {
+		public String toBundleName(String name, Locale loc) {
+		    return null;
+		}
+	    };
+	try {
+	    ResourceBundle rb = ResourceBundle.getBundle("StressOut", control);
+	    throw new RuntimeException("toBundleName returns null");
+	} catch (MissingResourceException e) {
+	    if (!(e.getCause() instanceof NullPointerException)) {
+		throw new RuntimeException("toBundleName returns null. The cause isn't NPE.");
+	    }
+	}
+
+	// null Control tests
+	control = null;
+	try {
+	    ResourceBundle rb = ResourceBundle.getBundle("StressOut", control);
+	    throw new RuntimeException("getBundle doesn't throw NPE with null Control");
+	} catch (NullPointerException e) {
+	    // OK
+	}
+    }
+
+    private static void testControl(ResourceBundle.Control control, String testTitle) {
+	try {
+	    ResourceBundle rb = ResourceBundle.getBundle("StressOut", control);
+	    throw new RuntimeException(testTitle);
+	} catch (IllegalArgumentException e) {
+	    System.out.println(testTitle + ": PASSED (" + e.getMessage() + ")");
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/BadStaticInitRB.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,41 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)BadStaticInitRB.java	1.2 07/04/09
+ */
+
+import java.util.*;
+
+public class BadStaticInitRB extends ListResourceBundle {
+    // Must have an error in this static initializer
+    static {
+	int[] x = new int[1];
+	x[100] = 100;
+    }
+
+    public Object[][] getContents() {
+	return new Object[][] {
+	    { "type", "class (static initializer error)" }
+	};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/Bug6530694.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,48 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * @test @(#)Bug6530694.java	1.1 07/03/14
+ * @bug 6530694
+ * @summary Checks that sun.util.CoreResourceBundleControl does not apply
+ *     to the application provided Swing resources.
+ * @run main/othervm Bug6530694
+ */
+
+import java.util.Locale;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+
+public class Bug6530694 {
+    Bug6530694() {
+        Locale.setDefault(Locale.GERMANY);
+        UIDefaults defs = UIManager.getDefaults();
+        defs.addResourceBundle("Bug6530694");
+        String str = defs.getString("testkey");
+        if (!"testvalue".equals(str)) {
+            throw new RuntimeException("Could not load the resource for de_DE locale");
+        }
+    }
+
+    public static void main(String[] args) {
+        new Bug6530694();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/Bug6530694_de_DE.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+testkey=testvalue
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/Chinese.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)Chinese.properties	1.2 07/04/09
+#
+
+data=root
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/Chinese_zh.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)Chinese_zh.properties	1.2 07/04/09
+#
+
+data=zh
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/Chinese_zh_CN.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)Chinese_zh_CN.properties	1.2 07/04/09
+#
+
+# Empty
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/Chinese_zh_TW.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)Chinese_zh_TW.properties	1.2 07/04/09
+#
+
+# Empty
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/ControlFactoryTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,165 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 5102289
+ * @summary Test the ResourceBundle.Control factory methods.
+ */
+
+import java.util.*;
+import static java.util.ResourceBundle.Control.*;
+
+public class ControlFactoryTest {
+
+    /**
+     * An interface for calling ResourceBundle.Control.getControl or
+     * ResourceBundle.Control.getNoFallbackControl.
+     */
+    private static interface Factory {
+	public ResourceBundle.Control getControl(List<String> formats);
+	public String name();
+    }
+
+    static int errors;
+
+    public static void main(String[] args) {
+	// Test getControl.
+	testControlFactory(new Factory() {
+		public ResourceBundle.Control getControl(List<String> formats) {
+		    return ResourceBundle.Control.getControl(formats);
+		}
+		public String name() { return "getControl"; }
+	    }, Locale.getDefault());
+
+	// Test getNoFallbackControl.
+	testControlFactory(new Factory() {
+		public ResourceBundle.Control getControl(List<String> formats) {
+		    return ResourceBundle.Control.getNoFallbackControl(formats);
+		}
+		public String name() { return "getNoFallbackControl"; }
+	    }, null);
+
+	if (errors > 0) {
+	    throw new RuntimeException("FAILED: " + errors + " error(s)");
+	}
+    }
+
+    private static void testControlFactory(Factory factory, Locale loc) {
+	testGetControl(factory, loc, FORMAT_DEFAULT, "java.class", "java.properties");
+	testGetControl(factory, loc, FORMAT_CLASS, "java.class");
+	testGetControl(factory, loc, FORMAT_PROPERTIES, "java.properties");
+
+	// test IllegalArgumentException
+	String[][] data = {
+	    { "java.class", "java.properties", "java.xml" },
+	    { "java.class", "java.props" },
+	    { "java.properties", "java.class" },
+	    { "java.foo", "java.properties" },
+	    { "java.foo" },
+	    { null },
+	};
+	for (String[] fmts : data) {
+	    try {
+		List<String> fmt = Arrays.asList(fmts);
+		ResourceBundle.Control control = factory.getControl(fmt);
+		error("getControl: %s%n", fmt);
+	    } catch (IllegalArgumentException e) {
+	    }
+	}
+
+	// test NPE
+	try {
+	    ResourceBundle.Control control = factory.getControl(null);
+	    error("%s: doesn't throw NPE.%n", factory.name());
+	} catch (NullPointerException npe) {
+	}
+    }
+
+    private static void testGetControl(Factory factory,
+				       Locale loc,
+				       final List<String> FORMATS,
+				       String... fmtStrings) {
+	final ResourceBundle.Control CONTROL = factory.getControl(FORMATS);
+	List<String> fmt = CONTROL.getFormats("any");
+	if (fmt != FORMATS) {
+	    error("%s: returns %s, expected %s.%n",
+		  factory.name(), fmt, FORMATS);
+	}
+	ResourceBundle.Control control = null;
+
+	// Check if getControl always returns the expected singleton.
+	for (int i = 0; i < 10; i++) {
+	    fmt = Arrays.asList(fmtStrings);
+	    control = factory.getControl(fmt);
+	    if (control != CONTROL) {
+		error("%s: doesn't return the singleton: got %s, expected %s%n",
+		      factory.name(), control, CONTROL);
+	    }
+	}
+
+	// Check if getFallbackLocale performs as expected.
+	Locale defaultLocale = Locale.getDefault();
+	Locale nonDefaultLocale = defaultLocale.equals(Locale.US) ? Locale.JAPAN : Locale.US;
+	if (loc != null) {
+	    // Test ResourceBundle.Control.getControl()
+	    Locale l = CONTROL.getFallbackLocale("any", nonDefaultLocale);
+	    if (!defaultLocale.equals(l)) {
+		error("%s: getFallbackLocale doesn't return default locale. got %s, expected %s%n",
+		      factory.name(), toString(l), toString(defaultLocale));
+	    }
+	    l = CONTROL.getFallbackLocale("any", defaultLocale);
+	    if (l != null) {
+		error("%s: getFallbackLocale doesn't return null. got %s%n",
+		      factory.name(), toString(l));
+	    }
+	} else {
+	    // Test ResourceBundle.Control.getNoFallbackControl()
+	    Locale l = CONTROL.getFallbackLocale("any", nonDefaultLocale);
+	    if (l != null) {
+		error("%s: getFallbackLocale doesn't return null. got %s%n",
+		      factory.name(), toString(l));
+	    }
+	    l = CONTROL.getFallbackLocale("any", defaultLocale);
+	    if (l != null) {
+		error("%s: getFallbackLocale doesn't return null. got %s%n",
+		      factory.name(), toString(l));
+	    }
+	}
+    }
+
+    private static String toString(Locale loc) {
+	if (loc == null)
+	    return "null";
+	return "\"" + loc.getLanguage() + "_" + loc.getCountry() + "_" + loc.getVariant() + "\"";
+    }
+
+    private static void error(String msg) {
+	System.out.println(msg);
+	errors++;
+    }
+
+    private static void error(String fmt, Object... args) {
+	System.out.printf(fmt, args);
+	errors++;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/DefaultControlTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,443 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.4 07/04/09
+ * @bug 5102289 6278334
+ * @summary Test the default Control implementation. The expiration
+ * functionality of newBundle, getTimeToLive, and needsReload is
+ * tested by ExpirationTest.sh. The factory methods are tested
+ * separately.
+ * @build TestResourceRB
+ * @build NonResourceBundle
+ * @run main DefaultControlTest
+ */
+
+import java.util.*;
+import static java.util.ResourceBundle.Control.*;
+
+public class DefaultControlTest {
+    // The ResourceBundle.Control instance
+    static final ResourceBundle.Control CONTROL
+	= ResourceBundle.Control.getControl(FORMAT_DEFAULT);
+
+    static final ResourceBundle BUNDLE = new ResourceBundle() {
+	    public Enumeration<String> getKeys() { return null; }
+	    protected Object handleGetObject(String key) { return null; }
+	};
+
+    static final String CLAZZ = FORMAT_CLASS.get(0);
+
+    static final String PROPERTIES = FORMAT_PROPERTIES.get(0);
+
+    static final ClassLoader LOADER = DefaultControlTest.class.getClassLoader();
+
+    // Full arguments for NPE testing
+    static final Object[] FULLARGS = { "any",
+				       Locale.US,
+				       FORMAT_PROPERTIES.get(0),
+				       LOADER,
+				       BUNDLE };
+
+    static int errors;
+
+    public static void main(String[] args) {
+	checkConstants();
+
+	// Test getFormats(String)
+	testGetFormats();
+
+	// Test getCandidateLocales(String, Locale)
+	testGetCandidateLocales();
+
+	// Test getFallbackLocale(String, Locale)
+	testGetFallbackLocale();
+
+	// Test newBundle(String, Locale, String, ClassLoader, boolean)
+	testNewBundle();
+
+	// Test toBundleName(String, Locale)
+	testToBundleName();
+
+	// Test getTimeToLive(String, Locale)
+	testGetTimeToLive();
+
+	// Test needsReload(String, Locale, String, ClassLoader,
+	//                  ResourceBundle, long)
+	testNeedsReload();
+
+	// Test toResourceName(String, String)
+	testToResourceName();
+
+	if (errors > 0) {
+	    throw new RuntimeException("FAILED: " + errors + " error(s)");
+	}
+    }
+
+    private static void checkConstants() {
+	// Check FORMAT_*
+	if (!CONTROL.FORMAT_DEFAULT.equals(Arrays.asList("java.class",
+							"java.properties"))) {
+	    error("Wrong Control.FORMAT_DEFAULT");
+	}
+	checkImmutableList(CONTROL.FORMAT_DEFAULT);
+	if (!CONTROL.FORMAT_CLASS.equals(Arrays.asList("java.class"))) {
+	    error("Wrong Control.FORMAT_CLASS");
+	}
+	checkImmutableList(CONTROL.FORMAT_CLASS);
+	if (!CONTROL.FORMAT_PROPERTIES.equals(Arrays.asList("java.properties"))) {
+	    error("Wrong Control.FORMAT_PROPERTIES");
+	}
+	checkImmutableList(CONTROL.FORMAT_PROPERTIES);
+
+	// Check TTL_*
+	if (CONTROL.TTL_DONT_CACHE != -1) {
+	    error("Wrong Control.TTL_DONT_CACHE: %d%n", CONTROL.TTL_DONT_CACHE);
+	}
+	if (CONTROL.TTL_NO_EXPIRATION_CONTROL != -2) {
+	    error("Wrong Control.TTL_NO_EXPIRATION_CONTROL: %d%n",
+		  CONTROL.TTL_NO_EXPIRATION_CONTROL);
+	}
+    }
+
+    private static void checkImmutableList(List<String> list) {
+	try {
+	    list.add("hello");
+	    error("%s is mutable%n", list);
+	} catch (UnsupportedOperationException e) {
+	}
+    }
+
+    private static void testGetFormats() {
+	List<String> list = CONTROL.getFormats("foo");
+	if (list != CONTROL.FORMAT_DEFAULT) {
+	    error("getFormats returned " + list);
+	}
+	try {
+	    list = CONTROL.getFormats(null);
+	    error("getFormats doesn't throw NPE.");
+	} catch (NullPointerException e) {
+	}
+    }
+
+    private static void testGetCandidateLocales() {
+	Map<Locale, Locale[]> candidateData = new HashMap<Locale, Locale[]>();
+	candidateData.put(new Locale("ja", "JP", "YOK"), new Locale[] {
+			      new Locale("ja", "JP", "YOK"),
+			      new Locale("ja", "JP"),
+			      new Locale("ja"),
+			      new Locale("") });
+	candidateData.put(new Locale("ja", "JP"), new Locale[] {
+			      new Locale("ja", "JP"),
+			      new Locale("ja"),
+			      new Locale("") });
+	candidateData.put(new Locale("ja"), new Locale[] {
+			      new Locale("ja"),
+			      new Locale("") });
+
+	candidateData.put(new Locale("ja", "", "YOK"), new Locale[] {
+			      new Locale("ja", "", "YOK"),
+			      new Locale("ja"),
+			      new Locale("") });
+	candidateData.put(new Locale("", "JP", "YOK"), new Locale[] {
+			      new Locale("", "JP", "YOK"),
+			      new Locale("", "JP"),
+			      new Locale("") });
+	candidateData.put(new Locale("", "", "YOK"), new Locale[] {
+			      new Locale("", "", "YOK"),
+			      new Locale("") });
+	candidateData.put(new Locale("", "JP"), new Locale[] {
+			      new Locale("", "JP"),
+			      new Locale("") });
+	candidateData.put(new Locale(""), new Locale[] {
+			      new Locale("") });
+
+	for (Locale locale : candidateData.keySet()) {
+	    List<Locale> candidates = CONTROL.getCandidateLocales("any", locale);
+	    List<Locale> expected = Arrays.asList(candidateData.get(locale));
+	    if (!candidates.equals(expected)) {
+		error("Wrong candidates for %s: got %s, expected %s%n",
+		      toString(locale), candidates, expected);
+	    }
+	}
+	final int NARGS = 2;
+	for (int mask = 0; mask < (1 << NARGS)-1; mask++) {
+	    Object[] data = getNpeArgs(NARGS, mask);
+	    try {
+		List<Locale> candidates = CONTROL.getCandidateLocales((String) data[0],
+								      (Locale) data[1]);
+		error("getCandidateLocales(%s, %s) doesn't throw NPE.%n",
+		      data[0], toString((Locale)data[1]));
+	    } catch (NullPointerException e) {
+	    }
+	}
+    }
+
+    private static void testGetFallbackLocale() {
+	Locale current = Locale.getDefault();
+	Locale.setDefault(Locale.ITALY);
+	try {
+	    Locale loc = CONTROL.getFallbackLocale("any", Locale.FRANCE);
+	    if (loc != Locale.ITALY) {
+		error("getFallbackLocale: got %s, expected %s%n",
+		      toString(loc), toString(Locale.ITALY));
+	    }
+	    loc = CONTROL.getFallbackLocale("any", Locale.ITALY);
+	    if (loc != null) {
+		error("getFallbackLocale: got %s, expected null%n", toString(loc));
+	    }
+	} finally {
+	    Locale.setDefault(current);
+	}
+
+	final int NARGS = 2;
+	for (int mask = 0; mask < (1 << NARGS)-1; mask++) {
+	    Object[] data = getNpeArgs(NARGS, mask);
+	    try {
+		Locale loc = CONTROL.getFallbackLocale((String) data[0], (Locale) data[1]);
+		error("getFallbackLocale(%s, %s) doesn't throw NPE.%n", data[0], data[1]);
+	    } catch (NullPointerException e) {
+	    }
+	}
+    }
+
+    private static void testNewBundle() {
+	int testNo = 0;
+	ResourceBundle rb = null;
+	try {
+	    testNo = 1;
+	    rb = CONTROL.newBundle("StressOut", Locale.JAPANESE,
+				   PROPERTIES, LOADER, false);
+	    String s = rb.getString("data");
+	    if (!s.equals("Japan")) {
+		error("newBundle: #%d got %s, expected Japan%n", testNo, s);
+	    }
+
+	    testNo = 2;
+	    rb = CONTROL.newBundle("TestResourceRB", new Locale(""),
+				   CLAZZ, LOADER, false);
+	    s = rb.getString("type");
+	    if (!s.equals(CLAZZ)) {
+		error("newBundle: #%d got %s, expected %s%n", testNo, s, CLAZZ);
+	    }
+	} catch (Throwable e) {
+	    error("newBundle: #%d threw %s%n", testNo, e);
+	    e.printStackTrace();
+	}
+
+	// Test exceptions
+
+	try {
+	    // MalformedDataRB contains an invalid Unicode notation which
+	    // causes to throw an IllegalArgumentException.
+	    rb = CONTROL.newBundle("MalformedDataRB", Locale.ENGLISH,
+				   PROPERTIES, LOADER, false);
+	    error("newBundle: doesn't throw IllegalArgumentException with malformed data.");
+	} catch (IllegalArgumentException iae) {
+	} catch (Exception e) {
+	    error("newBundle: threw %s%n", e);
+	}
+
+	try {
+	    rb = CONTROL.newBundle("StressOut", Locale.JAPANESE,
+				   "foo.bar", LOADER, false);
+	    error("newBundle: doesn't throw IllegalArgumentException with invalid format.");
+	} catch (IllegalArgumentException iae) {
+	} catch (Exception e) {
+	    error("newBundle: threw %s%n", e);
+	}
+
+	try {
+	    rb = CONTROL.newBundle("NonResourceBundle", new Locale(""),
+				   "java.class", LOADER, false);
+	    error("newBundle: doesn't throw ClassCastException with a non-ResourceBundle subclass.");
+	} catch (ClassCastException cce) {
+	} catch (Exception e) {
+	    error("newBundle: threw %s%n", e);
+	}
+
+	// NPE test
+	final int NARGS = 4;
+	for (int mask = 0; mask < (1 << NARGS)-1; mask++) {
+	    Object[] data = getNpeArgs(NARGS, mask);
+	    Locale loc = (Locale) data[1];
+	    try {
+		rb = CONTROL.newBundle((String) data[0], loc,
+				       (String) data[2], (ClassLoader) data[3],
+				       false);
+		error("newBundle(%s, %s, %s, %s, false) doesn't throw NPE.%n",
+		      data[0], toString(loc), data[2], data[3]);
+	    } catch (NullPointerException npe) {
+	    } catch (Exception e) {
+		error("newBundle(%s, %s, %s, %s, false) threw %s.%n",
+		      data[0], toString(loc), data[2], data[3], e);
+	    }
+	}
+    }
+
+    private static void testGetTimeToLive() {
+	long ttl = CONTROL.getTimeToLive("any", Locale.US);
+	if (ttl != CONTROL.TTL_NO_EXPIRATION_CONTROL) {
+	    error("getTimeToLive: got %d, expected %d%n", ttl,
+		  CONTROL.TTL_NO_EXPIRATION_CONTROL);
+	}
+	final int NARGS = 2;
+	for (int mask = 0; mask < (1 << NARGS)-1; mask++) {
+	    Object[] data = getNpeArgs(NARGS, mask);
+	    try {
+		ttl = CONTROL.getTimeToLive((String) data[0], (Locale) data[1]);
+		error("getTimeToLive(%s, %s) doesn't throw NPE.%n", data[0], data[1]);
+	    } catch (NullPointerException e) {
+	    }
+	}
+    }
+
+    // The functionality of needsReload is tested by
+    // ExpirationTest.sh. Only parameter checking is tested here.
+    private static void testNeedsReload() {
+	long loadTime = System.currentTimeMillis();
+
+	// NPE test
+	final int NARGS = 5;
+	for (int mask = 0; mask < (1 << NARGS)-1; mask++) {
+	    Object[] data = getNpeArgs(NARGS, mask);
+	    Locale loc = (Locale) data[1];
+	    try {
+		boolean b = CONTROL.needsReload((String) data[0], loc,
+						(String) data[2], (ClassLoader) data[3],
+						(ResourceBundle) data[4], loadTime);
+		error("needsReload(%s, %s, %s, %s, %s, loadTime) doesn't throw NPE.%n",
+		      data[0], toString(loc), data[2], data[3], data[4]);
+	    } catch (NullPointerException e) {
+	    }
+	}
+    }
+
+    private static void testToBundleName() {
+	final String name = "J2SE";
+	Map<Locale, String> bundleNames = new HashMap<Locale, String>();
+	bundleNames.put(new Locale("ja", "JP", "YOK"),
+			name + "_" + "ja" + "_" + "JP" + "_" + "YOK");
+	bundleNames.put(new Locale("ja", "JP"),
+			name + "_" + "ja" + "_" + "JP");
+	bundleNames.put(new Locale("ja"),
+			name + "_" + "ja");
+	bundleNames.put(new Locale("ja", "", "YOK"),
+			name + "_" + "ja" + "_" + "" + "_" + "YOK");
+	bundleNames.put(new Locale("", "JP", "YOK"),
+			name + "_" + "" + "_" + "JP" + "_" + "YOK");
+	bundleNames.put(new Locale("", "", "YOK"),
+			name + "_" + "" + "_" + "" + "_" + "YOK");
+	bundleNames.put(new Locale("", "JP"),
+			name + "_" + "" + "_" + "JP");
+	bundleNames.put(new Locale(""),
+			name);
+
+	for (Locale locale : bundleNames.keySet()) {
+	    String bn = CONTROL.toBundleName(name, locale);
+	    String expected = bundleNames.get(locale);
+	    if (!bn.equals(expected)) {
+		error("toBundleName: got %s, expected %s%n", bn, expected);
+	    }
+	}
+
+	final int NARGS = 2;
+	for (int mask = 0; mask < (1 << NARGS)-1; mask++) {
+	    Object[] data = getNpeArgs(NARGS, mask);
+	    try {
+		String s = CONTROL.toBundleName((String) data[0], (Locale) data[1]);
+		error("toBundleName(%s, %s) doesn't throw NPE.%n", data[0], data[1]);
+	    } catch (NullPointerException e) {
+	    }
+	}
+    }
+
+    private static void testToResourceName() {
+	String[][] names = {
+	    // bundleName,   suffix, expected result
+	    { "com.sun.J2SE", "xml", "com/sun/J2SE.xml" },
+	    { ".J2SE", "xml", "/J2SE.xml" },
+	    { "J2SE", "xml", "J2SE.xml" },
+	    { "com/sun/J2SE", "xml", "com/sun/J2SE.xml" },
+	    { "com.sun.J2SE", "", "com/sun/J2SE." },
+	    { ".", "", "/." },
+	    { "", "", "." },
+
+	    // data for NPE tests
+	    { null, "any", null },
+	    { "any", null, null },
+	    { null, null, null },
+	    };
+
+	for (String[] data : names) {
+	    String result = null;
+	    boolean npeThrown = false;
+	    try {
+		result = CONTROL.toResourceName(data[0], data[1]);
+	    } catch (NullPointerException npe) {
+		npeThrown = true;
+	    }
+	    String expected = data[2];
+	    if (expected != null) {
+		if (!result.equals(expected)) {
+		    error("toResourceName: got %s, expected %s%n", result, data[2]);
+		}
+	    } else {
+		if (!npeThrown) {
+		    error("toResourceName(%s, %s) doesn't throw NPE.%n", data[0], data[1]);
+		}
+	    }
+	}
+    }
+
+    /**
+     * Produces permutations argument data that contains at least one
+     * null.
+     */
+    private static Object[] getNpeArgs(int length, int mask) {
+	Object[] data = new Object[length];
+	for (int i = 0; i < length; i++) {
+	    if ((mask & (1 << i)) == 0) {
+		data[i] = null;
+	    } else {
+		data[i] = FULLARGS[i];
+	    }
+	}
+	return data;
+    }
+
+    private static String toString(Locale loc) {
+	if (loc == null)
+	    return "null";
+	return "\"" + loc.getLanguage() + "_" + loc.getCountry() + "_" + loc.getVariant() + "\"";
+    }
+
+    private static void error(String msg) {
+	System.out.println(msg);
+	errors++;
+    }
+
+    private static void error(String fmt, Object... args) {
+	System.out.printf(fmt, args);
+	errors++;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/ExpirationTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,176 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)ExpirationTest.java	1.3 07/04/09
+ */
+
+/*
+ * This class is used by ExpirationTest.sh. See the timing information in
+ * the shell script.
+ */
+
+import java.util.*;
+
+public class ExpirationTest {
+    static final Locale AUSTRIA = new Locale("de", "AT");
+    static String format;
+    static String fileType;
+
+    public static void main(String[] args) {
+	// If -latency is specified, try sleeping for 3 seconds 3
+	// times to see its latency. If the latency is too large, then
+	// the program exits with 2. (See sleep())
+	if ("-latency".equals(args[0])) {
+	    System.out.print("Checking latency... ");
+	    for (int i = 0; i < 3; i++) {
+		sleep(3);
+	    }
+	    System.out.println("done");
+	    System.exit(0);
+	}
+
+	format = args[0];
+	fileType = args[1];
+
+	Locale loc = Locale.getDefault();
+	try {
+	    Locale.setDefault(Locale.JAPAN);
+	    ResourceBundle.Control control = new TestControl();
+	    ResourceBundle rb = ResourceBundle.getBundle("ExpirationData", Locale.GERMAN,
+							 control);
+	    check(rb.getString("data"), "German");
+
+	    rb = ResourceBundle.getBundle("ExpirationData", AUSTRIA, control);
+	    check(rb.getString("january"), "Januar");
+
+	    // Wait until the instance gets expired in the cache in 7 seconds.
+	    sleep(7);
+
+	    // At this point, it should be determined that reloading is not needed.
+	    rb = ResourceBundle.getBundle("ExpirationData", Locale.GERMAN, control);
+	    check(rb.getString("data"), "German");
+
+	    rb = ResourceBundle.getBundle("ExpirationData", AUSTRIA, control);
+	    check(rb.getString("january"), "Januar");
+
+	    // Wait until the instance in the cache gets expired again and
+	    // ExpirationData_de gets updated.
+	    // 33 = 40 - 7 (See the timing chart in ExpirationTest.sh)
+	    sleep(33);
+
+	    // At this point, getBundle must reload the updated
+	    // ExpirationData_de and ExpirationData_de_AT must be
+	    // avaible.
+
+	    rb = ResourceBundle.getBundle("ExpirationData", Locale.GERMAN, control);
+	    try {
+		check(rb.getString("data"), "Deutsch");
+	    } catch (RuntimeException e) {
+		if (format.equals("class")) {
+		    // Class loader doesn't load updated classes.
+		    System.out.println("Known class limitation: " + e.getMessage());
+		}
+	    }
+
+	    rb = ResourceBundle.getBundle("ExpirationData", AUSTRIA, control);
+	    try {
+		check(rb.getString("january"), "J\u00e4nner");
+	    } catch (RuntimeException e) {
+		if (fileType.equals("jar")) {
+		    // Jar doesn't load new entries.
+		    System.out.println("Known jar limitation: " + e.getMessage());
+		} else {
+		    throw e;
+		}
+	    }
+	} finally {
+	    Locale.setDefault(loc);
+	}
+    }
+
+    private static void check(String s, String expected) {
+	String time = getTime();
+	if (!s.equals(expected)) {
+	    throw new RuntimeException("got '" + s + "', expected '" + expected + "' at "
+				       + time);
+	}
+	System.out.println("ExpirationTest: got '" + s + "' at " + time);
+    }
+
+    private static void sleep(int seconds) {
+	long millis = seconds * 1000;
+	long start = System.currentTimeMillis();
+	try {
+	    Thread.sleep(millis);
+	} catch (InterruptedException e) {
+	}
+	long end = System.currentTimeMillis();
+	long latency = end - start - millis;
+	// If the latecy is more than 1% of the requested sleep time,
+	// then give up the testing.
+	if (latency > millis/100) {
+	    System.err.printf("Latency is too large: slept for %d [ms], "
+			      + "expected %d [ms] latency rate: %+.2f%% (expected not more than 1%%)%n"
+			      + "exiting...%n",
+			      end - start, millis, (double)latency*100.0/millis);
+	    System.exit(2);
+	}
+    }
+
+    private static final String getTime() {
+	return new Date().toString().substring(11, 19);
+    }
+
+    private static class TestControl extends ResourceBundle.Control {
+	@Override
+	public long getTimeToLive(String name, Locale loc) {
+	    return 5000; // 5 seconds
+	}
+
+	@Override
+	public ResourceBundle newBundle(String name, Locale loc,
+					String fmt, ClassLoader cl, boolean reload)
+	    throws IllegalAccessException, InstantiationException, java.io.IOException {
+	    ResourceBundle bundle = super.newBundle(name, loc, fmt, cl, reload);
+	    if (bundle != null) {
+		System.out.println("newBundle: " + (reload ? "**re" : "")
+				   + "loaded '" + toName(name, loc , fmt) + "' at " + getTime());
+	    }
+	    return bundle;
+	}
+
+	@Override
+	public boolean needsReload(String name, Locale loc,
+				   String fmt, ClassLoader cl,
+				   ResourceBundle rb, long time) {
+	    boolean b = super.needsReload(name, loc, fmt, cl, rb, time);
+	    System.out.println("needsReload: '" + b + "' for " + toName(name, loc, fmt)
+			       + " at " + getTime());
+	    return b;
+	}
+
+	private String toName(String name, Locale loc, String fmt) {
+	    return toResourceName(toBundleName(name, loc), fmt.substring(5));
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/ExpirationTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,331 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @test 1.3 07/04/09
+# @bug 4212439 5102289 6272156
+# @summary Tests for expiration control and reloading expired resource bundles.
+# @build ExpirationTest
+# @run shell/timeout=300 ExpirationTest.sh
+
+#
+# Timings of the test sequence
+#
+# 0         5    7      10             20             40  [seconds]
+# +---------+----+------+------//------+------//------+--
+# g         X    g      X              U              g   [event]
+#
+#  0 g - java starts; the first getBundle call gets "German";
+#        sleep for 7 sec
+#  5 X - the bundle expires (every 5 seconds)
+#  7 g - java wakes up; the second getBundle call still gets "German";
+#        sleep for 33 sec
+# 10 X - the bundle expires in the cache
+# 20 U - shell script updates DE and add AT
+# 40 g - java wakes up; third getBundle call; gets "Deutsch"
+#
+# event: g - getBundle, X - eXpire, U - Update
+#
+#
+# ExpirationTest.java uses 3 exit values.
+#  0 - passed
+#  1 - failed
+#  2 - can't proceed due to slow platform
+#
+
+# Check environment variables
+if [ "x$TESTJAVA" = "x" ]; then
+    1>&2 echo "No TESTJAVA defined. exiting..."
+    exit 1
+fi
+
+# Make sure that this test is run in C locale
+LANG=C
+export LANG
+LC_ALL=
+export LC_ALL
+
+: ${TESTCLASSES:=.}
+
+# YES if the platform has %s support in date
+HAS_S=NO
+
+case "`uname`" in
+Windows*)
+    DEL=";"
+    ;;
+SunOS)
+    DEL=":"
+    ;;
+Linux)
+    DEL=":"
+    HAS_S=YES
+    ;;
+esac
+
+# Interval until resources are updated
+INTERVAL=20
+
+DATA=ExpirationData
+
+ROOT=${DATA}.properties
+JA=${DATA}_ja.properties
+DE=${DATA}_de.properties
+AT=${DATA}_de_AT.properties
+
+JARFILE=data.jar
+
+createProperties() {
+    rm -f ${DATA}*.properties
+    echo "data: English" > $ROOT
+    (echo "data: Japanese"; echo "january: 1gatsu") > $JA
+    (echo "data: German"; echo "january: Januar") > $DE
+    echo "Properties files have been created at `date +%T`"
+}
+
+createJar() {
+    if [ "$FORMAT" = "properties" ]; then
+	createProperties
+	F="${DATA}*.properties"
+    else
+	createClasses
+	F="-C classes ${ROOT}.class -C classes ${JA}.class -C classes ${DE}.class"
+    fi
+    ${TESTJAVA}/bin/jar cf $JARFILE $F
+    ${TESTJAVA}/bin/jar tvf $JARFILE
+    rm -f ${DATA}*.properties
+    echo "Jar created at `date +%T`"
+}
+
+createClasses() {
+    rm -f ${DATA}*.java
+    rm -rf classes
+    mkdir classes
+    createJava $ROOT English
+    createJava $JA Japanese
+    createJava $DE German Januar
+    ${TESTJAVA}/bin/javac -d classes ${ROOT}.java ${JA}.java ${DE}.java
+    echo "Created" classes/*.class "at `date +%T`"
+}
+
+createJava() {
+    (echo "
+import java.util.*;
+
+public class $1 extends ListResourceBundle {
+    public Object[][] getContents() {
+	return new Object[][] {
+	    { \"data\", \"$2\" },"
+    if [ "x$3" != "x" ]; then
+	echo "	    { \"january\", \"$3\" },"
+    fi
+echo "	};
+    }
+}") >$1.java
+}
+
+updateDEaddAT() {
+    rm -f $DE
+    (echo "data=Deutsch"; echo "january=Januar") > $DE
+    # add de_AT
+    echo "january=J\u00e4nner" > $AT
+    echo "Updated '"${DE}"' and added '"${AT}"' at `date +%T`"
+}
+
+updateClassDEaddClassAT() {
+    rm -f $DE.java classes/$DE.class
+    createJava $DE Deutsch Januar
+    ${TESTJAVA}/bin/javac -d classes ${DE}.java
+    createJava $AT Deutsch "J\\u00e4nner"
+    ${TESTJAVA}/bin/javac -d classes ${AT}.java
+    echo "Updated '"${DE}"' class and added '"${AT}"' class at `date +%T`"
+}
+
+updateJar() {
+    if [ "$FORMAT" = "properties" ]; then
+	updateDEaddAT
+	F="$DE $AT"
+    else
+	updateClassDEaddClassAT
+	F="-C classes ${DE}.class -C classes ${AT}.class"
+    fi
+    ${TESTJAVA}/bin/jar uf $JARFILE $F
+    rm -f $DE $AT
+    echo "Updated '"${JARFILE}"' at `date +%T`"
+    ${TESTJAVA}/bin/jar tvf $JARFILE
+}
+
+getSeconds() {
+    if [ "$HAS_S" = "YES" ]; then
+	date '+%s'
+    else
+	# Returns an approximation of the offset from the Epoch in
+	# seconds.
+	date -u '+%Y %j %H %M %S' | \
+	awk '{d=($1-1970)*365.2425; print int(((((((d+$2-1)*24)+$3)*60)+$3)*60)+$5);}'
+    fi
+}
+
+#
+# Execute $1 and check how long it takes
+#
+timedExec() {
+    S=`getSeconds`
+    eval $1
+    E=`getSeconds`
+    D=`expr $E - $S`
+    #
+    # If this machine is too slow, give up the further testing.
+    #
+    if [ "$D" -gt $2 ]; then
+	1>&2 echo "This machine took $D seconds to prepare test data," \
+		  "which is too slow to proceed. Exiting..."
+	exit 0
+    fi
+    unset S
+    unset E
+    unset D
+}
+
+checkStatus() {
+    if [ $1 = 0 ]; then
+	echo "$2: PASSED"
+    elif [ $1 != 2 ]; then
+	echo "$2: FAILED"
+	exit 1
+    else
+	# Just we should't proceed to avoid timing issues.
+	exit 0
+    fi
+}
+
+#
+# Before starting tests, check the latency with Thread.sleep().
+#
+${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}." ExpirationTest -latency
+STATUS=$?
+if [ $STATUS = 2 ]; then
+    exit 0
+fi
+
+#
+# Tests for properties
+#
+FORMAT=properties
+
+#
+# Test with plain files (properties)
+#
+echo "Starting test with properties files at `date +%T`"
+
+#
+# Creates properties files
+#
+timedExec createProperties 10
+
+#
+# Execute a child process which will update files in $INTERVAL seconds.
+#
+(sleep $INTERVAL; updateDEaddAT; exit 0) &
+
+${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}." ExpirationTest properties file
+STATUS=$?
+wait
+checkStatus $STATUS "Test with properties files"
+
+#
+# Test with jar file if jar is available (properties)
+#
+if [ -x ${TESTJAVA}/bin/jar ] || [ -x ${TESTJAVA}/bin/jar.exe ]; then
+    HASJAR=YES
+else
+    HASJAR=NO
+fi
+
+if [ $HASJAR = YES  ]; then
+    echo ""
+    echo "Starting test with a jar file (properties) at `date +%T`"
+
+    #
+    # Create a jar files with properties
+    #
+    timedExec createJar 10
+
+    (sleep $INTERVAL; updateJar; exit 0) &
+    ${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}${JARFILE}" ExpirationTest properties jar
+    STATUS=$?
+    wait
+    checkStatus $STATUS "Test with a jar file (properties)"
+fi
+
+#
+# Test for classes
+#
+
+# Note: class-based resource bundles can't be reloaded due to the
+# cache support in class loaders. So the results of the test cases
+# below are not checked. (Test cases always pass.)
+
+# If there's no javac available, then give up the test with
+# class-based properties.
+if [ ! -x ${TESTJAVA}/bin/javac ] && [ ! -x ${TESTJAVA}/bin/javac.exe ]; then
+    exit 0
+fi
+
+rm -f ${DATA}*.properties $JARFILE
+
+FORMAT=class
+ROOT=`basename $ROOT .properties`
+JA=`basename $JA .properties`
+DE=`basename $DE .properties`
+AT=`basename $AT .properties`
+
+echo ""
+echo "Starting test with class files at `date +%T`"
+
+#
+# Create class files
+#
+timedExec createClasses 10
+
+(sleep $INTERVAL; updateClassDEaddClassAT; exit 0) &
+${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}classes" ExpirationTest class file
+STATUS=$?
+wait
+checkStatus $STATUS "Test with class files"
+
+if [ $HASJAR = YES ]; then
+    echo ""
+    echo "Starting test with a jar file (class) at `date +%T`"
+
+    #
+    # Create a jar file with class files
+    #
+    timedExec createJar 10
+
+    (sleep $INTERVAL; updateJar; exit 0) &
+    ${TESTJAVA}/bin/java -cp "${TESTCLASSES}${DEL}${JARFILE}" ExpirationTest class jar
+    STATUS=$?
+    wait
+    checkStatus $STATUS "Test with a jar file (class)"
+fi
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/LoadingStrategiesTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,157 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.3 07/04/09
+ * @bug 4303146 5102289 6272060
+ * @summary Test non-standard loading strategies with ResourceBundle.Control subclasses
+ */
+
+import java.io.*;
+import java.util.*;
+
+public class LoadingStrategiesTest {
+
+    static int errors;
+
+    public static void main(String[] args) {
+	ResourceBundle rb;
+	String s;
+
+	// Test zh_TW -> root, zh_CN -> zh -> root
+	rb = ResourceBundle.getBundle("Chinese", Locale.TAIWAN, new ChineseControl());
+	s = rb.getString("data");
+	check("chinese with Locale.TAIWAN", s, "root");
+
+	rb = ResourceBundle.getBundle("Chinese", Locale.CHINA, new ChineseControl());
+	s = rb.getString("data");
+	check("chinese with Locale.CHINA", s, "zh");
+
+
+	// Test use of per-locale packaging
+	preparePerLocalePackageProperties();
+
+	rb = ResourceBundle.getBundle("test.package.Messages", Locale.US,
+				      new PerLocalePackageControl());
+	s = rb.getString("data");
+	check("Per-locale package with Locale.US", s, "");
+
+	rb = ResourceBundle.getBundle("test.package.Messages", Locale.GERMAN,
+				      new PerLocalePackageControl());
+	s = rb.getString("data");
+	check("Per-locale package with Locale.GERMAN", s, "de");
+
+	rb = ResourceBundle.getBundle("test.package.Messages", Locale.JAPAN,
+				      new PerLocalePackageControl());
+	s = rb.getString("data");
+	check("Per-locale package with Locale.JAPAN", s, "ja_JP");
+
+
+	// Check any errors
+	if (errors > 0) {
+	    throw new RuntimeException("FAILED: " + errors + " error(s)");
+	}
+    }
+
+    private static void check(String msg, String got, String expected) {
+	if (!got.equals(expected)) {
+	    error("%s: got \"%s\", expected \"%s\"%n", msg, got, expected);
+	}
+    }
+
+    private static class ChineseControl extends ResourceBundle.Control {
+	@Override
+	public List<Locale> getCandidateLocales(String baseName,
+						Locale locale) {
+	    if (locale.equals(Locale.TAIWAN)) {
+		return Arrays.asList(locale,
+				     // no Locale("zh")
+				     new Locale(""));
+	    }
+	    return super.getCandidateLocales(baseName, locale);
+	}
+    }
+
+    private static class PerLocalePackageControl extends ResourceBundle.Control {
+	@Override
+	public String toBundleName(String baseName, Locale locale) {
+	    if (baseName == null || locale == null) {
+	    	throw new NullPointerException();
+	    }
+	    String loc = super.toBundleName("", locale);
+	    if (loc.length() > 0) {
+		return baseName.replaceFirst("^([\\w\\.]+)\\.(\\w+)$",
+					     "$1." + loc.substring(1) + ".$2");
+	    }
+	    return baseName;
+	}
+
+	// Avoid fallback to the default locale (6272060)
+	@Override
+	public Locale getFallbackLocale(String baseName, Locale locale) {
+	    if (baseName == null || locale == null) {
+	    	throw new NullPointerException();
+	    }
+	    return null;
+	}
+    }
+
+    // Creates:
+    //     test/package/Messages.properties
+    //     test/package/de/Messages.properties
+    //     test/package/ja_JP/Messages.properties
+    private static void preparePerLocalePackageProperties() {
+	final String DEL = File.separator;
+	try {
+	    String dir = System.getProperty("test.classes", ".");
+	    String[] subdirs = { "", "de", "ja_JP" };
+	    for (String subdir : subdirs) {
+		StringBuilder sb = new StringBuilder();
+		sb.append(dir).append(DEL).append("test").append(DEL).append("package");
+		if (subdir.length() > 0) {
+		    sb.append(DEL).append(subdir);
+		}
+		File path = new File(sb.toString());
+		path.mkdirs();
+		File propsfile = new File(path, "Messages.properties");
+		OutputStream os = new FileOutputStream(propsfile);
+		Properties props = new Properties();
+		props.setProperty("data", subdir);
+		props.store(os, null);
+		System.out.println("Created: " + propsfile);
+		os.close();
+	    }
+	} catch (Exception e) {
+	    throw new RuntimeException("Can't set up per-locale properties", e);
+	}
+    }
+
+    private static void error(String msg) {
+	System.out.println(msg);
+	errors++;
+    }
+
+    private static void error(String fmt, Object... args) {
+	System.out.printf(fmt, args);
+	errors++;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/MalformedDataRB_en.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)MalformedDataRB_en.properties	1.2 07/04/09
+#
+
+data=\u001xyz
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/MissingResourceCauseTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,60 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)MissingResourceCauseTest.java	1.2 07/04/09
+ */
+
+import java.io.*;
+import java.util.*;
+
+public class MissingResourceCauseTest {
+    public static void main(String[] args) {
+	callGetBundle("NonResourceBundle", ClassCastException.class);
+	callGetBundle("MalformedDataRB", Locale.ENGLISH, IllegalArgumentException.class);
+	callGetBundle("PrivateConstructorRB", IllegalAccessException.class);
+	callGetBundle("AbstractRB", InstantiationException.class);
+	callGetBundle("BadStaticInitRB", ExceptionInInitializerError.class);
+	callGetBundle("UnreadableRB", IOException.class);
+    }
+
+    private static void callGetBundle(String baseName,
+				      Class<? extends Throwable> expectedCause) {
+	callGetBundle(baseName, Locale.getDefault(), expectedCause);
+    }
+
+    private static void callGetBundle(String baseName, Locale locale,
+				      Class<? extends Throwable> expectedCause) {
+	ResourceBundle rb;
+	try {
+	    rb = ResourceBundle.getBundle(baseName, locale);
+	    throw new RuntimeException("getBundle(\""+baseName+"\") doesn't throw "
+				      + expectedCause);
+	} catch (MissingResourceException e) {
+	    Throwable cause = e.getCause();
+	    if (!expectedCause.isInstance(cause)) {
+		throw new RuntimeException("getBundle(\""+baseName+"\") throws "
+					   + cause + ", expected " + expectedCause);
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/MissingResourceCauseTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,57 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @test 1.2 07/04/09
+# @bug 4354216
+# @summary Test for the cause support when throwing a
+# MissingResourceBundle. (This test exists under
+# ResourceBundle/Control because bad resource bundle data can be
+# shared with other test cases.)
+# @build MissingResourceCauseTest
+# @build NonResourceBundle PrivateConstructorRB AbstractRB BadStaticInitRB
+# @run shell MissingResourceCauseTest.sh
+
+case "`uname`" in
+Windows*)
+    DEL=";";
+    ;;
+*)
+    DEL=":";
+    ;;
+esac
+
+#
+# Create an unreadble properties file
+#
+UNREADABLE=UnreadableRB.properties
+rm -f $UNREADABLE
+echo "type=unreadable" >$UNREADABLE
+chmod 000 $UNREADABLE
+
+: ${TESTCLASS:=.}
+: ${TESTSRC:=.}
+
+${TESTJAVA}/bin/java -esa -cp ${TESTCLASS}${DEL}${TESTSRC} MissingResourceCauseTest
+STATUS=$?
+chmod 666 $UNREADABLE
+rm -f $UNREADABLE
+exit $?
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/NonResourceBundle.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,33 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)NonResourceBundle.java	1.2 07/04/09
+ */
+
+public class NonResourceBundle {
+    public Object[][] getContents() {
+	return new Object[][] {
+	    { "type", "Non-ResourceBundle" }
+	};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/PackagePrivateRB.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,36 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)PackagePrivateRB.java	1.2 07/04/09
+ */
+
+import java.util.*;
+
+// Package private resource bundle
+class PackagePrivateRB extends ListResourceBundle {
+    public Object[][] getContents() {
+	return new Object[][] {
+	    { "type", "class (package1.PackagePrivateRB)" }
+	};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/PackagePrivateTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,86 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 4175293 5102289
+ * @summary Test if package private ResourceBundles can be loaded.
+ * @build PackagePrivateRB
+ * @run main/timeout=300/othervm -esa PackagePrivateTest
+ */
+
+import java.io.*;
+import java.util.*;
+import static java.util.ResourceBundle.Control.*;
+
+public class PackagePrivateTest {
+    public static void main(String[] args) {
+	ResourceBundle rb;
+
+	// Make sure that the default Control can't load the package
+	// private resource bundles.
+	try {
+	    rb = ResourceBundle.getBundle("PackagePrivateRB");
+	    throw new RuntimeException(
+		       "doesn't throw MissingResourceException with the default Control");
+	} catch (MissingResourceException e) {
+	}
+
+	// Remove the dummy cache entry
+	ResourceBundle.clearCache();
+
+    	rb = ResourceBundle.getBundle("PackagePrivateRB",
+		new ResourceBundle.Control() {
+		    @Override
+		    public List<String> getFormats(String baseName) {
+			return FORMAT_CLASS;
+		    }
+
+		    @Override
+		    public ResourceBundle newBundle(String baseName,
+						    Locale locale,
+						    String format,
+						    ClassLoader loader,
+						    boolean reload)
+			throws IllegalAccessException,
+			       InstantiationException, IOException {
+			String bn = toBundleName(baseName, locale);
+			if ("java.class".equals(format)) {
+			    try {
+				Class<? extends ResourceBundle> cl =
+				    (Class<? extends ResourceBundle>) loader.loadClass(bn);
+				return  cl.newInstance();
+			    } catch (ClassNotFoundException e) {
+				//System.out.println("ClassNotFoundException: " + e.getMessage());
+			    }
+			    return null;
+			}
+			throw new IllegalArgumentException("unknown format: " + format);
+		    }
+		});
+	String s = rb.getString("type");
+	if (!s.equals("class (package1.PackagePrivateRB)")) {
+	    throw new RuntimeException("wrong type: got " + s + ", expected '" +
+				       "class (package1.PackagePrivateRB)'");
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/PrivateConstructorRB.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,37 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)PrivateConstructorRB.java	1.2 07/04/09
+ */
+
+import java.util.*;
+
+public class PrivateConstructorRB extends ListResourceBundle {
+    private PrivateConstructorRB() {
+    }
+    public Object[][] getContents() {
+	return new Object[][] {
+	    { "type", "class (private constructor)" }
+	};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/StressOut.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)StressOut.properties	1.2 07/04/09
+#
+
+data: U.S.A.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/StressOut_en_CA.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)StressOut_en_CA.properties	1.2 07/04/09
+#
+
+# empty
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/StressOut_ja.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)StressOut_ja.properties	1.2 07/04/09
+#
+
+data: Japan
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/StressOut_ja_JP.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)StressOut_ja_JP.properties	1.2 07/04/09
+#
+
+# empty
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/StressOut_ko.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)StressOut_ko.properties	1.2 07/04/09
+#
+
+data: Korea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/StressOut_zh_CN.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)StressOut_zh_CN.properties	1.2 07/04/09
+#
+
+data: China
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/StressTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,209 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.5 07/06/11
+ * @bug 5102289
+ * @summary Stress test for ResourceBundle.getBundle with ResourceBundle.Control.
+ * @run main/timeout=300/othervm -esa StressTest
+ */
+
+import java.util.*;
+import java.util.concurrent.atomic.*;
+
+public class StressTest {
+    static final Locale ROOT_LOCALE = new Locale("");
+    static final Random rand = new Random();
+    static final Locale[] locales = {
+	Locale.US,
+	Locale.CHINA,
+	ROOT_LOCALE,
+	Locale.JAPAN,
+	Locale.CANADA,
+	Locale.KOREA
+    };
+    static final String[] expected = {
+	"U.S.A.",
+	"China",
+	"U.S.A.",
+	"Japan",
+	"U.S.A.", // StressOut_en_CA.properties is empty.
+	"Korea"
+    };
+    final static long startTime = System.currentTimeMillis();
+
+    // increment each element when one getBundle call is done.
+    static AtomicIntegerArray counters;
+    static int[] prevCounters;
+    static int intervalForCounterCheck;
+    static AtomicInteger clearCounter = new AtomicInteger();
+
+    static volatile boolean runrun = true;
+
+    public static void main(String[] args) {
+	int nThreads = 2;
+	if (args.length > 0) {
+	    nThreads = Math.max(Integer.parseInt(args[0]), 2);
+	}
+	int nSeconds = 180;
+	if (args.length > 1) {
+	    nSeconds = Integer.parseInt(args[1]);
+	}
+	Locale.setDefault(Locale.US);
+	Thread[] tasks = new Thread[locales.length * nThreads];
+	counters = new AtomicIntegerArray(tasks.length);
+
+	for (int i = 0; i < tasks.length; i++) {
+	    tasks[i] = new Thread(new Worker(i));
+	}
+	for (int i = 0; i < tasks.length; i++) {
+	    tasks[i].start();
+	}
+
+	int nProcessors = Runtime.getRuntime().availableProcessors();
+	intervalForCounterCheck = Math.max(tasks.length / nProcessors, 1);
+	System.out.printf("%d processors, intervalForCounterCheck = %d [sec]%n",
+			  nProcessors, intervalForCounterCheck);
+	try {
+	    for (int i = 0; runrun && i < nSeconds; i++) {
+		Thread.sleep(1000); // 1 seconds
+		if ((i % intervalForCounterCheck) == 0) {
+		    checkCounters();
+		}
+	    }
+	    runrun = false;
+	    for (int i = 0; i < tasks.length; i++) {
+		tasks[i].join();
+	    }
+	} catch (InterruptedException e) {
+	}
+
+	printCounters();
+    }
+
+    static void checkCounters() {
+	int length = counters.length();
+	int[] snapshot = new int[length];
+	for (int i = 0; i < length; i++) {
+	    snapshot[i] = counters.get(i);
+	}
+
+	if (prevCounters == null) {
+	    prevCounters = snapshot;
+	    return;
+	}
+
+	for (int i = 0; i < length; i++) {
+	    if (snapshot[i] > prevCounters[i]) {
+		continue;
+	    }
+	    System.out.printf(
+		"Warning: Thread #%d hasn't updated its counter for the last %d second(s).%n",
+		i, intervalForCounterCheck);
+	}
+	prevCounters = snapshot;
+    }
+
+    static void printCounters() {
+	long total = 0;
+	int min = Integer.MAX_VALUE;
+	int max = Integer.MIN_VALUE;
+	for (int i = 0; i < counters.length(); i++) {
+	    int counter = counters.get(i);
+	    total += counter;
+	    min = Math.min(min, counter);
+	    max = Math.max(max, counter);
+	}
+	System.out.printf("Total: %d calls, min=%d, max=%d, cache cleared %d times%n",
+			  total, min, max, clearCounter.get());
+    }
+
+    static class Worker implements Runnable {
+	final int id;
+	final int index;
+	final Locale locale;
+	final String str;
+	final int max;
+	final boolean cleaner;
+	ResourceBundle.Control control;
+
+	Worker(int i) {
+	    id = i;
+	    index = i % locales.length;
+	    locale = locales[index];
+	    cleaner = locale.equals(ROOT_LOCALE);
+	    str = expected[index];
+	    max = rand.nextInt((index + 1) * 500) + 1000;
+	    control = new TestControl(max);
+	    System.out.println("Worker" + i + ": locale="+locale+", expected="+str+
+			       ", max="+max);
+	}
+
+	public void run() {
+	    while (runrun) {
+		ResourceBundle rb = ResourceBundle.getBundle("StressOut", locale, control);
+		counters.incrementAndGet(id);
+		String s = rb.getString("data");
+		if (!s.equals(str)) {
+		    runrun = false;
+		    throw new RuntimeException(locale + ": rb.locale=" + rb.getLocale() +
+					       ", got " + s + ", expected " + str);
+		}
+		try {
+		    Thread.sleep(rand.nextInt(max/500));
+		} catch (InterruptedException e) {
+		}
+		if (cleaner && (rand.nextInt(10000) == 0)) {
+		    //System.out.println("Clearing cache!");
+		    ResourceBundle.clearCache();
+		    clearCounter.incrementAndGet();
+		}
+	    }
+	}
+
+	static class TestControl extends ResourceBundle.Control {
+	    int max;
+
+	    public List<Locale> getCandidateLocales(String baseName, Locale locale) {
+		List<Locale> list = super.getCandidateLocales(baseName, locale);
+		//System.out.println("Candidate locales=" + list);
+		return list;
+	    }
+	    public TestControl(int max) {
+		this.max = max;
+	    }
+	    public long getTimeToLive(String baseName, Locale locale) {
+		// This will set TTL to a random value for each bundle.
+		long ttl = rand.nextInt(max);
+		//System.out.println("TTL: " + baseName + "_" + locale + " for " + ttl);
+		return ttl;
+	    }
+	    public boolean needsReload(String baseName, Locale locale,
+				       String format, ClassLoader loader,
+				       ResourceBundle bundle, long loadTime) {
+		//System.out.println("Expired: " + baseName + "_" + locale + "." + format +
+		//		   " at " + (loadTime-startTime) + ", bundle=" + bundle);
+		return rand.nextBoolean();
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/TestResourceRB.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,35 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TestResourceRB.java	1.2 07/04/09
+ */
+
+import java.util.*;
+
+public class TestResourceRB extends ListResourceBundle {
+    public Object[][] getContents() {
+	return new Object[][] {
+	    { "type", "java.class" }
+	};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/XMLResourceBundleTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,115 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 5102289 4403721
+ * @summary Test XML support as shown in the ResourceBundle.Control description.
+ */
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import static java.util.ResourceBundle.Control.*;
+
+public class XMLResourceBundleTest {
+    public static void main(String[] args) {
+	ResourceBundle.Control xmlControl = new ResourceBundle.Control() {
+		   @Override
+		   public List<String> getFormats(String baseName) {
+		       if (baseName == null) {
+			   throw new NullPointerException();
+		       }
+		       return Arrays.asList("xml");
+		   }
+		   @Override
+		   public ResourceBundle newBundle(String baseName, Locale locale,
+						   String format,
+						   ClassLoader loader,
+						   boolean reload)
+		       throws IllegalAccessException,
+			      InstantiationException, IOException {
+		       if (baseName == null || locale == null
+			   || format == null || loader == null) {
+			   throw new NullPointerException();
+		       }
+		       ResourceBundle bundle = null;
+		       if (format.equals("xml")) {
+			   String bundleName = toBundleName(baseName, locale);
+			   String resourceName = toResourceName(bundleName, format);
+			   URL url = loader.getResource(resourceName);
+			   if (url != null) {
+			       URLConnection connection = url.openConnection();
+			       if (connection != null) {
+				   if (reload) {
+				       // disable caches if reloading
+				       connection.setUseCaches(false);
+				   }
+				   InputStream stream = connection.getInputStream();
+				   if (stream != null) {
+				       BufferedInputStream bis = new BufferedInputStream(stream);
+				       bundle = new XMLResourceBundle(bis);
+				       bis.close();
+				   }
+			       }
+			   }
+		       }
+		       return bundle;
+		   }
+	       };
+	ResourceBundle rb = ResourceBundle.getBundle("XmlRB", new Locale(""), xmlControl);
+	String type = rb.getString("type");
+	if (!type.equals("XML")) {
+	    throw new RuntimeException("Root Locale: type: got " + type
+				       + ", expected XML (ASCII)");
+	}
+
+	rb = ResourceBundle.getBundle("XmlRB", Locale.JAPAN, xmlControl);
+	type = rb.getString("type");
+	// Expect fullwidth "XML"
+	if (!type.equals("\uff38\uff2d\uff2c")) {
+	    throw new RuntimeException("Locale.JAPAN: type: got " + type
+				       + ", expected \uff38\uff2d\uff2c (fullwidth XML)");
+	}
+    }
+
+    private static class XMLResourceBundle extends ResourceBundle {
+	private Properties props;
+
+	XMLResourceBundle(InputStream stream) throws IOException {
+	    props = new Properties();
+	    props.loadFromXML(stream);
+	}
+
+	protected Object handleGetObject(String key) {
+	    if (key == null) {
+		throw new NullPointerException();
+	    }
+	    return props.get(key);
+	}
+
+	public Enumeration<String> getKeys() {
+	    // Not implemented
+	    return null;
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/XmlRB.xml	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- @(#)XmlRB.xml	1.1 05/05/16 -->
+
+<!-- DTD for properties -->
+<!DOCTYPE properties [
+<!ELEMENT properties ( comment?, entry* ) >
+<!ATTLIST properties version CDATA #FIXED "1.0">
+<!ELEMENT comment (#PCDATA) >
+<!ELEMENT entry (#PCDATA) >
+<!ATTLIST entry key CDATA #REQUIRED>
+]>
+
+<properties>
+    <comment>Test data for XMLResourceBundleTest.java</comment>
+    <entry key="type">XML</entry>
+</properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Control/XmlRB_ja.xml	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- @(#)XmlRB_ja.xml	1.1 05/05/16 -->
+
+<!-- DTD for properties -->
+<!DOCTYPE properties [
+<!ELEMENT properties ( comment?, entry* ) >
+<!ATTLIST properties version CDATA #FIXED "1.0">
+<!ELEMENT comment (#PCDATA) >
+<!ELEMENT entry (#PCDATA) >
+<!ATTLIST entry key CDATA #REQUIRED>
+]>
+
+<properties>
+    <comment>Test data for XMLResourceBundleTest.java</comment>
+    <entry key="type">XML</entry>
+</properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/FakeTestResource.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,64 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)FakeTestResource.java	1.5 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+// NOTE:  This class is part of the ResourceBundleTest.
+// The ResourceBundle code should never find this class, even if the caller looks
+// for "FakeTestResource".  If it does, that's an error.
+
+public class FakeTestResource {
+    public FakeTestResource() {
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/KeySetMessages.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,35 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)KeySetMessages.java	1.2 07/04/09
+ */
+
+import java.util.*;
+
+public class KeySetMessages extends ListResourceBundle {
+    protected Object[][] getContents() {
+	return new Object[][] {
+	    { "food", "Cheeseburger" },
+	    { "drink", "Coke" }};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/KeySetMessages_zh_CN.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,35 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)KeySetMessages_zh_CN.java	1.2 07/04/09
+ */
+
+import java.util.*;
+
+public class KeySetMessages_zh_CN extends ListResourceBundle {
+    protected Object[][] getContents() {
+	return new Object[][] {
+	    { "food", "Peking Duck" },
+	    { "tea", "Oolong" }};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/KeySetResources.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,26 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# 1.2 07/04/09
+
+food: Cheeseburger
+drink: Coke
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/KeySetResources_ja_JP.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,26 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# 1.2 07/04/09
+
+food: Chicken Teriyaki
+tea: Green Tea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/KeySetTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,114 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 07/04/09
+ * @bug 4095319 4286358
+ * @summary Test cases for the containsKey, keySet, and handleKeySet
+ * methods that are new in Mustang.
+ * @build KeySetMessages KeySetMessages_zh_CN
+ * @run main KeySetTest
+ */
+
+import java.lang.reflect.*;
+import java.util.*;
+
+public class KeySetTest {
+    static final List<String> fullKeys = Arrays.asList("food", "drink", "tea");
+    static final List<String> localKeys = Arrays.asList("food", "tea");
+
+    public static void main(String[] args) {
+	// Test PropertyResourceBundle
+	testKeys("KeySetResources", Locale.JAPAN);
+
+	// Test ListResourceBundle
+	testKeys("KeySetMessages", Locale.CHINA);
+    }
+
+    static void testKeys(String bundleName, Locale locale) {
+	ResourceBundle rb = ResourceBundle.getBundle(bundleName, locale);
+	System.out.println("food = " + rb.getString("food"));
+
+	// Test keySet()
+	Set<String> allKeys = rb.keySet();
+	if (!(allKeys.containsAll(fullKeys) && fullKeys.containsAll(allKeys))) {
+	    throw new RuntimeException("got "+allKeys + ", expected " + fullKeys);
+	}
+
+	// Test containsKey()
+	for (String key : fullKeys) {
+	    if (!rb.containsKey(key)) {
+		throw new RuntimeException("rb doesn't contain: " + key);
+	    }
+	}
+	for (String key : new String[] { "snack", "beer" }) {
+	    if (rb.containsKey(key)) {
+		throw new RuntimeException("rb contains: " + key);
+	    }
+	}
+
+	// Make sure that the default handleKeySet implementation
+	// returns the subset keys of the given locale.
+	TestBundle tb = new TestBundle(bundleName, locale);
+	Set<String> childKeys = tb.handleKeySet();
+	if (!(childKeys.containsAll(localKeys) || localKeys.containsAll(childKeys))) {
+	    throw new RuntimeException("get " + childKeys + ", expected " + localKeys);
+	}
+    }
+
+    static class TestBundle extends ResourceBundle {
+	ResourceBundle bundle;
+	Method m;
+
+	public TestBundle() {}
+
+	public TestBundle(String name, Locale locale) {
+	    bundle = ResourceBundle.getBundle(name, locale);
+
+	    // Prepare for the handleGetObject call
+	    try {
+		Class clazz = bundle.getClass();
+		m = clazz.getMethod("handleGetObject", String.class);
+		m.setAccessible(true);
+	    } catch (Exception e) {
+		throw new RuntimeException("method preparation error", e);
+	    }
+	}
+
+	public Enumeration<String> getKeys() {
+	    return bundle.getKeys();
+	}
+
+	// handleGetObject() doesn't look up its parent bundles.
+	protected Object handleGetObject(String key) {
+	    try {
+		return m.invoke(bundle, key);
+	    } catch (Exception e) {
+		throw new RuntimeException("handleGetObject error", e);
+	    }
+	}
+
+	public Set<String> handleKeySet() {
+	    return super.handleKeySet();
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/RB4353454_en.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,26 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+# @(#)RB4353454_en.properties	1.2 07/04/09
+#
+text=Got it!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/RBTestFmwk.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,263 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)RBTestFmwk.java	1.6 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+import java.lang.reflect.*;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.util.Vector;
+import java.io.*;
+import java.text.*;
+
+/**
+ * RBTestFmwk is a base class for tests that can be run conveniently from
+ * the command line as well as under the Java test harness.
+ * <p>
+ * Sub-classes implement a set of methods named Test<something>. Each
+ * of these methods performs some test. Test methods should indicate
+ * errors by calling either err or errln.  This will increment the
+ * errorCount field and may optionally print a message to the log.
+ * Debugging information may also be added to the log via the log
+ * and logln methods.  These methods will add their arguments to the
+ * log only if the test is being run in verbose mode.
+ */
+public class RBTestFmwk {
+    //------------------------------------------------------------------------
+    // Everything below here is boilerplate code that makes it possible
+    // to add a new test by simply adding a function to an existing class
+    //------------------------------------------------------------------------
+
+    protected RBTestFmwk() {
+        // Create a hashtable containing all the test methods.
+        testMethods = new Hashtable();
+        Method[] methods = getClass().getDeclaredMethods();
+        for( int i=0; i<methods.length; i++ ) {
+            if( methods[i].getName().startsWith("Test")
+                    || methods[i].getName().startsWith("test") ) {
+                testMethods.put( methods[i].getName(), methods[i] );
+            }
+        }
+    }
+
+    protected void run(String[] args) throws Exception
+    {
+        System.out.println(getClass().getName() + " {");
+        indentLevel++;
+
+        // Set up the log and reference streams.  We use PrintWriters in order to
+        // take advantage of character conversion.  The JavaEsc converter will
+        // convert Unicode outside the ASCII range to Java's \\uxxxx notation.
+        log = new PrintWriter(System.out,true);
+
+        // Parse the test arguments.  They can be either the flag
+        // "-verbose" or names of test methods. Create a list of
+        // tests to be run.
+        Vector testsToRun = new Vector( args.length );
+        for( int i=0; i<args.length; i++ ) {
+            if( args[i].equals("-verbose") ) {
+                verbose = true;
+            }
+            else if( args[i].equals("-prompt") ) {
+                prompt = true;
+            } else if (args[i].equals("-nothrow")) {
+                nothrow = true;
+            } else {
+                Object m = testMethods.get( args[i] );
+                if( m != null ) {
+                    testsToRun.addElement( m );
+                }
+                else {
+                    usage();
+                    return;
+                }
+            }
+        }
+
+        // If no test method names were given explicitly, run them all.
+        if( testsToRun.size() == 0 ) {
+            Enumeration methodNames = testMethods.elements();
+            while( methodNames.hasMoreElements() ) {
+                testsToRun.addElement( methodNames.nextElement() );
+            }
+        }
+
+        // Run the list of tests given in the test arguments
+        for( int i=0; i<testsToRun.size(); i++ ) {
+            int oldCount = errorCount;
+
+            Method testMethod = (Method)testsToRun.elementAt(i);
+            writeTestName(testMethod.getName());
+
+            try {
+                testMethod.invoke(this, new Object[0]);
+            }
+            catch( IllegalAccessException e ) {
+                errln("Can't acces test method " + testMethod.getName());
+            }
+            catch( InvocationTargetException e ) {
+		errorCount++;
+		log.println("\nUncaught throwable thrown in test method "
+			    + testMethod.getName());
+                e.getTargetException().printStackTrace(this.log);
+		if (!nothrow) {
+		    throw new RuntimeException("Exiting...");
+		}
+            }
+            writeTestResult(errorCount - oldCount);
+        }
+        indentLevel--;
+        writeTestResult(errorCount);
+        if (prompt) {
+            System.out.println("Hit RETURN to exit...");
+            try {
+                System.in.read();
+            }
+            catch (IOException e) {
+                System.out.println("Exception: " + e.toString() + e.getMessage());
+            }
+        }
+        if (nothrow) {
+            System.exit(errorCount);
+        }
+    }
+
+    /**
+     * Adds given string to the log if we are in verbose mode.
+     */
+    protected void log( String message ) {
+        if( verbose ) {
+            indent(indentLevel + 1);
+            log.print( message );
+            log.flush();
+        }
+    }
+
+    protected void logln( String message ) {
+        log(message + System.getProperty("line.separator"));
+    }
+
+    /**
+     * Report an error
+     */
+    protected void err( String message ) {
+        errorCount++;
+        indent(indentLevel + 1);
+        log.print( message );
+        log.flush();
+
+        if (!nothrow) {
+            throw new RuntimeException(message);
+        }
+    }
+
+    protected void errln( String message ) {
+        err(message + System.getProperty("line.separator"));
+    }
+
+
+    protected void writeTestName(String testName) {
+        indent(indentLevel);
+        log.print(testName);
+        log.flush();
+        needLineFeed = true;
+    }
+
+    protected void writeTestResult(int count) {
+        if (!needLineFeed) {
+            indent(indentLevel);
+            log.print("}");
+        }
+        needLineFeed = false;
+
+        if (count != 0)
+            log.println(" FAILED");
+        else
+            log.println(" Passed");
+    }
+
+    private final void indent(int distance) {
+        if (needLineFeed) {
+            log.println(" {");
+            needLineFeed = false;
+        }
+        log.print(spaces.substring(0, distance * 2));
+    }
+
+    /**
+     * Print a usage message for this test class.
+     */
+    void usage() {
+        System.out.println(getClass().getName() +
+                            ": [-verbose] [-nothrow] [-prompt] [test names]");
+
+        System.out.println("test names:");
+        Enumeration methodNames = testMethods.keys();
+        while( methodNames.hasMoreElements() ) {
+            System.out.println("\t" + methodNames.nextElement() );
+        }
+    }
+
+    private boolean     prompt = false;
+    private boolean     nothrow = false;
+    protected boolean   verbose = false;
+
+    private PrintWriter log;
+    private int         indentLevel = 0;
+    private boolean     needLineFeed = false;
+    private int         errorCount = 0;
+
+    private Hashtable testMethods;
+    private final String spaces = "                                          ";
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/ReferencesTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,145 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test 1.2 04/09/07
+ * @bug 4405807
+ * @run main/othervm -Xms10m ReferencesTest
+ * @summary Verify that references from ResourceBundle cache don't prevent
+ * class loader reclamation.
+ */
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * This test relies on the current behavior of the garbage collector and is
+ * therefore no clear indicator of whether the fix for 4405807 works.
+ * If the test fails, it might indicate a regression, or it might just mean
+ * that a less aggressive garbage collector is used.
+ */
+public class ReferencesTest {
+    
+    private static final int CLASS_LOADER_COUNT = 20;
+    
+    // These two parallel arrays have references to the same class loaders.
+    // The weakLoaders array lets us track whether class loaders are being
+    // reclaimed after the references in the loaders array are nulled out.
+    private static ClassLoader[] loaders = new ClassLoader[CLASS_LOADER_COUNT];
+    private static WeakReference[] weakLoaders = new WeakReference[CLASS_LOADER_COUNT];
+    
+    public static void main(String[] args) throws Exception {
+        
+        URL testDirectory = new File(System.getProperty("test.classes", ".")).toURL();
+    
+        for (int i = 0; i < loaders.length; i++) {
+            URL[] urls = { testDirectory };
+            loaders[i] = new URLClassLoader(urls);
+            weakLoaders[i] = new WeakReference(loaders[i]);
+        }
+        
+        // fill the ResourceBundle cache with entries for half the class loaders
+        loadBundles(0, CLASS_LOADER_COUNT / 2);
+        
+        report("After loading resource bundles for first half of class loaders: ");
+        
+        // release the first half of the class loaders
+        for (int i = 0; i < CLASS_LOADER_COUNT / 2; i++) {
+            loaders[i] = null;
+        }
+        
+        System.gc();
+        
+        report("After releasing first half of class loaders: ");
+        
+        // fill the ResourceBundle cache with entries for second half the class loaders
+        loadBundles(CLASS_LOADER_COUNT / 2, CLASS_LOADER_COUNT);
+        
+        report("After loading resource bundles for second half of class loaders: ");
+        
+        // release the second half of the class loaders
+        for (int i = CLASS_LOADER_COUNT / 2; i < CLASS_LOADER_COUNT; i++) {
+            loaders[i] = null;
+        }
+        
+        System.gc();
+        
+        report("After releasing second half of class loaders: ");
+        
+        // The garbage collector in Tiger actually has reclaimed all class
+        // loaders at this point, but in order not to become too dependent
+        // on the current behavior, we only require that the first half
+        // has been reclaimed.
+        if (countLoaders(0, CLASS_LOADER_COUNT / 2) > 0) {
+            throw new RuntimeException("Too many class loaders not reclaimed yet.");
+        }
+    }
+    
+    private static void report(String when) throws Exception {
+        int first = countLoaders(0, CLASS_LOADER_COUNT / 2);
+        int second = countLoaders(CLASS_LOADER_COUNT / 2, CLASS_LOADER_COUNT);
+        
+        Class clazz = ResourceBundle.class;
+        Field cacheList = clazz.getDeclaredField("cacheList");
+        cacheList.setAccessible(true);
+        int cacheSize = ((Map)cacheList.get(clazz)).size();
+        
+        System.out.println(when);
+        System.out.println("    " + first + " loaders alive in first half");
+        System.out.println("    " + second + " loaders alive in second half");
+        System.out.println("    " + cacheSize + " entries in resource bundle cache");
+    }
+    
+    private static void loadBundles(int start, int end) throws Exception {
+        for (int i = start; i < end; i++) {
+            // There's no resource bundle for NonExistantBundle - this
+            // let's us test the case where a resource bundle is not found,
+            // which in the past created a SoftReference on the value side
+            // of the cache.
+            try {
+                ResourceBundle.getBundle("NonExistantBundle", Locale.US, loaders[i]);
+            } catch (MissingResourceException e) {
+            }
+            // There's a base resource bundle for ReferencesTestBundle - the
+            // normal case.
+            ResourceBundle.getBundle("ReferencesTestBundle", Locale.US, loaders[i]);
+        }
+    }
+    
+    private static int countLoaders(int start, int end) {
+        int count = 0;
+        for (int i = start; i < end; i++) {
+            if (weakLoaders[i].get() != null) {
+                count++;
+            }
+        }
+        return count;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/ReferencesTestBundle.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+unused=Hallo, alle miteinander!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/ResourceBundleTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,393 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test 1.22 07/04/09
+    @bug 4049325 4073127 4083270 4106034 4108126
+    @summary test Resource Bundle
+    @build TestResource TestResource_de TestResource_fr TestResource_fr_CH
+    @build TestResource_it FakeTestResource
+    @run main ResourceBundleTest
+*/
+/*
+ * @(#)ResourceBundleTest.java	1.22 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+import java.text.*;
+import java.util.*;
+import java.io.*;
+
+public class ResourceBundleTest extends RBTestFmwk {
+    public static void main(String[] args) throws Exception {
+        new ResourceBundleTest().run(args);
+    }
+
+    public ResourceBundleTest() {
+        makePropertiesFile();
+    }
+
+    public void TestResourceBundle() {
+        Locale  saveDefault = Locale.getDefault();
+        Locale.setDefault(new Locale("fr", "FR"));
+
+        // load up the resource bundle, and make sure we got the right one
+        ResourceBundle  bundle = ResourceBundle.getBundle("TestResource");
+        if (!bundle.getClass().getName().equals("TestResource_fr"))
+            errln("Expected TestResource_fr, got " + bundle.getClass().getName());
+
+        // these resources are defines in ResourceBundle_fr
+        String  test1 = bundle.getString("Time");
+        if (!test1.equals("Time keeps on slipping..."))
+            errln("TestResource_fr returned wrong value for \"Time\":  got " + test1);
+
+        test1 = bundle.getString("For");
+        if (!test1.equals("Four score and seven years ago..."))
+            errln("TestResource_fr returned wrong value for \"For\":  got " + test1);
+
+        String[] test2 = bundle.getStringArray("All");
+        if (test2.length != 4)
+            errln("TestResource_fr returned wrong number of elements for \"All\": got " + test2.length);
+        else if (!test2[0].equals("'Twas brillig, and the slithy toves") ||
+                 !test2[1].equals("Did gyre and gimble in the wabe.") ||
+                 !test2[2].equals("All mimsy were the borogoves,") ||
+                 !test2[3].equals("And the mome raths outgrabe."))
+            errln("TestResource_fr returned the wrong value for one of the elements in \"All\"");
+
+        Object  test3 = bundle.getObject("Good");
+        if (test3 == null || test3.getClass() != Integer.class)
+            errln("TestResource_fr returned an object of the wrong class for \"Good\"");
+        else if (((Integer)test3).intValue() != 3)
+            errln("TestResource_fr returned the wrong value for \"Good\": got " + test3);
+
+        // This resource is defined in TestResource and inherited by TestResource_fr
+        test2 = bundle.getStringArray("Men");
+        if (test2.length != 3)
+            errln("TestResource_fr returned wrong number of elements for \"Men\": got " + test2.length);
+        else if (!test2[0].equals("1") ||
+                 !test2[1].equals("2") ||
+                 !test2[2].equals("C"))
+            errln("TestResource_fr returned the wrong value for one of the elements in \"All\"");
+
+        // This resource is defined in neither TestResource not TestResource_fr
+        try {
+            test3 = bundle.getObject("Is");
+            errln("TestResource_fr returned a value for \"Is\" when it shouldn't: got " + test3);
+        }
+        catch (MissingResourceException e) {
+        }
+
+        String[] keys = { "Now", "Time", "For", "All", "Good", "Men", "Come" };
+        checkKeys(bundle.getKeys(),  keys);
+
+        Locale.setDefault(saveDefault);
+    }
+
+    public void TestListResourceBundle() {
+        // load up the resource and check to make sure we got the right class
+        // (we don't define be_BY or be, so we fall back on the root default)
+        ResourceBundle  bundle = ResourceBundle.getBundle("TestResource",
+                            new Locale("be", "BY"));
+        if (!bundle.getClass().getName().equals("TestResource"))
+            errln("Expected TestResource, got " + bundle.getClass().getName());
+
+        doListResourceBundleTest(bundle);
+    }
+
+    /**
+     * @bug 4073127
+     * Repeat TestListResourceBundle on TestResource_it, which is a ListResourceBundle
+     * with NO contents.  It should gracefully inherit everything from the root
+     * TestResource.
+     */
+    public void TestEmptyListResourceBundle() {
+        ResourceBundle bundle = ResourceBundle.getBundle("TestResource",
+                            new Locale("it", "IT"));
+        doListResourceBundleTest(bundle);
+    }
+
+    private void doListResourceBundleTest(ResourceBundle bundle) {
+        // load up the resource and check to make sure we got the right class
+        // all of these resources are defined in TestResource; it doesn' inherit from anybody
+        String  test1 = bundle.getString("Now");
+        if (!test1.equals("Now is the time for all..."))
+            errln("TestResource returned wrong value for \"Now\":  got " + test1);
+
+        test1 = bundle.getString("Time");
+        if (!test1.equals("Howdy Doody Time!"))
+            errln("TestResource returned wrong value for \"Time\":  got " + test1);
+
+        test1 = bundle.getString("Come");
+        if (!test1.equals("Come into my parlor..."))
+            errln("TestResource returned wrong value for \"Come\":  got " + test1);
+
+        Object  test3 = bundle.getObject("Good");
+        if (test3 == null || test3.getClass() != Integer.class)
+            errln("TestResource returned an object of the wrong class for \"Good\"");
+        else if (((Integer)test3).intValue() != 27)
+            errln("TestResource returned the wrong value for \"Good\": got " + test3);
+
+        String[] test2 = bundle.getStringArray("Men");
+        if (test2.length != 3)
+            errln("TestResource returned wrong number of elements for \"Men\": got " + test2.length);
+        else if (!test2[0].equals("1") ||
+                 !test2[1].equals("2") ||
+                 !test2[2].equals("C"))
+            errln("TestResource returned the wrong value for one of the elements in \"All\"");
+
+        // this item isn't defined in TestResource
+        try {
+            test3 = bundle.getObject("All");
+            errln("TestResource_en returned a value for \"All\" when it shouldn't: got " + test3);
+        }
+        catch (MissingResourceException e) {
+        }
+
+        String[] keys = { "Now", "Time", "Good", "Men", "Come" };
+        checkKeys(bundle.getKeys(), keys);
+    }
+
+    /**
+     * @bug 4049325
+     * @ summary Bug 4049325 says ResourceBundle.findBundle() uses a hard-coded '/' as
+     * the directory separator when searching for properties files.  Interestingly, it
+     * still works on my NT installation.  I can't tell whether this is a required
+     * property of all Java implementations (the magic appears to happen ClassLoader.
+     * getResourceAsStream(), which is a native function) or a lucky property of my
+     * particular implementation.  If this bug regresses, this test may still pass
+     * because a lower-level facility translates the / to the platform-specific separator
+     * for us.
+     */
+    public void TestPropertyResourceBundle() {
+        ResourceBundle  bundle = ResourceBundle.getBundle("TestResource",
+                            new Locale("es", "ES"));
+
+        // these resources are defined in TestResource_es.properties
+        String  test = bundle.getString("Now");
+        if (!test.equals("How now brown cow"))
+            errln("TestResource_es returned wrong value for \"Now\":  got " + test);
+
+        test = bundle.getString("Is");
+        if (!test.equals("Is there a dog?"))
+            errln("TestResource_es returned wrong value for \"Is\":  got " + test);
+
+        test = bundle.getString("The");
+        if (!test.equals("The rain in Spain"))
+            errln("TestResource_es returned wrong value for \"The\":  got " + test);
+
+        test = bundle.getString("Time");
+        if (!test.equals("Time marches on..."))
+            errln("TestResource_es returned wrong value for \"Time\":  got " + test);
+
+        // this resource is defined in TestResource and inherited by TestResource_es
+        String[] test2 = bundle.getStringArray("Men");
+        if (test2.length != 3)
+            errln("TestResource returned wrong number of elements for \"Men\": got " + test2.length);
+        else if (!test2[0].equals("1") ||
+                 !test2[1].equals("2") ||
+                 !test2[2].equals("C"))
+            errln("TestResource returned the wrong value for one of the elements in \"All\"");
+
+        // this resource is defined in neither TestResource nor TestResource_es
+        try {
+            test = bundle.getString("All");
+            errln("TestResource_es returned a value for \"All\" when it shouldn't: got " + test);
+        }
+        catch (MissingResourceException e) {
+        }
+
+        String[] keys = { "Now", "Is", "The", "Time", "Good", "Men", "Come" };
+        checkKeys(bundle.getKeys(), keys);
+    }
+
+    /**
+     * @bug 4108126
+     */
+    public void TestGetLocale() {
+        // try to find TestResource_fr_CH.  Should get fr_CH as its locale
+        ResourceBundle test = ResourceBundle.getBundle("TestResource",
+                        new Locale("fr", "CH", ""));
+        Locale locale = test.getLocale();
+        if (!(locale.getLanguage().equals("fr")) || !(locale.getCountry().equals("CH")))
+            errln("Actual locale for TestResource_fr_CH should have been fr_CH, got " + locale);
+
+        // try to find TestResource_fr_BE, which doesn't exist.  Should get fr as its locale
+        test = ResourceBundle.getBundle("TestResource",
+                        new Locale("fr", "BE", ""));
+        locale = test.getLocale();
+        if (!(locale.getLanguage().equals("fr")) || !(locale.getCountry().equals("")))
+            errln("Actual locale for TestResource_fr_BE should have been fr, got " + locale);
+
+        // try to find TestResource_iw_IL, which doesn't exist.  Should get root locale
+        // as its locale
+        test = ResourceBundle.getBundle("TestResource",
+                        new Locale("iw", "IL", ""));
+        locale = test.getLocale();
+        if (!(locale.getLanguage().equals("")) || !(locale.getCountry().equals("")))
+            errln("Actual locale for TestResource_iw_IL should have been the root locale, got "
+                            + locale);
+    }
+
+    /*
+     * @bug 4083270
+     */
+    public void TestNonSubclass() {
+        // ResourceBundle.getBundle should never return an object that isn't an instance
+        // of ResourceBundle or one of its subclasses.  We have a class called FakeTestResource
+        // in this package that isn't a ResourceBundle.  If we get that back, we barf.
+        // (Actually, at the time I fixed this bug, getResource() would throw a
+        // ClassCastException in that case.)
+        // There's also a properties file called FakeTestResource; we should get back a
+        // PropertyResourceBundle pointing to that file.
+        Object test1 = ResourceBundle.getBundle("FakeTestResource",
+                Locale.US);
+
+        if (!(test1 instanceof ResourceBundle))
+            errln("Got back a " + test1.getClass().getName() + " instead of a PropertyResourceBundle when looking for FakeTestResource.");
+
+        ResourceBundle test = (ResourceBundle)test1;
+
+        // there's also a properties file called FakeTestResource.  getBundle() should
+        // find it, and it should have the following contents
+        String message = test.getString("message");
+        if (!message.equals("Hello!"))
+            errln("Supposedly found FakeTestResource.properties, but it had the wrong contents.");
+    }
+
+    /*
+     * @bug 4106034
+     */
+    public void TestErrorMessage() {
+        // Ensure that the message produced by the exception thrown
+        // by ResourceBundle.getObject contains both the class name and
+        // the key name.
+        final String className = "TestResource";
+        final String keyName = "DontGetThis";
+        ResourceBundle bundle = ResourceBundle.getBundle(className,
+                            new Locale("it", "IT"));
+        try {
+            Object o = bundle.getObject(keyName);
+            errln(bundle.getClass().getName()+" returned a value for tag \""+keyName+"\" when it should have thrown an exception.  It returned "+o);
+        } catch (MissingResourceException e) {
+            String message = e.getMessage();
+            boolean found = false;
+            if (message.indexOf(className) < 0) {
+	            errln("MissingResourceException error message did not contain class name.");
+            }
+            if (message.indexOf(keyName) < 0) {
+	            errln("MissingResourceException error message did not contain resource key name.");
+            }
+        }
+    }
+
+
+    private void makePropertiesFile() {
+        try {
+            // 
+            // The getProperty call is to ensure that this test will work with
+            // the JTREG test harness.  When running in the harness, the current
+            // directory is often set to someplace that isn't on the CLASSPATH,
+            // so we can't just create the properties files in the current
+            // directory.  But the harness uses the "test.classes" property to
+            // tell us where the classes directory is.
+            //
+            String classesDir = System.getProperty("test.classes", ".");
+            File    file = new File(classesDir, "TestResource_es.properties");
+            if (!file.exists()) {
+                FileOutputStream stream = new FileOutputStream(file);
+                Properties  props = new Properties();
+
+                props.put("Now", "How now brown cow");
+                props.put("Is", "Is there a dog?");
+                props.put("The", "The rain in Spain");
+                props.put("Time", "Time marches on...");
+
+                props.save(stream, "Test property list");
+
+                stream.close();
+            }
+
+            file = new File(classesDir, "FakeTestResource.properties");
+            if (!file.exists()) {
+                FileOutputStream stream = new FileOutputStream(file);
+                Properties props = new Properties();
+
+                props.put("message", "Hello!");
+
+                props.save(stream, "Test property list");
+
+                stream.close();
+            }
+        }
+        catch (java.io.IOException e) {
+            errln("Got exception: " + e);
+        }
+    }
+
+    private void checkKeys(Enumeration testKeys, String[] expectedKeys) {
+        Hashtable   hash = new Hashtable();
+        String      element;
+        int         elementCount = 0;
+
+        for (int i=0; i < expectedKeys.length; i++)
+            hash.put(expectedKeys[i], expectedKeys[i]);
+
+        while (testKeys.hasMoreElements()) {
+            element = (String)testKeys.nextElement();
+            elementCount++;
+            if (!hash.containsKey(element))
+                errln(element + " missing from key list.");
+        }
+
+        if (elementCount != expectedKeys.length)
+            errln("Wrong number of elements in key list: expected " + expectedKeys.length +
+                " got " + elementCount);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/RestrictedBundleTest.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,3 @@
+<!-- 1.2 98/05/07 -->
+This is a test.
+<applet code=RestrictedBundleTest.class width=400 height=400></applet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/RestrictedBundleTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,51 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ * @test 1.5 07/04/09
+ * @bug 4126805
+ * @run applet RestrictedBundleTest.html
+ * @summary I was able to reproduce this bug with 1.2b2, but not with the current 1.2
+ * build.  It appears that it was fixed by changes to the class-loading mechanism,
+ * which now throws a ClassNotFoundException where before it was propagating through
+ * a bogus ClassFormatError.  Therefore, this is just an additional regression test
+ * for whatever bug that was.
+ */
+
+import java.util.ResourceBundle;
+import java.applet.Applet;
+import java.util.MissingResourceException;
+
+public class RestrictedBundleTest extends Applet {
+    public void init() {
+        super.init();
+        try {
+            ResourceBundle bundle = ResourceBundle.getBundle("unavailable.base.name");
+            
+            throw new RuntimeException("Error: MissingResourceException is not thrown");
+        }
+        catch (MissingResourceException e) {
+            // other types of error will propagate back out into the test harness
+            System.out.println("OK");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4300693.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,45 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test 1.3 04/09/07
+    @summary test that ResourceBundle.getBundle can be called recursively
+    @build  Test4300693RB
+    @run main Test4300693
+    @bug 4300693
+*/
+
+/*
+ * @(#)Test4300693.java	1.3 07/04/09
+ */
+
+import java.util.ResourceBundle;
+
+public class Test4300693 {
+
+   static private ResourceBundle rb = ResourceBundle.getBundle("Test4300693RB");
+   
+   static public void main(String[] args) {
+       System.out.println(rb.getString("test result"));
+   }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4300693RB.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,42 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)Test4300693RB.java	1.3 07/04/09
+ */
+
+import java.util.ResourceBundle;
+import java.util.ListResourceBundle;
+
+public class Test4300693RB extends ListResourceBundle {
+
+    public static ResourceBundle rb = ResourceBundle.getBundle("Test4300693RB");
+    
+    public Object[][] getContents() {
+        return contents;
+    }
+    
+    static final Object[][] contents = {
+        {"test result", "Test4300693 succeeded"}
+    };
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,107 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test 1.2 04/09/07
+    @summary Verify a few assertions of the new specification of ResourceBundle.getBundle
+    @build Test4314141B Test4314141B_fr_CH Test4314141B_es_ES
+    @run main Test4314141
+    @bug 4314141
+*/
+
+import java.util.ResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+
+public class Test4314141 {
+
+    public static void main(String[] args) {
+        testCandidateOmission();
+        testExample();
+    }
+
+    /**
+     * Tests that candidate bundle names where the final component is an empty string are omitted.
+     * Previous versions of ResourceBundle might attempt to load bundles with a trailing
+     * underscore (e.g., "Test4314141_") resulting from concatenation with an empty string.
+     * This is no longer permitted.
+     */
+    static void testCandidateOmission() {
+        Locale.setDefault(Locale.US);
+        doTestCandidateOmission("de", "DE", "EURO", new String[] {"_de", ""});
+        doTestCandidateOmission("de", "DE", "", new String[] {"_de", ""});
+        doTestCandidateOmission("de", "", "EURO", new String[] {"_de", ""});
+        doTestCandidateOmission("de", "", "", new String[] {"_de", ""});
+        doTestCandidateOmission("", "DE", "EURO", new String[] {"__DE", ""});
+        doTestCandidateOmission("", "DE", "", new String[] {"__DE", ""});
+        doTestCandidateOmission("", "", "EURO", new String[] {"___EURO", ""});
+        doTestCandidateOmission("", "", "", new String[] {""});
+    }
+
+    static void doTestCandidateOmission(String language, String country, String variant,
+            String[] expectedSuffixes) {
+        doTest("Test4314141A", language, country, variant, expectedSuffixes);
+    }
+    
+    /**
+     * Verifies the example from the getBundle specification.
+     */
+    static void testExample() {
+        Locale.setDefault(new Locale("en", "UK"));
+        doTestExample("fr", "CH", new String[] {"_fr_CH.class", "_fr.properties", ".class"});
+        doTestExample("fr", "FR", new String[] {"_fr.properties", ".class"});
+        doTestExample("de", "DE", new String[] {"_en.properties", ".class"});
+        doTestExample("en", "US", new String[] {"_en.properties", ".class"});
+        doTestExample("es", "ES", new String[] {"_es_ES.class", ".class"});
+    }
+    
+    static void doTestExample(String language, String country, String[] expectedSuffixes) {
+        doTest("Test4314141B", language, country, "", expectedSuffixes);
+    }
+    
+    static void doTest(String baseName, String language, String country, String variant,
+            String[] expectedSuffixes) {
+        System.out.print("Looking for " + baseName + " \"" + language + "\", \"" + country + "\", \"" + variant + "\"");
+        ResourceBundle bundle = ResourceBundle.getBundle(baseName, new Locale(language, country, variant));
+        System.out.print(" => got ");
+        String previousName = null;
+        int nameCount = 0;
+        for (int i = 3; i >= 0; i--) {
+            String name = bundle.getString("name" + i);
+            if (!name.equals(previousName)) {
+                if (previousName != null) {
+                    System.out.print(", ");
+                }
+                System.out.print(name);
+                if (!name.equals(baseName + expectedSuffixes[nameCount++])) {
+                    System.out.println();
+                    throw new RuntimeException("Error: got unexpected resource bundle");
+                }
+                previousName = name;
+            }
+        }
+        System.out.println();
+        if (nameCount != expectedSuffixes.length) {
+            throw new RuntimeException("Error: parent chain too short");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141A.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,26 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name0=Test4314141A
+name1=Test4314141A
+name2=Test4314141A
+name3=Test4314141A
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141A_.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,25 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name1=Test4314141A_
+name2=Test4314141A_
+name3=Test4314141A_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141A__DE.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,24 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name2=Test4314141A__DE
+name3=Test4314141A__DE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141A___EURO.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name3=Test4314141A___EURO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141A_de.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,25 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name1=Test4314141A_de
+name2=Test4314141A_de
+name3=Test4314141A_de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141A_de_.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,24 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name2=Test4314141A_de_
+name3=Test4314141A_de_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141B.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,36 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.util.ListResourceBundle;
+
+public class Test4314141B extends ListResourceBundle {
+    protected Object[][] getContents() {
+        return new Object[][] {
+            {"name0", "Test4314141B.class"},
+            {"name1", "Test4314141B.class"},
+            {"name2", "Test4314141B.class"},
+            {"name3", "Test4314141B.class"}
+        };
+    }
+}
+
+            
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141B_en.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,25 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name1=Test4314141B_en.properties
+name2=Test4314141B_en.properties
+name3=Test4314141B_en.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141B_es_ES.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,32 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.util.ListResourceBundle;
+
+public class Test4314141B_es_ES extends ListResourceBundle {
+    protected Object[][] getContents() {
+        return new Object[][] {
+            {"name2", "Test4314141B_es_ES.class"},
+            {"name3", "Test4314141B_es_ES.class"}
+        };
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141B_fr.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,25 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name1=Test4314141B_fr.properties
+name2=Test4314141B_fr.properties
+name3=Test4314141B_fr.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141B_fr_CH.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,34 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.util.ListResourceBundle;
+
+public class Test4314141B_fr_CH extends ListResourceBundle {
+    protected Object[][] getContents() {
+        return new Object[][] {
+            {"name2", "Test4314141B_fr_CH.class"},
+            {"name3", "Test4314141B_fr_CH.class"}
+        };
+    }
+}
+
+            
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4314141B_fr_CH.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,24 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name2=Test4314141B_fr_CH.properties
+name3=Test4314141B_fr_CH.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4318520.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,53 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test 1.3 04/09/07
+    @summary test that getBundle handles change in default locale correctly
+    @bug 4318520
+*/
+
+/*
+ * @(#)Test4318520.java	1.3 07/04/09
+ */
+
+import java.util.ResourceBundle;
+import java.util.Locale;
+
+public class Test4318520 {
+
+    public static void main(String[] args) {
+        test(Locale.GERMAN);
+        test(Locale.ENGLISH);
+    }
+
+    private static void test(Locale locale) {
+        Locale.setDefault(locale);
+        ResourceBundle myResources =
+                ResourceBundle.getBundle("Test4318520RB", Locale.FRENCH);
+        String actualLocale = myResources.getString("name");
+        if (!actualLocale.equals(locale.toString())) {
+            System.out.println("expected: " + locale + ", got: " + actualLocale);
+            throw new RuntimeException();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4318520RB_de.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name=de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/Test4318520RB_en.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,23 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+name=en
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/TestBug4179766.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,311 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+    @test  1.3 99/02/15
+    @summary test Resource Bundle for bug 4179766
+    @build Bug4179766Class Bug4179766Resource Bug4179766Getter
+    @run main TestBug4179766
+    @bug 4179766
+*/
+/*
+ * @(#)TestBug4179766.java	1.5 07/04/09
+ *
+ * (C) Copyright IBM Corp. 1996 - 1999 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+import java.util.Hashtable;
+import java.util.ResourceBundle;
+import java.util.MissingResourceException;
+import java.util.Hashtable;
+import java.io.File;
+import java.io.FileInputStream;
+
+/**
+ * This class tests the behavior of the ResourceBundle cache with 
+ * respect to ClassLoaders.  The same resource loaded by different
+ * loaders should be cached as separate objects, one for each loader.
+ * In order to test this behavior, this test constructs a custom
+ * class loader to load its resources.  It does not delegate resource
+ * loading to the system loader to load the class files, but loads
+ * them from the current directory instead.  This is so that the
+ * defining class loader for the resources is different.  If it
+ * delegated to the system loader to load the resources, the
+ * defining ClassLoader would be the same even though the initiating
+ * loader differered, and the resource would only be cached once.
+ */
+public class TestBug4179766 extends RBTestFmwk {
+    //hash code used by class loaders when sameHash is true
+    private static final int SAME_HASH_CODE = 0;
+    //the next unique hash code
+    private static int nextHashCode = SAME_HASH_CODE + 1;
+    //suffix on class files
+    private static final String CLASS_SUFFIX = ".class";
+
+    //generate a unique hashcode for a class loader
+    private static synchronized int getNextHashCode() {
+        return nextHashCode++;
+    }
+
+    public static void main(String[] args) throws Exception {
+        //static links so all needed classes get compiled
+        Object o1 = new Bug4179766Class();
+        Object o2 = new Bug4179766Resource();
+        new TestBug4179766().run(args);
+    }
+
+    /**
+    * Ensure the resource cache is working correctly for a single
+    * resource from a single loader.  If we get the same resource
+    * from the same loader twice, we should get the same resource.
+    */
+    public void testCache() throws Exception {
+        Loader loader = new Loader(false);
+        ResourceBundle b1 = getResourceBundle(loader, "Bug4179766Resource");
+        if (b1 == null) {
+            errln("Resource not found: Bug4179766Resource");
+        }
+        ResourceBundle b2 = getResourceBundle(loader, "Bug4179766Resource");
+        if (b2 == null) {
+            errln("Resource not found: Bug4179766Resource");
+        }
+        printIDInfo("[bundle1]",b1);
+        printIDInfo("[bundle2]",b2);
+        if (b1 != b2) {
+            errln("Different objects returned by same ClassLoader");
+        }
+    }
+
+    /**
+    * Test that loaders with the same hash key still
+    * cache resources seperately
+    */
+    public void testSameHash() throws Exception {
+        doTest(true);
+    }
+    
+    /**
+    * Test that loaders with different hash keys
+    * cache resources seperately
+    */
+    public void testDifferentHash() throws Exception {
+        doTest(false);
+    }
+
+    /**
+     * Ensure that cached resources for different ClassLoaders
+     * are cached seperately
+     */
+    private void doTest(boolean sameHash) throws Exception {
+        ResourceBundle b1 = getResourceBundle(new Loader(sameHash), "Bug4179766Resource");
+        if (b1 == null) {
+           errln("Resource not found: Bug4179766Resource");
+        }
+        ResourceBundle b2 = getResourceBundle(new Loader(sameHash), "Bug4179766Resource");
+        if (b2 == null) {
+           errln("Resource not found: Bug4179766Resource");
+        }
+        printIDInfo("[bundle1]",b1);
+        printIDInfo("[bundle2]",b2);
+        if (b1 == b2) {
+           errln("Same object returned by different ClassLoaders");
+        }
+    }
+
+    /**
+     * Get a resource using a specified class loader to load the resource
+     */
+    private ResourceBundle getResourceBundle(Loader loader, String name) throws Exception {
+        try {
+            Class c = loader.loadClass("Bug4179766Class");
+            Bug4179766Getter test = (Bug4179766Getter)c.newInstance();
+            return test.getResourceBundle(name);
+        } catch (ClassNotFoundException e) {
+            errln("Class not found by custom class loader: "+name);
+            throw e;
+        } catch (InstantiationException e) {
+            errln("Error instantiating: "+name);
+            throw e;
+        } catch (IllegalAccessException e) {
+            errln("IllegalAccessException instantiating: "+name);
+            throw e;
+        }
+    }
+
+    /**
+     * Print information about an object
+     * [message][object's identity][object's class][object's loader][loaders hash][loaders identity]
+     */
+    private void printIDInfo(String message, Object o) {
+        if (o == null) {
+            return;
+        }
+        Class c = o.getClass();
+        ClassLoader l = c.getClassLoader();
+        int hash = -1;
+        if (l != null) {
+            hash = l.hashCode();
+        }
+        logln(message + System.identityHashCode(o) + "  Class: " + c 
+                + "  ClassLoader: " + l + "  loaderHash: " + hash
+                + "  loaderPrimHash: " + System.identityHashCode(l));
+    }
+
+    /**
+     * A simple class loader that loads classes from the current
+     * working directory.  The hash code of the loader can be
+     * set to be either the loaders identity or 0, allowing several
+     * loaders to have the same hashCode value.
+     */
+    public class Loader extends ClassLoader {
+        private int thisHashCode;
+        
+        /**
+         * Create a new loader
+         */
+        public Loader(boolean sameHash) {
+            if (sameHash) {
+                thisHashCode = SAME_HASH_CODE;
+            } else {
+                thisHashCode = getNextHashCode();
+            }
+        }
+
+        /**
+         * Return the hash code for this loader.
+         */
+        public int hashCode() {
+            return thisHashCode;
+        }
+
+        /**
+         * Get the data from the class file for the specified class.  If
+         * the file can't be found, or the class is not one of the
+         * special ones listed below, return null.
+         *    Bug4179766Class
+         *    Bug4179766Resource
+         */
+        private byte[] getClassData(String className) {
+            boolean shouldLoad = className.equals("Bug4179766Class");
+            shouldLoad = shouldLoad || className.equals("Bug4179766Resource");
+
+            if (shouldLoad) {
+                try {
+                    File file = new File(System.getProperty("test.classes", "."), className+CLASS_SUFFIX);
+                    FileInputStream fi = new FileInputStream(file);
+                    byte[] result = new byte[fi.available()];
+                    fi.read(result);
+                    return result;
+                } catch (Exception e) {
+                    return null;
+                }
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Load a class.  Files we can load take preference over ones the system
+         * can load.
+         */
+        public synchronized Class loadClass(String className, boolean resolveIt)
+                throws ClassNotFoundException {
+                
+            Class result = findLoadedClass(className);
+            if (result != null) {
+                printInfo("        ***Returning cached class: "+className, result);
+                return result;
+            }
+
+            byte[] classData = getClassData(className);
+            if (classData == null) {
+                //we don't have a local copy of this one
+                return loadFromSystem(className);
+            }
+
+            result = defineClass(classData, 0, classData.length);
+            if (result == null) {
+                //there was an error defining the class
+                return loadFromSystem(className);
+            }
+
+            if (resolveIt) {
+                resolveClass(result);
+            }
+
+            printInfo("        ***Loaded local class: "+className, result);
+            return result;
+        }
+
+        /**
+         * Delegate loading to the system loader
+         */
+        private Class loadFromSystem(String className) throws ClassNotFoundException {
+            try {
+                Class result = super.findSystemClass(className);
+                printInfo("        ***Returning system class: "+className, result);
+                return result;
+            } catch (ClassNotFoundException e) {
+                printInfo("        ***Class not found: "+className, null);
+                throw e;
+            }
+        }
+
+        /**
+         * Print information about a class that was loaded
+         * [loader identity][message][class identity]
+         */
+        private void printInfo(String message, Class c) {
+            if (c != null) {
+                logln(""+System.identityHashCode(this)+"  "+message+"  "+System.identityHashCode(c));
+            } else {
+                logln(""+System.identityHashCode(this)+"  "+message);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/TestResource.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,73 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TestResource.java	1.7 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+// NOTE:  This class is part of the ResourceBundleTest.
+
+import java.util.*;
+
+public class TestResource extends ListResourceBundle {
+    public Object[][] getContents() {
+        return contents;
+    }
+
+    static final Object[][] contents = {
+        { "Now", "Now is the time for all..." },
+        { "Time", "Howdy Doody Time!" },
+        { "Good", new Integer(27) },
+        { "Men", new String[] { "1", "2", "C" } },
+        { "Come", "Come into my parlor..." }
+    };
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/TestResource_de.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,69 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TestResource_de.java	1.7 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+// NOTE:  This class is part of the ResourceBundleTest.
+
+// NOTE:  As of 11/21/97, this class isn't actually being used by the ResourceBundleTest
+// anymore.  I've left it here simply because we don't currently have a way to obsolete
+// a file in RCS.  If you're running it, you've got a problem!
+
+import java.util.*;
+import java.io.*;
+
+public class TestResource_de extends PropertyResourceBundle {
+    public TestResource_de() throws IOException, FileNotFoundException {
+        super(new FileInputStream("TestResource_de"));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/TestResource_fr.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,101 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TestResource_fr.java	1.7 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+// NOTE:  This class is part of the ResourceBundleTest.
+
+import java.util.*;
+
+public class TestResource_fr extends ResourceBundle {
+    public TestResource_fr() {
+    }
+
+    public Object handleGetObject(String key) throws MissingResourceException {
+        if (key.equals("Time"))
+            return "Time keeps on slipping...";
+        else if (key.equals("For"))
+            return "Four score and seven years ago...";
+        else if (key.equals("All")) {
+            String[] values = {
+                "'Twas brillig, and the slithy toves",
+                "Did gyre and gimble in the wabe.",
+                "All mimsy were the borogoves,",
+                "And the mome raths outgrabe."
+            };
+            return values;
+        }
+        else if (key.equals("Good"))
+            return new Integer(3);
+        else
+            return null;
+    }
+
+    public Enumeration getKeys() {
+        Hashtable keys = new Hashtable();
+
+        keys.put("Time", "Time");
+        keys.put("For", "For");
+        keys.put("All", "All");
+        keys.put("Good", "Good");
+
+        Enumeration parentKeys = parent.getKeys();
+        while (parentKeys.hasMoreElements()) {
+            Object  elt = parentKeys.nextElement();
+            keys.put(elt, elt);
+        }
+
+        return keys.elements();
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/TestResource_fr_CH.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,71 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TestResource_fr_CH.java	1.5 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+// NOTE:  This class is part of the ResourceBundleTest.
+
+// This class is here so that we can call getLocale() on it and get back fr_CH.
+// It should gracefully inherit everything from TestResource_fr.
+
+import java.util.*;
+
+public class TestResource_fr_CH extends ListResourceBundle {
+    public Object[][] getContents() {
+        return contents;
+    }
+
+    static final Object[][] contents = {
+    };
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/TestResource_it.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,72 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @(#)TestResource_it.java	1.6 07/04/09
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+// NOTE:  This class is part of the ResourceBundleTest.
+
+// This class is designed to make sure we don't crash ResourceBundle if we create
+// a ListResourceBundle with nothing in it.  This should gracefully inherit everything
+// from its parent.
+
+import java.util.*;
+
+public class TestResource_it extends ListResourceBundle {
+    public Object[][] getContents() {
+        return contents;
+    }
+
+    static final Object[][] contents = {
+    };
+}
+
Binary file j2se/test/java/util/ResourceBundle/awtres.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/ResourceBundle/bug4195978Test.properties	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,28 @@
+# 
+# Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# This file is part of Bug4195978Test.
+# 2/20/2000
+# joconner
+#
+test=test
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/StringTokenizer/FormFeed.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright 1997 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test 1.5 07/05/18
+ * @bug 4017777
+ * @summary Test StringTokenizer on \f character
+ */
+
+import java.util.StringTokenizer;
+
+/**
+ * This class tests to see if the StringTokenizer recognizes
+ * backslash f as a whitespace character (it should)
+ */
+public class FormFeed {
+
+   public static void main(String[] argv) {
+      StringTokenizer st = new StringTokenizer("ABCD\tEFG\fHIJKLM PQR");
+           
+      if (st.countTokens() != 4)
+         throw new RuntimeException("StringTokenizer does not treat form feed as whitespace.");
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/java/util/Vector/IllegalConstructorArgs.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,58 @@
+/*
+ * Copyright 1997 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test 1.8 07/05/18
+ * @bug 4061897
+ * @summary Test for illegal argument exception
+ */
+
+import java.util.*;
+
+/**
+ * This is a simple test class created to check for
+ * an exception when a new Vector is constructed with
+ * illegal arguments
+ */
+public class IllegalConstructorArgs {
+
+      public static void main(String argv[]) {
+          int testSucceeded=0;
+
+        try{
+           // this should generate an IllegalArgumentException
+           Vector bad1 = new Vector(-100, 10);
+        }
+        catch (IllegalArgumentException e1) {
+            testSucceeded =1;
+        }
+        catch (NegativeArraySizeException e2) {
+            testSucceeded =0;
+        }
+
+        if(testSucceeded == 0)
+             throw new RuntimeException("Wrong exception thrown.");
+
+     }
+       
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/javax/imageio/plugins/gif/GifTransparencyTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,186 @@
+/*
+ * @test    @(#)GifTransparencyTest.java	1.1 07/03/23
+ * @bug     6276653 6287936
+ *
+ * @summary Test verifes that Image I/O gif writer correctly handles
+ *          image what supports tranclucent transparency type but contains
+ *          picture with opaque or bitmask transparecy (i.e. each image pixel
+ *          is ether opaque or fully transparent). 
+ * 
+ * @run     main GifTransparencyTest
+ */
+
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.geom.Area;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriter;
+import javax.imageio.spi.ImageWriterSpi;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+
+public class GifTransparencyTest {
+    
+    BufferedImage src;
+    BufferedImage dst;
+    
+    public GifTransparencyTest() {
+        src = createTestImage();     
+    }
+    
+    public void doTest() {
+        File pwd = new File(".");
+        try {    
+            File f = File.createTempFile("transparency_test_", ".gif", pwd);
+            System.out.println("file: " + f.getCanonicalPath());
+            
+            ImageWriter w = ImageIO.getImageWritersByFormatName("GIF").next();
+            
+            ImageWriterSpi spi = w.getOriginatingProvider();
+            
+            boolean succeed_write = ImageIO.write(src, "gif", f);
+            
+            if (!succeed_write) {
+                throw new RuntimeException("Test failed: failed to write src.");
+            }
+            
+            dst = ImageIO.read(f);
+            
+            checkResult(src, dst);
+            
+        } catch (IOException e) {
+            throw new RuntimeException("Test failed.", e);
+        }
+    }
+    
+    /*
+     * Failure criteria:
+     *  - src and dst have different dimension
+     *  - any transparent pixel was lost
+     */
+    protected void checkResult(BufferedImage src, BufferedImage dst) {
+        int w = src.getWidth();
+        int h = src.getHeight();
+        
+        
+        if (dst.getWidth() != w || dst.getHeight() != h) {
+            throw new RuntimeException("Test failed: wrong result dimension");
+        }
+        
+        BufferedImage bg = new BufferedImage(2 * w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics g = bg.createGraphics();
+        g.setColor(Color.white);
+        g.fillRect(0, 0, 2 * w, h);
+        
+        g.drawImage(src, 0, 0, null);
+        g.drawImage(dst, w, 0, null);
+        
+        g.dispose();
+        
+        for (int y = 0; y < h; y++) {
+            for (int x = 0; x < w; x++) {
+                int src_rgb = bg.getRGB(x, y);
+                int dst_rgb = bg.getRGB(x + w, y);
+                
+                if (dst_rgb != src_rgb) {
+                    throw new RuntimeException("Test failed: wrong color " +
+                            Integer.toHexString(dst_rgb) + " at " + x + ", " +
+                            y + " (instead of " + Integer.toHexString(src_rgb) +
+                            ")");
+                }
+            }
+        }
+        System.out.println("Test passed.");
+    }
+    
+    public void show() {        
+        JPanel p = new JPanel(new BorderLayout()) {
+            public void paintComponent(Graphics g) {
+                g.setColor(Color.blue);
+                g.fillRect(0, 0, getWidth(), getHeight());
+            }
+        };
+        p.add(new ImageComponent(src), BorderLayout.WEST);
+        if (dst != null) {
+        p.add(new ImageComponent(dst), BorderLayout.EAST);
+        }
+         
+        JFrame f = new JFrame("Transparency");
+        f.add(p);
+
+        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        f.pack();
+        f.setVisible(true);
+    }
+    
+    public static class ImageComponent extends JComponent {
+        BufferedImage img;
+        
+        public ImageComponent(BufferedImage img) {
+            this.img = img;
+        }
+        
+        public Dimension getPreferredSize() {
+            return new Dimension(img.getWidth() + 2, img.getHeight() + 2);
+        }
+        
+        public void paintComponent(Graphics g) {
+            g.drawImage(img, 1, 1, this);
+        }
+    }
+    
+    protected BufferedImage createTestImage() {
+        BufferedImage img = new BufferedImage(200, 200,
+                                              BufferedImage.TYPE_INT_ARGB);
+        Graphics g = img.createGraphics();
+        
+        g.setColor(Color.red);
+        g.fillRect(50, 50, 100, 100);
+        g.dispose();
+        
+        return img;
+    }
+    
+    public static class Empty extends GifTransparencyTest {
+        protected BufferedImage createTestImage() {
+            return new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
+        }
+    }
+    
+    public static class Opaque extends GifTransparencyTest {
+        protected BufferedImage createTestImage() {
+            BufferedImage img = new BufferedImage(200, 200,
+                                                  BufferedImage.TYPE_INT_ARGB);
+            Graphics g = img.createGraphics();
+            g.setColor(Color.cyan);
+            g.fillRect(0, 0, 200, 200);
+            
+            g.setColor(Color.red);
+            g.fillRect(50, 50, 100, 100);
+            g.dispose();
+            
+            return img;
+        }
+    }
+    
+    public static void main(String[] args) {
+        System.out.println("Test bitmask...");
+        new GifTransparencyTest().doTest();
+
+        System.out.println("Test opaque...");
+        new GifTransparencyTest.Opaque().doTest();
+        
+        System.out.println("Test empty...");
+        new GifTransparencyTest.Empty().doTest();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/javax/imageio/plugins/jpeg/ConcurrentReadingTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug     6547241
+ * @summary Test verifies that concurrent usage of jpeg reader instance 
+ *          by number of threads does not cause crash in jpeg library.
+ * @run     main ConcurrentReadingTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RadialGradientPaint;
+import java.awt.geom.Point2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.ImageReadParam;
+import javax.imageio.stream.ImageInputStream;
+
+public class ConcurrentReadingTest extends Thread {
+
+    static ImageReader r = null;
+    static File file = new File("IMGP1001.JPG");
+
+    private static final int MAX_THREADS = 50;
+
+    static int completeCount = 0;;
+    static Object lock = new Object();
+
+    public static void main(String[] args) throws Exception {
+        createTestFile();
+
+        ImageInputStream iis = ImageIO.createImageInputStream(file);
+        r = ImageIO.getImageReaders(iis).next();
+        iis.close();
+        
+        for (int i = 0; i < MAX_THREADS; i++) {
+            (new ConcurrentReadingTest()).start();
+        }
+
+        // wait for started threads
+        boolean needWait = true;
+        while (needWait) {
+            Thread.sleep(100);
+            synchronized(lock) {
+                needWait = completeCount < MAX_THREADS;
+            }
+        } 
+        System.out.println("Test PASSED.");
+    }
+    
+    public void run() {
+        try {
+            ImageInputStream iis = ImageIO.createImageInputStream(file);
+            r.setInput(iis);
+            ImageReadParam p = r.getDefaultReadParam();
+            Thread.sleep(70);
+            BufferedImage res = r.read(0, p);
+            Thread.sleep(70);
+            r.reset();
+        } catch (IllegalStateException e) {
+            System.out.println(e);
+        } catch (IOException e) {
+            System.out.println(e);
+        } catch (Throwable e) {
+            // Unexpected exception. Test failed.
+            throw new RuntimeException("Test failed.", e);
+        } finally {
+            synchronized(lock) {
+                completeCount ++;
+            }
+        }
+    }
+
+    private static void createTestFile() {
+        int w = 1280;
+        int h = 1024;
+
+        BufferedImage img = new
+            BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = img.createGraphics();
+        Color[] colors = { Color.red, Color.green, Color.blue };
+        float[] dist = {0.0f, 0.5f, 1.0f };
+        Point2D center = new Point2D.Float(0.5f * w, 0.5f * h);
+        
+        RadialGradientPaint p =
+            new RadialGradientPaint(center, 0.5f * w, dist, colors);
+        g.setPaint(p);
+        g.fillRect(0, 0, w, h);
+        g.dispose();
+
+        try {
+            System.out.println("Create test image " + file.getAbsolutePath());
+            boolean b = ImageIO.write(img, "JPEG", file);
+            if (!b) {
+                throw new RuntimeException("Failed to create test image.");
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Test failed", e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/javax/imageio/plugins/jpeg/ConcurrentWritingTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug     6547241
+ * @summary Test verifies that concurrent usage of jpeg writer instance 
+ *          by number of threads does not cause crash in jpeg library.
+ * @run     main ConcurrentWritingTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RadialGradientPaint;
+import java.awt.geom.Point2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
+
+public class ConcurrentWritingTest extends Thread {
+
+    static ImageWriter w = null;
+    static File pwd = new File(".");
+    static BufferedImage img;
+
+    private static int MAX_THREADS = 50;
+    private static int completeCount = 0;
+    private static Object lock = new Object();
+
+    public static void main(String[] args) throws Exception {
+        img = createTestImage();
+
+        w = ImageIO.getImageWritersByFormatName("JPEG").next();
+        
+        for (int i = 0; i < MAX_THREADS; i++) {
+            (new ConcurrentWritingTest()).start();
+        }
+
+        // wait for threads
+        boolean needWait = true;
+        while(needWait) {
+            synchronized(lock) {
+                needWait = completeCount < MAX_THREADS;
+            }
+        }
+        System.out.println("Test PASSED");
+    }
+    
+    public void run() {
+        try {
+            File f = File.createTempFile("writer_", ".jpg", pwd);
+            ImageOutputStream ios = ImageIO.createImageOutputStream(f);
+            w.setOutput(ios);
+            Thread.sleep(70);
+            w.write(img);
+            Thread.sleep(70);
+            w.reset();
+        } catch (IllegalStateException e) {
+            System.out.println(e);
+        } catch (IOException e) {
+            System.out.println(e);
+        } catch (Throwable e) {
+            // Unexpected exception. Test failed.
+            throw new RuntimeException("Test failed.", e);
+        } finally {
+            synchronized(lock) {
+                completeCount ++;
+            }
+        }
+    }
+
+    private static BufferedImage createTestImage() {
+        int w = 1024;
+        int h = 768;
+
+        BufferedImage img = new
+            BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = img.createGraphics();
+        Color[] colors = { Color.red, Color.green, Color.blue };
+        float[] dist = {0.0f, 0.5f, 1.0f };
+        Point2D center = new Point2D.Float(0.5f * w, 0.5f * h);
+        
+        RadialGradientPaint p =
+            new RadialGradientPaint(center, 0.5f * w, dist, colors);
+        g.setPaint(p);
+        g.fillRect(0, 0, w, h);
+        g.dispose();
+        
+        return img;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/javax/imageio/plugins/jpeg/ReadingInterruptionTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug     6557086 6547241
+ * @summary Test verifies that invocation of reset/abort/dispose methods from
+ *          another thread does not cause crash in jpeg library.
+ * @run     main ReadingInterruptionTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RadialGradientPaint;
+import java.awt.geom.Point2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.ImageReadParam;
+import javax.imageio.event.IIOReadProgressListener; 
+import javax.imageio.stream.ImageInputStream;
+
+
+public class ReadingInterruptionTest implements IIOReadProgressListener {
+
+    public static void main(String[] args) {
+        createTestFile();
+
+        System.out.println("Test abort()....");
+        ReadingInterruptionTest t = new ReadingInterruptionTest(new AbortAction());
+        t.doTest();
+
+        System.out.println("Test reset()....");
+        t = new ReadingInterruptionTest(new ResetAction());
+        t.doTest();
+ 
+        System.out.println("Test dispose()....");
+        t = new ReadingInterruptionTest(new DisposeAction());
+        t.doTest();
+     }
+
+    protected abstract static class Action implements Runnable {
+        protected ImageReader target;
+        
+        public void setTarget(ImageReader target) {
+            this.target = target;
+        }
+
+        public abstract void run();
+    }
+
+    protected static class DisposeAction extends Action {
+        public void run() {
+            try {
+                target.dispose();
+            } catch (IllegalStateException e) {
+                System.out.println("Test PASSED: IllegalStateException was thrown.");
+            } catch (Throwable e) {
+                throw new RuntimeException("Test FAILED.", e);
+            }
+        }
+    }
+
+    protected static class AbortAction extends Action {
+        public void run() {
+            try {
+                target.abort();
+            } catch (IllegalStateException e) {
+                System.out.println("Test PASSED: IllegalStateException was thrown.");
+            } catch (Throwable e) {
+                throw new RuntimeException("Test FAILED.", e);
+            }
+        }
+    }
+
+    protected static class ResetAction extends Action {
+        public void run() {
+            try {
+                target.reset();
+            } catch (IllegalStateException e) {
+                System.out.println("Test PASSED: IllegalStateException was thrown.");
+            } catch (Throwable e) {
+                throw new RuntimeException("Test FAILED.", e);
+            }
+        }
+    }
+
+    static File file = new File("IMGP1001.JPG");
+
+    Action action;
+    ImageInputStream iis;
+    ImageReader reader;
+
+    protected ReadingInterruptionTest(Action action) {
+        this.action = action;
+
+        reader = ImageIO.getImageReadersByFormatName("JPEG").next();
+        
+        this.action.setTarget(reader);
+    }
+
+    public void doTest() {
+        try {
+            reader.addIIOReadProgressListener(this);
+            iis = ImageIO.createImageInputStream(file);
+            reader.setInput(iis);
+            ImageReadParam p = reader.getDefaultReadParam();
+            Thread.sleep(70);
+            BufferedImage res = reader.read(0, p);
+            Thread.sleep(70);
+        } catch (Exception e) {
+            /*
+             * we do expect that concurrent attempt to dispose this 
+             * instance of image reader will be blocked. So, this image
+             * should be read sucessfuly. Otherwise, something went wrong
+             * and we need to report test failure.
+             */
+            throw new RuntimeException("Test FAILED", e);
+        } finally {
+            /*
+             * it would happen that concurrent invocation of dispose() method
+             * will be successful. Due to race condition it seems to be possible
+             * that dispose operation will be performed after than read() operation
+             * leaveled thread lock. In this case all subsequent calls for reader
+             * methods should results in IllegalStateException. So, we treat
+             * IllegalStateException as success. Everything else means test failure.
+             */
+            try {
+                reader.reset();
+            } catch (IllegalStateException e) {
+                System.out.println("Expected exception was caught: " + e);
+            } catch(Exception e) {
+                throw new RuntimeException("Test FAILED.", e);
+            }
+        }
+        System.out.println("Test PASSED.");
+    }
+
+    // listener medthods
+    public void imageStarted(ImageReader source,
+                                  int imageIndex) {} ;
+
+    public void imageProgress(ImageReader source,
+                              float percentageDone)
+    {
+        if (20f < percentageDone && percentageDone < 80f) {
+            Thread t = new Thread(action);
+            t.start();
+        }
+    };
+
+    public void imageComplete(ImageReader source) {};
+
+    
+    public void sequenceStarted(ImageReader source,
+                                int minIndex) {};
+    
+    public void sequenceComplete(ImageReader source) {};
+
+    public void thumbnailStarted(ImageReader source,
+                                 int imageIndex,
+                                 int thumbnailIndex) {};
+    
+    public void thumbnailProgress(ImageReader source,
+                                  float percentageDone) {};
+
+    public void thumbnailComplete(ImageReader source) {};
+
+    public void readAborted(ImageReader source) {};
+
+    private static void createTestFile() {
+        int w = 1280;
+        int h = 1024;
+        
+        BufferedImage img = new
+            BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = img.createGraphics();
+        Color[] colors = { Color.red, Color.green, Color.blue };
+        float[] dist = {0.0f, 0.5f, 1.0f };
+        Point2D center = new Point2D.Float(0.5f * w, 0.5f * h);
+        
+        RadialGradientPaint p =
+            new RadialGradientPaint(center, 0.5f * w, dist, colors);
+        g.setPaint(p);
+        g.fillRect(0, 0, w, h);
+        g.dispose();
+        
+        try {
+            System.out.println("Create test image " + file.getAbsolutePath());
+            boolean b = ImageIO.write(img, "JPEG", file);
+            if (!b) {
+                throw new RuntimeException("Failed to create test image.");
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Test failed", e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/javax/imageio/plugins/jpeg/WritingInterruptionTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug     6557086 6547241
+ * @summary Test verifies that invocation of reset/abort/dispose methods from
+ *          another thread does not cause crash in jpeg library.
+ * @run     main WritingInterruptionTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RadialGradientPaint;
+import java.awt.geom.Point2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriter;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.event.IIOWriteProgressListener; 
+import javax.imageio.stream.ImageOutputStream;
+
+
+public class WritingInterruptionTest implements IIOWriteProgressListener {
+
+    static File pwd = new File(".");
+    static BufferedImage img;
+
+    public static void main(String[] args) {
+        img = createTestImage();
+
+        System.out.println("Test abort()....");
+        WritingInterruptionTest t = new WritingInterruptionTest(new AbortAction());
+        t.doTest();
+
+        System.out.println("Test reset()....");
+        t = new WritingInterruptionTest(new ResetAction());
+        t.doTest();
+ 
+        System.out.println("Test dispose()....");
+        t = new WritingInterruptionTest(new DisposeAction());
+        t.doTest();
+     }
+
+    protected abstract static class Action implements Runnable {
+        protected ImageWriter target;
+        
+        public void setTarget(ImageWriter target) {
+            this.target = target;
+        }
+
+        public abstract void run();
+    }
+
+    protected static class DisposeAction extends Action {
+        public void run() {
+            try {
+                target.dispose();
+            } catch (IllegalStateException e) {
+                System.out.println("Test PASSED: IllegalStateException was thrown.");
+            } catch (Throwable e) {
+                throw new RuntimeException("Test FAILED.", e);
+            }
+        }
+    }
+
+    protected static class AbortAction extends Action {
+        public void run() {
+            try {
+                target.abort();
+            } catch (IllegalStateException e) {
+                System.out.println("Test PASSED: IllegalStateException was thrown.");
+            } catch (Throwable e) {
+                throw new RuntimeException("Test FAILED.", e);
+            }
+        }
+    }
+
+    protected static class ResetAction extends Action {
+        public void run() {
+            try {
+                target.reset();
+            } catch (IllegalStateException e) {
+                System.out.println("Test PASSED: IllegalStateException was thrown.");
+            } catch (Throwable e) {
+                throw new RuntimeException("Test FAILED.", e);
+            }
+        }
+    }
+
+
+    Action action;
+    ImageOutputStream ios;
+    ImageWriter w;
+
+    protected WritingInterruptionTest(Action action) {
+        this.action = action;
+
+        w = ImageIO.getImageWritersByFormatName("JPEG").next();
+        
+        this.action.setTarget(w);
+    }
+    
+    public void doTest() {
+        try {
+            w.addIIOWriteProgressListener(this);
+            File f = File.createTempFile("writer_", ".jpg", pwd);
+            ImageOutputStream ios = ImageIO.createImageOutputStream(f);
+            w.setOutput(ios);
+            Thread.sleep(70);
+            w.write(img);
+            Thread.sleep(70);
+        } catch (Exception e) {
+            /*
+             * we do expect that concurrent attempt to dispose this 
+             * instance of image writer will be blocked. So, this image
+             * should be writen sucessfuly. Otherwise, something went wrong
+             * and we need to report test failure.
+             */
+            throw new RuntimeException("Test FAILED", e);
+        } finally {
+            /*
+             * it would happen that concurrent invocation of dispose() method
+             * will be successful. Due to race condition it seems to be possible
+             * that dispose operation will be performed after than write() operation
+             * leaveled thread lock. In this case all subsequent calls for writer
+             * methods should results in IllegalStateException. So, we treat
+             * IllegalStateException as success. Everything else means test failure.
+             */
+            try {
+                w.reset();
+            } catch (IllegalStateException e) {
+                System.out.println("Expected exception was caught: " + e);
+            } catch(Exception e) {
+                throw new RuntimeException("Test FAILED.", e);              
+            }
+        }
+        System.out.println("Test PASSED.");
+    }
+
+    // listener medthods
+    public void imageStarted(ImageWriter source,
+                                  int imageIndex) {} ;
+
+    public void imageProgress(ImageWriter source,
+                              float percentageDone)
+    {
+        if (20f < percentageDone && percentageDone < 80f ) {
+            Thread t = new Thread(action);
+            t.start();
+        }
+    };
+
+    public void imageComplete(ImageWriter source) {};
+
+    public void thumbnailStarted(ImageWriter source,
+                                 int imageIndex,
+                                 int thumbnailIndex) {};
+    
+    public void thumbnailProgress(ImageWriter source,
+                                  float percentageDone) {};
+
+    public void thumbnailComplete(ImageWriter source) {};
+
+    public void writeAborted(ImageWriter source) {};
+
+
+    private static BufferedImage createTestImage() {
+        int w = 1024;
+        int h = 768;
+
+        BufferedImage img = new
+            BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = img.createGraphics();
+        Color[] colors = { Color.red, Color.green, Color.blue };
+        float[] dist = {0.0f, 0.5f, 1.0f };
+        Point2D center = new Point2D.Float(0.5f * w, 0.5f * h);
+
+        RadialGradientPaint p =
+            new RadialGradientPaint(center, 0.5f * w, dist, colors);
+        g.setPaint(p);
+        g.fillRect(0, 0, w, h);
+        g.dispose();
+
+        return img;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/javax/imageio/plugins/png/GrayPngTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug     6557713
+ * @summary Test verifies that PNG image writer correctly handles indexed images with
+ *          various types of transparency.
+ *
+ * Test for 4bpp OPAQUE image
+ * @run     main GrayPngTest 4 1 3
+ *
+ * Test for 4bpp BITMASK image with transparent pixel 3
+ * @run     main GrayPngTest 4 2 3
+ *
+ * Test for 4bpp TRANSLUCENT image
+ * @run     main GrayPngTest 4 3 3
+ *
+ * Test for 8bpp OPAQUE image
+ * @run     main GrayPngTest 8 1 127
+ *
+ * Test for 8bpp BITMASK image with transparent pixel 127
+ * @run     main GrayPngTest 8 2 127
+ *
+ * Test for 8bpp TRANSLUCENT image
+ * @run     main GrayPngTest 8 3 127
+ *
+ */
+
+import java.awt.Color;
+import java.awt.Transparency;
+import java.awt.image.BufferedImage;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import javax.imageio.ImageIO;
+
+public class GrayPngTest {
+
+    public static void main(String[] args) throws IOException {
+        /*
+         * Expected argiments:
+         * args[0] - bits per pixel. Supported range: [1, 8]
+         * args[1] - transparency type. Should be one form
+         *           java.awt.Transparency type constants.
+         * args[2] - transparent pixel for BITMASK transparency type,
+         *           otherwise is ignored.
+         */
+        int bpp = 4;
+        int trans_type = Transparency.BITMASK;
+        int trans_pixel = 3;
+        try {
+            bpp = Integer.parseInt(args[0]);
+            trans_type = Integer.parseInt(args[1]);
+            trans_pixel = Integer.parseInt(args[2]);
+        } catch (NumberFormatException e) {
+            System.out.println("Ignore ncorrect bpp value: " + args[0]);
+        } catch (ArrayIndexOutOfBoundsException e) {
+            System.out.println("Default test argumens.");
+        }
+
+        new GrayPngTest(bpp).doTest(trans_type, trans_pixel);
+    }
+
+    
+    
+    private BufferedImage getTestImage(int trans_type, int trans_pixel) {
+        
+        IndexColorModel icm = null;
+        switch(trans_type) {
+            case Transparency.OPAQUE:
+                icm = new IndexColorModel(bpp, numColors, r, g, b);
+                break;
+            case Transparency.BITMASK:
+                icm = new IndexColorModel(bpp, numColors, r, g, b, trans_pixel);
+                break;
+            case Transparency.TRANSLUCENT:
+                a = Arrays.copyOf(r, r.length);
+                icm = new IndexColorModel(bpp, numColors, r, g, b, a);
+                break;
+            default:
+                throw new RuntimeException("Invalid transparency: " + trans_type);
+        }
+        
+        int w = 256 * 2;
+        int h = 200;
+        
+        dx = w / (numColors); 
+        
+        WritableRaster wr = icm.createCompatibleWritableRaster(w, h);
+        for (int i = 0; i < numColors; i ++) {
+            int rx = i * dx;
+            
+            int[] samples = new int[h * dx];
+            Arrays.fill(samples, i);
+            wr.setPixels(rx, 0, dx, h, samples);        
+        }
+        
+        // horizontal line with transparent color
+        int[] samples = new int[w * 10];
+        Arrays.fill(samples, trans_pixel);
+        wr.setPixels(0, h / 2 - 5, w, 10, samples);
+        
+        // create index color model
+        return new BufferedImage(icm, wr, false, null);
+    }
+    
+    static File pwd = new File(".");
+    
+    private BufferedImage src;
+    private BufferedImage dst;
+    private int bpp;
+    private int numColors;
+    
+    private int dx;
+    
+    private byte[] r;
+    private byte[] g;
+    private byte[] b;
+    
+    private byte[] a;
+    
+    protected GrayPngTest(int bpp) {
+        if (0 > bpp || bpp > 8) {
+            throw new RuntimeException("Invalid bpp: " + bpp);
+        }
+        this.bpp = bpp;
+        numColors = (1 << bpp);
+        System.out.println("Num colors: " + numColors);
+        
+        // create palette       
+        r = new byte[numColors];
+        g = new byte[numColors];
+        b = new byte[numColors];
+        
+        int dc = 0xff / (numColors - 1);
+        System.out.println("dc = " + dc);
+        
+        for (int i = 0; i < numColors; i ++) {
+            byte l = (byte)(i * dc);
+            r[i] = l; g[i] = l; b[i] = l;
+        }
+    }
+
+    public void doTest() throws IOException {
+        for (int i = 0; i < numColors; i++) {
+            doTest(Transparency.BITMASK, i);
+        }
+    }
+    
+    public void doTest(int trans_type, int trans_index) throws IOException {
+        src = getTestImage(trans_type, trans_index);
+        
+        System.out.println("src: " + src);
+                
+        File f = File.createTempFile("gray_png_" + bpp + "bpp_" +
+              trans_type + "tt_" +
+                    trans_index + "tp_", ".png", pwd);
+        System.out.println("File: " + f.getAbsolutePath());
+        if (!ImageIO.write(src, "png", f)) {
+            throw new RuntimeException("Writing failed!");
+        };
+        
+        try {
+            dst = ImageIO.read(f);
+            System.out.println("dst: " + dst);
+        } catch (Exception e) {
+            throw new RuntimeException("Test FAILED.", e);
+        }
+        
+        checkImages();
+    }
+    
+    private void checkImages() {
+        for (int i = 0; i < numColors; i++) {
+            int src_rgb = src.getRGB(i * dx, 5);
+            int dst_rgb = dst.getRGB(i * dx, 5);
+            
+            // here we check transparency only due to possible colors space
+            // differences (sRGB in indexed source and Gray in gray+alpha destination)
+            if ((0xff000000 & src_rgb) != (0xff000000 & dst_rgb)) {
+                throw new RuntimeException("Test FAILED. Color difference detected: " +
+                        Integer.toHexString(dst_rgb) + " instead of " +
+                        Integer.toHexString(src_rgb) + " for index " + i);
+                
+            }
+        }
+    }
+}
--- a/j2se/test/javax/management/ImplementationVersion/ImplVersionCommand.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/javax/management/ImplementationVersion/ImplVersionCommand.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,7 @@
  * @(#)file      ImplVersionCommand.java
  * @(#)author    Sun Microsystems, Inc.
  * @(#)version   1.6
- * @(#)date      07/05/24
+ * @(#)date      07/06/21
  */
 
 import javax.management.MBeanServer;
--- a/j2se/test/javax/management/ImplementationVersion/ImplVersionReader.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/javax/management/ImplementationVersion/ImplVersionReader.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,7 @@
  * @(#)file      ImplVersionReader.java
  * @(#)author    Sun Microsystems, Inc.
  * @(#)version   1.4
- * @(#)date      07/05/24
+ * @(#)date      07/06/21
  */
 
 import java.io.BufferedReader;
--- a/j2se/test/javax/management/monitor/MBeanServerBuilderImpl.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/javax/management/monitor/MBeanServerBuilderImpl.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,7 @@
  * @(#)file      MBeanServerBuilderImpl.java
  * @(#)author    Sun Microsystems, Inc.
  * @(#)version   1.4
- * @(#)date      07/05/24
+ * @(#)date      07/06/21
  */
 
 import javax.management.MBeanServer;
--- a/j2se/test/javax/management/monitor/MBeanServerForwarderInvocationHandler.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/javax/management/monitor/MBeanServerForwarderInvocationHandler.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,7 @@
  * @(#)file      MBeanServerForwarderInvocationHandler.java
  * @(#)author    Sun Microsystems, Inc.
  * @(#)version   1.4
- * @(#)date      07/05/24
+ * @(#)date      07/06/21
  */
 
 import java.lang.reflect.InvocationHandler;
--- a/j2se/test/javax/management/remote/mandatory/version/ImplVersionCommand.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/javax/management/remote/mandatory/version/ImplVersionCommand.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,7 @@
  * @(#)file      ImplVersionCommand.java
  * @(#)author    Sun Microsystems, Inc.
  * @(#)version   1.4
- * @(#)date      07/05/24
+ * @(#)date      07/06/21
  */
 
 import javax.management.remote.rmi.RMIJRMPServerImpl;
--- a/j2se/test/javax/management/remote/mandatory/version/ImplVersionReader.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/javax/management/remote/mandatory/version/ImplVersionReader.java	Fri Jun 22 00:46:43 2007 +0000
@@ -25,7 +25,7 @@
  * @(#)file      ImplVersionReader.java
  * @(#)author    Sun Microsystems, Inc.
  * @(#)version   1.4
- * @(#)date      07/05/24
+ * @(#)date      07/06/21
  */
 
 import java.io.BufferedReader;
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/CIEXYZ.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ColConvCCMTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6476665
+ * @summary Verifies color conversion of Component Color Model based images
+ * @run main ColConvCCMTest
+ */
+
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.awt.image.DataBuffer;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+public class ColConvCCMTest extends ColConvTest {
+
+    final static int [] dataTypes = {
+        DataBuffer.TYPE_BYTE,
+        DataBuffer.TYPE_DOUBLE,
+        DataBuffer.TYPE_FLOAT,
+        DataBuffer.TYPE_INT,
+        DataBuffer.TYPE_SHORT,
+        DataBuffer.TYPE_USHORT
+    };
+    
+    final static int [] cSpaces = {
+        ColorSpace.CS_sRGB,
+        ColorSpace.CS_LINEAR_RGB,
+        ColorSpace.CS_GRAY,
+        ColorSpace.CS_PYCC,
+        ColorSpace.CS_CIEXYZ 
+    };
+    
+    final static double [] ACCURACY = {
+    // Accuracy for color conversions
+        2.5,        // sRGB
+        6.5,        // LINEAR_RGB 
+        10.5,       // GRAY
+        45.5,       // PYCC
+        47.5        // CIEXYZ
+    };
+    
+    final static String [] gldImgNames = {
+        "SRGB.png", "LRGB.png", "GRAY.png", "PYCC.png",  "CIEXYZ.png"
+    };
+
+    static BufferedImage [] gldImages = null;
+    
+    static boolean testImage(int dataType, int rBits, int gBits, int bBits, 
+                              int cs, BufferedImage gldImage, 
+                              double accuracy)
+     {
+        BufferedImage src = ImageFactory.createCCMImage(cs, dataType);
+        BufferedImage dst = ImageFactory.createDstImage(
+            BufferedImage.TYPE_INT_RGB);
+        ColorConvertOp op = new ColorConvertOp(null);
+        op.filter(src, dst);
+
+        ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 
+                                                  bBits);
+        boolean result = cmp.compare(gldImage, dst);
+        if (!result) {
+            System.err.println(cmp.getStat());
+        }
+        return result;
+    }
+     
+     static boolean testSubImage(int x0, int y0, int dx, int dy, 
+                                 int dataType, int rBits, int gBits, 
+                                 int bBits, int cs, BufferedImage gldImage, 
+                                 double accuracy)
+     {
+        BufferedImage src = ImageFactory.createCCMImage(cs, dataType);
+        BufferedImage subSrc = src.getSubimage(x0, y0, dx, dy);
+        BufferedImage dst = ImageFactory.createDstImage(
+            BufferedImage.TYPE_INT_RGB);
+        BufferedImage subDst = dst.getSubimage(x0, y0, dx, dy);
+        ColorConvertOp op = new ColorConvertOp(null);
+        
+        op.filter(subSrc, subDst);
+        ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 
+                                                  bBits);
+        boolean result = cmp.compare(subDst, gldImage, x0, y0, dx, dy);
+        if (!result) {
+            System.err.println(cmp.getStat());
+        }
+        return result;
+    }
+     synchronized public static void initGoldenImages() {
+        if (gldImages == null) {
+            gldImages = new BufferedImage[gldImgNames.length];
+            for (int i = 0; i < gldImgNames.length; i++) {
+                try {
+                    File gldFile = new File(System.getProperty("test.src", "."),
+                                            gldImgNames[i]);
+ 
+                    gldImages[i] = ImageIO.read(gldFile);
+                } catch (IOException e) {
+                    throw new RuntimeException("Cannot initialize golden " + 
+                                               "image: " + gldImgNames[i]);
+                }
+            }
+        }
+     }
+
+     public void init() {
+        initGoldenImages();
+     }
+     
+     public void runTest() {
+        for (int i = 0; i < cSpaces.length; i++) {
+            BufferedImage gldImage = gldImages[i];
+            for (int j = 0; j < dataTypes.length; j++) {
+                if (!testImage(dataTypes[j], 8, 8, 8, cSpaces[i], gldImage, 
+                               ACCURACY[i])) 
+                {
+                     throw new RuntimeException(
+                        "Invalid result of the ColorConvertOp for " +
+                        "ColorSpace:" + getCSName(cSpaces[i]) +
+                        " Data type:" +
+                        getDTName(dataTypes[j]) + ". Golden image:" +
+                        gldImages[i]);
+                 }
+                 
+                 if (!testSubImage(SI_X, SI_Y, SI_W, SI_H, dataTypes[j], 
+                                   8, 8, 8, cSpaces[i], gldImage, ACCURACY[i])) 
+                 {
+                    throw new RuntimeException(
+                        "Invalid result of the ColorConvertOp for " +
+                        "ColorSpace:" + getCSName(cSpaces[i]) +
+                        " Data type:" +
+                        getDTName(dataTypes[j]) + ". Golden image:" +
+                        gldImages[i]);
+                 }
+            }
+        }
+     }
+
+     public static void main(String [] args) throws Exception {
+         ColConvCCMTest test = new ColConvCCMTest();
+         test.init();
+         test.run();
+     }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ColConvDCMTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6476665
+ * @summary Verifies color conversion of Direct Color Model based images
+ * @run main ColConvDCMTest
+ */
+
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+
+public class ColConvDCMTest extends ColConvTest {
+
+    /* 
+     * Test case descriptors: <imgType> <rBits> <gBits> <bBits> <csNum> <gldNum>
+     */
+    final static int [][] imgTypes = {
+        {BufferedImage.TYPE_INT_ARGB, 8, 8, 8, 0, 0},
+        {BufferedImage.TYPE_INT_ARGB, 8, 8, 8, 1, 3},
+
+        {BufferedImage.TYPE_INT_RGB, 8, 8, 8, 0, 0},
+        {BufferedImage.TYPE_INT_RGB, 8, 8, 8, 1, 3},
+
+        {BufferedImage.TYPE_INT_BGR, 8, 8, 8, 0, 0},
+        {BufferedImage.TYPE_INT_BGR, 8, 8, 8, 1, 3},
+
+        {BufferedImage.TYPE_USHORT_555_RGB, 5, 5, 5, 0, 1},
+        {BufferedImage.TYPE_USHORT_555_RGB, 5, 5, 5, 1, 4},
+
+        {BufferedImage.TYPE_USHORT_565_RGB, 5, 6, 5, 0, 2},
+        {BufferedImage.TYPE_USHORT_565_RGB, 5, 6, 5, 1, 5}
+    };
+    
+    final static int [] cSpaces = {
+        ColorSpace.CS_sRGB,
+        ColorSpace.CS_LINEAR_RGB,
+    };
+    
+    final static double ACCURACY = 2.5;
+    
+    final static String [] gldImgNames = {
+        "SRGB.png", "SRGB555.png", "SRGB565.png", "LRGB.png", "LRGB555.png", 
+        "LRGB565.png"
+    };
+
+    static BufferedImage [] gldImages = null;
+    
+    static boolean testImage(int type, int rBits, int gBits, int bBits, 
+                              int cs, BufferedImage gldImage, 
+                              double accuracy)  
+    {
+        BufferedImage src = ImageFactory.createDCMImage(type, cs);
+        BufferedImage dst = ImageFactory.createDstImage(
+            BufferedImage.TYPE_INT_RGB);
+        ColorConvertOp op = new ColorConvertOp(null);
+        
+        op.filter(src, dst);
+
+        ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 
+                                                  bBits);
+        boolean result = cmp.compare(gldImage, dst);
+        if (!result) {
+            System.err.println(cmp.getStat());
+        }
+        return result;
+    }
+     
+     static boolean testSubImage(int x0, int y0, int dx, int dy, int type, 
+                                 int rBits, int gBits, int bBits, 
+                                 int cs, BufferedImage gldImage, 
+                                 double accuracy) 
+     {
+        BufferedImage src = ImageFactory.createDCMImage(type, cs);
+        BufferedImage subSrc = src.getSubimage(x0, y0, dx, dy);
+        BufferedImage dst = ImageFactory.createDstImage(
+            BufferedImage.TYPE_INT_RGB);
+        BufferedImage subDst = dst.getSubimage(x0, y0, dx, dy);
+        
+        ColorConvertOp op = new ColorConvertOp(null);
+        
+        op.filter(subSrc, subDst);
+
+        ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 
+                                                  bBits);
+        boolean result = cmp.compare(subDst, gldImage, x0, y0, dx, dy);
+        if (!result) {
+            System.err.println(cmp.getStat());
+        }
+        return result;
+     }
+     
+     synchronized public static void initGoldenImages() {
+        if (gldImages == null) {
+            gldImages = new BufferedImage[gldImgNames.length];
+            for (int i = 0; i < gldImgNames.length; i++) {
+                try {
+                    File gldFile = new File(System.getProperty("test.src", "."),
+                                            gldImgNames[i]);
+ 
+                    gldImages[i] = ImageIO.read(gldFile);
+                } catch (IOException e) {
+                    throw new RuntimeException("Cannot initialize golden " + 
+                                               "image: " + gldImgNames[i]);
+                }
+            }
+        }
+     }
+ 
+     public void init() {
+        initGoldenImages();
+     }
+
+     public void runTest() {
+        for (int i = 0; i < imgTypes.length; i++) {
+            BufferedImage gldImage = gldImages[imgTypes[i][5]];
+
+            if (!testImage(imgTypes[i][0], imgTypes[i][1], imgTypes[i][2],
+                           imgTypes[i][3], cSpaces[imgTypes[i][4]], gldImage, 
+                           ACCURACY)) 
+            {
+                throw new RuntimeException(
+                    "Invalid result of the ColorConvertOp for " +
+                    "ColorSpace:" + getCSName(cSpaces[imgTypes[i][4]]) +
+                    " Image type:" +
+                    getImageTypeName(imgTypes[i][0]) + ". Golden image:" +
+                    gldImgNames[imgTypes[i][5]]);
+            }
+        
+            if (!testSubImage(SI_X, SI_Y, SI_W, SI_H, imgTypes[i][0], 
+                              imgTypes[i][1], imgTypes[i][2], imgTypes[i][3], 
+                              cSpaces[imgTypes[i][4]], gldImage, ACCURACY)) 
+            {
+                throw new RuntimeException(
+                    "Invalid result of the ColorConvertOp for " +
+                     "ColorSpace:" + getCSName(cSpaces[imgTypes[i][4]]) +
+                     " Image type:" +
+                     getImageTypeName(imgTypes[i][0]) + ". Golden image:" +
+                     gldImgNames[imgTypes[i][5]]);
+            }
+        }
+     }
+
+     public static void main(String [] args) throws Exception {
+         ColConvDCMTest test = new ColConvDCMTest();
+         test.init();
+         test.run();
+     }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ColConvTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+
+public abstract class ColConvTest implements Runnable {
+    
+    /* Parameters of the testing subimage */
+    static final int SI_X = 10;
+    static final int SI_Y = 10;
+    static final int SI_W = 100;
+    static final int SI_H = 100;
+
+    private boolean passed = false;
+    
+    static String getCSName(int cs) {
+        switch(cs) {
+            case ColorSpace.CS_GRAY:
+                return "CS_GRAY";
+            case ColorSpace.CS_CIEXYZ:
+                return "CS_CIEXYZ";
+            case ColorSpace.CS_LINEAR_RGB:
+                return "CS_LINEAR_RGB";
+            case ColorSpace.CS_PYCC:
+                return "CS_PYCC";
+            case ColorSpace.CS_sRGB:
+                return "CS_sRGB";
+        }
+        return "UNKNOWN";
+    }
+    
+    static String getDTName(int dType) {
+        switch(dType) {
+            case DataBuffer.TYPE_BYTE:
+                return "TYPE_BYTE";
+            case DataBuffer.TYPE_DOUBLE:
+                return "TYPE_DOUBLE";
+            case DataBuffer.TYPE_FLOAT:
+                return "TYPE_FLOAT";
+            case DataBuffer.TYPE_INT:
+                return "TYPE_INT";
+            case DataBuffer.TYPE_SHORT:
+                return "TYPE_SHORT";
+            case DataBuffer.TYPE_USHORT:
+                return "TYPE_USHORT";
+            case DataBuffer.TYPE_UNDEFINED:
+                return "TYPE_UNDEFINED";
+        }
+        return "UNKNOWN";
+    }
+    
+    static String getImageTypeName(int type) {
+        switch(type) {
+            case BufferedImage.TYPE_INT_ARGB:
+                return "TYPE_INT_ARGB";
+            case BufferedImage.TYPE_INT_RGB:
+                return "TYPE_INT_RGB";
+            case BufferedImage.TYPE_INT_BGR:
+                return "TYPE_INT_BGR";
+            case BufferedImage.TYPE_INT_ARGB_PRE:
+                return "TYPE_INT_ARGB_PRE";
+            case BufferedImage.TYPE_3BYTE_BGR:
+                return "TYPE_3BYTE_BGR";
+            case BufferedImage.TYPE_4BYTE_ABGR:
+                return "TYPE_4BYTE_ABGR";
+            case BufferedImage.TYPE_4BYTE_ABGR_PRE:
+                return "TYPE_4BYTE_ABGR_PRE";
+            case BufferedImage.TYPE_BYTE_BINARY:
+                return "TYPE_BYTE_BINARY";
+            case BufferedImage.TYPE_BYTE_GRAY:
+                return "TYPE_BYTE_GRAY";
+            case BufferedImage.TYPE_BYTE_INDEXED:
+                return "TYPE_BYTE_INDEXED";
+            case BufferedImage.TYPE_USHORT_555_RGB:
+                return "TYPE_USHORT_555_RGB";
+            case BufferedImage.TYPE_USHORT_565_RGB:
+                return "TYPE_USHORT_565_RGB";
+            case BufferedImage.TYPE_USHORT_GRAY:
+                return "TYPE_USHORT_GRAY";
+        }
+        return "UNKNOWN";
+    }
+
+    /* Actual tests should override this method and put initialization logic
+     * into it 
+     */
+    public abstract void init();
+
+    /* Actual tests should override this method and put test logic into it */
+    public abstract void runTest();
+
+    public final void run() {
+        try {
+            runTest();
+            passed = true;
+        } catch (Throwable ex) {
+            ex.printStackTrace();
+            passed = false;   
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /* returns result of the test */
+    public boolean isPassed() {
+        return passed;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ColCvtAlpha.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4405224
+ * @summary Test color conversion for images with alpha
+ */
+
+import java.awt.Color;
+import java.awt.Transparency;
+import java.awt.Point;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.SampleModel;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+import java.awt.image.PixelInterleavedSampleModel;
+import java.awt.image.DataBuffer;
+import java.awt.color.ColorSpace;
+
+
+public class ColCvtAlpha {
+
+    public static void main(String args[]) {
+        BufferedImage src 
+            = new BufferedImage(1, 10, BufferedImage.TYPE_INT_ARGB);
+
+        // Set src pixel values
+        Color pelColor = new Color(100, 100, 100, 128);
+        for (int i = 0; i < 10; i++) {
+            src.setRGB(0, i, pelColor.getRGB());
+        }
+
+        ColorModel cm = new ComponentColorModel
+            (ColorSpace.getInstance(ColorSpace.CS_GRAY),
+             new int [] {8,8}, true,
+             src.getColorModel().isAlphaPremultiplied(),
+             Transparency.TRANSLUCENT,
+             DataBuffer.TYPE_BYTE);
+
+        SampleModel sm = new PixelInterleavedSampleModel
+            (DataBuffer.TYPE_BYTE, 100, 100, 2, 200,
+             new int [] { 0, 1 });
+
+        WritableRaster wr = Raster.createWritableRaster(sm, new Point(0,0));
+
+        BufferedImage dst =
+            new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), null);
+        dst = dst.getSubimage(0, 0, 1, 10);
+
+        ColorConvertOp op = new ColorConvertOp(null);
+
+        op.filter(src, dst);
+
+        for (int i = 0; i < 10; i++) {
+            if (((dst.getRGB(0, i) >> 24) & 0xff) != 128) {
+                throw new RuntimeException(
+                    "Incorrect destination alpha value.");
+            }
+        }
+
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ColCvtIntARGB.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4425837
+ * @summary Test color conversion for TYPE_INT_ARGB images
+ */
+
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+
+
+public class ColCvtIntARGB {
+
+    public static void main(String args[]) {
+        //
+        // Build a 1 pixel ARGB, non-premultiplied image
+        //
+        BufferedImage src 
+            = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
+
+        // Set src pixel value
+        Color pelColor = new Color(100, 100, 100, 128);
+        src.setRGB(0, 0, pelColor.getRGB());
+
+        //
+        // ColorConvertOp filter
+        //
+        ColorConvertOp op = new ColorConvertOp(null);
+
+        //
+        // Test ARGB -> ARGB_PRE
+        //
+        BufferedImage dst 
+            = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
+        op.filter(src, dst);
+        if (((dst.getRGB(0, 0) >> 24) & 0xff) != 128) {
+            throw new RuntimeException("Incorrect destination alpha value.");
+        }
+
+        //
+        // Test ARGB -> ARGB
+        //
+        dst = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
+        op.filter(src, dst);
+        if (((dst.getRGB(0, 0) >> 24) & 0xff) != 128) {
+            throw new RuntimeException("Incorrect destination alpha value.");
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ColorConvertTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2006-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+* @test
+* @bug 6396875
+* @summary Checking that color conversion with CMM doesn't crash or throw ProfileDataException
+* @run main ColorConvertTest
+*/
+
+import java.awt.color.*;
+import java.awt.image.*;
+
+public class ColorConvertTest {
+    public static void main(String[] args) {
+        ColorSpace rgbCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+        ColorSpace grayCS = ColorSpace.getInstance(ColorSpace.CS_GRAY);
+
+        ColorConvertOp op = new ColorConvertOp(rgbCS, grayCS, null);
+        BufferedImage src = new BufferedImage(100, 100, 
+                                              BufferedImage.TYPE_INT_RGB);
+        BufferedImage dst = new BufferedImage(100, 100,
+                                              BufferedImage.TYPE_BYTE_GRAY);
+        try {
+            op.filter(src, dst);
+        } catch (ProfileDataException ex) {
+            throw new RuntimeException("Test Failed", ex);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ColorSpaceCvtCrashTest/ColorSpaceCvtCrashTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* 
+  @test
+  @bug 4907226
+  @summary Tests that cmm code doesn't crash
+  @author
+  @run main ColorSpaceCvtCrashTest
+*/
+import java.awt.image.*;
+import java.awt.color.*;
+
+/* Note that this bug is reproducible only on systems with more than 4 cpus. */
+
+public class ColorSpaceCvtCrashTest {
+
+    public static void main(String argv[]) {
+        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
+        ColorConvertOp theOp = new ColorConvertOp(cs, null);
+	BufferedImage srcImg = 
+	    new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
+	BufferedImage dstImg =
+	    new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
+
+	theOp.filter(srcImg, dstImg);
+	System.err.println("Test passed");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ConstructorsNullTest/ConstructorsNullTest.html	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,20 @@
+<html>
+<!--  
+  @test 1.1 00/02/25
+  @bug 4185854
+  @summary Checks that constructors do not accept nulls and throw NPE
+  @author tdv@eng.sun.com: area= 
+  @run applet ConstructorsNullTest.html
+  -->
+<head>
+<title>  </title>
+</head>
+<body>
+
+<h1>ConstructorsNullTest<br>Bug ID: 4185854</h1>
+
+<p> This is an AUTOMATIC test, simply wait for completion </p>
+
+<APPLET CODE="ConstructorsNullTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ConstructorsNullTest/ConstructorsNullTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/* 
+  test
+  @bug 4185854
+  @summary Checks that constructors do not accept nulls and throw NPE
+  @run applet ConstructorsNullTest.html
+*/
+
+// Note there is no @ in front of test above.  This is so that the
+//  harness will not mistake this file as a test file.  It should
+//  only see the html file as a test file. (the harness runs all
+//  valid test files, so it would run this test twice if this file
+//  were valid as well as the html file.)
+// Also, note the area= after Your Name in the author tag.  Here, you
+//  should put which functional area the test falls in.  See the
+//  AWT-core home page -> test areas and/or -> AWT team  for a list of 
+//  areas.
+// Note also the 'ConstructorsNullTest.html' in the run tag.  This should
+//  be changed to the name of the test.
+
+
+/**
+ * ConstructorsNullTest.java
+ *
+ * summary:
+ */
+
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.image.*;
+import java.awt.color.*;
+
+
+//Automated tests should run as applet tests if possible because they
+// get their environments cleaned up, including AWT threads, any
+// test created threads, and any system resources used by the test
+// such as file descriptors.  (This is normally not a problem as
+// main tests usually run in a separate VM, however on some platforms
+// such as the Mac, separate VMs are not possible and non-applet
+// tests will cause problems).  Also, you don't have to worry about
+// synchronisation stuff in Applet tests they way you do in main
+// tests...
+
+
+public class ConstructorsNullTest extends Applet 
+ {
+   //Declare things used in the test, like buttons and labels here
+
+   public void init() 
+    {
+      //Create instructions for the user here, as well as set up 
+      // the environment -- set the layout manager, add buttons,
+      // etc.
+      
+      this.setLayout (new BorderLayout ());
+
+      String[] instructions = 
+       {
+	 "This is an AUTOMATIC test",
+	 "simply wait until it is done"
+       };
+      Sysout.createDialog( );
+      Sysout.printInstructions( instructions );
+
+    }//End  init()
+
+   public void start ()
+    {
+      //Get things going.  Request focus, set size, et cetera
+      setSize (200,200);
+      show();
+
+      ColorConvertOp gp;
+      boolean passed = false;
+      try {
+          gp = new ColorConvertOp((ColorSpace)null, (RenderingHints)null);
+      } catch (NullPointerException e) {
+          try {
+              gp = new ColorConvertOp((ColorSpace)null, null, null);
+          } catch (NullPointerException e1) {
+              try {
+                  gp = new ColorConvertOp((ICC_Profile[])null, null);
+              } catch (NullPointerException e2) {
+                  passed = true;
+              }
+          }
+      }
+
+      if (!passed) {
+          Sysout.println("Test FAILED: one of constructors didn't throw NullPointerException.");
+          throw new RuntimeException("Test FAILED: one of constructors didn't throw NullPointerException.");
+      }
+      Sysout.println("Test PASSED: all constructors threw NullPointerException.");
+
+      //What would normally go into main() will probably go here.
+      //Use System.out.println for diagnostic messages that you want
+      //to read after the test is done.
+      //Use Sysout.println for messages you want the tester to read.
+
+    }// start()
+
+ }// class ConstructorsNullTest
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard 
+  chunk of code whose purpose is to make user 
+  interaction uniform, and thereby make it simpler
+  to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+  for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+  WithInstructions method.  Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+  with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well 
+  as standalone.
+ */
+
+class Sysout 
+ { 
+   private static TestDialog dialog;
+
+   public static void createDialogWithInstructions( String[] instructions )
+    {
+      dialog = new TestDialog( new Frame(), "Instructions" );
+      dialog.printInstructions( instructions );
+      dialog.show();
+      println( "Any messages for the tester will display here." );
+    }
+   
+   public static void createDialog( )
+    {
+      dialog = new TestDialog( new Frame(), "Instructions" );
+      String[] defInstr = { "Instructions will appear here. ", "" } ;
+      dialog.printInstructions( defInstr );
+      dialog.show();
+      println( "Any messages for the tester will display here." );
+    }
+   
+      
+   public static void printInstructions( String[] instructions )
+    {
+      dialog.printInstructions( instructions );
+    }
+
+
+   public static void println( String messageIn )
+    {
+      dialog.displayMessage( messageIn );
+    }
+
+ }// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog
+ {
+
+   TextArea instructionsText;
+   TextArea messageText;
+   int maxStringLength = 80;
+   
+   //DO NOT call this directly, go through Sysout
+   public TestDialog( Frame frame, String name ) 
+    {
+      super( frame, name );
+      int scrollBoth = TextArea.SCROLLBARS_BOTH;
+      instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+      add( "North", instructionsText );
+      
+      messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+      add("South", messageText);
+      
+      pack();
+      
+      show();
+    }// TestDialog()
+
+   //DO NOT call this directly, go through Sysout
+   public void printInstructions( String[] instructions )
+    {
+      //Clear out any current instructions
+      instructionsText.setText( "" );
+
+      //Go down array of instruction strings
+
+      String printStr, remainingStr;
+      for( int i=0; i < instructions.length; i++ )
+       { 
+	 //chop up each into pieces maxSringLength long
+	 remainingStr = instructions[ i ];
+	 while( remainingStr.length() > 0 )
+	  {
+	    //if longer than max then chop off first max chars to print
+	    if( remainingStr.length() >= maxStringLength )
+	     {
+	       //Try to chop on a word boundary
+	       int posOfSpace = remainingStr.
+		  lastIndexOf( ' ', maxStringLength - 1 );
+	       
+	       if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+	       
+	       printStr = remainingStr.substring( 0, posOfSpace + 1 );
+	       remainingStr = remainingStr.substring( posOfSpace + 1 );
+	     }
+	    //else just print
+	    else 
+	     { 
+	       printStr = remainingStr;
+	       remainingStr = "";
+	     }
+	    
+            instructionsText.append( printStr + "\n" );
+	    
+	  }// while
+	 
+       }// for
+      
+    }//printInstructions()
+
+   //DO NOT call this directly, go through Sysout
+   public void displayMessage( String messageIn )
+    {
+      messageText.append( messageIn + "\n" );
+    }  
+   
+ }// TestDialog  class    
+  
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/GRAY.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ImageComparator.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+
+public class ImageComparator {
+    double accuracy;
+    int errorCounter = 0;
+    double maxError = 0f;
+    
+    int rMask = 0x00FF0000;
+    int gMask = 0x0000FF00;
+    int bMask = 0x000000FF;
+    
+    int rShift = 16;
+    int gShift = 8;
+    int bShift = 0;
+
+    public ImageComparator() {
+        accuracy = 0;
+    }
+
+    public ImageComparator(double accuracy) {
+        this.accuracy = accuracy;
+    }
+    
+    public ImageComparator(double accuracy, int rBits, int gBits, int bBits) {
+        this.accuracy = accuracy;
+        rShift += (8 - rBits);
+        gShift += (8 - gBits);
+        bShift += (8 - bBits);
+    }
+    
+    public boolean compare(int c1, int c2) {
+        int d1 = Math.abs(((c1&bMask)>>bShift) - ((c2&bMask)>>bShift));
+        int d2 = Math.abs(((c1&gMask)>>gShift) - ((c2&gMask)>>gShift));
+        int d3 = Math.abs(((c1&rMask)>>rShift) - ((c2&rMask)>>rShift));
+        if (d1 < d2) d1 = d2;
+        if (d1 < d3) d1 = d3;
+        if (d1 >= accuracy) {
+            errorCounter++;
+            if (d1 > maxError) maxError = d1;
+            return false;
+        }
+        return true;
+    }
+    
+    public boolean compare(double r1, double g1, double b1,
+                           double r2, double g2, double b2) 
+    {
+        double d1 = Math.abs(r1 - r2);
+        double d2 = Math.abs(g1 - g2);
+        double d3 = Math.abs(b1 - b2);
+        if (d1 < d2) d1 = d2;
+        if (d1 < d3) d1 = d3;
+        if (d1 >= accuracy) {
+            errorCounter++;
+            if (d1 > maxError) maxError = d1;
+            return false;
+        }
+        return true;
+    }
+    
+    public boolean compare(Color c1, Color c2) {
+        return compare(c1.getRed(), c1.getGreen(), c1.getBlue(),
+                       c2.getRed(), c2.getGreen(), c2.getBlue());
+    }
+    
+    public boolean compare(BufferedImage img1, BufferedImage img2) {
+        boolean result = true;
+        if (img1.getWidth() != img2.getWidth() || 
+            img1.getHeight() != img2.getHeight()) {
+            throw new IllegalArgumentException(
+                "Images have different width or height");
+        }
+        for (int i = 0; i < img1.getWidth(); i++) {
+            for (int j = 0; j < img1.getHeight(); j++) {
+                boolean cmp = compare(img1.getRGB(i,j), img2.getRGB(i,j));
+                result = cmp && result;
+            }
+        }
+        return result;
+    }
+    
+    public void resetStat() {
+        errorCounter = 0;
+        maxError = 0;
+    }
+    
+    public String getStat() {
+        return "Accuracy " + accuracy + ". Errors " + errorCounter + 
+               ". Max error " + maxError;
+    }
+
+    boolean compare(BufferedImage dst, BufferedImage gldImage, int x0, int y0, 
+                    int dx, int dy) 
+    {
+        int width = gldImage.getWidth();
+        int height = gldImage.getHeight();
+
+        if (x0 < 0) x0 = 0;
+        if (x0 > width - dx) x0 = width - dx;  
+        if (y0 < 0) y0 = 0;
+        if (y0 > height - dy) y0 = height - dy;
+        
+        int c = 0;
+        
+        boolean result = true;
+        for (int i = x0; i < x0 + dx; i++) {
+            for (int j = y0; j < y0 + dy; j++) {
+                boolean cmp = compare(dst.getRGB(i-x0,j-y0), 
+                                      gldImage.getRGB(i,j));
+                result = cmp && result;
+            }
+        }
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/ImageFactory.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,305 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.Color;
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.DirectColorModel;
+import java.awt.image.IndexColorModel;
+import java.awt.image.SampleModel;
+import java.awt.image.WritableRaster;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+
+public class ImageFactory {
+    public static int WIDTH = 256;
+    public static int HEIGHT = 256;
+    
+    
+    final static int aMask = 0xFF000000;
+    final static int rMask = 0x00FF0000;
+    final static int gMask = 0x0000FF00;
+    final static int bMask = 0x000000FF;
+    
+    final static int r555Mask = 0x7c00;
+    final static int g555Mask = 0x3e0;
+    final static int b555Mask = 0x1f;
+    
+    final static int r565Mask = 0xf800;
+    final static int g565Mask = 0x7e0;
+    final static int b565Mask = 0x1f;
+    
+    final static int rShift = 16;
+    final static int gShift = 8;
+    final static int bShift = 0;
+    
+    public static BufferedImage createCCMImage(int cs, int dataType) 
+    {
+        
+        ColorSpace cSpace = ColorSpace.getInstance(cs);
+        ComponentColorModel ccm = null;
+        if (dataType == DataBuffer.TYPE_INT)
+        {
+            ccm = new ComponentColorModel(cSpace, 
+                    ((cs == ColorSpace.CS_GRAY)? 
+                        new int[] {8}: new int[] {8,8,8}),
+                    false, false, Transparency.OPAQUE, dataType);
+        } else {
+            ccm = new ComponentColorModel(
+                cSpace, false, false, Transparency.OPAQUE, dataType);
+        }
+        SampleModel sm = ccm.createCompatibleSampleModel(WIDTH, HEIGHT);
+        WritableRaster raster = ccm.createCompatibleWritableRaster(WIDTH, 
+                                                                   HEIGHT);
+        DataBuffer data = raster.getDataBuffer();
+        fillCCM(data, sm, cSpace);
+        return new BufferedImage(ccm, raster, false, null);
+    }
+    
+    public static BufferedImage createDCMImage(int type, int cs) {
+        if (type == BufferedImage.TYPE_INT_RGB && cs == ColorSpace.CS_sRGB) {
+            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, 
+                                                    BufferedImage.TYPE_INT_RGB);
+            DataBuffer data = image.getData().getDataBuffer();
+            fill(image);
+            return image;
+        }
+        
+        ColorSpace cSpace = ColorSpace.getInstance(cs);
+        DirectColorModel dcm = null;
+        switch(type) {
+            case BufferedImage.TYPE_INT_ARGB:
+                dcm = new DirectColorModel(cSpace, 32, rMask, gMask, 
+                                           bMask, aMask, false, 
+                                           DataBuffer.TYPE_INT);
+                break;
+            case BufferedImage.TYPE_INT_RGB:
+                dcm = new DirectColorModel(cSpace, 24, rMask, gMask, 
+                                           bMask, 0, false, 
+                                           DataBuffer.TYPE_INT);
+                break;
+            case BufferedImage.TYPE_INT_BGR:
+                dcm = new DirectColorModel(cSpace, 24, rMask, gMask, 
+                                           bMask, 0, false, 
+                                           DataBuffer.TYPE_INT);
+                break;
+            case BufferedImage.TYPE_USHORT_555_RGB:
+                dcm = new DirectColorModel(cSpace, 15, r555Mask, g555Mask, 
+                                           b555Mask, 0, false, 
+                                           DataBuffer.TYPE_USHORT);
+                break;
+            case BufferedImage.TYPE_USHORT_565_RGB:
+                dcm = new DirectColorModel(cSpace, 16, r565Mask, g565Mask, 
+                                           b565Mask, 0, false, 
+                                           DataBuffer.TYPE_USHORT);
+                break;
+        }
+        SampleModel sm = dcm.createCompatibleSampleModel(WIDTH, HEIGHT);
+        WritableRaster raster = dcm.createCompatibleWritableRaster(WIDTH, 
+                                                                   HEIGHT);
+        switch(type) {
+            case BufferedImage.TYPE_INT_ARGB:
+                fillDCM(raster.getDataBuffer(), sm, cSpace.getType());
+                break;
+            case BufferedImage.TYPE_INT_RGB:
+                fillDCM(raster.getDataBuffer(), sm, cSpace.getType());
+                break;
+            case BufferedImage.TYPE_INT_BGR:
+                fillDCM(raster.getDataBuffer(), sm, cSpace.getType());
+                break;
+            case BufferedImage.TYPE_USHORT_555_RGB:
+                fillDCM(raster.getDataBuffer(), sm, cSpace.getType(), 5, 5, 5);
+                break;
+            case BufferedImage.TYPE_USHORT_565_RGB:
+                fillDCM(raster.getDataBuffer(), sm, cSpace.getType(), 5, 6, 5);
+                break;
+        }
+        return new BufferedImage(dcm, raster, false, null);
+    }
+    
+    public static void fill(BufferedImage image) {
+        for (int i = 0; i < WIDTH; i++) {
+            for (int j = 0; j < HEIGHT; j++) {
+                image.setRGB(i,j,0xFF000000 | (i << 16) | (j << 8) |
+                        ((i + j)>>1));
+            }
+        }
+    }
+    
+    public static void fillCCM(DataBuffer data, SampleModel sm, ColorSpace cs) {
+        switch (cs.getType()) {
+            case ColorSpace.TYPE_RGB:
+            case ColorSpace.TYPE_XYZ:
+            case ColorSpace.TYPE_3CLR:
+                if (data.getDataType() == DataBuffer.TYPE_BYTE ||
+                    data.getDataType() == DataBuffer.TYPE_INT)
+                {
+                    int [] pixel = new int[3];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = i;
+                            pixel[1] = j;
+                            pixel[2] = ((i + j)>>1);
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else if (data.getDataType() == DataBuffer.TYPE_SHORT) {
+                    int [] pixel = new int[3];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = (i<<7);
+                            pixel[1] = (j<<7);
+                            pixel[2] = ((i + j)<<6);
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else if (data.getDataType() == DataBuffer.TYPE_USHORT) {
+                    int [] pixel = new int[3];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = (i<<8);
+                            pixel[1] = (j<<8);
+                            pixel[2] = ((i + j)<<7);
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                    
+                } else if (data.getDataType() == DataBuffer.TYPE_DOUBLE) {
+                    double [] pixel = new double [3];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = (i/255.0)*(cs.getMaxValue(0) - 
+                                                  cs.getMinValue(0)) + 
+                                       cs.getMinValue(0);
+                            pixel[1] = (j/255.0)*(cs.getMaxValue(1) - 
+                                                  cs.getMinValue(1)) +
+                                       cs.getMinValue(1);
+                            pixel[2] = (((i + j)>>1)/255.0)*(cs.getMaxValue(2) - 
+                                                             cs.getMinValue(2))+
+                                       cs.getMinValue(2);
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else if (data.getDataType() == DataBuffer.TYPE_FLOAT) {
+                    float [] pixel = new float [3];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = (i/255.0f)*(cs.getMaxValue(0) - 
+                                                  cs.getMinValue(0)) + 
+                                       cs.getMinValue(0);
+                            pixel[1] = (j/255.0f)*(cs.getMaxValue(1) - 
+                                                  cs.getMinValue(1)) +
+                                       cs.getMinValue(1);
+                            pixel[2] = (((i + j)>>1)/255.0f)*(cs.getMaxValue(2)- 
+                                                              cs.getMinValue(2))
+                                       + cs.getMinValue(2);
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else {
+                    throw new RuntimeException("Unsupported DataBuffer type");
+                }
+                break;
+            case ColorSpace.TYPE_GRAY:
+                if (data.getDataType() == DataBuffer.TYPE_BYTE || 
+                    data.getDataType() == DataBuffer.TYPE_INT) {
+                    int [] pixel = new int[1];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = i;
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else if (data.getDataType() == DataBuffer.TYPE_SHORT) {
+                    int [] pixel = new int[1];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = i << 7;
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else if (data.getDataType() == DataBuffer.TYPE_USHORT) {
+                    int [] pixel = new int[1];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = i << 8;
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else if (data.getDataType() == DataBuffer.TYPE_DOUBLE) {
+                    double [] pixel = new double[1];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = (i/255.0)*(cs.getMaxValue(0) - 
+                                                  cs.getMinValue(0)) + 
+                                       cs.getMinValue(0);;
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                 } else if (data.getDataType() == DataBuffer.TYPE_FLOAT) {
+                    float [] pixel = new float[1];
+                    for (int i = 0; i < WIDTH; i++) {
+                        for (int j = 0; j < HEIGHT; j++) {
+                            pixel[0] = (i/255.0f)*(cs.getMaxValue(0) - 
+                                                  cs.getMinValue(0)) + 
+                                       cs.getMinValue(0);;
+                            sm.setPixel(i, j, pixel, data);
+                        }
+                    }
+                } else {
+                    throw new RuntimeException("Unsupported DataBuffer type");
+                }
+                break;
+        }
+    }
+
+    public static void fillDCM(DataBuffer data, SampleModel sm, int csType, 
+                               int c1Bits, int c2Bits, int c3Bits) 
+    {
+        int [] pixel;
+        pixel = new int[4];
+        for (int i = 0; i < WIDTH; i++) {
+            for (int j = 0; j < HEIGHT; j++) {
+                pixel[0] = i >> (8 - c1Bits);
+                pixel[1] = j >> (8 - c2Bits);
+                pixel[2] = ((i + j)>>1) >> (8 - c3Bits);
+                pixel[3] = 0xFF;
+                sm.setPixel(i, j, pixel, data);
+            }
+        }
+    }
+    
+    public static void fillDCM(DataBuffer data, SampleModel sm, int csType) {
+        fillDCM(data, sm, csType, 8, 8, 8);
+    }
+
+    public static BufferedImage createDstImage(int type) {
+        return new BufferedImage(WIDTH, HEIGHT, type);
+    }
+}
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/LRGB.png has changed
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/LRGB555.png has changed
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/LRGB565.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/MTColConvTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6476665
+ * @summary Verifies MT safety of color conversion of Component and Direct Color Model based images
+ * @run main MTColConvTest
+ */
+
+public class MTColConvTest {
+    public final static int THREAD_COUNT = 10;
+    public static void main(String [] args) throws InterruptedException {
+        Thread [] threads = new Thread[THREAD_COUNT];
+        ColConvTest [] tests = new ColConvTest[THREAD_COUNT];
+        for (int i = 0; i < threads.length; i+=2) {
+            tests[i]= new ColConvDCMTest();
+            tests[i].init();
+            threads[i] = new Thread(tests[i]);
+            tests[i+1] = new ColConvCCMTest();
+            tests[i+1].init();
+            threads[i+1] = new Thread(tests[i+1]);
+        }
+
+        for (int i = 0; i < threads.length; i++) {
+            threads[i].start();
+        }
+        boolean isPassed = true;
+        for (int i = 0; i < threads.length; i++) {
+            threads[i].join();
+            isPassed = isPassed && tests[i].isPassed();
+        }
+
+        if (!isPassed) {
+            throw new RuntimeException("MT Color Conversion error");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/MTSafetyTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6476665
+ * @summary Verifies MT safety of color conversions 
+ * @run main MTSafetyTest
+ */
+
+import java.util.Vector;
+import java.awt.*;
+import java.awt.color.*;
+import java.awt.image.*;
+
+public class MTSafetyTest {   
+    
+    static boolean failed = false;
+
+    static int[] colorSpaceType = {
+        ColorSpace.CS_CIEXYZ, 
+        ColorSpace.CS_GRAY, 
+        ColorSpace.CS_LINEAR_RGB, 
+        ColorSpace.CS_PYCC, 
+        ColorSpace.CS_sRGB 
+    };
+
+    static private final int[] imageTypes = new int[] {
+        BufferedImage.TYPE_INT_RGB,
+        BufferedImage.TYPE_INT_ARGB,
+        BufferedImage.TYPE_INT_ARGB_PRE,
+        BufferedImage.TYPE_INT_BGR,
+        BufferedImage.TYPE_3BYTE_BGR,
+        BufferedImage.TYPE_4BYTE_ABGR,
+        BufferedImage.TYPE_4BYTE_ABGR_PRE,
+        BufferedImage.TYPE_USHORT_565_RGB,
+        BufferedImage.TYPE_USHORT_555_RGB,
+        BufferedImage.TYPE_BYTE_GRAY,
+        BufferedImage.TYPE_USHORT_GRAY,
+        BufferedImage.TYPE_BYTE_BINARY,
+        BufferedImage.TYPE_BYTE_INDEXED
+    };
+
+    
+    public static void main(String[] args) { 
+        int nImgTypes = imageTypes.length;
+        int nCSTypes = colorSpaceType.length;
+        Vector<Thread> threads = 
+            new Vector<Thread>(nImgTypes*nCSTypes*nCSTypes);
+
+        for (int i = 0; i < nImgTypes; i++) {
+            BufferedImage origImage = 
+                new BufferedImage(300, 300, imageTypes[i]);
+ 
+            for (int j = 0; j < nCSTypes; j++) {
+                for (int k = 0; k < nCSTypes; k++) {
+                    
+                    Graphics2D g2 = (Graphics2D) origImage.getGraphics();
+                    g2.fillRect(0, 0, 300, 150);
+ 
+                    ColorConvertOp colorOp = getColorConvertOp(j,k);
+                    ColorConvert cc = new ColorConvert(origImage, colorOp);
+                    
+                    Thread colorThread = new Thread(cc);
+                    threads.add(colorThread);
+                    colorThread.start();
+                }
+            }
+        }
+
+        try {
+            for (Thread thread : threads) {
+                thread.join();
+            }
+        } catch (InterruptedException e) {
+            throw new RuntimeException("Unexpected exception" + e);
+        }
+
+        if (failed) {
+            throw new RuntimeException("Unexpected exception");
+        }
+    }
+    
+    private static ColorConvertOp getColorConvertOp(int srcIndex, 
+                                                    int destIndex) 
+    {
+        ColorSpace srcColorSpace = ColorSpace.getInstance(
+            colorSpaceType[srcIndex]);
+        ColorSpace destColorSpace = ColorSpace.getInstance(
+            colorSpaceType[destIndex]);
+        return new ColorConvertOp(srcColorSpace, destColorSpace, null);
+    }
+    
+    
+    static class ColorConvert implements Runnable {
+        
+        BufferedImage original = null;
+        ColorConvertOp colorOp = null;
+        
+        public ColorConvert(BufferedImage orig, ColorConvertOp ccOp) {
+            original = orig;
+            colorOp = ccOp;
+        }
+        
+        public void run() {
+            try {
+                colorOp.filter(original, null);
+            } catch (OutOfMemoryError e) {
+            /* Skipping OOM exception. We cannot just enlarge stack and heap 
+             * because it causes problem to disappear
+             */
+
+                e.printStackTrace();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+                failed = true;
+            }
+        }
+    }
+}
+        
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/PYCC.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ColorConvertOp/RGBColorConvertTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2006-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6279846
+ * @summary Verifies that transform between the same ICC color spaces does not 
+ * change pixels
+ * @run main ColorConvertTest
+ */
+
+import java.awt.image.*;
+import java.awt.color.ColorSpace;
+
+public class RGBColorConvertTest {
+
+    public static void main(String [] args) {	
+        BufferedImage src =
+            new BufferedImage(256,3,BufferedImage.TYPE_INT_RGB);
+        BufferedImage dst =
+            new BufferedImage(256,3,BufferedImage.TYPE_INT_RGB);
+
+        for (int i = 0; i < 256; i++) {
+            src.setRGB(i,0,i);
+            src.setRGB(i,1,i << 8);
+            src.setRGB(i,2,i << 16);
+        }
+
+        ColorSpace srcColorSpace = src.getColorModel().getColorSpace();
+        
+        ColorConvertOp op = new ColorConvertOp(srcColorSpace, srcColorSpace,
+                                               null);
+        op.filter(src, dst);
+
+        int errCount = 0; 
+        for (int i = 0; i < src.getWidth(); i++) {
+            for (int j = 0; j < src.getHeight(); j++) {
+                int scol = src.getRGB(i,j);
+                int dcol = dst.getRGB(i,j);
+                if (scol != dcol) {
+                    System.err.println("(" + i + "," + j + ") : " + 
+                                       Integer.toHexString(scol) + "!=" + 
+                                       Integer.toHexString(dcol));
+                    errCount++;
+                }
+            }
+        }
+
+        if (errCount > 0) { 
+            throw new RuntimeException(errCount + " pixels are changed by " +
+                                       "transform between the same ICC color " +
+                                       "spaces");
+        }
+    }
+}
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/SRGB.png has changed
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/SRGB555.png has changed
Binary file j2se/test/sun/java2d/cmm/ColorConvertOp/SRGB565.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ProfileOp/MTReadProfileTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6476665
+ * @summary Verifies MT safety of reading profiles of the standard color spaces
+ * @run main MTReadProfileTest
+ */
+
+public class MTReadProfileTest {
+    public final static int THREAD_COUNT = 30;
+    public static void main(String [] args) throws InterruptedException {
+        Thread [] threads = new Thread[THREAD_COUNT];
+        ReadProfileTest [] tests = new ReadProfileTest[THREAD_COUNT];
+        
+        for (int i = 0; i < THREAD_COUNT; i++) {
+            tests[i] = new ReadProfileTest();
+            threads[i] = new Thread(tests[i]);
+        }
+        for (int i = 0; i < threads.length; i++) {
+            threads[i].start();
+        }
+        for (int i = 0; i < threads.length; i++) {
+            threads[i].join();
+            if (!tests[i].getStatus()) {
+                throw new RuntimeException("Error in MT reading of the ICC " + 
+                                           "profiles");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/java2d/cmm/ProfileOp/ReadProfileTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6476665
+ * @summary Verifies reading profiles of the standard color spaces
+ * @run main ReadProfileTest
+ */
+
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.util.*;
+import java.nio.*;
+import java.util.Hashtable;
+
+public class ReadProfileTest implements Runnable {
+    /* Location of the tag sig counter in 4-byte words */
+    final static int TAG_COUNT_OFFSET = 32;
+    
+    /* Location of the tag sig table in 4-byte words */
+    final static int TAG_ELEM_OFFSET = 33;
+
+    static byte[][] profiles;
+    static int [][] tagSigs;
+    static Hashtable [] tags;
+    boolean status;
+    
+    static int [] cspaces = {ColorSpace.CS_sRGB, ColorSpace.CS_PYCC, 
+                             ColorSpace.CS_LINEAR_RGB, ColorSpace.CS_CIEXYZ,
+                             ColorSpace.CS_GRAY};
+
+    static String [] csNames = {"sRGB", "PYCC", "LINEAR_RGB", "CIEXYZ", "GRAY"};
+    
+    static void getProfileTags(byte [] data, Hashtable tags) {
+        ByteBuffer byteBuf = ByteBuffer.wrap(data);
+        IntBuffer intBuf = byteBuf.asIntBuffer();
+        int tagCount = intBuf.get(TAG_COUNT_OFFSET);
+        intBuf.position(TAG_ELEM_OFFSET);
+        for (int i = 0; i < tagCount; i++) {
+            int tagSig = intBuf.get();
+            int tagDataOff = intBuf.get();
+            int tagSize = intBuf.get();
+
+            byte [] tagData = new byte[tagSize];
+            byteBuf.position(tagDataOff);
+            byteBuf.get(tagData);
+            tags.put(tagSig, tagData);
+        }
+    }
+    
+    static {
+        profiles = new byte[cspaces.length][];
+        tags = new Hashtable[cspaces.length];
+        
+        for (int i = 0; i < cspaces.length; i++) {
+            ICC_Profile pf = ICC_Profile.getInstance(cspaces[i]);
+            profiles[i] = pf.getData();
+            tags[i] = new Hashtable();
+            getProfileTags(profiles[i], tags[i]);
+        }
+    }
+    
+    public ReadProfileTest() {
+        status = true;
+    }
+    
+    public void run() {
+        for (int i = 0; i < cspaces.length; i++) {
+            ICC_Profile pf = ICC_Profile.getInstance(cspaces[i]);
+            byte [] data = pf.getData();
+            if (!Arrays.equals(data, profiles[i])) {
+                status = false;
+                System.err.println("Incorrect result of getData() " + "with " +
+                                   csNames[i] + " profile");
+                throw new RuntimeException("Incorrect result of getData()");
+            }
+            
+            Iterator<Integer> iter = tags[i].keySet().iterator();
+            while(iter.hasNext()) {
+                int tagSig = iter.next();
+                byte [] tagData = pf.getData(tagSig);
+                if (!Arrays.equals(tagData, 
+                                   (byte[]) tags[i].get(tagSig))) 
+                {
+                    status = false;
+                    System.err.println("Incorrect result of getData(int) with" +
+                                       " tag " + 
+                                       Integer.toHexString(tagSig) + 
+                                       " of " + csNames[i] + " profile");
+
+                    throw new RuntimeException("Incorrect result of " + 
+                                               "getData(int)");
+                }
+            }
+        }
+    }
+    
+    public boolean getStatus() {
+        return status;
+    }
+     
+    public static void main(String [] args) {
+        ReadProfileTest test = new ReadProfileTest();
+        test.run();
+    }
+}
--- a/j2se/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -554,18 +554,23 @@
 	    Boolean.valueOf(useAuthenticationStr).booleanValue();
 
 	// Get Password File
-	final String defaultPasswordFileName   = 
-	    getDefaultFileName(DefaultValues.PASSWORD_FILE_NAME);
-	final String passwordFileName = 
+	final String defaultPasswordFileName = Utils.convertPath(
+            getDefaultFileName(DefaultValues.PASSWORD_FILE_NAME));
+	final String passwordFileName = Utils.convertPath(
 	    props.getProperty(PropertyNames.PASSWORD_FILE_NAME,
-			       defaultPasswordFileName);
+			      defaultPasswordFileName));
 
 	// Get Access File
-	final String defaultAccessFileName   = 
-	    getDefaultFileName(DefaultValues.ACCESS_FILE_NAME);
-	final String accessFileName = 
+	final String defaultAccessFileName = Utils.convertPath(
+	    getDefaultFileName(DefaultValues.ACCESS_FILE_NAME));
+	final String accessFileName = Utils.convertPath(
 	    props.getProperty(PropertyNames.ACCESS_FILE_NAME,
-			       defaultAccessFileName);
+			      defaultAccessFileName));
+
+        if (useAuthentication) {
+            System.out.println("PasswordFileName: " + passwordFileName);
+            System.out.println("accessFileName: " + accessFileName);
+        }
 
 	final Object[] allCredentials;
 	final Object[] noCredentials = { null };
--- a/j2se/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -22,10 +22,11 @@
 #
 
 #
-# @test    @(#)RmiBootstrapTest.sh	1.16 07/05/05
+# @test    @(#)RmiBootstrapTest.sh	1.17 07/06/08
+# @bug     6528083
 # @summary Test RMI Bootstrap
 #
-# @build TestLogger RmiBootstrapTest
+# @build TestLogger RmiBootstrapTest Utils
 # @run shell/timeout=300  RmiBootstrapTest.sh
 
 # Define the Java class test name
--- a/j2se/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -22,10 +22,11 @@
 #
 
 #
-# @test    @(#)RmiSslBootstrapTest.sh	1.7 07/05/05
+# @test    @(#)RmiSslBootstrapTest.sh	1.8 07/06/08
+# @bug     6528083
 # @summary Test RMI Bootstrap with SSL
 #
-# @build TestLogger RmiBootstrapTest
+# @build TestLogger RmiBootstrapTest Utils
 # @run shell/timeout=300  RmiSslBootstrapTest.sh
 
 # Define the Java class test name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/management/jmxremote/bootstrap/Utils.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,49 @@
+#
+# Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+/**
+ * Utility class.
+ */
+public class Utils {
+    static private String fileSeparator = System.getProperty("file.separator");
+
+    /**
+     * Converts slashes in a pathname to backslashes
+     * if slashes is not the file separator.
+     */
+    static String convertPath(String path) {
+        // No need to do the conversion if file separator is '/'
+        if (fileSeparator.length() == 1 && fileSeparator.charAt(0) == '/') {
+            return path;
+        }
+ 
+        char[] cs = path.toCharArray();
+        for (int i = 0; i < cs.length; i++) {
+            if (cs[i] == '/') {
+                cs[i] = '\\';
+            }
+        }
+        String newPath = new String(cs);
+        return newPath;
+    }
+}
--- a/j2se/test/sun/management/windows/revokeall.c	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/management/windows/revokeall.c	Fri Jun 22 00:46:43 2007 +0000
@@ -64,9 +64,9 @@
     }    
 
     if (strlen(buf) > 0) {
-	fprintf(stderr, "%s: %s\n", msg, buf);
+	fprintf(stderr, "revokeall %s: %s\n", msg, buf);
     } else {
-	fprintf(stderr, "%s\n");
+	fprintf(stderr, "revokeall %s\n", msg);
     }
 }
 
@@ -233,7 +233,6 @@
 	*p = '\0';
     }
 
-
     /*
      * Get the volume information - this gives us the file system file and
      * also tells us if the file system supports persistent ACLs.
@@ -422,6 +421,20 @@
     return 1;
 }
 
+/*
+ * Convert slashes in the pathname to backslashes if needed.
+ */
+static char* convert_path(const char* p) {
+   int i = 0;
+   char* path = strdup(p);
+   while (p[i] != '\0') {
+       if (p[i] == '/') {
+           path[i] = '\\';
+       }
+       i++;
+   }
+   return path;
+}
 
 /*
  * Usage: revokeall file
@@ -435,7 +448,8 @@
 	fprintf(stderr, "Usage: %s file\n", argv[0]);
 	return -1;
     }
-    path = argv[1];
+    path = convert_path(argv[1]);
+    printf("Revoking all non-owner access to %s\n", path);
     rc = isSecuritySupported(path);    
     if (rc != 1) {
 	if (rc == 0) {
Binary file j2se/test/sun/management/windows/revokeall.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/misc/CopyMemory.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6565543
+ * @summary Minimal test for unsafe.copyMemory() and unsafe.setMemory()
+ */
+
+import java.util.*;
+import java.lang.reflect.*;
+import java.nio.*;
+
+import sun.misc.Unsafe;
+
+import sun.nio.ch.DirectBuffer;
+
+public class CopyMemory {
+    
+    private final static int BUFFER_SIZE = 1024;
+    private final static int N = 16 * 1024;
+
+    private final static int FILLER = 0x55;
+    private final static int FILLER2 = 0x33;
+    
+    private final static Random random = new Random();
+
+    private static void set(byte[] b, int ofs, int len, int value) {
+	for (int i = 0; i < len; i++) {
+	    b[ofs + i] = (byte)value;
+	}
+    }
+    
+    private static void check(byte[] b, int ofs, int len, int value) {
+	for (int i = 0; i < len; i++) {
+	    int r = b[ofs + i] & 0xff;
+	    if (r != value) {
+		throw new RuntimeException("mismatch");
+	    }
+	}
+    }
+    
+    private static void set(Unsafe unsafe, long addr, int ofs, int len, int value) {
+	for (int i = 0; i < len; i++) {
+	    unsafe.putByte(null, addr + ofs + i, (byte)value);
+	}
+    }
+    
+    private static void check(Unsafe unsafe, long addr, int ofs, int len, int value) {
+	for (int i = 0; i < len; i++) {
+	    int r = unsafe.getByte(null, addr + ofs + i) & 0xff;
+	    if (r != value) {
+		throw new RuntimeException("mismatch");
+	    }
+	}
+    }
+    
+    private static final List<ByteBuffer> buffers = new ArrayList<ByteBuffer>();
+    
+    private static long getMemory(int n) {
+	ByteBuffer b = ByteBuffer.allocateDirect(n);
+	if (b instanceof DirectBuffer == false) {
+	    throw new RuntimeException("Not a direct buffer");
+	}
+	buffers.add(b); // make sure the buffer does not get GCed
+	return ((DirectBuffer)b).address();
+    }
+    
+    private static void testSetByteArray(Unsafe unsafe) throws Exception {
+	System.out.println("Testing setMemory() for byte[]...");
+	byte[] b = new byte[BUFFER_SIZE];
+	for (int i = 0; i < N; i++) {
+	    set(b, 0, BUFFER_SIZE, FILLER);
+	    int ofs = random.nextInt(BUFFER_SIZE / 2);
+	    int len = random.nextInt(BUFFER_SIZE / 2);
+	    int val = random.nextInt(256);
+	    unsafe.setMemory(b, Unsafe.ARRAY_BYTE_BASE_OFFSET + ofs, len, (byte)val);
+	    check(b, 0, ofs - 1, FILLER);
+	    check(b, ofs, len, val);
+	    check(b, ofs + len, BUFFER_SIZE - (ofs + len), FILLER);
+	}
+    }
+    
+    private static void testSetRawMemory(Unsafe unsafe) throws Exception {
+	System.out.println("Testing setMemory() for raw memory...");
+	long b = getMemory(BUFFER_SIZE);
+	for (int i = 0; i < N; i++) {
+	    set(unsafe, b, 0, BUFFER_SIZE, FILLER);
+	    int ofs = random.nextInt(BUFFER_SIZE / 2);
+	    int len = random.nextInt(BUFFER_SIZE / 2);
+	    int val = random.nextInt(256);
+	    unsafe.setMemory(null, b + ofs, len, (byte)val);
+	    check(unsafe, b, 0, ofs - 1, FILLER);
+	    check(unsafe, b, ofs, len, val);
+	    check(unsafe, b, ofs + len, BUFFER_SIZE - (ofs + len), FILLER);
+	}
+    }
+    
+    private static void testCopyByteArrayToByteArray(Unsafe unsafe) throws Exception {
+	System.out.println("Testing copyMemory() for byte[] to byte[]...");
+	byte[] b1 = new byte[BUFFER_SIZE];
+	byte[] b2 = new byte[BUFFER_SIZE];
+	for (int i = 0; i < N; i++) {
+	    set(b1, 0, BUFFER_SIZE, FILLER);
+	    set(b2, 0, BUFFER_SIZE, FILLER2);
+	    int ofs = random.nextInt(BUFFER_SIZE / 2);
+	    int len = random.nextInt(BUFFER_SIZE / 2);
+	    int val = random.nextInt(256);
+	    set(b1, ofs, len, val);
+	    int ofs2 = random.nextInt(BUFFER_SIZE / 2);
+	    unsafe.copyMemory(b1, Unsafe.ARRAY_BYTE_BASE_OFFSET + ofs,
+		b2, Unsafe.ARRAY_BYTE_BASE_OFFSET + ofs2, len);
+	    check(b2, 0, ofs2 - 1, FILLER2);
+	    check(b2, ofs2, len, val);
+	    check(b2, ofs2 + len, BUFFER_SIZE - (ofs2 + len), FILLER2);
+	}
+    }
+    
+    private static void testCopyByteArrayToRawMemory(Unsafe unsafe) throws Exception {
+	System.out.println("Testing copyMemory() for byte[] to raw memory...");
+	byte[] b1 = new byte[BUFFER_SIZE];
+	long b2 = getMemory(BUFFER_SIZE);
+	for (int i = 0; i < N; i++) {
+	    set(b1, 0, BUFFER_SIZE, FILLER);
+	    set(unsafe, b2, 0, BUFFER_SIZE, FILLER2);
+	    int ofs = random.nextInt(BUFFER_SIZE / 2);
+	    int len = random.nextInt(BUFFER_SIZE / 2);
+	    int val = random.nextInt(256);
+	    set(b1, ofs, len, val);
+	    int ofs2 = random.nextInt(BUFFER_SIZE / 2);
+	    unsafe.copyMemory(b1, Unsafe.ARRAY_BYTE_BASE_OFFSET + ofs,
+		null, b2 + ofs2, len);
+	    check(unsafe, b2, 0, ofs2 - 1, FILLER2);
+	    check(unsafe, b2, ofs2, len, val);
+	    check(unsafe, b2, ofs2 + len, BUFFER_SIZE - (ofs2 + len), FILLER2);
+	}
+    }
+
+    private static void testCopyRawMemoryToByteArray(Unsafe unsafe) throws Exception {
+	System.out.println("Testing copyMemory() for raw memory to byte[]...");
+	long b1 = getMemory(BUFFER_SIZE);
+	byte[] b2 = new byte[BUFFER_SIZE];
+	for (int i = 0; i < N; i++) {
+	    set(unsafe, b1, 0, BUFFER_SIZE, FILLER);
+	    set(b2, 0, BUFFER_SIZE, FILLER2);
+	    int ofs = random.nextInt(BUFFER_SIZE / 2);
+	    int len = random.nextInt(BUFFER_SIZE / 2);
+	    int val = random.nextInt(256);
+	    set(unsafe, b1, ofs, len, val);
+	    int ofs2 = random.nextInt(BUFFER_SIZE / 2);
+	    unsafe.copyMemory(null, b1 + ofs,
+		b2, Unsafe.ARRAY_BYTE_BASE_OFFSET + ofs2, len);
+	    check(b2, 0, ofs2 - 1, FILLER2);
+	    check(b2, ofs2, len, val);
+	    check(b2, ofs2 + len, BUFFER_SIZE - (ofs2 + len), FILLER2);
+	}
+    }
+
+    private static void testCopyRawMemoryToRawMemory(Unsafe unsafe) throws Exception {
+	System.out.println("Testing copyMemory() for raw memory to raw memory...");
+	long b1 = getMemory(BUFFER_SIZE);
+	long b2 = getMemory(BUFFER_SIZE);
+	for (int i = 0; i < N; i++) {
+	    set(unsafe, b1, 0, BUFFER_SIZE, FILLER);
+	    set(unsafe, b2, 0, BUFFER_SIZE, FILLER2);
+	    int ofs = random.nextInt(BUFFER_SIZE / 2);
+	    int len = random.nextInt(BUFFER_SIZE / 2);
+	    int val = random.nextInt(256);
+	    set(unsafe, b1, ofs, len, val);
+	    int ofs2 = random.nextInt(BUFFER_SIZE / 2);
+	    unsafe.copyMemory(null, b1 + ofs,
+		null, b2 + ofs2, len);
+	    check(unsafe, b2, 0, ofs2 - 1, FILLER2);
+	    check(unsafe, b2, ofs2, len, val);
+	    check(unsafe, b2, ofs2 + len, BUFFER_SIZE - (ofs2 + len), FILLER2);
+	}
+    }
+    
+    private static Unsafe getUnsafe() throws Exception {
+	Field f = Unsafe.class.getDeclaredField("theUnsafe");
+	f.setAccessible(true);
+	return (Unsafe)f.get(null);
+    }
+    
+    public static void main(String[] args) throws Exception {
+	Unsafe unsafe = getUnsafe();
+
+	testSetByteArray(unsafe);
+	testSetRawMemory(unsafe);
+	testCopyByteArrayToByteArray(unsafe);
+	testCopyByteArrayToRawMemory(unsafe);
+	testCopyRawMemoryToByteArray(unsafe);
+	testCopyRawMemoryToRawMemory(unsafe);
+	
+	System.out.println("OK");
+    }
+
+}
--- a/j2se/test/sun/net/www/http/ChunkedInputStream/test.txt	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/net/www/http/ChunkedInputStream/test.txt	Fri Jun 22 00:46:43 2007 +0000
@@ -1,2 +1,2 @@
-Fo`kMsMr*sth,dr2oD]eg<N\U4KGXn2VQ,&'!;AW&I["@nZQJWPG$PpAl;1AZ@R:DZ4;<,C-&1H7ZAjAq7LN`NV[,YDa^JKW_!oW6>=tA9q;%*^5$1[C24!O=7p0LB8c6EQ:bpii++fSJsNl3$mN#K[2eL#%d>c<39pV55VfO? t5a5 >+g-X9Yc=es5sI-ts)A9R5TqE?/<M.C8Zl  ^n"s`BDQp*W@oVW;]I'.h/b1:4!=.W%/01LcYF7=Um1(.GNWiH:Kp?Ch12Bg[5M`,TTE5TN\pba^I;oM2Z<O9%>*KqR@#RqN\;Cb99`H0d5^K*=fJ<]%Sd>i1hpA>313bbb#MCtA</sM^aXko^.Z7+VJ+(EYJgJ;j*\%5@13(Wd^;PcjC44A  I$8,VM>Eg2T*ancMc.8]W(7%'g.#VpQC!2AZ(0oW12mIhnJ-G]D;Q6OF(eon*,UL_H'UE 4Y? 1?_,2ia$K^X?R  hhS3!R5BC,T<ZN5!YZd6fQIR#P5G9=')C%:&VSLdN^\Q=(FarUg3XE_^O&Pgd`)M[,?JMA(tc@C?lCJElM>>@#rs1 gF*lPf8,*cCi:nAaE%*,qP_ofK<pL[$Mk;2G/Yp+/G1pr\l^!M.q<kd)1"Vlkr(fg;1^t-eBC0# -tR@1_oAY#7OSHnE=pt A/h_K[T[d[A-EmPnXA5VV2dAf(\"gAR$FA%$4@ TTG_O?MHmO[);^]F##V68*QQ'&B%p<rfl-LXiD[Oi3s;l6aCfB$UP,?TEArTRhX@<"d8%#K%`]$V=3-:kb%mdJi8CW_5"V/'4\V6cVn(YGRK[4odBH!?#G1^%*8Li_!UI[(4t4WjSQ6>]hZ@>cQ?A;,EH7fU]GR2p25#UA$.oE5/ETshg=9Vk_;RC#<^nK?)PKL(YCWdtBChB*T>[%;/@Rq[Alea)>Ib^QrKHG2KcbE0mD&/'eS*tX&\8+U,Q#Zm_`8?%In$FLme]D% ()6T<AlGK&rH3GdpT73OclHAtINAkXo9otK-O+;eAd>Es4q.E.\S$= 7iO_5W?K\UA2:WSgk?-p@=SQU#E/1!4.@--8IW]kLr"j;$TCUr,R,s7OlD-(o#dlEef9VK?'53Xq]/3-s!3B?Z&#3Ok&d'a*X1TRs$(?O`DTmX3mPX,>=,![AO/gEO^,W^00>Aq\)M=a3:U`AVleR6-Y[4qdj1Nl,gEDi']t&><6n0#)'Z0Ci.pZY$d1A4E?FrX9Blka%LHWMd ilA@#'i'db3# ]+Mf4VRQn6'nXg#E)I(8<5I&(lT5Y$1s.5[0tYd]IbLkgGlt%?^MHq!k!h'FP18>%"oqn+V?WX<FN2Q /=3aW@ri7A8]i.)<pP=;OJ(Z)@(kk2Yt5_?/'hVjq&n'-sU`1& BJfe9*!JgT84l]Po+=(geID#F=d-($??n#64nRW<AAK%Zd$#23 k]M-`N#T9dnAkX-$WAJJ"GjGp($L]#7h9WMkYN3Z:#eW-.0F=5CeT(K$afW!t/NcVDa*SIRV`ASWk#UnIfb8Q.&pG\)7]E\abi^ )"W*e4ab\s"V@D%?Hp`?sB,We. -tdprb$B&>AK,6JP\KYb5jIJZAG 7F"0a<l?+^R6iPro=S`r-VWEcYRA'-*)?Hn;sK<dN;B2ZRZ&EsB20,MGK34ODqIA<^D(#*Ahcm]XRb_7-jtt0AegK\`A+pX5l dcLk(K!!FcE-9CcI.`M5%N(X$)lMOAaX;8Aei1;3MS<c#/eKhS]\\X;7&aoO:S$^efs9po;[JAY2LrVMALKAXAoY)jW2+n6'?#,UrD.3Y);"?JBb_5B7T]o/.dZc\qaF5-] ADXZJM:f%F&bDZ8dBK;"iW]_U_?TeC+[*a.o[MR.$G/7^Q\fRhVa BfIhNA&Z]=;<#mFl<G$/V=#WI\cG0;+g e-*7cAg<UIci"i+If;"PRrU&C;4poA#%*GfQ>'"A"g<61lB:'^;idCr*82Z>MEOCeHqH^Se6;OgKSWR]"Kji7'1:VI)AC"nA7mhWM*okf"4,G7hm:c6B&$3CM.8fIbb[kPX',j^&K6"IoHXPQgY>@E=HE0-$10tpQ mXol_g,-rmo11C4F3b8t;@JINZ.t#TT7eG.+CjQ&NN)IqI3hE6EF'h)!f6spqV,fm4`H<PRgV5N*r3r2%sSB.9g3R,SAqV8XY<n5WR\)2)2GA H)bCIH2iNTJFY_lg%KBX22=lb66^K?_K<FCbElA(IEaX`H',\"!Z9l][*XjKscs(;`\fgDRPrVO1.1N%NnWgl;I^B__B/-Zs%!K(5jV'A!$">irb'7+pr8Y,NqR^eF_23mt@C3@MGAHm0d;3rY&+tsK(BK30:V]"gTpI=$ms8j*+qddro#A(Y64/i!F2PA3<9/WQX?l6QV^V&)m!C]F$@ 468?JD8p``2c.;]3mkp)Bl'X2PpYSi+[t<UF\X)=EGfr K?A/;Dgq)qD4.4c)7Y&PKg>Es^%2h ,)YbjfMA5:dYE'1)rb]]/j1?:Iq37N8f.>+UQ "f5qFFYloKPQ`I#0ZFLrgQ1WQ\:)L-6\$Q1UDgI!d,_#),YE90K^EY0*0saQnl48<1`(@3L%LshoA?:5Gd0,6/b0!pIibT2UW9c()EH0.+>aoE%`]e[:.A!9^rMan?\peDIlNkjaJiX-=gYcFoXXbTYD8+Sp8US^t0cBf3@I?<7&f 2%n9!]t9rF_flN_U)74!ghb.I!'D4n5dim##5j:?GPH_3Q;gB$j'qNk[H,%n6dc0aBl&>PN-X3J.[pNK 2S'oEm_dsA1&+b`$3h32%m)"QNiJIWX9%*49_)I&ARkIm:gM(Vh!$bI1iSC/;/efNr_`sWbT'>T;fNIJ<%NW0%A)]npAdI>\KaA[.G-8An8&VN6)A$o4,@31\];&k4*=*?pasKksN1=1l-ISJEY/_`=U]j[Td-9;(OFh(IHp70H!2kN/9to//b/_ar&/Xe9CmaqX:`X,S\^A+AQes./s'F:2ZMY :m H+3XS)l35Y]AicKV"G?4XERT;gD?+<J[(S*sDO2A:?Dc6?!]qOVRIYF4bMiFBo]LVRGl:L0SGI!&i%Rq<%KXn8l<)B"OVtd?=)5)>)S.0?,8X=414C$hD`@?3"Sc/s>A[bFPR^]CnN8ml`[pD$q%M,aSCC$b$#D!JN=;^9VLl>P$8s).J7tC!^LQ,c4dPAoU,M7NmQk=90>$=:&_J;s?Y$/#I^h_`%2K$[^S[7f=Oa21<Q!o%eb5FXT:E'=\8k,(oaOF#76[i!T,B`i3",0)r[-8]tkf-ZUWdKr+Sf2dM',1-Pkn/V:p1=[ @a@rRgtt79k<Y"HK+;U;l-5*JOGJ: IWH[>sm+aM=G89g8RD:KQ)pRKLf'/>$ciA'Lr7+X'%1D+6hDh@8G#+B:/_"EaEc)VPU$kLC32rR-?HCm_QlA2Qlf[@n^K'OC7CDEFI]`;C5.EQ$V0,V.<E#;<.J8PiYa`M$FYCP[8$3Dif8K'RSc@r@MF XRPUqE?nmRhVE4D<^[%5D(^.>V.t4OQ_mqq37`53H)8rAGPldR>'1DEec?"2IGY,ane;V7C:K/__[:&<dboAG@@WqJZ:3<^.ffSXTgT(X./0T_"B06!]fejtX+?"dGC#nSP\JUSFU'mS22bI#WAp\83A2T(Mah,S`@56_B\r2.1Q9=f(-6K6YZ#Gf\;o,  7.cIAMP_(5X2O("&7fr`;lO2!5=W,8`9`s/6N!+6+A!PJfWK\A< XSr6gdpo=eE!e1jqMR"ptea0A+i[Qf<Y ,)YtQ4qA7e+#E6pcFs\c^_<f0?p9bUt .#?dSj*JeK,#2QE0&9/;dM6iN8/$K%=&i[%pcCmf(;`,.]qK;nG4UM2&k%eI;9$sf-XZBajKVLE==J>-Q(Y3DN39tKGiOML4ZJ/]jY*6K("f?j]d5Q`"(!a6^EnhMXs-4(YR2'J@A!hV_VYI.'P,/ct:aiY%I5X*@<<!f2$Fd[n#8H>Xt!%`[GkeOtZa[( XBpK2#?$1UiL2i!?t8SDQ]UBEW@5SN:$qlSg'CJ>p4G44h[U)U*4s.C'ieWRf:.VF]R(Q.iRPRAi0HUFmR8GAtnR1D&03T):Hpn+RlJa>:[U<*83'R<ZrVPX-mARst:2b;nm:8`R ah-e5GLA0Go'>8Fr%W$]?l)KANM[Ttj gKAfib:.oo,D?jMTW<3DIFMR\io*NBBA$.9'8A6g#(FsamZsV[>Ml`Y&<W"Tq)i8'ROHA9<4@#a56nIM,ME'>LJ18>52+]9pLqoAIWG##HMS2`^SX$'N0dP/)7*DVh;<llE__mo^GAHFXh+,nhg[,\S`oWd!dH+iUA)Cg@qlT jQ?8()W2`0RA9_i Y;!EBdA$_[IX'ERYmL[MkeMnHN0 R"8Nhn7>%)Hh\ e7F@VP61nAQm%^$@;fs\@mrNC5=Or32)c[O6G3#OrFN>k;m0oPe/]0!.i=5Qp+Is@bJ<-cLh_.Ia91f6M+7l;+\mH7V$Ai"4mAp<H ?)6O[-8rE,S6O8'mV??t@ZF^mZ@@"eZhf6M(b3j32;E*13J*rZY9jWB=Zn[(?GU-9>-#Y(jDKCL:4Vr!h#<idLO<paCgYJdN^6rIJk_[]])O!JW%n`EiNq^ZUXL#,))es;M*=%h'#*Mlod2%-Db)MM 0OJMn95,+N]`l#5MM/:hb8V0R/n[)D3WG#@^.(#o%be-5gJH-Fs"`2VH 5"Aj/cV#ZXCH:9ko0jWL:<B+)"J`.l<8K*)-A:QX/($milWkP1L1aQR%"0GU-_".E5"J>k8<CSPU?ieVSFh<(F niAmnHk!l$\sf_=jraa7AK2de2AF2>R"*n88`WB?N)/o9KG\8A]PmSnj,=q=h!%(X+*%Z_/ApSK0`.L;*%@G22NlmG='pP%,JBl$WZ:AS)rlaK/^(J+B^6fW*E C37[ae^A]L@g$;/Ho)o)1:W6q><Q\E7s9(h`c'OTETn:!q`s_K2),-SGXf+!'fgMAqN9/N3,ZS`+`VOd9oT'@B@5ZB<Pk>GbC42!!oDY5#cMQmK3-<)(m#=s%&K37[:CU-hm->V"/AM\ 2BfkNtlILl`fPWRG^+d_9rcNQFckrMM.!3jP2V<b(:QZiAo6XdK KD5-f95M&=Y$'1hV=]F?b6E"^W.I2<7kgnUQlj;YQ'W8NFe?Pc%[Z^BEnel*gUJ:gp`7lGR<sWo*:L^,I@i9KoZ#DK_R/P.QZ(FLN!RO<DH7qY33s88-V/:nIV`_e;!=EW,M.@b!K8$g(:&dKd 1+ghHQ_)#L(]BR=Qg"d1(IaaPU#L=m;U#U;_cR6@A4CTAWnRrdMHjg%2blsYFa!,V9q^;*o"9e]j/-fg.; I@=hri190<\Ld;U^_L"G%ZtjfQor;mA/V<SE%9 DK;JB9^>fg5_YboSY$].O r)#c8_"RFR#WEt(dQCYF8h;ngfPe^Ero9^bWGha"p"J]+f.<>A`G s^Xs9s%I&aF3k(BC@WZ"J9-425-K3884cC_#0Z2 >%o<rip@)O#%A62g?fTsOAa4a36q&D3AJ!JkoSjsXE1#n12,,+n* ,d(o'Z+`;2,RCd]9[%@hTE9r8I-HJOJ$P6':P0,A<mgI%NSe 5tm=.l9eXj9T'I%al,J9A(=rRomPh3n@OVjk>&UIrn.]!F8I#*Th=17cHo>^;_8dB:>NMm'XX<sZM8$3UsY(sJ-An`L0_.!/GhED.&$37=>@beT#@YdX3DFir7"Q'tVgC2$3="Ke9<0Z/i"]":tD-/nfkbdT_X/f)ka]=.l!c?IXTW,9!34IK/'*,/.8OA`8aoXCBI)SGDZdi3b?a`%bI;nNAAfg5KXSC8NdCa(!E:T*fIo2V)8Q;j q<42ACAa.4[Y@<OX&G&JJ[bW[3;Akj&&e!.;;=)abrA2*`5TQlbpi!?P,f_eV#Tt G!rd bi-Rf'-p%U@V7Q\/I?J+mR0m/p6VW4g26;7BUG<N[UJ=U9+@IQ:rA.O&(=O#KK2dj46OP&TFFE+h*8()fLTP[2OW qr=`X;/tCWh905f8f52;D?m-BG4h=I(A]L(K?G&YK'0eI=%:%%>fQscTe-Af]R9Z!B&f@3T2^G+NfGDgHPP!J,Qi5oCC\$B@I3Eg/6D3&MOfs$K9V),ESse*!h_BL_h-mA_19@P&s3i_0iHT+8#"? A)te`srfDN:Qjr =9Q5@m&S8U*eG`k+UC@Op]SVZp7bRqca5TaQ@_g,K"O>Mk8Tkh6K%[TeG=k1P'^k4`43Kp'N+A3+'>e M>-a!M@QEPf>BY.M^D#@!8RAn&" lZp*=gJD#>l.44)c8kJ0EjKn@q4]@Y"mKH\t@=Q!ISeN@[A=q`kl;K32M1r$LV+mb_ni\;IE,6>d$t)B ABH]7&-OK7"('Usf4<rZ=KP(HgBg&TC*^@Z$<'X5<C=+P=iUk1OUaFWGOg<I_Ac$@I-'EcO]6eGc.GF5ZgC8Y jRT@J:3/#*_>U>;ZrgSANg+q7P8tFk0)r%3<-aN*%<p`FYk>`<IX2bS/j42rGs'?VYO0`OQgi8T`, r'(&F7Y<g4oA"(o?:r.*(e6<hBRF( '"$j+Ci Xpr#5Iee>ZUL-14<T&jITd+]Vlgb4/,'YE&ftJ:Qe1+E&F;>2$\*VD79cs,gWm0n+DS7bcA,c14[CZQn]kb/-$nM,K;F";E%4X[R#GGd<f86&...O.Mb+V3jBs5@hK]OH/lW.[;O/J'sa]E4'^eHRV?!l@QpA/];D2c3j\<qo%GhV=[Zb3&I;=(-;)O9m*P7'-k/Kp:NEm\OaD A\ZA[0A5r]:" %S:V%Mk`0rTs8t-U^gGBcn!om 8^-6V&T;$>pX"!h`j=A9_%pt4mZ]LJoOMh#$*nX57JktJ5HI?#ne/qIMd:?F9:q*_UG%ILCdH>fQ\f#>Y7OP(+"C'HD9a&F`'6ir+QkiB`,/EAT'IaBH$'gIAGL>;RtSL"1gO>XeX.L 1SZ+A]31S4W9T>4EJSpPk<4#("#CaOV>>iGftc7?5[?(T^qc:kl2I'#.t^6,`H4W!DfMI9oGt$p0>5f.Z>JO`^Be%q=/\eg]7MaOY:2_,]-,b!A;;_OR A5P.n%Z7YLIe^)1_$N$?&>oA6$59qS8"@VbD8bV:ON"!]`jC@4n:6eDT)3E=(orMJ<ft(p).*n&m(@gO<&[R1jce$dE08i+I=@4P?/E&(bWUdCBsK;OmWDah$02GZfA?,bY7&S=OS1LU>r+U/U-E%h*J> ]QinJS"Z`-9QP2rBF?g#8m PlBDJg^)p'Y4bRk OZ\`0<"p0#`Fq</t8\@flWcEKrMGqD-Y6;3'C<B:6'/BGq9/On3bqOa">LDRa_Md",AR>_7tqgAI6q>F\ rUP2h6P5Lf!WmaGeslT$$:km:"^b98>B@[58%Vk8o[4,3`i<A:q'ZH_pY%"Uo'`nA`#.43cb+C9`m)k1!%m`%&mseOt9o+e2ctA0Xb8dWXkl.0F'&Ws"&JQZjC1QUQf.DqldZ3oGQ+pSCX4l +Al : eAjU?!67ReeTYltifnT*HmKGP&t$Js=8ZnCR/*m-r_j5Ydp3Yr. M0aD?'P4lkVs=?d(*<BdY]jr[SC$jp_YS)j2F=AR*8^m2hgOQOSV_^JjP#sX/\A+-aQhT>-j`:lG Jp3Z@RD+o"K;Oo`cgPBOm:XS[SO/hl\%V"K%rXTaOdA?!`KL0[jil< IE9'PaXf@/tA#eT'SBZ]es'ljk^/f?i^b`k`CeqsgEah1N^_qKFOQ:V,nH;?rWTWAh8@J)AJ-fdM.Ub'>9`Ht>[4A\. HEF2YA9)_X3L^H[B`)dO UYDPi]b&C`-AD`ettad@A#nG>L4c\Wcp"a%d1Bt4"atAn_#%3>VCJq$l$>O^!?$WB17E,NMQI9hqOM,Kl#0QC)5_M%B2E"K7Dt9XK[s@_HW( Xp8-1+,k\hs [i?3?4XCQ9R@I1c,D4?]8FU17BbSEg^J]H'(3&Hist50)n$_k1ZX=$.[:O6<T_<j:`*J"-r,6PMD[9MCs;(Yq<qrK<Kq2 J>R_<AA$0bA>rL`V#&"G<PcUU"nGF[?"W"J%&'nZ3tMD,D?pgc7A[?SXo%+^=?0?FaG6ec"!m0<,H.U\iP;\JS/:dXZGG5nH)-IHaoe&IakR!hcp"nK]q@t7`#Z-1UKD.](XQ4EW%OCAFPfP)%cOW6(#1fA2hleLsX"6qIZI/PkPB,0TlRj+XZg1,g6)<;R6S)`lP]B&`:YB""-A=\O-PW7ZQ5U=IgKgI73V""LsK$)r@T[dQOqtq-7)1MNFR\Rg3hUS*XK"i#A1MPRbhNF),"n!G4AVFnsDl/,!rMD'IHqp@^Aq4TA5'gcKQ>Pi<GU 8>(Zk4\Tk?UAZ@,gt)S#c&n/KSYnFGZjs^cACm;+eP6F^)MAGhoqV4`@1%UMmfNba+"& 0sY!5$N>XYCnoO9^FI6'Y >U,i^S$3>sW3#itq3RnU@rgE1^8\UTrjTcUHbl$CFC%)UY[P:8'M'a6^1O4Y!kgi@n8:%j^P-cslBH*r,-Q"Psn4bKbHHAUVLl%F_fB\P<sD$^O&VU,5Xf';b#cibEC64s c(Wl+T+UE&N,[r6Z`Nk>h*jme`BI1EhI<tPT8'd=nFNSC\#76?:Dg-hVE!L7pL?']SHj@mFc=fH>TO9_gA%]A"i<37)\jY=sD8sYN^9XFA/Ml<+seGea<.6D^$UC[=X-4`tk@fI<aWHN,m37@@E2"LW<b *\l-lL,4OFomrX8JB7`Z<r=tOtOtBdE?[FQ2%g_I.@Ucq$@saZ*AA )qZ,[^(UCZYG*2A $&* (UTA'26U@"_(=Ze]H?i0U3W'K(b$s=&+V+[eBthtG:"E%4^;;jJR2q'1>XG]%M_h:kVC\&C#1j,`E;2[CP_;_,SHb+MHJ][=@?Z\J[!ciZMSC=8T_P^+7+4 #0aMJB#M7+J9Y(TrprMRVhqp%6n6ph[#A1N=8i>Md4<b+GoT'>mPMB$b#AdB5bdamqKn6.so 1O2dscP,`V1#sAjYn-$).Ao3moshGH`Y^-a>1T?/^VeV aR(MfbU*_)lD<ARlksCHYS6i 0q>iE%8OlO?pr$ZfBJj5#^-GX'h(lCVdm<9)q".PI$+*5j!p_'3#>\Il_VpFG6Zjia`Dtp+IWhr@EH#]l0o\`js?_);^=90%PE(m]hA-Vm/r)\W9ENd*Edn+NM,G^,U/n;tA^+<A5Y)VTN+$7=+2ij&=^i_/.T,gT^.CdD1Fs5d+qNl1Z2T*20$cnAc:sB^.?$+m(IlJae \18$h,GVofc!rdX asfdnd4&SOrds;@9][aJ.3h0=t`NnA(fim`UiZ&H '=Ic!`JiOWM-#T6QXPDcec3!J;+/UBa%!onsq92N4A':K7*FnRl=J6H(bRmHG)clO6e2CEd6,GgGO_Q8n!>RQIGfiB9s5o6`RjM[ALmTXqNm@Z:O<6NTbU`)NOr.a:gm^b_XYn-Va0`;P? RCFlYsq/5Pr%$G?r^AZAE&/d*X7AYM\AC,Mes7G -Hb0B\BfX6kcUaJ_5[W1+lp6<;T$WU=C&\hg6A^NeR%bIWE6ZjlN\:k&Kb+<V9boOA3We'Pp+PkF'h5^NrL(PC&SIg%Y$%fDpJA1Ol[+q!_>B7A6N4>?q&C-pLlqE@c)j/Ml\i'J'\/N4((UnMeLVG-?rc?_4]>TAn6!eU_:tUA?OYrAJ[:n>nrn>tOl]L,L3tb%q1"TKD_Ggo :+r<+/L<-QrHM<=)i1La%Yj<M[$U\-a6&PRZ>*#]#`akcXI$cXUbL:=!nNd4$]flE;,Y4(i51saE!5.n97EkgA`IQUb$1s_<[*SpA1j/,IYK=$^.'*J;^U1Aa:r\*[5'BfPm5i\R:Y5N7XT*fJ;m"f<-*_ ePoqPlR7d4nX0[ZP'7CSd8!faj)#/6e[R+!^]L[R:N:TNV!(Kr]OV]a<fSRWGjM;1A!UfQY! C:.jXD2k)AUFH55Z/Te`=;5\Gr'3UgmS0.MhbHXAV;hAcl1a)Zj)t]QG+:J3nm8^\)kSha(@A;OIiY[%%8ieU-cE,_"JR=4l]Lliip./\p7dYXRt\R1@5NG:lQi1nFOXUC4(MW*b+,o\MmaV.BBKf5E5k!+5tih6q+FeghS53%/T*4_R^PLV*EhW0>`% 'I-L hGX.orUtGE^39%Nio,O9MZ;+bHD?BJDBPVAk'SV%5rFKf"?[RX`W\t+Dp$)0NZ_IgY*9I"+GSj3NL[k%HI-fm9A]*9\;\>CTdiC02j0G04t_2C)XN&a6!NCi&_[W*E+K*."oe6R:Oj2/4rU6PtGm9X]s>ho)^1<44a0AT%ELqE/-UKgS#AB$kVBmie4$1Y`0JHGlRa#Xc:]60EN9KE:of(H;ElD[-b]C6hOqKdd#&8/Ct2<^WG->k1N._J]6)TUC2mWRXrPD"Y8'_,rqThCrN+A_oEMMkM5-rY2:3Xl1 @J)D=WVEo)paNT7\MYaD^:\WF6(/m:-oEQ98:]mn#U2rTqm7W07fcC6V&pFWgZ!A^-Ri>AAY?!!sY[:h8OB'o6t?3_]rM4^IfRmA$'mPB<X2,@j62V_BkPrr/6H*4NiF23S%(,EO!Q %$RLjP5X& dHpAUB h>9RjB34sA:CJ(R;lN6,kj1<ao`E3p<h7J&^s-p8+kdahR+Y@q*=<`rl6FFZjEh^OG5d9>[LNKFk4a!+V_Rh;;O><H9'3C`YRV`s4%/?%b_%E3?f0*`?[>&;)P/*^g?AAiJ`@*k?1A%p<4%9L2R:C!fReCA[f#T1C6sYjI_D/H`IV@*N6LX'`m>\qeb %'3.)%;s#s!6/B#8dd`5di,iDPHo7MQ$AV=J+V0:(\<8fZa%E@Z7)"ZlWG4;b.0*S,<"K9#CihF83rBU(&mA&5EDV,'WJ=3NXeAW3@.j2/:!+an"I%3q(9(kqZgY9h]q,VK&![P9;J=D07JI_\6+/:21[RB<D#^-Y-KhIW\TX_dUF=AfD@otfd$h))fGYlq#h\<lEMa!SAs_@+SZ`r;8E0m5UMYmKlI''BkpF:iLERQ,?tXamgrf/;%Hr^Mg0l1ZPn[q4cFoOX'\=>q#4%?Fci'2V,<%6krSb@]jEo:YMGB7P87$W;76_U"nHlgO2 o>'[KdHeIl+n@'5[+Bd.^:\Jt&\Ap\RO2Fn5C&`omaZk:sGJj&_SIO0P-Cd;G3#j(I.Z=NCqc 2%(:[0hN1FV89i'a+ed49r,f\kNa@_KE*@ZZP\GFNRNQ;"+ghd]$LgM%3U05!U-$#I2.6 GM.Cq7P&WDYj$qd`V_755b9$K7,9(Sf=6>@<R(]Q=)V9p>J9pbr+RAf>A74AV_E>Fg]^+-0UtQi_m3+rkfFFEr'<%iHE/4B7N'sRWoRIc*U_qfZ(pFqp,^'0-ja;tcTHL5:+gJPb_qrZl.X(/0TeXTVZ"4AR/'lPAsqA<$@Ej%/0XV$:][.2mhWZ]lgQ?eD8q:t>_himc#`.>6[$mMSG)7CZBZ\e!QI7U=HDoP,3)B5C7Ulm`8l&?97]9bV$) c*11'-:+% f_[-8hncgs>Na[J (jUgspZ80?Ia_'AV;n/VQ0I`\QC$>`:PG6t >1!Z%s\a(FNgB;;HbsFWlOV9<aAs^'\eZZJQfc>3M8[Ut%f/AT2]4a@fo=&HiQ$Kkle-FYl a@C8F)*S;lU"VkdR9\LfU/TT!@.L'+ZhI,!?G3A!#@-h)^!B?)c>:O8cA4gUgeE#kH'\>E:`Rn#i!@2,*)H+HVeRB,cATD8U;RsNOXr*M;O+NTMJGe<Db!OI6eErYAcU4/Z$[Ce_ZE.)Mrc=8:OS%hl.!c[67W8cM1Z4Ge.6/3CFfjm?$6!S<A96Ork]-0/AZn!U)@-0kt%]CT0`F@B.b9`3,8o"sRTPW;sWU'Sl@^FZ$^=RcfT>6$J,BI9'cg'=ei>U`gN41oN#SSV`o[8aOLPjsb0pL^G#MnmAgsb=(`-0T)4mP2A43]F!Uh\hA*V6 9#@Za_'IE2Ai;qk$JQY5>o;L)\]:h7Z)^G7#b'r-KqtTi'dWAC^g,"^i)abIli*HV@7rW#;[H.^HAVDU0)J:8sn2XK+LR._$[Vr,4Eb/7LT^MBL3gcWI7E?sZRn0YPA.\N%UqZT"H:5"Ha +4&mLinhZ%SHpL<hhc.<+2Aihamn$t14&e;M=G6)=c6hP,D:eK>CjG@EpaTt]I+&VgLL6s%+epH56Rq<iMh6<oRS59M$sl:-VHg7r>LE_Js\!*V6EAJ<m@[g2W`/]fs@W3-.LWqIB=:jc1,1YB(:0]qBBrVa;b(D5%kqiYA0p8l<V1oTY<-S&=lmsbAiZ;jFdCEU`lA7O<?aG'W?CH[GC"TB3lPt1#">4"tQerAf'c/]icOeFc]>qJahlBP61.6Zn1e:I5 r78,#,F /3<;SFor=OJLpMlGrc$]/91SAq6(c[(Fle]DE#!/r\CdaCl)$0R$4B-4bm4dX ]0#T,5#9#(`J,Aj?&_%EcpA7_aQJCpFA*F[0r;.q*f0>3$$!_'tRVnR?Q$Q"0XT9?Tq+c_9!_^8eph%AR25K>)6T%F01e/>&b2f]l+nAgmQg8kHb psX3`)5MpE1O.Q!"DT'`;7A-tWqW@P20f$$T/a>PebHtn1!qZT'&JHqr[&'* =52"&7dpe?g.$o%-kKF7q,O0.i?lc698?&86,"NdI3_=M]nkAfAt(7"*tEfQ=-K#I<q67aDF@AD3&RHa4,3Bc[e]FUa>I_0<o0q@cqtbSi'aJ8b6oEkG J=S(Ttr#a2]iN ?&EdQn\N8?m.0f$c2s29AXnfRrD0YYe=h@Q@ZjCe-a08LEl`k96Pm;B-<tbV"TjZ2\.:n<A*IAH*]W6C#lBaq,@epQ^EPI_"<RQ(7m*tZ3gfRVdE2[rolYp (b:G1:C(l@+s2(JL8pEFNE,;km0RU)GA/:St7D"n]JriFr`1*e ]VIpQXV":%co r[GN6H@-:9J5_+['9e5=d,XAB;2fAn.MM5/W!RVm'L?3EHh8/T];)\7jY3Wid<)fCaM=*.kGVRA@W1mb+q&dFAjlpU+nNr=\N@N8j4bA88ZKcfaP7sP%?4@e9)@p`oa2LKVmUKTm%Z 1?4l.rE*WsK5=B&!>q:N.0:K]80%4=JdT[F0n":o%VE& 7;;]E)'rAS_Nc-$P\NppVegCj</=2bL4E>TY>\lcF!%a:rq;9ndd'A:RY&IhG`p5>>Hj^/Wpn)<!^EIH^`@AFS3WL3P>7-f6$8A)=>0+* 7$4o63)&!i-YA,0;t\MkD(AgZah_<[k0o"0]af<(rDd%XfeBU#W/^QS!LTO[PV+8,<A(+P-d42rItI3#eVmFj&F7^as+NJ-RDht  (2FRGbRSQ_R758OHQsFWg`3FHh?jF.r31]^^`[>jY_N*bApB[$!`-QWWA#H->h<CZ`F8p.-B=Z=N-BO!^@@8$A.;" ^/3%Q<]?/b:+VlD`YsUmk":QAh/r;[7d+L/-_*/VN$`h8c"T/[ha@9 );p@U"m<k8[0ejHl^OiCYaZpLE5rnODn':*[M+/RP-GJ3%q8t X9Qp*>AJRlr$UQ<H43#THG3BsI)J0io;C<M:O5*r5SNQ&Z[@ F<G'-VtA?q)I,6hH&b4&g+OJ<\97!`N'/2(3BBpJ!\.&`@q4\^4H)+O=$sHgA#Gc]G='R<Dff"7aF+',VTNeSUi?bbj%FIk_DtiL9cK"DdmW1gr,KX>N(hAmmN\m!Y3R?nY'"`Rr4e))Ys@rQ6(FW9+m(8<6%1roR(^ERjQ>Aoab3a1MR=_]O/h4Irsl=W5+T3ZFSn`X0+r#O*iHD?bGj?I7m8IpjrFoa5J\97IJE66Ob[-4N_o,d-KP#P<rEf@]!AW"4o;D^Goel3A8a5;V^i)cCQ'4sJSm^kAM&`S8Ai!X/Agp3n3?5Ob/K7ojG_+#I&jY%Qr&k@`\`<[mF 0p_(Zi''$a//E?[a<-Wi:7Kl-Sk@N o'eCcBgHJ(ZU,(!e8,ffV6q\[[a0L5bK)\hefXm4A2s#<t6Ed)(<6K0)\7iq>mqB;G=fXB8#]1AL7.HQoXm-[$A\\CQb)f*TfEH1Q()dJ?f&qZlmRo;a%-LnqtW3e&5PgT5d;Has=F2_VI@'FrHm,WN?2 *"=U `K'P$PchrWcdt L92Kj4;kTH=#?H"cf<@iiXjA_QN^rj4qLV";XPD9j:bV01]`34N1\%DX/Ff@#XBI/Lo#c QCoJ\IZ$g(1KG2#(:XDi8A.P"d,A_68DjmdT!hT<G[=Z0H@%j]'jQbkp"q)+)g_:[AYDW,K'LPY:rM4t>.V&m?$9OAM3$5kn+,%0o>W\p<o"Ae_E^)e-oLT@Aa-acg7_9No=J;<@rA`?'!YGG8OG7D(M/H>IXT`^5!6<K>k%@p]Ybdg-7nI"A9V]]2SWb!JA!k)D#W8R2B'ALHClX$++inHhl,8AXH!U j.7%W"Z6tNSf7STULk#,b=c2Y`\M8=j>!L<n>A\i$qn8!`$El*4qXlSbfb3!aDY?2R%[1R5Ah"'$$j?8pp1qtA'Jl$%CW/KX#QcL%9a)['lmKB/(.BG]:TpH6$]M$P3\E,H=El.).V_g'G(SKG/>Z +7Sg  PKXjE]t+.WS^o8?G+9(9o@9@1c?LgS<$&?)tbb^'g(er+C2@fq_->mnAkE5cCn*<>AI/KAoGo>9TcH+h`Wd? FbbjTld6Hm+oYiT&XBq+Tb/Yf9BTIB^Ch`AZldmX'?0WT. @VSl&XcW:#(FW^.IAG(a&UF<A?aHQG"9sAEKhicer@J0`1<UJ5=."s:r-FqL+^:<&;JHr(L3T0ZR,>98DfaUc5>!o9$?$41o7OMdQN 'CCF=3n9,H-GV1:C2fre*/DfeAAgS<E.bQ^&4b7:#ChiO0/(Hq\S%DaH#T+7lYsIUS\"[Q60MRkTZpC29Uam&%?)2LniR"^$@&4Hta5=hQXj*M_EC.4DGJ0,V:>Cp#^OM0Us`WMg\KO4)#5VeCjJY-3Nn8Z+dM8HLr;&bU#`l<.J:+WdI9TALi7"Z.An&t-&SVX`XOY)D:7Cd+Ddfr!Y-0&jr9ie)OCg-)sqid!Q,>ghj*.<4]<aYpe8Z`Vad^(+]OgLt*-%P:?DMA?-;qR_g+>]ft=rY!g>i%M`] kX-bg;:*`c :*FpCB="6Cp?Ksn1E-<iQp4'(EO$[MdUB'LhkB*?DXotl1:)esp1#_CP/O7k@'eH,j5`?lltq,NR?Q3)K,]9^#>$6*nP"]JM1==QSeI5@A"1AJ/Z_F%\AC')E3ZqSM3L2.IfClYbSGOb?aeeqJU!UH_2PI2IVoJ6q7pYVa71dJ%G/foptEZbhC#'i^4tPXI0= KDT Y-TRaHabpCCf="Bi`+t-V#dP>j"+FJN/KL',;Gpj3Q5Vfn6i?8El?H4p'?A"h)A'K%Sm^r%a7-\YgE9pLcSV!=?p%(7TIdC,UJ?]b+L0LJ3PEHeXZTr].8CR?b;,t4!C'>Z&UEGNT$PlIQW6DSsF;WeM2&o=mUA>cAhf-i$qW*KB I)9.1Ae%^ICbAe2h7.Z]$UQ!@G,pCLD1J>:A#U>hg/fathk5@GnFm"/:HW)V\+\*c)m2Jk8DoKPOBc7]fSih46G/\rq0&rm#,G3J;E-*rDh sS= *C%f.NATZooQ.modqS#(%dHm;?a4d&b!XWgOmKTf"q9I -2%%q,8R4,J#$5gBfZTYMm,tq2SA+ifSo/r[#P]T<sPs5P<%KADoLC3t3T5l\d?-pNlf\80T4:jo?sq9f38r_%_-@PQ8+"U!Ab)\ LCp)RsPYNC`D.'j(FQrAA(hW2+LK)TB/#2e@CpI`![q 2=&b;kl8k6FWhGZ`.>^7eX0(.?F6`%@`NXKL=PX\?XR7=GQRsCYK 0Q\S/ZOS`W`[9W)X7V_(iTHfR:`>AF:g>b LA3A@>8dj3,0ned.C9%JHBg&lDPd9#)n\@9&p)jY]=s!9 :qp)mJ3#7,;-Nm`e9lY@:m]"The#>be)i8Ahq]g 7#C_o&cdPH13j;Sp$)0sqL`Z.WA8[L%sSPF@E-(\S\9Y(fRCOm4p#A+/.-O(a11A$tQm_(R)NjCW(2f_' o<TL."!<4`.@SM!<'b%HSI$t&j)#!<Wh ,9Oj91s8X\Cb6M]3nnBlIEnkDQ8ZRbQOc"P<q8n--ZMNV#jA`Z=gKe&t/66IcPh>fHL0$??.r'tB.`X]ZTY-740RoY&iN5STW5I Y>I!rPHtYX"Y/ ]m]QInX!&K`NQRU)A>OG5&En."WC4<;4;\=BB.gia@?>Y0'ASF+mY*2#Lb[9B#JZ%RhJ<>fc!Ae*daYAO6gYGjGl-!/h69M)#jlf86;rh<sq1e06H9`D4a:\QGK68r%_AJApp^r6rn-q$h+8o;^HR@AA:_*O#O2q)6>Hb)i)DV\@*_9T:__^KQ^l @<85s9 M6]?eA!#Cps.,Y$ e<B?lq`ob11&"+0p!0%L'*]25G*f$f_n45Rk_7\3_%Qk.TAGETBtgV3eb-_@XHi*ed>-f$32>G2bhqZA!B1LIA6@arX(5L&:e!eg0X=_bWcP-%",09!bEk^C&Y!irAW36XKqV6/MbI)Ak![%,TPZ/AKX0]*\WPq";OP*pa)Ki!,)$\1N-X$@M$b!8<;O`$8OZh_`N0mh_cs1/7&k3=["]tI-OGV.oYk Y2+.riBdRQ7k\d8GFpG/PVm.]tlq>RU!J_h'fVdeSAbW[^.iXN!f<qMX:0;PEoMR^?NslZ`NHj W/&G&!Z6a4LQp]2]=t"X]6<NEreD:Z<PrBEW)?^`KRf9Zt)9*<i=e3L8q"3d5L0'\j_PKdUYRLp069hp*/<t,R*OgK#ml^-8&AN]kS=IDMlD0ZI3iiIAj-;MOY>#;cO[m]U9NstB?Y`+Ab(IDE;'P.!Z\N@8!HZ>d>(@m"p(lS4/XIEKNZ5h:\YL>SWGK#]2OP.q;][.s$84/9FJeN')"(&q42g3SKpVUbifkn,mpIT- @XaW8j?_3AJT:Voh==X>+ ?1)iFM(aWV4]1_hI,\Slc#pWkThsicBRV[AhADB9KKPUJ`KL$eSSPC/['K8(hb?AE3^sJ7;;oEH6A8j$#1`AQXq]ps9,Ap08AYc/MO]IfN[.]7tD;U%6lh8;XH`s+'p4diRJ%oF_4b)cOH8 /J=sS"0kO<gBSc8Lf:tS5Gk2`_Ed[*XG@A#sH@fAg?QcggR_AJ&qZQ8mE<6R _A:&n0)9"WXr]aZ9hb1;JT_;OU0h[Kqdl>l)4^H.]mP3:cCoJ8V1hl+)+2d7W Dt$0'FNfB&5PlW9$M]DJE_D:(;N(?$o&d,qGsnX ;1dOdm0c.Rl^Ct/GiDTs&^SYV.PW$"J@8 b,>I-<Gm&@`:[p6h-V:)e7A-96;h8:[364n4pA5C8I3WTj%5k)'[,&4>:#.aEXL8niGh;KrT F$=M/DjA'3s5/9@r1hqn@+HYf""RWe9Afnlh*\tg\T$X6dE9C#q[\0\:dFf4!-]NS4`VIJhs6-=6e2lT5cCT"24i5G$]2n^Bb$3$,R6:ZKjn@n.A;.MEscbH4 DdA?j8O`!mM#7p (Mb(4\qBrt!VG>>(BIRK#@Z:0AcaHk=6AL-/"R+&S!c-BagoA8,om0\!GWbeO<.R":,J>2aU0%PFdYd004$69J5;\tLU!5Ym$k)$!cm%OR%btd4g`bla;Q&(f`X3:4DeNTAmo=m*:p1]Al3O5H8,'4G6c-h3;7n>Fq/)Q'@lk!K[k0:eKGq8'^Hbjj*^%?XnWb)/soo."AmJq]dI[KZDV&75oA*F:"*VWY1d`DAUtYXFESlLQ:A9c_qNT^NYs.-:rZkgJ".PD:)-#CMDPjY3^/mi\s+r67s[c@V=;W6e*^PJO9`@2fPXRojZ9Z%1+:OLf?fGi)YF]!H %Bcbh!X*+F!)/)#Eg+Z;c*f^&2;tm2;slJSP2a+& \W;9)_LH`"+S$tAU MQ+dCr^ $1(AY!.b-2ce%n.dInA;#Vipk<ZTp!@%11QGD'M!';#,H>o"dmU?'\qoV[ngS)K[\IhNC`)f:On)g3&qdb!?cQ&r,.UoSd%9KA8O!L([*H.!:j;cE7V65ae>>K)=('.65D3G;+]qYa4Nd;5l+PW ACE1@pAZ!9fj`ksP&cNdARrG dHjaQ5oVOYpEt>,V<p)n9MF3r<fAH*Y)q/2!P'XI_0.m'+PPISi+df=_YP42`P]8hh9VI5*`8`_F(k%t`FWUsFa-g!M3EB[9$=@ptPVQE;?!0CC8 i+Scs]<Ys,t*BbZ2 J89^"H;`O.8XETtXsd4L#I-o-Q#%GN0Fr')D'bg,l^]mW@^%MqYtbp0Ae!K=0TBeXY2GpWZ@n#.qaJHhR2IelC(MZ`76Y%p0$QYS"H"^?O:<Y3(M9c2_iApo9aeWBUcdk75sd+`R/_$N#%,7.T, g8RAMjc`4r0OY#;\J-+'Y2s8taO >3SV /T)`t (A(e3UG*B:$*U%1qF'.Y&@4m;$i R!&GXLANqSP^N1$/D5SG9AP@nCAr=gHZ8G\FWrDbm\'IM:n4b!oXSa#UmqGQ(=UD*99GH#2FAcmitH0)]lAfKB;T<fbN'_q=TPt.AbP]s=6gRTsAZ#aJ&+`[3'.,nkmM(M)>S5Q$tR],lh]mC$AP;D@ULc0jXAAT>pBH_EDkoO7H2_oUJ!P@01V94VqMXTS"fUAS.Vq8W7*8jMn9>mJBQE0?C@1KW>E7_AGr\BQ+q/kpCe2B@)'1.3pE0P9NbKC$`5X^'*+[69n.gQDdk!6N`c(r5CV8O[#$Yh Ur$&Z?,6iif)l0lTtGi%Iq;+L3_U>Y#*78dKr,BH6An2gR5bcap^l)Y3!c&>n<VT:7o<)r>.ee4 aE5AcSdA>MPOSQK\#=r&1"0_S^@0*e--@bKC&1Nc"P;&2Z:GGifAL6]:t%t"Y$9O#GW]?-?>OCNKs A@-ekH0m`@*!+J>,/WJ9]kt5tQC6j+V'VG<.77h*g&)+G9nKA#5TAW\ti)&M3$k/7W?A%\=P*&&L]kY&rKk!kjTUl,N6R7-cPUHak5odkeHZH9A3V/]e/;fYF-<pP^Vka]?L%Wt!> 'JSsn/16VA/c<cMH<R^q/)0e2;0#JS*Xe+:^ZA+@)L0T3EJ 1lbB1h=[9 QmbKjA&XLtea]?:Kq.jhNK)7a,bhS4;J%1oUk,]tlO*Q.p?H.tDIt()%AIRd@hS?]l4F[1!8eqI]gkcXGY9AIHK`GRgr/9G,oWDWTf\o=J]eNYPGqdFoS^/F`V;UhkT9^Z3a-6;;9XcCV8mb5-90k Xmq58-!MoS=8,7rZ;cs*fZAMb!<CkeAbep3lEp[jA#UOt_+rso4GBAt&E8rg[G8+pt6V4DJ] RFDWkE]hic+BC`XB(#,e[PrXb8N#OTM+.a$*(GA<g 2:'FJo+n!I9ng@d9oi N9R )XYP`32,r+K7ma4 X3`\4?)8dR6fAA>,(-q T)"`=2JkBj^:aT8sTp_+2o%N:b%QTZ\gnq"t4D_1B<2AXOUM;O4*Ak@I\ENSP'eanE/Y^fL4TOAcV4an>(*-1fPMHG=)$j4j8tKb`59DFSA+QR?.;n<(j:3sr33Q-o]b5;j^l<-Ua&+5%1?7smY;jbUM/7"Zf70BdK@GnRNi%\2A+%S1J/`?(NH8JFjLeJ Z9$Mq986!Pn6H8E=Eg=k)e]>^Ad=?#rpK+J^5QQsb)oT1ch=rtJrj.c+XK;Mk_e_dc ^YG[aWPCZd!n,D+1F=_O\K:LU3"G'rFViOQO`B+PP`%XRnoQg9V:YCrJjl'rh5"HeFCLg:B.Ic7r:&F($UKC>8#C"lGT*p!A\3'_A*'.InVC1n8Z@F<O&B45YQ%bA*n<&r7.WlfF@>O;Iq7_7tWk:q")I#=4mK(56h45X,q,9s.lG#mPRAAfs2l/8MBX_na39RX1B$7LKc'&?bV/'g' k_D5I67WP!W/a'l%;ZWeAH"f7AQ;OA"^*oPXQ%;8;iU46BOD>lJO;8k,[Z1W`N'Bk^0Q_7P<#K%b*cpHlEFaJMNaHL>>J(p@9OVAOb8]Djdf+69iccX jG1Q9kqd*.,"lmC3"mYNY35[,2A=oIg#`S8OJ#be %49a81hN,bj1J-ZB9MYg,p*,1gKDe=>lr'+(fb:U#_eKBV(:H8\eY-Zs4bW5CLo:PZ]&V ]tV5`';2A@r:h;k(62p]F.ga5.r%EH)=f=AlBO-d;9*;n-=Ztn1@/-,7Nm%3t"^-?+sTCNYq)pZ[R#%BRe&5EM98USIRnH]R,Ij[aJ5#GcDL1P2'U%1U4B-0pLMZ:],^f*a)tYI6->6F]]rp*Fi! h2_=EaBn5D)(F?1amaLA4)UZ)\;;4B8F8PAa#XA\=$>RK>aPcH's.cHKk<BWbJU:7&jj98ZP5/@p%_NQLhE>9o9Yc*7CO;(m<DreX]hQ>1f5^ZpkRf`5#?(],]V@j"JEi_U&+ec^F9L+o6S`$P;g':4%8Z<MZ]C-&Y)X3#^):;bkY-`MWD?WY4ITg#;T&5.PXB-F]a3[st">IGG_$22bNQ589\KG%;CdqrRWd"f"GcNj&-$QNs2'2=j6AojYZakT>_KbC4HIT4.^o=ES8*5JZ1<(!\Fs8!r;!:!@U[/oA*I:A<UkZKmV'rAjCFA7,$O?h)W XtghnUp)YO&g_sO%b&`L`TqZTi&s\"<%DbkaLEV2US2PV$id")V]d9E6-=as:T:%$."r)<#XcD2hH^S77"(gi,MW;ZDi7k@@e6YIQ\dZ"1GBHB-N_BK%A/WHnX#kan&g=<!g"?[,\!\EGsZ9@<4-IK-[Q(3N]?-+Zi(F'HZ5L\,$IE.8$;Gf4KeiqHA]nUR4)r\1dqj()?S=l&]`gfXAF'K:(&f `H<!-DqdR#aKYFFKLcbp0>eFUE.UE$^[dbN6./B(o+&Khj";/-h7U]"6pb4W:3Gd^'+82&iV6L$oar/'MR?Wo,W"@YY&)#&_<%eETG(I??e'7cRH$>%H&b/BCF"pt+97)2YnSV3Mc#`m#smn^Y9jpKoO=e9j+fnJ+/V]Fq?:kpU(tq8hX\Zl2#ppK'X.Xa2UdC95c)8D?q!AQmHL.qh+?a.PN;ZHUmo&jm]dEnA] fin@9St "5i+L-4s,$sW Kt^;[K.q2QQO`?!m\?:*]-<cpg)U6pDr]\21@-BmSIt:YjN0l3kdDB3c]"]/PIRn<'5)Wp@b$ =o"JPcV@\Y:,#[m,R;G$qdBQ&^2>j;5\Te*TYd[R*#XE?R%JJRX*gELE/ZOMoP'"i-U[8We5H5qOj30C-lI1\#MAo36hPt.caONtgNM,:8aFnFomY<fHcg[Hl8P AV!IbYROa,4^dDX__$F5)S)b2e+73K [4#q_+mrX?'YC]N2RB0U(S&QQ hOgA,AZ0`qb3V'n35LNK?FZT]%o7_G4B)+dH!WFj;?`(OA0p<tr_D)-h+-XQ:Q9,UH[4R3M Xc7#T:Fe&#h<:H23V*WWo046t0IM*G9$@%ALWR2C?ADqS3e>4(g]IO/H0$Sc3nH@nd0n)lG;+$%`nilmb*S[gZE0_`<Ab7&5h[g$Hs6l<p&6g3;54A#Z=W $^m? "RN4LN+&Gr3.`s:f98/6gD,<HA>Rm/T>RR%">8C$4 be`Y$@B<K$s&?R_MqP#,lh7?+Nh*F!&sN)b"%3P0q./&hbZ K_tl(BPd%#@DbcW&:E+eJH0,#@NU!Rqn\f9U^EZCM#XXWgnh4eIcm"Ji#dlEjAGiUt7`2^X.([Gf3s\jEJ=ZE%"@;Ibi,&Ill,[nhG0:1Wqc6"+G*E!Vjqhq!,n3RTG*4h4pl?RW(9U\mYdNrK0NBAdOFf>j$^Sdf4OY_N+C;K8]fi!4g3cF<58F-dat-XT:DkVSopo4.^ZhsjV/eX7AEPS2FVgB$'&Xh=VSM$Ik07PPW6ZO':)3Uf7)dOK8jh_f3?H(Jr=J.LgWnT1_eA=M1e,6f!4%<&&A2&DON;?=N_kWlt\Kag$9 26W#;7 crF(` K+M`V"PfX,K%Ul_d@0i!KWfX*OGp4i=EUbSAqBrLALs%[A.^,l0Al?QEaj(amk)]FBXCiYK--?0U(pfC?q!+_=@mSLkXrK'J*gge)^B-a6n'9Hs)75QM5+cQ_[B^[je,\&h0,L2:n3+V:eA6RKlQnAh^: #7oU(C74=K*?8a@iMN 6)?Y2imWkj)jL3t=2lo%-A%Gmm6AGXq_4!Ebb6`hLDF-N:dPU-j=o@5]'ibipCDlZg8,*CGk`A71c00>eW@`lpcN++U?e,n3\;Y#a($_>;^HrjD$XkV&[F,SB1n7gSqmnJZ[Id1g^sl*\E]lIB<oj:'TWj$k:erJc7cB#:UY/,soH*e[nmF5hk/+"E]31?=^CldeS;qF-frFMr]d0s8E[&`j^Zhngt?@jiqb%>^ROG<^fcY4L[M^]n*O[R3GnNg9P/XAAM=16F,A^V<TeQH,>M3/HLLO3#gZ!31(_R8kt:X2EhY\#6)+[`Q$B#C"A7-qpb/JiZ$eMFkn^MD ,TL4B?tXT&-c,/po271,` L:QjqT/q!K'EqA 6n#[#UY9n`TOWqC)=[A!8`QY#;#:fLP\"n+9hd&@S8<L/Wg?HaBIt%gi=K#]t*8\Qae71@(a;j(FHc(.siW;\+Z6Sr!A*.bSSjG[D:[SV]`QQ>&98>gA1=@,sIE$B1.F\m[c2-092XJD<`_R109#40(RH4j$j'(^%l%LaG[tiNdNZd*L1\p&tAXEZ$g?Z02SLek*3eor_IN&2ML+)kQAg3r8Y'\^UIW-h=C1`3]Rm:6]k..&0H*fa8l.nU@9a"kZS0BW6]KU9Y(_gF#p kT*6NY\(LoI+>=7e":1nOl4V"$!IZZY,B8hj6fhZ7>HA^rt'%q(_IeAAN#$#"8MFmA2qMckc  cP)2Nn9;YF3LqeBr;(\kgkAfI0eR*@.h`&A+`ESKeNB"7q;S,6E/B'U'\'1FYW[5,sBM+KgV1A\l(q.oU7(!F0!T<MI#A;:dt2WI6mcC\`WgY4fI4)O-*OT-bBsfU9k:)75H"QIg8B2!CH8),!@-B?;k;9e@L%n))6Sg?45t^H6D97\-0T%b+pEoA3(Hn *@9\5L59I.h_Tjr^P=!R>:g&.X(<$bD-DS]3<q7*PkT4BfJ!km`,/j,&=TXKS>Cr[2U?^/0_g%5=6=#cQt:]hj1O7-*[drWco:"b>R!sa"'8k_dU;QMV?:lSAcFDAaK\bO':MoAp_lAh`-" EqBL/@I)1Q -:'/=tR0A#;9N?(II?^7"Wr8-.@_*/KdAbk=Kb?6/5k /l5J:::)1cNJBbV/bC%Gf<"1r>kprV$Fat17n#07s,X$5"q5'M'%q%f6Y%r'\tr>+\UpOrS;&:N*0&?rVlQp*q:9LhNVteW"%&_0nP]CVWeWYb[mIOkkDfKdF9END]C>(/EUcC3'KtX3)- l^9"AmN>%a7htW0sKW>ko+-1p0A2NPU8ZpPV[sI'QOYe4+[F%aIY!jA `E?h[:=BrTgJ4p^1d7sAitnEHsfm)?\MJ1WA/Zim*4V-B3o'kMrct@h.>*OB-/7YG=)EW.tj!CpSYMa>CdEqFI@`1G#apQ/J4LV_VFO/PS]ZRV;s84(hSM.n8(`6LX.,jiGkF5,*UkI$H> /@ArY_7EOm)/2;6=EjTI&*#\e'#*2*>k.3T'0C*o0^#OHh[&"W6Eo2A]5GB6S,?"m$ER:Pi?aY4pH?Z; A,m!K+sF/-oB >-Xh?WQ'TI)L'mBJWWF>%mY!F&X8ZZ0)q2UfsSqZ[X:d0[4EWb!S7I(,FN3F)LdFX^3:`EhCO=U9>5.6\R;PF;)`^3M4EI/A b]Re\,*TD!C[T"iYIj^+l.tUG<0&ID.JdLFEF,lrZogh-JT-;a?2`HS7"eQ+Ng&icHUr[3kn'?nNUVD /b@7[cRe(U6BA?<ltXNL(\1rAT_cr.IH8&2GZQ=KT!*moSn^:b]=SUlC &s*mXBh-Bq0%O3RX,b:8(nBC`tYafYW]A]tJf^b`;XqJ+m^7q;nPAC@3p2T9cEOd_[J70^#Ilo-0F9s,1"K`=#?,^s!OqC*X],J`NgbSo["=#3SR/r1b4RaG4/i;]YRj7CL2nmSRk5qB6jqB#K6dAi1>jmq>ToSn @6G03!ngRd&*ZKo'Ue,Ll)_2'- h1 98UTlo@LX@i7hgRUb\trHlfc\epd$Dd'=6=tm#:U]S;d(`ABONL L6q,6lVID;;TVbZb3oT?#!cjhA#S9'J =Iie<<Ubr^#:;pOhpn.P%"P0<&C>3KV%eXg9ST cf%hT!aZIG74l-^bP>18WA:NRE,1<W;ioB;n-g*(PJteLc38\2U-"74d.Nt;:ofSZ=rTdIK*3^n&d?['Xh+L5n?C.j]T6l+>VQ>8n_d`II+&4Ume@SeS  Q`+>dmTNhhU+8=+gc/Unj=\LBal9)>-cT7]Nh_,!'&2Oa;O_!p:NEnWnKsUke-I@`1=nB)N>[)qs_)>E2r3B@c%N0R7PVUEf['eeAnFZtesX'+o>$5Y<"i?6&_Fj*<nm*UZ_nXNnnOek6 W[0ej.je1[^M?MKO,G%A0h#Wc!jZQKcG]jfmj1 gE\Ti:!7"`A#jO4Q,4!TI$2A(S;),-k Ia!GO8inSYdhSrZPLGY5m(S4:KAn(NDGpsoLs^38'`,>iY\Rr]5)>7/E\e?mp^dUAn]C3?#T'`oEe&3R5g7t[U21bj#^2t?>HAVAb)D]gf2B,<VBQV:PMU,nkL>esZ"shAWS=WN)5P.p+TZGN3\KAkAmHN2DbS[<A@RE3@aHjXFA([<8LrV%(pD+U1@=%%n2/'@[\%?E3@emR'38S9#&e!R1#T?B)b:AEU<flsK&_XEV+QTV/)/:_2YO,6nEkF6'T9?A.'?r&9VUnMC!rRjX%W9/A&53XK a2;9tcnD"Fm4k<ra0Ycl:*?IMgkgm_>V@R1fS`Ti50@R0>UdFAK1)Zi*-J0D7j"/FE0RKgkB;0iln2Vh\<@,l5r]`W?D2+"Bt/6X 0L>3\066f+6tYoOA`?=e&r+4_C(F?pZZ_h]2V0&2bBhp(=3Q,]EGTePc&Co;lFKHts'mB>=OgZJ5rFRoEQ6$W?]j$BT@RHgO*82+a[@NRqTPYs:Ks+^NG+2"2jF(5!\ kq?M9_GhBC&']rj'Qj)AhgNs#OnOQBXPO!o0&=nZ!i%DX?:cOY,2Y8#2IALK1>:R^N+o6hfqpU f[O%m6lQ%_I0=>bgAG'%\7(4Tm+LtH]Q(f[KYjRnf`W0-B'*LL- s90UE*\Ks5< =BWFKc485lcUBk(R%gULHnT^KAPiWSR6 ?35O?d<ff?d:X)7qR0&20Y"+F# 2jA>mV- ]mH45?&LV=EsoB]%)!*$'edIP"HG+V/A::SkJdA1k+@K%D:IB_ENml)0&r$<b[)qh6Ke(orDDnsEPjrVWQot<!(j%'>NS`[IdK@Tg>Jq5]_0*/Q-KIb IWTFA!SDl%\-:M7ni6Aj9j[^!L?`ZS^T47j`e`*lc!hK=rb;UG! #CL$5c(3iTti:(pCpR34`];*shFF]-d>MAn59AF1a_E2<NF57<Xt4jQKmk 'ks'DL^;mk\(#\a6&B2pYbaN-R(oKP$>>SbWX_0to6Q'":44aKk4,_OWN'WE+p9GES&eVmA!ZAWe;*qsL/ l"?l1kg2d9<5jgb5\#OmVf3WH4:$$ad*b>=G)U/n7dEeC([U<@`qL2iOVk(Dib2-K:K?Y*r+^A^,72qI)JQ>.VE SfW`"Qrg1`cJ!oAKC>O @CpG-A0t@M*]8=":inR=\NnGXpC1+<J7f1QKdi"G &GAc37cmGW'*sk!8:G:AZb=k8LcF0l&+[H=]J%m,:gflb*.i9I?=;h,UcLclokkEijJRo"]LiA "]#^bs*Qr-PeR@k9`_6Z++1R6"&99>]3lQO]i?5P-WsB0t^VO<idr5N0l8S=<pUV9]A&#(PAR+fAAo'$Sr6A5BgK#2-amroKkQAjs7'beCcn/;)!*lkA-\iAb$=*_DA<OdZ_&i1rN;6/]C"@14U>rZ8kQAh<njeqG0W`F-t8J7e 0f[isgmTg5$:#KpJ[q`""%O28,f>M+-/3'N7[h^&Rg#A%K\^9XV4Rl gZWEKgPEG;$^iRChYtWGPlp<8#\6OVm7h`lDL-V11E[4QN:,kH"\o(<)7`=*@tKW]66kb^#jiLt*/%]!)A1(Vt]%e;K0FREkVrC,XQJA'Foj:?I&Zb>^Z+4D4"A9)%`=J nAEL+q\'\F$kAP627_qJekh$gb:_FDj/*fM#1<(;qNmOX/:T&7B?EMGQ@QAs.O*o2ld' jcoHpC:/'!;`CX*#, 0M[`0HB[A5#]4&jDdoo' tf6e",o(9HXr,bVrfLCL0Aa.bjVFXVF5P>b%R(lpHU*'3XDQQWq-8MECG"t"'dj!OM[_N,FfE40OCHd6Z!'M&6f!PZ0t+@\2#)&%Pk45Vf#O<Zbbpid[CjWaL&nd&DZFr#6he(H@s]ah6W\O;[S2<>#be?9I.6D<CG0:7!l'4-HNnB/`+>kcS<X6L"SfT*23Tm`'LY4/)o%J3X&0%2R1&)qc/0O3LH':V?g$d!ho*i@s80,\#"aM;BrKe-ggAW7Ib6j^GsG\@:U8$^djWn4)8VB1->%rV/\^Te((c*l7+cDmM<W>aFCFhGD$Lh\ID5;V0a7iRq<ss]O[b<]O1FBh7:*jb&?@?)&RGF]%/C2;&J+%f=Q>dV)<],d-e>q<E[ (Zg7.D!\4EJ4[U(b@(AhmE`_OS9G&&pdj" q3PHR$me3_LRA`G[9poS)*7?L"2_qe3HXV^[%rTArKEAa:S-aOS](?hsJW_/7R\[+%;pe*kZC<@(q`<8!`&7#4.OoJfbpo3ig@50+m*eR53JRhqrU=H3GH@^KM2%<`pA;<7dUD]9FE$tYmlj:4&)lWpjoXje\L;nHsWBi%7Z8@%W2M>]WatN3e&Ya$P?d1_j+a6i$FGQe [Ho%f;j#Qt=QGoBobQN?lP1[f>fL:)H^SC9A[ ;\(Q=WAm6cp29%SZhY@(8TsDkq=l3_I,h(g?%q73K`h6-55N<Bb"<b\qiCo;QrFJc6nT`ib7p%bK]Z8Uo(27M&*.E"M&]] lBHe%8YL9fSs[i&o1*qNq$\A[-3b;`9KbFn% MU:@"4#9NFH/B`<"#)MUg^'k_Qf4rEI<!.UE0!%eTi"%_=E*?qJZhS7.2#l/]i(bnr=1mN@N7X,5(WfVX"5(.Ik%gY]ibjqG>igo3:!<3c4d]&(M/RC4(eIiBKW,oI1d4!(<;B >+HZ0)e.bs' II6_7LN#)q0a(AMn+>q59C$8oU0La]iI)[H9,gNXL4&:BUAfcT@[h'dlY4tBR90i9=:_bb?\QZ673eo0Ea?JZDAFnHn/UH6]C0 /t-;)e78-B$@6G%OBSL1a.\&FQb-+OUZWrW&1ecmcSTKW#ZdeT1+ApR'5DMSQ, 9Am& )+ e<2W.Wa?CO"X_l"lQ/Q<*[.hDltZ^6JjC[PiL2814O$?j/QC&AnOGmtW_ b]KA( 9LO*7FOICC/7dr)pPH!B?r[;`^d[\V2,^08jK/C[M3k,V78XZ@LoJf\HmZAko6>rTepb]iPgEQ!;4.c$ClmhP9 1T=6&0GBA*(Un49P<=BR:p2#p&bO!H74&n`98`_,VkA6]t dGYqeN"grDXBFk;-"dNOARN[5-%).(_NSa/RE::QKJnZG%f"PP=6#l'D'I48qT\;))GTV2K1E51o"_6-RH;:$cTB5"48AR<+U*>A7N?5J+iEFl=h2p+f6]h.fH!E0CtSO7t;SK_/h/-^ndjRX4$rfi7Onn#B$CE="L=nLG[]3HB=/ph65]@7dB7P#"MTBSV[P-60h'#NLG=klt'MR8q=d)fN])[O_`Ia-7BMX%eFAkcF6JT8MYV!)/cL3[cj3VnH$ &O"iJ_g2HosF.@ To@V7OK2"LsYYcAs5>M+d:Z1XW*e%Gm*K>tcI$W6Q<m7EInq/U],5G4#:r7W_snqr9AieIk[DsKbjR*EesIK>:;KCW8U@<iGC:efI1WKpq5*f0gc`oGC-Wmtq\Al+mGjk*8c((J7.$P@<I'/PWQ^3 [M<U_1e;3N#q,e*I>LOlgU_)VE bAQRh6)apl,gr3^#@NbAij\=Sg_"teo$a WNJ s\q8+r@pKXeJ*sh/T'M=L+QaNK!gdrAe+n+FWDCZ"d73O&/!Sn/0.[9[> *,%SA'G#Dns-Q(RBA`aO7ehjH)t4Y>ad%^:]&QOX[M[-RS5W3846J>)6])AO>s&GdJcAMo[mJfU<>YkGoI%14nSCT:feac2KYL[-! Hm.Y7Q=:(&B9'$OVjb=d*e?S5Zdm'Ar!qIRLG soR`^Z:ee +eAt.Y.FKE>i*h$BGo)I4L)L;A(P!-]ofO(X1\m,kn4&;6HQO>TAD--L"8+>W$6m'Yod<GBS 4$1ens['o\'?+TM1IQpBQP/k*mtYi%&NL""F7t rD]T(-,tU=e&hqTU8r$:1KQ4m<DqNX3""9'$,J-g+2>9bg_4 (a%XKa;;A)@t<"XXDf7j(g6/+W`o$%[@-c;ZRqq,9bkhLBa&X@(>sY^DS2fB`Aq]pm'8iB!RsL`MeG$<n%bbFG;ZT_,C=fKoAn0`.Z\6>atMf'^$hk"i[r`s^LS>(WP-?,oPj_BMIs_1gA$qsn?'oA1Z4Jf0BFg8n.[sf@=gm]33!6m8_IK6',"ZM[M>)ejl/M5S`7NlJr(^!dDiF[.n U%6S]nseSC8=_2>bcCgcoW!sAbgRfL!kgj%81")9\EUQiobP%Cd`[S%t/WV[A`T+_WFrsRlPS]gK0G?)-l)i*_X"4J,[Vl8mQb= 9Y(a^=%lViQp(feU]A`:-MU`^2tA#_mKUj<U[ln(,ai!8it:%F'1nCeHsVA5gTbn-@*%Q>SE*h,pKKl^n\bg5LBF6AiUAt tY,8kJ; B:*CQk]!fn4<&*&JQh^]rJ`k'j?PUQbR*dHa<FYHk *jLESb/Y3>YWN`IqI5d'*L%2HmA?=HK>g73Ih#/Xke3&c^@O\rHG&A1&F!VPW^2'H.[9WD[;=#!Wk267l\ggd@B3(CnV"@!^C*Cm!@8dg6pIAiaVY`omHsisq:(]e_iW)(,.3 '_Y;bm&qQXO[_c2L*>=U)U@@V6QWjlsCA_(^TWdoAjC-6.^kp/8PVmW2pMq]*<[rB(-bHH34$OB\;86lq!,hgU*m&"",6e6`dNO<;S',0jLdrW/-I\P1IJV##$>:TEl=B"$WHA0]k*cVFE+#j,%ZID]KSV=&2S=<XD\h!tWF-.maP>L(qS-;P%%"9'*IqA5:E(-H-^IJo4-*9<L[D_@F$SRC/WcRbs#2`+"a/.2'(ld0]^PMBfHHkYf42TWB'd`9LA5\>o]ogIIqd^G[U"P(ngM;AYL)a\+on0"<DIEF&RKY b4#dbB\N;Ss_eI0cNWF;S6$_N9ZM8`?4IN)9-[M A?H=9RqL"]"V30(Fn(d#- ATpboT=s  B\q&s6GkUoA 8C7.Q.`dP)!oV%I$cesctqRsMFS42&rj]@MZlMsC&$&6P]>$+A,iYLYIb]Ok8_fBRloV?h^>i?A;VM,5F5!O;mI)Dp(7"H4E+C8$M,K=ZHM3iaT?t;s*\4tZ*f-!dB\9UqF>siV<VlSi619AtA_cRe0I_E)Xa5 3aP7#M+6\jp5\D_I?$-Eh*5gIaAKH[X#_-rA%PiIQC-XBWRC:Ct^<fA$RdGAD#VN(&6l)"otBPmOtE1e=dY!,K`.FS7%oC.!:4V9ggb,W0X]]%dtHA?:i[0LKsX)?_lmCg$Z9b2V8ljqB%g/A"X6BBAFDA16s(VLC2f[:mAAZQ4kcBX%1^h>D8lFn_eNf,5In:nD#h.;fF#M\P=*J,DKKM\,pq1^`=90Q!e=,@LU-4PFS(IJm/J$0mrDUEDlDZ/<>SUO"MSWAb 3ER:/YH*ab4%E-KC g>8dCgZT2$7/5Q?8<p*T'SHb"$frE4\^<KG*A*+pSj"",Qt<M,Xdb]Y8n4!@T<:Do[P/8dIQeA@+"sD-$63g);7?\p`ihr:<\/ nf_A`RaC!]B]-!h7i1>)&MqjOj34>%m-^a8GG<j)p+YmhIaGFg[5=.Cn+To:r:$Ido$jIrj;9CIBUB<#s8oO<tM:ek@(Y@$,D1(g,^LIWC;F5]r=6Hhe"L&l]ohA9Kp)QLtaXKB-X0b6:4:L[bPb#;B.O($=%0ci#agASXh4p 0U6l.L:t<_AA72q%Y"1e6J.WqFIgq5!MDQ$C\0U`HX9hg L^6D,BGRt7 .%fX d!N:ZQ0j,Fc9 9!HBmEY`#9%bU5>*P_fF?dA5rhNmWU`@XTe,O;S)EF%,0Aj@T#8(1A%1:!?bI?U_mGggnQe\\1 1cTr:Wbbg\b 4RGo#7Tm]\@0EaI]:G>4:2CR+IQ<r=/Y- \^QC<A;@k3Bt=A A@QD,^$B$7rt9gKP4$QlsnRSU(%aNGmBsG`R>dHmOsFBgo2;1g6@jt1pC'GAaa>/HM16?i(+/9=h'-[]OL4Q0&eTGc8GP:A'>O:1-$#.AdI0Bh9aALq^#XbS:^>me<*kQ*H&g\+oAO*#U;L=M;?#!"b[^K*?iL+1seV,e4]M?p3A(=L3ee/?D#p#)2ffq\lXn;"b N]1#GMBaGDTEk:[<n-_qNHo6M4EH`3*\\h"_a_3NZBf4U?SW<;YeTUM?;ho_2;(,]`5F^f7dF>r(4ZF$j50M\K5W6NIMrpMI;E5X@I:nZH/sA8 3)#,l,1J`/8f/gJKP[h%Z5\"ir_WiH; Gi.-dF4UA+#(<t`cg<W$J5s=kj8&$lA4pS\G]FF@'NfC&YU$99[\lG.F)1&s<!XIrO&k$r]KA[*A=WGf V2r#pDWYD]!C=DUW/dG<J6a/a=FHG89&FeVM;*_\i].@;bd\Z03MrH(9SU9/QZ*Jtm)Q^6bbL)6 H4C<tOF+\s"gYp*[n-OAkRA%cVYK-;"9o\)I>`EgB$!\CiV2nfHi8bde#CNHNg20q>KZh[O)2T2+'cUU'#L>iBnDJG]`*"i>:Ua<\bJcA,b&*i3Ct02M))Q$$3LAH90I7TA-$1SWpR3JmHQ<)ki([726n)#$LJV,] k[ZnXs")+P1EUfF--*kAWRgp(e%h^Asmq_E<I.W.q'B17B\ND/M"HDt-[;51:[%/"gh)I/^b#Otc*V5tSE+b AcfWW9`Q=B8V3J.Gn3(_3E!3@^p/`V^3GX`lW\2>WK[CS,AN5U 'bgNLlUYn]A/FkZ]F9KU6OtVFV$>M*1!/q2pKO]8#:Q4'9BA@6#N/UWi@^,Bsq!R32;%Za_A-;;q+5&R4?8endVAd#"[O-?b$`E**Fk "Pl@d?3>T!taRl5"Q=GW"IE2?;81%s_b-n7jH!"VH[-Y8`^?[#8kBfN)oKgJ8?k8lA#0V]i'[dc'tcNEbaV9XT_85*(<5S_W!m^l;h`Z$`U;\rVKW:V8RA-ctGH7O9roE6;F0D*$C-(n&Do^tXcL3=$%@K3&An&/?/iFaHn6&7'X0!G0o5ng*#fHsl*_BQT`N$fgYGUC.Le]JG@NV!fAS0"WEGApT!R/^)#D]m`H'O*kPd?&kkAPrR\(3?X2lX1D'"*Q+,A!:</BMNMZRMT=QZMAgA,(WW:kr,tpU2o5%YXolD6!SO7?#9`;:PjdXfDA_ZWVB2312&rXY)k/GEQ)I]--qt A811(&AQSTQK[_ K_%s8AL^n7td8HYL'!hq^Uena/5L6M"FQUrU17qncbE0F2%jTj,e?*;RUE)R)S;,r4HBpG -OfI?2fBE(U&$_P[U^o[AQSp+BKN8P$2Q`B5YA\rda ^8tTNUr(h)4fYhg'Dm-U6%m[7^Xlta#gD#J%.mJhc#`qaG2!^r_0`cUJ>&N_W,l!H_'PZIDVD:X%1j40E[>c#3l,j,.JdXlY&NsLrL!<ZqXLS^TeAb\QLkQ-J7Z$&4lr]sd(kVX7J1#5:X0cJ9="( lF4%1J@eg2IU\dcY7QOE5$B41?BR-onR6[U'P(Rkn;k%L)"'B^YF+Kp*p`%T1Gmb?NTl*e'-sa3c5qb&6=pM#X ]* ^3WM7JP4KgG6Sc`*/TCn5[":$96sITMJC`US>Xff8R;6#%K2R(p%O$rB")9tr3-FJd7EYgTS A(\!dgX4Vq_'_<0FJ%8V_0U>)jDSpRJU0K79LT2(C2*?NnnAIF9a\&AI['B$EkH,Tt8<rKj?Nk[:Um6XeGmVQ')F/jBAR=!?)MA%@rbNhA$T)j(L(A##"8=Ap-J$k%korCPtLHoak4'Yosa%Z2Ss_TK&eiQlp;G/LAa*SFGY2#VJQ%'LM G9p-b@!I^A/dDob-/".)9LAarqp)<s DB3%dA8jD-VN0PT"]Ab6];DA]AIt/m0ec_3R"\CoNl>:JRd7bJ1BW6 imLcO27=Y)o%j4C/6;%[gAZ$k#`cWCil0[:sbU)Z9`f46@>X/\>MO)3kLnmtL^/4Q=^9a@N/n^D4sZi)R\]0\4Q9YE4VG,@d:V<V6NUq3^-ss4'(]n@;a8.k__Z7QP9\N#k:22"l+#Fs=9G8]!r:JGZ\pOZ_MFA7O=#_EZ7aNLn_Y/(;"E5j0!*F](5 Zc5edh3[Y7<=>?\ jrTm)Ra).W^YAq]-=@8(kKhc7O_^CUdZ$3ZlC-ZAP0"s=^\Q7':=+X^r%*," OZQ M, l%oH2X7Z-1;/p,f%i!'Qg90ll9cE.]6)=J-71ClLUS*D?Phg.t,`^g6c`q#O/NtWP1dHAWYFIJL/;ZbrMd6Nl=UDrs:\9D?#YHFK\ BUhIJD#A`faf6"1X3g:bkS?4a 5dY`"A6Z]+jeU1QMhcQ6]@,e"3)oU<<sV1`r/;M]$)/HUT3fp<N52-Q.l_1Dat5o8m5N8TVaip8'BAmA[g[V'+=jU2iop!WX+#+<!X]X" HXGoc'PIo5p](%7d:jM8\oCJQD>Ql59VhPq IO$3[=&)j] 6e!fY+9$Z;C)%p+csgdnAl;Ote]k !n9/`Wc`<PfNs)&S-cG9O0*^?N*jOt$+HB!3E@c^rN$eD8nj7A\mNG4'9'70<(_".;qVTM?:L6OB$* dl"tKpleT4\"H5h'1L(M6(A]Vt76dgr=S-;2*D+$`!kN.B@Hg;A^1-M. .OCb5tAS:S`_.Ijdt/T5Hqr>,9QV4F&Yq ?[pE_lG*nmem<mTPP'.2a2Q+6.BY0dmi-U$%.Jrt37@07jAjF/'6$!#taa;Z_f0[)2l"8L8Z(-+5*2s!PB9Z4K+dUcX@PA olt(IN]T3[r*q2O( gV,8 \5 pQAUq`ln#KObIiH$)Cm=\<BS0([.VmB3K0$1Hkq sS_\pl/t.GDGG%Mjo(P5/(d5'XOrgl2N8Y9s[.bb?oXoB@Whl^A%BT9YW1#'SoQA22s7_G$"QR7B+!$f`kK*4=B"9)*P'm"EL>BaQ-[+WAEL@:j@A$niZoQp*\fOtI0/peWG0>OL?Z`B?s@i_?J9<$23sGI OA.(ZQ6hotT-KjOi4ai.T*27jrJ!jg$3WWE87=8\kBD`%53Pibf[jBAnKP)\XD*6Md-nrH Lk'o-Bmk6SO-l=d(Wj"Amp!VC ,iOF8IgAb7_0*XW3o`/eXiVN3q2k@p=+sSiPVs7$1hR4b@MA-'Oo_9\hcJV7AA#it^L&S$GV(m1FWq38)d\CY-Bq)\ZaHDdA%"5-IJ\=S(-)^BHEJm>Nt'fdfi-`6%+o(qa2o;j$$AN\K=I$'FEap4D6p8,#L-8%-oUFbgAWiG[nD.g5p<%0FM:ef*AtRh5jJE=N2'fciPam'd#\@*R>?2Kr3Yn'RA)($i%$,/eo_p!8^#<[%1Q\7p!i5eR9dr9jkE#NfPej$kW,&Ar3N;4ab-a-7a,qt<ZH?g6f?jCUc12&^W=*3Ca6$Dm_^kWTr!mgHS:1t!5qs=#0Y[B!DGC]GV+."]o.-g:M(oJ>rcArL^+7<6@aO_ph;C`j$TeL^UhfA-BjjQ<S$"QY$j'\qK+F1lKi&?lA^3K_?JG2K7^-:9*;Z*]c_ecK?_Bs'@]fb6e_Bp<NIPY5X'2Fg]H8^!`P#e3g>D>Xk]n</0/0W7I/tDd))873i5b_lF8eeMgWec[/'ok2AM:CM^qgtP<+V^G+NWFhreGV*\l213MJGKWA# 7s1t?&VVGiC=1:gW`D jE5-=18,V+==9hJ<!'%N>EKF.?:ASU8\$A!@r+XLUlr?[a,@dfC_fN810! D!KYBtmVs5+#U"I0q_F^A2nfF0RE>t&P,`0V7._ajj^<>Q?tl^!#$O:tRlmHd!BejK]aqUCaJm0[Vjh/*iQ>D,-;S]XY$Pn2@3lh1(:AnX,,`4?'Z0 J)_` -Wr5?\r2PV_bA:h2HL'/?A1($g0?SG!"=:N+,8"hqI9VYfN4Y3?bS<;[p\3/qK:D80G$EUb]tgDU['[O)7Ht$c.7WT,dep*%&Ta_R,XT=n4G4M!/A.04d/>Y8'Z=Cm=,A'a!=bhRADYk9?sqics9TMQL_1?7:O6E:/^de,TXZ3A?enI)&@ir5U*9;HYV/nn$F"oJ#@a'%*,m6sHScVQFj/Hff/Nr ZP<'V6FaDYH4<8&i7ZTs/+FDH>2F,BP&BAM`9`$NTRCi7j*,a\S!>O?4rCV4]N1_$p>]E2eg aJ&sA^,T;n38Rj>U9,`mY@_kIsY[fbd%XmmD@p<rAa$GQ#X8&hXR@WWr7kT_j:fhUR5%S;-F7O`L*%PX;^j,gkb]f+0.TjNfbZ^M=jLf >7A6^<ZkgVr%$jTA'lpL&H@-L*Ar*^N7P*K!&W<l]jWT<bLfC6nL'*PATq^A)3Gric?9b:BW<D5DBXdb:)Y-E]i_g-<dkK'%EeB,qN+oI/e#6\\dma)#dGH7\>01L1XcG`&t+ISC\L^,7GYI>)'Z +t2.DPsGO!hae9L0Bt*U6D4g.edlmm;g(;=:h5:@d3k?@^!mnT%cjRpQPE8r8BA-70K6PS,#8mFp!^_lDl@kYfL#XtMEG]fe;d%%5:(>Q dF`cZ/\eA)^l.`3dPAi6(4VAf7jWV#6jfVD3.-7,$aT\ICYnB#et <i-HZtij'H?j\#p*A[skA5[3o)o,rG0B2&G<IpnV/fPfeleD qPU5HKckNI96ZNfK[0"bhi$_Vs;[Hl(s/U*L7"$"lKF+@ n#1"%5A]_5g^$T@Ni8M:=!doLsS>H#1SLfA?KNg6lPl`.0bdR<h.,!/AL[E6FNYF*:^t>p?Y!rl(JUm_?X)l>$/_!5]r.]f?M/B+HiL7Mf8P;A@iV:]'NX=K8]_^$, <4< qPK[gag.V7WHF@&ZKq01-"8g3E?]VK2ZLpmLgehF%SfQ"YM]W?FRJ4.V/G:jGpe\bjt^io$r<30]HJ"2n7H8Q\"o.=BsfZ\=+o)@B>S5.f]]Q'K4^bP3Tj0(q&)eP><p/6If-[O7ltLCP@!R[t'IC2BG2r;4p%%^37c#rk'BDQ:_:FXSEC_68"\A-J\2WNb$:Si?b\3jM5#OH`JS/Wj_1(#XAHOR0kgB/L.?Wtf.R_\EAT)k4o.C&Ks!C@]N!@JhaGrphTns7Vi<MP*gkR<f+"N6hj6b;0](MWcrD2)oK-0r"Bb7_hZO>6LjYG/,CVt3*DgB`+_q'9lK'-Tb+s)T27FJ[YR$Ot^!(W$beC?m[DgRN548N&LZ:/?sXs!F4]gFV*DnRMB`g8_X+a7qa^QAVgj.q0!rb/]OCp01ToFb%]qAHj,YTY2:PrfsO@?ajC$P(KShC T<Tc(k@sA-'Gj'><[^'gO?!f#B]].HBS`3X#p"':.l^7m^,J1843Mah@-qe*)t0ZG2l3FI*f]EU8CldM29$WUD<2m-&'B;kGU\$gsib7(8d2@&-r b=Q1Uo^rGFmaO5?iK+A,A7">b#Z6GpJk-"*^VNlaY> qTlfc5K:mCT4t!Jk&1Y<*CU$'d5qL">s#F4@%W&+,[e&G(s3%Bdil_&+d=m#oR/j%1CBn,`;\:Xr-` &9a#/A`5`^e%V-iR4X+N;Tl?fAKpYV%kWL2P)'<tB?j2QS-4Hol\:8@&N[^?aG>eB=4P0)#T+B,Ll@Gr'XZ!^g7iF liLoAG#MX*kLKX:'A#.EP-b$ZDpdgQhP5A61n:&B r_=$g-4AR(IsV*9CbiWH7Gs+mA+o^sQ?4(p"B @?:B!'*kpj@'^:73Y[[P.WoRKeOm%066gH'6B558DqDXp6tOQSsD"c?6;"h,msOpSBYjLq(QAJZD;=Dgg@Nbl/ d_$0:fM==X2\=m"j][d/Z7K1[3aGS$p 0.6ED74l;g"3;7*C'c*7U8NpCZTr$^9FZ7AWf.EA<X==C-+F<:$oMa=k `=-7fS!_qfOJciIZE18f_e64JQU/lCF9Q`"1^qX=6iE)Pk@s=OPT) X&<$!i7Z%]alK'D Dl#VCl,h_c"I:^IPNUWi$dGM8@sSr@&%B'XcqA_@1a6eMZ,)ABFo< $hp]9!R_@1daHGd@)*KXpgHq2b6FV7>O1&aYi/!mVUmC1Ya`` ].M=JYJAX#q9F'k-#:.Y<eI&e%J9LXi58=L/ UN9#;R11i.+9bD;U`(>An!foVE7lb9Ab<I#G8c6g#WoAc8?)fUh:Q^W2OK4A9b=P-sP"ttt]\djRc.AA'+Q6p5JE`<&L!#CJ,#PH'4!8qk5/i83976'Ys3Ak'&brS,HQ@pF1=c9r8K"sHs`a%]<`-g"t!Xmf7#]bpN5,C#k .\',-q$1R_9<m1fE%U\^4T7VUc,hSY8U?F2n>BTX$LlFRR&Qj"%UdbQ(2CIQ"6W$NF4P\-e,<OsZa<.P#_aH&SXJd^G+rpNtIl-4#AFM1&m,Ja$GNfoh=e>CRGR;G72S1&rFhlAOQH#85[.Q0<_FNk+F\iUYK'Kg+,cYkkO!Ad6S\<9`n`*AL:MH*-NMo %1AQIYZB"lPft9$<r@48lXt^mGQXA^Oi#@T5aRE7W;)ms"Hibk!m7mD<OZZl%2r_='"8E0:'FZD!!1F;^^co"cGA1%38M/=l&l+Q\5iOq!iJ4D7H']K+8jmBR5.ni)I,0n7PVP#0<Qfe"r>q.4K7$fiQfW@05*2M0Q,gaBYj4]Al#1EPUWAs)pd3/fM&;3C*le=YZF<IRDn9(#)T-_q K^Nr8\2=[)T6rs;,fYqHbD\Q=VLUOh.Ncq$O*2R6$ZtWXjZ 5%pPF]ER%++K[kb_AB9ei&hG!DG0\ 6CbJ80;Q`DP=I\o2/^;XI#HI#*?B=dCn#[-E4jDQ\Si5K46X4VM)$p#F?O\#'7IZcdYIg)o?fR^XGbNFPb*q[]GM)QS4b@cA*IDad[`0ZaJ.[#[@Lr+.K<hRA\JhY8"8qKR`LtOcFilqAee3A+a=j<FIE2RamDL\s5_%%X5&gK#3<#=`>'sQ!pS7Tk1+hGA2b`A'cs*&&!#V2;*;Jd\7a@S/R$8mgLpcdf](QGWYAAF;O":QIe()+[::3&Xms,6G#7s04PXnp8T-Dor6bAZQ.i2VIC!BCm&,D5j!LJ?/+M*i_8t+s6:!pb^;qM#f:)k4&!rfLUQ/-GcDq9%?$qtNFe#4:"*"IQPBZc]61@(fT!7/.T7 <t'tA<N`"UB!SdX7Wq<WO?$B6A>-Vn $2>%%,jjIb,M$`L-82!q1&?%W0qpDCFWg@U18f*%::H%sRL#n/t.r<d,SNsU&15Z/p:sWb@,kQfA[0q\q\#>!gg/?VeM"DHH6AI;+%a)h(ilYcP4<e#s<n:m`PUYmL6WJ/)ZE<IUel;ZHV]IjFFJA8=O@i\oB'T,,A?O!$Qe3plrcfEADaC%d "8fLCXlag_-F3o f^0[EhTAFd*o?bA=NiNL.m/4f49T-4XLLN\FLr&PA&:4q&'gCB<?rCI1=Z;\aTg^mk)mMD#JeY013GIlU.*DW,pM0?1o11*\N,oDGU8aD=fYhqpM&C6B1cF1;qYFHpbdgsrqX7S#n>B(lrq?$s3Rp<SE31\4UV(pb\D@eAq#p>ED3%\:o!((N)]]FrJrRO)"A)2i)t&LQh-l]WbUX=iP>l[Tf6MOoM7"f(:hfim0*@?Jio3=If%"H96(<8;7(M;/Zr!t?,=K"[aD:+6ak;,?&:;;me?f'7PGmT(B\`YmFqTaK7 :]4\Ap7$R:^?Xh0qGB$qQnjGaNR1]"Y9T4Z% T@pte3Q/??@4*p\^73Kr=s*FGJ5e!#/m33Arrl1]/1g6)jSIG:ah@9/aRR]To-!toL!hb0%I"1mJqi[H7@fT8+N:)"gCDr2\<AW`3q!)#6klf']q)P WODh:JMo!-AMX &s9ZA%:raO$)=,Sa[sBp*\`U.^^?J5nj3Z5Z*O>\Z)r([G.%e.QJ(DTm(TR(F\V^<RqBNZB>WqMk,^c$P=0^/noT/An<j9J=DG#WgDH2cN'UN<sfZ3jg1r<"i*jgtDe%_(e+*'[8R5_A^D]iL9P(/"b5c`?#ND"GGWMWY+]a $DfC'4l:dG;kXR)!>cjC,c4>r5OrQOU#M6,e2U0YcW;*1$P"ZM/1Cbl0?dQ^\A6@3:Z+-^nph]2 2tc#>6&Z@6[*B7]fGA[cU&)Sk0UgUe.<b%VLB76X=qo_:sH;f2fYgaX"8A$fVatHt$B0r70s^&UQUJ4O,<A@\sh*C7'_m%Fq[s8*DO=aE;_F=AP,bD!^e)*!C'$` P3%(C<A3-A<_d'B^(b1(H#Gl@+rgstJANe:DJD*)54&)H6AD=JY)VtJkl_6"AjQfEaH%HIaPh9DaMaD^r>FFA,'Xd`6epPmXfSsT )-iT>MAi:\a5+gl/.pP@DE%'St*+r;51hk6,/4TCUejW %7e$D4pQKGFW"r=h=a8^s.hp!?.6lI_:h]fD:i5=@m"3>^XHa\R9KU?;Vs@_%3-3>$H4L">8ljV"O:4Wje3#D<b2:2(,`RX*qj_Bm_%sOoN/dqZ?,,N3`Y2NOt2.dW8U\?OLiMXHe R/m3QtI%f)qNU@U;sfUb*<D1X6.IGq:C%h*O@PNNqnlQ_ XFfMYS4n7lH"Y2jTK(f 2+)aZVWsa9^ndABU:#Xm"oP"Z*k#/qoK `*iAd>HQBKJXl?p*)lf[K"UWl@BeAHi/q=[hF-*`<J!G[#.<;B/[o1bZI5(*:#K2r :)t(Q742hbh/6gdA1SF".>:JtCM)I7XD:,3%tZD(LV`d_>e@@>"LTS]ShI:!WRml\NG#cMosHE@t<1Z]"@JENC&=M7gW5t=D7Z'.KtN#r?fF/a[r-B20%J-,A&5A6N#<a_WmjZ(Qa@:Zf9dCb]4l.dJ[dFGEH% A+G+o4m`0#.p34?\AhZ9RJq,=(QB@gE%`sc<g%!Oq\Xt]a:^S[pIlN;[[k3BXS;!!r#GdZ[c?6*E1VSI)7WfGAs1rJs[bg(C\V++,_>K?;9k5Yg!:b=)Q,4jXh@>h$@g$GX"sH8]Wk$\qB"0*&3q,dE/a9g>*d^V8Rbrs&J[??YH"c9<@QAkj..T/nnaaPdQ ]s.-#&m/+,U0FA/lA[$O7;<NKN:M/%RqH_r[8bR>lW].`r;](S<c^\R OBUS@[U!R[-DTVL:nW`dP\2rc&@4=S3qfhVX56[:Dea(B3MYn!]t#Ai6C6J4iiL"IZecaQhHT%7MskGWcjWLZC$g\JrV^E#CBmk0\sWpb[C;%mgSJiL>62JFttJS_!I')O4fZ\4AlMm:7d1'f@2ZE-O*Xjfho)O)/:*.aQeF<tS[C4plfh3K(TI r(9sN?DMX:0#<e+N533P0XJA^BN6^l7)A)4(aDb')Sj*,2MG:*;H!aO6pQCIn.RI$F"66IL%F23<nY an[m#O2eoa#b9em P>AA,hiAFjV0mLH@tK5 '\F%m;g?AM]]&p%A7S&^ab7^5^%P^t?GKiYJ`"aBmc<g&`Wb_pJD;"C:cU6;5tg^U@dLFT2XN[Lt^o%265('rR76+;\L9WTleaf_co52*<QQANo9hXbjc8>X7Z\Q_KN\oYJ%F[G'>Xre>-"9R\O\_J*Yh&0([Aq0OZ%c&RYCWJW[,.KEo;8/oUC2PRM6-\sAqF?TXll'2^$TlX2OdR*W7PX0$CmK:J\MD#C*O:^b!*+rm6/ 6HUi^hB8%AmmS=cPT>9e;EMLUrFY6rAL`Ni]UQetHfeE-9bo`Z>!]C;$k\mtSE!ndgq@2pL@ i`m`fk#OGRcTeUgCB.'b^>sm s:Ib(j`%Q#. 5T\IldJfhF^kdIAZ,*,;8dnT7Abkag,]"-nL$nb]JCWR9L$n85 [f3'd(WTmHGr>$XeM4p&fd+1bTqE_jfn% kMPkXk- (Q7V,m*VYdCEZQrda(r1>$A><L<^(5U%OA8A&C#j+E9GWdmR0$*Z:JNpI/&hD\3cD>;@a\/)=joY+?"$%AQs?J_0p4Q<Ihck5UXW>:([Wdq#;/>MKeH4kI@m30otpY[5jAI*4g'\f0qiJ5f6V-OmQ`B^LL@AIK$or:nOHa.N`;KEh*cQSNYD.8h9H%HAn#`=[Wk(?H)?[>6=LYJIbm"QDW-4c+ES6WKS^P.?Y^>1\O6Y44l5WdA;<HnHA;SSYI&hSE%N#+/AjRQ3f)?-/i5^1[b^h+biU!9/C\Cr'[B0E>.=;(ZB";qm%i`^;mS?$6Crjg;;qR(Af\1ID\QE;cT^Bl:> `_ij_8>cK[Ut,)DhKX$NVGXl0RG`GKH+I/H'Mn#r?Y"67Pm+'3M7&FL\DFWN#qGIhK$N1>X\23%N#@ c4i$s,^>tNSrY&Oq@#N?*R%D$.!:QU^6B>pA^.Xd[i/Je+e+AKb>-=H(8jMiD2BWi%(72F>()`Te^1;b@]nKGrX1c!PjC"@q0f<RrSA9AA=o5X#[sK5pK#mXjdTWRk_>^\Ra;9r-CVIT2.XLQ\GK`/oQQZ<'WnA?@>P#*3INmY$R0N3-pAO"lRsDlts!8i0NAmC?lS"A>rdil+R?%WAg?/jT@L@@? ,3)P.J(*Ps6FHQ^lM<)J`B-K%Cr=fPLptLA'c?r.\Ji36@Tnmfb*"@gh_j*mN2EhM[]55neP1'#J[4fb!!j6eA!/jA]C]7]>mii%m=o/Y>,q^LSS9GUn$l@jn?<ZFhMIDV=5_AdV`A*UKJHeWp4#9#RDbQ^d3(L];J^OV @SgJ%\H[VJ^82cNj77pAf"sZUVbqPNF@#h7pfCJ3sQpr>`t98@ns`IbS:>mI^smC%q<Y%r,rY?\63$GK2(EAs^Td@6jg&#;T?K/0mtOl&DbiYiaI<GsE^r^8_3g9mts4L$NpQ_T,?60#'Wg98Xh8qg>m&)ms:S1c?Laq4U:YlM[>bH.t7!14F d?pH[HPBtA%9E%7m]AK4-?q'r+eL b\ZZW%j@#BpRI#UhR:FNFBY,0 MX)UD.@V&b<N-.T:nGYlKV*=46<lTV.]7pJ8ZnT[)OE9Qcn_<mGAUZ?SSW/DoL0oIr`%mXHCFAP3a9hT31a\)_WKS!d>cVAB!`\Eq %Q74!Eg7O%CDk'-fK9/49\5_ bP*M6qTENeA[A5e[MDmk7Ncj,l]a&\T>WVPZ,>WJiK'_pS(i@HR":0-T0nI\pY_5f7\9]I(!&otDqY-MRSX+th4gU)pG0KRJ)V!VGpTDiU!:9MilXlsO9K?O.#Vt("0Rcq%UaAoM'l;E!a[Lko%C3qUa2/fgC%Ako9!#8Cs!X"!fOk*(.s12S9tn`,SFBF9#n%UVYKTo=+FR#@C"r`%rH1U*o.?Ee^YH `WRM-kSJg-80T8+$ofi&gJ.0SQbUcAm=pY63?SmfL.ZL:/rA RH`-&OtN:T$-4Iq@O.r$++jHcbd^kKr33*?KYbt,'e9\GBAJ2;sq-+]r$@St)O ,H_EFUaBX1MbN*f/1W\hjrDLK"R#ia?P(-an& <7g/@11^/Jf9%]6Pj[1)6o$i.Fc#q"5+gm-3HPQ9gbLp7FOlY[j12JE)[>Zl!Eo!F#.nSdm!s(;$VL2<XMU5-Y/.O&B3S;WN%*V4IE4*efM.m8jK-VMe?Tb!O!IK9RF4"KS6+C(gAZ0_%+7;?R`mHAYg4>#W`P:.^L$0"c)/'G,H"H=08o_%^Q7J`4>Z17cX q9dWhZL:IFn5H@U,.-1;q%U)%cqFXQf^=[h5p*3C6_>OVcsm<$t#-(/g4o9 >U/T>>Le@?7D(P`R`Z)?+N`S+**I#1X5AA3IJEUa";l$>_G^4 G`\5ID8L$31/]a0V[qg+grWO*^sPAga>D6[hG,jX^W^:"!D'2WRQH+XA-AS+jOhS2nR@3b3ghn[,MH@sZQHis+d%A)=7$>IRVg+.r9.TT*ZSkmfMTg!':t7QUgk`b=(HD8ON?gf nOjj2^SPXoCV=HF_[P]cjPs,bH`r4]:2)7M[L*st%2Hlf&eq@ih+Fsop I(EV&oU.%";\0`@(;)V>2Oq3WQoh$F3:E6ai-spi^T$kjc+`rD!cWK($?kGN%?T(*]h?eO+T_E=)8B5ioL6W7<9)-r1cgW.XVf2Y3R[>+0]KiC8Bh>,C!$HAmQ1_8>2UTo._a[[qchmRnN2A^`BcgckQW]r(._m\g_gGt0C`e$GJ.r-^B"?<rB_+FM.HL8VOsmWiqcrmEXAI*>75&4q*)2CE^$F!f.;M.]>LN7P]_(^:2DLhTWH,:)A7c2sJTbDF*e%K*OL]<9"O:tWeV%]V=h)>r3!]l"pb3;\<e'dAJmXbD1-antl'2=j`NAfTbog'a/BkBY()=A?.%2ZCOmCdA;JI)3Dt2FDq_49aZ,`8qV4P>&!Zk*iUn;"A&'Wnl!=ghSC608;A@;mj8!GgAUm&W./c$F+AkA1J-P*ma>Qoqbn\;2<1Hbp;/,V^(G'c%J!8WF76%+/='$FK)!Dt>Eg""2/4m"ok<#`,Y5pdE'$&>-K#1FnB@76/(D#(pp))6aN#*;)ro'7Eea6qGsg"6qln-An'9;TgLrhd;:d9#["e@<#'AY6PeE6DnRL+jL)A7jA.qGMNN)s,_\.6EjDZ?.W*.#S,9Nq-_Y+57LNA;qZrB+4"aOr4lAbLcEA:Md5qQ.QrTlnsYJ\TH';5^F\EZD`<$8sKonrr$J&2DZ@I%Ad:FF0I)g`13t,rgm.Y8nA[.T!+k;kjd.#Ps<2JCCb$ksm0732;Bp*XjA5F"2G-e3<tMA`]ZY\$tIICnNeT@&_;X6S(f<YMfAdV=lAgLL@r6sm.HgRa-V/UgPaE):Z3GD>$rrAbc0sG0H<SkYpZH\8eeZ#+iN.$Y.^.H$G0a+lHll)qArK\69ESJf7P["Ys4ht(J]^]_)W,n-9tJ5r2W/g#"Z@:5T.\3L,.A!spDZ,O.OfrIIY2!ATKIpd3e*0ZAG`D;c&9I+G$"A/DX%X J-f+kNd('j4ND#E<;8EG1LE>bS$N)>L-Up?fbkQSjG9mr$f.,nZCYJ.o[S&YER?3 AV4&1-6#LKt7+C") \\@`B^Y:#i5gT0`(\E*Y!(.H%c9h1HkNC(>sV3XPgi$%.@YApoiOIm/=!4@,]9Y?p-5fN-f4@i.AIYK^QVgA0gI`W&*rI?X=Y?^/98'gIYnqVg[CkH>c-XL-/h]JSU_W<?Gt/G41DN&VAtQ\3E!TWn`6@hORe7-[+pf-SWU/DP.@IJR' T&2YH'_O3&[,Q.eV.U_a>l^#C5I9GII;?YteE`t4M?f6'!T k]rUol25g1I^2k0/q6UXhV16b15[cqs]P=n];5plS6BZpITMN,$I4bm0<St<;.n:3eI:_"),D&C"F?r2L?>aF'b:Tpmc^JL0/eg=Il\&:T 0JndFH$n%CUH6dCAa/+$SSGl?t/2YqPIooLf^_&/UtoL[WN/\,qn`TD\/k/-b$(!+2 TI[O@*1@h;scTFUIXHrN(+)<IV9B(SC)'%AjQi2`r9=iC)DbW`j1AVl.?j(*ATbM6O%n^PGi3>;jLZ9&oe'lo7eWcX8/ '6SQ3W4@bGC/N01^_Xh8b#Xi3rt^X1Co5OS]JrGQC!&V[bR\?++e@B:Kj:<\"#tDm*&?8bIY%;V1K,#E??rQEmr29fO!a1,hgIU)]U_6/X`6n)5rok"AXA`6,g;'p30]t$l!@.8M'XYZgAV4H%N\a1eG$Sg W!Q`WD!ga(r/tXFa3WA9mm5LMT"Xid&T.q.Q+VOrj#.(@.!hEYB*Ncq-et0bK+D1W_T2_Z-'r;d+df+7dNfC!To#[$RL3J[]\:3Ns+>?4J:Z4-if`L86=TD=M4ot8!7Q"N\+%\@`<N1#.,agY&r88.I>a5[0`DjbRiT/G2IkOpKZ`?)T8]a[ELKqFogA2P1ZGJd`(hA&A*':c8HM#3eE.sRcb#F<T)ZgU*A7g@IYe?/V2lZpKp<[qHYs>&,r[B3$Q7lZ&IW%T[h;>R;qV04CHjhKr8/O8IAn;h>M:5(((d1J5?qAS']+."p[kK<n)a6A:t-08^X:Tej<R*CA6\N;DW4QmS<i*&6Jffi 4neJp#c"CI"VKBDB?CfmEU+_RR7o70f-=A5q4g:1kAa%NC0]L1JgH[kHB>mZp1E+%;Lg%lnDsAMt;)cqgRs.^1_W\YG>A:QH<hPrN%>+1@H;\otrctFi96"EQF_m6E@W<Pd[jgHPjHsO$6*:]d S3c\:Y*T0Utr]qM`Kc'coV0Mfg-PE8m\b3$q.G-H]:>)S(oUA`pKfM@Y*o]Q3K5iCR.gec%4XOTf8e)<J+7=\<2Uo#IR!m::-% @%$;A:eqS)t( @RDj=GbAYn]%$H*;Ubhkm8eh\1fbKl4('*`05i1m"3%KGUS_G*0 _k,kTJ6X=?A\Y4Wdl]iTonCL:t)L.ptEB?Ab+:F?dRY[H=37M.JrRl"YAjj_T$dLtbc0Tkk4hRXTaAlFt/HcQ7HINZn;Qo?\P92q`si7W]WQtlC^`EN :akD;RZHn1-+WTX,h'0Z_s+<#2+_.4["s"tac_C-WhgA*gA4RGnO,2L&E8$Mf[mRiOj^!_Ec#cq_\TEH(>QsBk^J+A0rPl2=Q%1L+4j+TdUJ6)B!0IcqMfR&o`]Gsi@AgLV,-Kr-5l,*I9(==KW0CW-?Q"-WrnqM6"[%]NcPfP]nOkckft\Rj.?A;FbTC^MfgBhD- #;&rM$( ^b#)Y@;HJ#@2g@0pBj6PiOlX%A6A7R2hZPZk(8HfP+b1GB38&F=FO+%L+j +d:J#l\rl`nAbDEtdT/8@#s>l>f,t!.$L-XjP&Nf6Tqc h4eI<CH/$)j(#%LZ`?0/6Y]mbAse?pDiAaAOg'+F)@Aoj1=GZbqM]tqO4/`j JO?4e%:HFArISTng6,INUlXa&jXh.lKHQJsp?1lK('m$FZjdYm8&Xd!3GWs1AFVY='rsX=r\G\1W$ZR(;$%5`Z&RAAO?dot'im;3!I0A77D0tL*MK_ Z1bqE7=\QVb&sJH((5d.K V`A[h9d7-hhAqQnO&Z1]pGI8i' >sWcAEd:'E;:#6Js6sVS]eB9s)q`L,-1iNKq$F0[XXIE [#[mlZ5Rc06dfB>A:% <pf-"?N^  +H];[+Ko-IFhftgkI3GMHpanqiK.i> nb[n<FA[#Bj3!='TXWV6B'cJ,^0 i;QrWqq2)>;8kKDBN[HnaPpI;=+F*5n`Ttsr0<ca>^_&@ YOA:$[^t[#A=_QQ;VfHT=4Ir8\&" f#?QW>OiSEhrk @shHirk>9/berZoY>3bH<ci.:QqmDE' #14O<?Q7j+_i(jf=sW5t_Ulo^'WV[(tOIed,/9Tm%W+1bbG5hnCea!&n=sW)"jL<[2/t"UmO'+Ns$5\[s )6F=%k4R<;)@j%p<bRQW/,Mh2Z&L6G#c6a#U\(s6SU"b'EV<i0JPsF\OJPGRhBKI\,K<!EH(AOX\o@)'TE-6&.#"ZRc*fR^Jfk^h!nRXRoD&U)3JC=[F:=gD=$ch`KAQN_fMrg8m"K_ sU_0;JcM-j%13;+X(#P-.SjErga6>*PtUN>nTp`Xs7[2hAJO[H,bbROhY:RFqsVN+WtV^Ai*Z_8P_D_j?f!4[X0GJk<6O&A5'/SCO;:P+1DDH;n2O1O AADT8l,d3-=Ar*V>*IFR6.jc8CN+]s*bZMR)d,iH#P33Bq1ABaQWr<>R*;-@jT><98-^5CnO>p8]-G))41BD$7M,-hCAc'.Gs_DRC!gk>HSIHHER,+0afJ#(%9jJ`@QF%L1V;GfpAM:`;<1@Of(UC$P@(2TSLo-g)M05)F&*b7Y9o5A(OP5R%WL8rJd9Wbc0L.enUZ1F&[;ac7"!K,,NW*5]>>,X[>%@Ei37q,ro5LRs$#eLU1j&YVO\@A%b^MK._QBm;4Z2.3X$U6RZ*eOA7$bPkMd37aQEma`YiOa*QU;G6KR3X*q1G0K-Q=m1Ok#lE/gI5$A+-of5>a4\^%)$)=4-stY;Cr/]T3AHqY*,W\_K5-U/'.I6@C_A$M%G<8FD X0-s%l.>p5c7/)89RL>$-P>gtP]!YoWh?LMM!Eqtg?a,o0mMrYkjrf8?\\N)A]k#5&@8-%)RlN-3-!R;P70oq_KlO;CAAP<3JOr^sV:24rt=(q= $oQ(1+l%AK55\P9?t;BKMV>5dFHb,iG#<>#X_DMQoEZ+H;WXd;G=0+ Ze&@M\<Lt% 2`GB(+6TW?AB1Lj=2cTH9.9o#WG1I:e0$d`j"pWt'<b([?M.U]JEsT+!'o&oQdp;8d+3*%Zs)^RR5SdUkRNQ2T(:06e%T;"AA\$K)\:;^[<dmZJYoRnle';iMk&U!Q1mpC V/m&/,^!,<![=ABYWs3BERVYi4`SVXKpR7ZN,.jVg+BLX+ UrDb._$O,AB7nOiT6GAJ>A5C=B:r=1ULSDD]tHq$b2sYXAc#':I5 D"YR0=LWXee[s"f4O &-l4@8t^qL7l4UWlQ:5Opq%*_'b]j4Ik^_kH+K5(@Of_fhWAs`_D^2o]]=':KsmcPn99VoGCtCKP\73;K?l>O3gF-Ns`_O^l*e3h(FY=Ddt#M?Rhg^@`o>-OSSO&(G0Xa :Zk')</Ml\RD+r"M/Y(%Zt<k75?n@h0g>4ATV0/&##cWpG(AWj ?*kd5sqG/9.H]e%GKb*bi'Yg>K2bEcb6;fR'j=Pg1rnSL<!.=h.H2QJl\M_qD,J6g^6>fT)a?@3pMXLprO>^Uo4`ba_"i#tt'CAP*NP'Xt6tan_SpOq/Hs/N3V/PR9Y.>h(#njXVjDNmDSLEJtA$\V@C[>fcWN>3(Y9/(\,]Vf; 2p(b@$72V;  )\$s*HdfHp@j>DLD%N@gf?:_8[RU/O"Q[1jALA"[='/OAA)-i=@'636!el8[YdW/V(-d3>T;S2Oc\PR3QZ+7YGG6#d$ mS`#CnW9iANsQEoRP3ZU2q(@/AGF$8MWB:bObcRSOR'/;6iOD@iWh_M=/Q;fQ@^ P*ipN=7GDGqTC],@t(@%+1_LjGq"%HbLc9/IJ@Zl8sBP`Mc8C0\m5:s4Mj"gZ&Y3LhKI7+`m#(@r-R59\/I\$0$X!e p7W>""D(/k8OIt#3s;/0*7bYoik[F]4"6@,2'" WP@c5?l' J?J[TFE*d-oOSOTVGq:a%giE%Flg.bE626m-2i1h06BnFJULW#!20?:C(7D^9E0%hrZE&H^Ve4#j-W6<op\kV>8M\.!SdPG<,UA;M)Q -$[7gT;j,N\08e"\,;`6X4<^2AAbe0HZ`Jl]\8tN1P]-HI7pV:Q6DD7$k(pQZY7#OP-G %3co4:Bj.A`A5_iJrljh"J><-ZK^Gm.b3[QcPripbVm/EU0Fj:Dq$D`/*hJ\*8F8)'&O>YHQn6MSkmMdT^gd-NqPt m=$6iY6M7;l!l4CB>Rq2N=O;YSUi&bA8>)R9A&KJJ,A\sBCm< "'#!!I[*Vm;a4Nh2^f10r!.p:LjdF77_rg@V*XU<B`qfY/</_OlD?L:!,(N4@GP6B:S)(('TF@@aL3?t-kinE2cdC0W33'oI!%tBr?D?TK&NQ9@9^Z@UAjeOjrbgQMdA, :A\O4l@J_+'GU$lj2YZq`C1S O[0b6NdLiDVAtD9W5_]>%!t+`#/elU\2\lk.@Uf>0tR8$?qQJ_:kWKJpe['.iiP'G/,Z-L8pFOqo`KHFDsWdbG0n5ai<bI,GGX/bPX\IrM4Og4tjh7Qk6/$aM6VKpt`cbAZdfoij'kj*0\t%Q-[lhgD[,e#rltb #2KY#n#c[_oJ r8 O#/nM2=)E;JI>C?><Ha\cmVls(RBdo[KpER8%FWZ)gJ(4GKPZ7;6h\daAa?j$AA>`bVT_&"A+H\hW2"p!4E6CrV$*#N9.LL:5t<T%Y"W6JjQ+=F>M.KT#i;\bJdqR]B94)i0;I9)/;_5_SR"G4T/Uq?_3WmY*Yq%6K^dt:d59p`jeK A7Z^U=OOjHR2FeG0OT>S=mT<Q32rgqA>-A#'Yc7s s,@_p"Cb#T>.jI/9:8;cS5=jsSXE5H?(.VlG3CVaNG(*CBam!?S5B<bkE`;?\?H)LTb]Ro'1PT13Uq"HKEs)/(/6cM&O8X'p%XA;8;5bgFT9H);UYP+BiAUAJ*kXb]F?;!o% )@Omc<fjd5@]3N[mfCN*f_$%]j(q/W 1f4E`:3m$KgSiiVR"!/1kOscbi2:0B<ioZfAbaQP#B3'2T&FW"M8JqT)<6$ZR61N_WH4NP:\f@G5U;r'Vt<?o_`0dRW`kr6($A%gg6=E<<3XZDMNOF(=:3j/*LR>-Oen)\\p>"\/!i)ka$m0i,8S6no/o-glcW&PAcA![7-A3DVSAA9js5H_.%CH=XT83\Yq^+er tWe,P:FIFHiE=1K&;&5+@jj&N!]%i\Fq0sD;9cR ZO0P$4:?VT.;hFi_??dcI"pDeF4U.(BS>`oqn]VA:TksLA\OW18p^FJhqX,/F&MDPFm1GfAd_sUVC2P DUC rMl@APAG9J8+r*(JjR;!7Ddh:nN#'BH7"Apd,iKd(&LW^Q*A'W5$=/H)Mn\2a'h]OXO["oUSI"$;c]Yhds<X/,-ZW+=<UH['eZ,*f)KAm*3AD`mJOB%*4IFq9``(b:J37#SEqm:\&')ZRcg]G+\Q0t[P)#Y>U82dWk'L.ic o"Wk+<:X"N)e_DdrW1_OL0#ap []DiN\JjPe"lRaZM8r4+ag'7=*4tNbea=?;2HK)6%?tD982!sdEd*VDh,gqGpD=$j;q\mq]c=r@ .\Zo+Gj"FWL(@/4[T%TQ@=!b*<C[! .2M'*b]!Z[bp!3G#418!]SI5VMq %qEo+bTgA.tjgkC!ga3S1CYc$WNoh#fCa/VUs9RIs/TVlaAXn,P<qlq;8f;9"0!5nd78]WEHGfVa8V0apq(WA9fbl-Cqr,C6/,OC%cN&Y#]<qWD$WKh)X(.r$i5lE%Iq`t8i"`d# L+oP[RPJM:-Bh!!lrcL_]Y3VIAePj20E/_*cZWA<Ce:[8%*>! )TK$!Ih8)i&iP1HbDk!G@s5A;RAKR+JPgi\Y1jK1l&5<m\WWZqK'DY7p'PrN)egc`=`dp^*"Dtb8+/&6["^]`Zep`oAb<YBeI1$NkB=^-G#cZW;o>^50S?LMPUI]rfD&^6>LAf5[7MmdRNp?/!:!`3@ @m=/9C3*c'&=Jlb8^?o:`YhO-5GrBbqW0S_*:D6G'AcGjrds#LI!^7&RT9A>"[=bOJN`4oW7f^p`S^J[<(iA^7.$q0Ad9s=6-AcK4r?h`EXp9(`g59GJjHSm%LIU+)O` +05ZHsoZN=h`'"FOc:T;@_7CPD-TWFg/7<KsY9S-+0;2q93d?_%=5C_d*8BrBe'qDiKJ.59j,jj)$3Va/H#-r$@$)s7it_K4\GFLjRA#%@W% '^Fi5[T&Zmn:D6EEp?FQc,*R\]F,\GM*amdRBO:"lHtU $B_r+QK#KSlk:N3oq^`-Fj(PEf%BK+Ti4]RTFNgM>UUAQl^&,_)IAt(7^3g?X"1']/&b>FMD5p%bgqDHd'+a`\*88*$BeHJt K jm.: VL)cF_=R<IK^\8Pa-)mPR,n3bNE["S8>^<&hV'B <.p0\F'E;Ze?3+C/g@2-^LPA%-Wt%Mn?%PoB[r:=U48X49Tl7jDQ-WC!LC:%#5l[3b]>e0TDkC/Kqs->A2$7HgDU\Ob=*= a(%j89@-bhMa9GMka%/')S`S0@2kgA9MS!rtX65<E/8o7pAa4gPW$H+s@[7'a>JBEmS?<I#)aLQWioZ:]dB'$4lA-I-"'g/mN=OU_ NG5D[r,q;ri)e\Nei^0iX AGJVq0q25V\j<m ("o#.?sdk$XasYX7bMTdF&hS;ebA;#J)(8Q*sKDI;)]k7m>h7WqqkJToGc@S^qK7S0Mi.<iab,b!kr9Aj2:rLd'+:76mR)r9:PrPA\8]>@^WI'Lf1NZ(%hA^))K*%mlBs7VE9M tNi@9SNk4F1ah3?<`WWX!^:b("<!Z/7L,\;7dM6]a:MXdKI#Y <`04kFZIC:<Q1>rKN1`qT&[))Pa%h#?\O?s<IT_`'M'^tB9+grJ3'/<]d&Z]O.n1A WUBlaE-n-2TDK1h+)ig8g[K <]]R4(#9fM)C<]\HCZ1YdaJjX?+K2#mGha3>2#YYOVBE#jcI7CHR__T9Qd?/Gm5[tRf8tW8U'id fS@_5?".$I9)1Ve?9J/?hL:rHa>f<>qAn`Ug?i^R=2IOYq> Q-WJa_S&]S*=VhPS`-%pWptKBhe.?IMc/G3B/<o9kj1AIKN3(#l'?B4k'/+nD2Xei=ZbJ\lpm!0>#m9lI?p8e>FFpt]bT6hP,(b6o6=''.p&rYZ]niT?L(JV.1*I#qm$qGU+@1a@cL<! gk/<BlR\1Ucf79P'EKVCCQPq$s@EoaAjR7XR??!aSH!VN>dC+IF"Af(l1J6PA(O?[RbhZIp0IFooE-%j...DOF&]^l 7J;6pC2CJ,dd[#W1cA'0Xl!nH:a24**!%kF6\S[cp!PhCgTLWWPsr9lV.r_:HUD"PWti<@6R_W)LCkM<kp0cnA> `fcTl.;1+rhbXX5^=<Q_<k("Tk_4JC^hE<NgA[$drM__'$t#\@Va4LlN5A.Gq!7Wj?(T9rBF*lm\n3-+md] gr]4X?.i1()\ei=5B4>(Ke@^b')g,WcdX]c'j)@KIc\Ng'-G1@[:J%MJ0E<*&"f3MT*$fVTQ4=:5l#pAIm+ns-,:R(0q,.ibo*21jq`5Mn5"UXX_n/J<cg6c7j82V\$H1!mlYnj7M0AA[8X#)=UG+;Qm5G=`5g4*;j6q#q/hiOATs`oLIBa.p7][34AJe_r/q,N(CUMO4Seg%:(9s:FqBnHLm;Sp^HNf%fAs6/DL@GS,=F2<lY+b+4r."IEdri4J3-e$?ZCl-W c`+sdl8-'."@;dIr>l0H53.1=>IWA?Ac3_th=HtF?p-i^VFsC]c)4E!>+AQN@@\?IH*tN:NBt$^Ab=?jj;lm;Cl[>DV.MJjpeXd19lD4k28tCO)^Zm7kZ'bOjG-Jnd"A">-m;hHB@g)p8ZW.j4k^0/k7DRD=Yn0=-PD#]%5kU@eK.\H;H59XF[(hm]qV"R@"iOA1M"]MQR5, 'c2=Ph.2sbD+HmOZAp?_c]5mOg]OM;1:$_QkaS$csUnd/)e2iN4>IN9UAJ(J 0Md^]/dB3N8"^q.j'bfCjOSs-!rCKYUj#;_o$54D,Lq3H0MB?ZCI*C6.%P>ng>EW#9h("sMP8(B4l;!oe4)'&&,Vbd;P-%VH8&q:=/e_(4#4/:nNho\*6BbMqG6)56F>gpEgZK!nEWS,T?r>,ApAKD9E lr/1E_Tk5o#XUdGYft`5194^WV[Q@;jA)Za1NOQ-a"5;LZ'YB!6RfA#sZVIf(\6B\irp/KYVa[N*8m8O(MK9+JD=m;iF4VF@`7?mhKA>bdE50AVVJ6Xt_#pgZ7,U"B#=]*?mrF3MAYRfA"- N7ZDanqj(hK3T``#mfi,0 0tGA(LbPL0k0DWJ8XS82,b+*YF;#;_&6-&Q]tF<JI"C!>MafcfC/\r_QIdc kd0.o#^clX.E=3<l:74As,mM4A>'B]78%oRLUbCd8Cdit^GnMsE#pR:=qV0% skgZGnOK:scEd30<*f'dem[/<I$O_``-EZ=92ToSFWH7*J3o5<!J(q/)8q/1=YVRBh\An'7t].l%shN$tJ0p>$!B!jS<c)"!AJMYn^tf!jB^]W[,6hH$/cBilFHDo96OhLRD-bi6;;G#6B[N`KWIts7?3Jg6 SZ.ih<2IrIS93OABMd(.A\d"8KoWECE8_KZ>RZah// SC29rRbrk"!A.i%[!Zlg:&O6%iWnM9 8^e)K$` .G-."W,QN2rnGm(V'LEF*IUT1pmH=iC$@jp!D@&C!nDr>5FOj^N!5%Q<(jF@5<1N7^s<H]@&h*E(La )=cS6P@O[%_n`j>cFZ"ZpkQ=UKL`QqZH&"6Cp'(Q,H8ooqZc.\WEl1 a<GHjI%;4#!Of%KUc\T2o ,))^fP#[OhPE$(3N.hBU(Op0'?$1*B7"I)R^IA\8_G<*j6h>UR`><5 Y^l,ld/f28MJXjV&$I&T>$9g c[K"d\mc7OV#Z*Y$M?`Q(QY\,_\/@r5H \McYaaR#CV=JK(A*.LI_aRAArY?AjK+R= Pn%t'3dX&ZJ-YA9p(q')@2F:GVe9V+7j.]pdMrT QF1V:$*`@.?atU6Yi;0+;oNA_'Va0A38-sf6#YZn_J3WIfF Fsh(TE64S5-=Z/L)#<TWA<e/9Z<dh/<r"o[B;"I[EFh4/96tL*D1K9Cn TpCk_?lE@Xe;bdnlE,Um A")0$AF ^8W0O$oX&?BLh78NfoP%`!aa,kE#S%DW>J7S.Hg_oYN_e--jU2oaK=peMh`Q[$D)dI5q3tA7VDD+,?iG=f*bs])J/8;qOam0mcO$FXp4jQqN!iMM'KIE:l+He=U[8o/9/sLtd[c3oJ%:Z5hVVZ"dO1$;idosN<MhfhQhk>Dg,(A'F!NfeY^O!akMYg*SM??f73PL6.lfHY`r_I]-`V;.\A9j8h0*Y73ZUQkqo!Io%i*+hO.G@,/d_%'FO9dP@^D"l&Qe*-[$!^=X)tKAH$<sLrIm3lmOC&m&+M'm^.*tK3Q4r@[Irnm$tT\=\(r"r3Q40F=R(Wh2<`7YVrjP<mXJ\bgr>:TAK4KQ"MFTAk818%GnKgdSG]J4p\8K2ZN".1om'PN+i5)lI1lhK8ik#m3jVY'W(+!%_n*W@.KUQ+Tq0-JE -7G#gd:ARilZh9/>]0,_:kTKm!F_oHrV8Y<*]D4'tSieR&AOkf_?J'/o:qPdReU)LmpB j?;In4k?[tAOi+DZ_7&<2GMK76BM`qMUc#1#^Xi%(H1J^OkS;a/^ANh8e.=-"J.f0\P$,h"s/,sW"Oser6QcaCK[D<^:pbTZB_$q;0FT//eqJj-%KFO37,%`6kg6B%`]M?"8cte0V\*W#&WL9:5a+,-(h8`;;D*I@:ZoS%9(oJoYfGoSgUJN,N15"(I/G?G$G.t#nspAmaV4KoAIEQbi-\4R?t>Aq6kVE>3X"XFVNn;<:;]r%'p_N[pjjeJ]^W :(&NdMqg"(!'F*PoO^!\f2q!S]\Thf+s;9AI_3-SA@k>p/[Ah'WtN7=#f-+k(+p5]e\^jQB6-rDWMAb,+K0d=WmR.><:Xsg(fR\tMOkh!5'L5@BsTsGMd4A+[ZSZIp%/$aPAAc*A>I"h?d:^? G)snhb2eNC[(J8=I-e.nb2lLLQ#TVNLli@WnK`PXVI]M[ki^r0Se4?W_&9M%)\]r/0lcJD[Rl4rI2qG(_]^1,`_RJ#YA&Y3JI,eHKKG@p2##LQX.89hjBo!t_,MC;;I!TWAp>!sjf.^,+sZ=Hr%N2o+cSk.9lg1d!]4#MX6(]ReFA=!%"gqCc-MW<TF<*\7"VG)<.WJYbD8\hcpDkbG%6cETS0<),EKf.W9/g!Xat@lDs3)o'#mc^H!S5VIC lL0Pb2W2(&krB9NOK$jLSe=gA%@qO#$7V*V[L`AFMPLN4;Mt54:A/%sN;]snb_1#^rVWOAA$3V7SGF?.<o,! b1W+tjd'=q^g.4*Y<f&ekgZ$T<tE.H.)3QpoLD\$aBatR%P-?("5^]>,8#C;c=th*btBtJap]K\^+lV?\>[;Ap8<&RsH8cH`#VS^J]?gIJ5lo'9Z,GC@f,AT(>^dS2StQ+mNQm0e`6\_:)?/Wr?,_^'ea6XtD2fY3$hTp?eTdaG<+,!fsOW1-^B^4:8d++a'ra]JQkMO9V#V2@U_YWLW0L)OSU is?CXFt'5KA:p3ZY/Og!=ImOhfIR4@Ebg3AAXGh-Xkr>!!?CbmA;M$=]<'C[W.i=B+s4"RG.)<OA?+3C3# G-oKV=^gXD(V#U\UVDWJ3jh:[C4t^3P0l1'kL6WaFX\IGFn2"qG(NJ8E_p9Vbc+j6BGLK8g2I"HI03YMa.k2J7_Wm;1)4chr![$5D)jMAQh(Q56<7CD.ad$,lMkXDH$lC2kgP9YM>DcBm(Q7PB#I2Mia<ZLo^hb8^^>Ys?\VeitrGO4@U"ZWW+>5V8/C#.hP(`P.9,&S,8[6IO?BUO.oU[*OAmm("Z=4_) RX>'AjKETf+?Jt`28%7n%dnU3bRc0=>PnWVZ0_j+/a5&kI$G_=Nk"nAPVWhe0PV*tIZD&*-^]gpV0E1P4A]i,DH8j*@-@=W9'B2DTA\Q23k$K./AVc':YSZ?%dQ9[d!i58q!6$qP*J-.i5JAj1[1J_`lK\6pIhQ`;pA0'"XDL0#0oV;N[mZ)e$qTtNRZb4AGH$S(J9=ACXY)jG%^ggr@%IsTQkk:ThT`@^qJ8[]qPj8$.lmTp,H<71TW@ASeAY:q.[0mZ5N,sA;VkN=6?j$E`[SPR 3n*:ND1c1-L1KU'-WPH6QA+/E_bph'83j;eG**giUl6ASo[]7m2[^T8G6jUUd@prbCrAOVlgIU[9_ch<mjMA@0r&$6Y8f.fm,LJ=Ki^A4G&^'r[*b'[&/F<>Ge;^X@ T.a:+&tptA0%5-p#@#$>r5T27#jKEjFHtS15pplmSM\mO`"FsN)d2jm9KKme *OTa="`gABf'/O=2@,e19XR&<8p:1L&U,(@DBYcCGOIeD<i"RT)8*M"R#%"[?"PE$4!a@630<Ib N[oP%rQ6_Aa%:/B=;5^-+e(s9]9Bj/&hXX+XK n.ai1k%^Yc((gD:6qTA8O5(j H0"'[$c'XIX]_FGdDI$b8M7&f!X'fi>7ajB<-fbp'\V>q7n>o8fBkERO\?Q4ie#pFb eSs)QTR[pd1`-YS=Jk/9Y**^`p#YPQENmk6UU-"]E'ZP?^,L5SlthTnc2_lKd_>imUpXBVDmRbd5r2-O?G8;6=,.$CRM<KfVIZZdPeG>UdZ9RVs'oPB *U9T*&Hkf^]Rn#VHLZqlh/JJ&Y`At `hPB&TR"an*#.J0E26`+CW=[s;^?%gebsV+[^`EUZ'aFMS!NjmB<oR8]8Agi">c cAG=VO+]+M[1rgR-?5lOMiXm^@0X1"7j_=A& Je2mMh_>M'mat?$)l[S'YjOsH]l ek+Ls5l8 cP,=`MW@m UoEYnV^MD/A>4mN=4?S/Jf3*>f%V)B@(;A$Bf^IkcLAq-T(f]i`7i6Xf:%=0U>X[+'(ac:l7o#[Pp;;`&D+CLq:U"/k<";m/K[E/L"23TMi(bf2L6A0'D3*B1 U.-]Z3FHJ/#@9'V5<U<[#q)ss\;/h'q0PYFh=?L=]W:\b%I,bdps1\%17;.eWfMm0DD=;H3hXOet'6/P<(/-O]8\WRC\?-kklr;7XPBg"FNAGZt5M6&`mUHgLI^^/mG7_5I7e?<baYm_"q$/NqMU5"qMM-UGFaHDc?H8Od>A;Tah)q8)4]JBp+%7>nmhS?e79@Iq/C*J_5r@9_ZdsVc5Y/k`BkgialL8::XP*%V[cg^&Aoje_/c[ms_4<MKHE8:4\X_.TrALSj=1>\N3`Xt^(KCneo>^ogjDh,=^/RP'-=q(!%[B54UpT,ic%K+RcrXP9sKD(0/m%>ZA:s==@cAdm`aT]JIC63Q0209[%MM;9:d.`tnKqFhg,3(YO4]4 =@&[?%6VWTA+K=A%`S/[jRA/rCA3#BBhAdn D8p'l/W+tiilb;=^'\GRM(8b"I.[?*VF,+%1"_#J8mL7EYJ#1T%Y3G?K^57Xmk(TQ/&Ajl6^mhsR0CB12Q@$(tBiE0YB)Uk;A@'tJYCab76t1Q9Ta*0f!AdV!5!3%;K!<GqsPHlAZYHP6^1``V\\C<Wp/s=C8MAO?ER@:Kn%5A.Tn[B^6nZq1WTLl2?c`lMHF5_iiZ;gaRT1!WA>b<,N&mO%TdK 4bOOfn;m`I_/<?>:nHcOq]Uc:3ljjJQop8strF,cY'Z?ME[`ps[+adMHJ2A:?)ffMG@OHf6*,W(kDNM:P&#"f=)e3h%4^]f=0T]1+bapD=A60M&l'b^4HU\la-I-j<`A_"/V#<Ab7Jps#[s8A(:9Q8#hDAO8rVTZ]cT9&^QjY,4T !:N\#"apZcAn?&T+f$"AX^X0(t*WAQlIc[QTbT%k#Ei)Yo\0a%90(J8fDQ)qnrr)jgJR?L)')0l?/$KoY8#N7r]ekrqIHHj?Z0HSK8NV/@pGo]b=LF?N?CA+5:0VJe;'?=hc+,0k;H,A1E:O_K+2Y.H"?N-`XfWfRW:7+,*W2GpjC]n*oD9i$Dh"[7OY<6n*9qUf0q@pG+jDa3Zm2o(\9H&fpVa/9H.3;fm]JGeYQtG8Zl5[[KkZY6f:2QQA3H=.`;_66IWsh,AVKml<CGB7/&QkF3dR;;@k\5L_3B&;QG8h'O_&].=h=#n9HJJdCLA`BJ+9T96 aAgN 3DNN#7[XX"E<ejGt:.'rA&].'-[=HPG?D[WMPrPcQNbm3a_.=]c[0LB?JT4$j?.`s-(9i/3WA@rmAi<1dF!$*@glo>h6r)_Ti8b)KG.K>6ECdLQL;d`<t1#K%+kgDC_'le24[qs8T;"a?e2c&]XQtJI16 8ZN-pGA)AcR'M0Z0qG]CGN*eMcCZUMRf'Jd,r4rA?f%=K4?DPK)%O%nMNn02>VeFI`8=)`Q<EC!$^.`I3/#gd^l77:8Z9bN2p,m,TVF3P]%,,ND,>h0ejFQjJckrf,><6bBmIUJ+rZ MAs)AJ'*[qSIC_e=K*1P0G.nW_A]c%)H*HR.-.g-oO7C N+Ie%aZ]_fDW]:S.9TZcXq3*ih*a)U6k)iqoXs\"*dp#U&eM%A6mVd2[bp&`r$'^UEi&jSsWU,OjYX4r9$AG*r^Db71Ul1M9m8g6+s) CaaTI`9#b)U1AOY3ALhtA#q\_+]PE2TiW'6aZD\HdkD)/U<D&l9i'Hinl[%5/S'3^IPe\$(c1]PnfGtqWV"3oqjQX i+9A+<qe;gAC\$ONsLdLr,G4ikN#RG+#$A,G!hV@t-8Gk"*d1Y>p.d++A%I^#fGKAW]>CtGt@A.Qj%UKZZHNnXer;a(&?Bq,]W*ot]P9e%iZ@]lXcdPU(h#TA7HGT.E8R(h;EB9JT15I]q)XtH'h[0IjLYE=/RFFlcVS)&GK"[Ag`+GcdI?tTD,_XG..XfWAl)gT)7dOFFs3jC#ctjk"2lpNM!Ui0$5H@ja;XZXDT\FMh-m ^D%AIc;N5A<sr$+1Q&[GsOUV77rQ"t:$ZXPqDc3l;7H6nn0sEUbd!Tp.rP8'B4:Hsc=%^.bmYfs;jgILi_=0L/n(@;dPU<_U5'b>.j%o%"a>#'h:kjq-Al`V\]Ih H>:F1hd,tSoPac]sc\'j:4\Zfo<-%foa.F%XN@]ZYm+SIFi3f2)prdB/c$U1)["WitMkFS5N?=b.\XXf4D@[A\\jpg8iNkRCch?pB@R3$:G!X'O%-B!HRanglMWA#5eaF2;a 2TCs_<CDPW_>>cEXqFAo7-<l$ ?4krlJ/q]K\Y)j_$AdU"3'P`AblRql9t06f8(bRC&*:[#E5c6cnNWAQgS7aSnn1X7rNM<c-tV+Hpd`MN$R!AL": =LdPZ[D5mg=%sD"TdL)m;AaQ7P_-9A2s[.'TnY'6"C6aFL!a"G][8>&Z0U1iOHNSG BShrT+_I.=P0:S]oA[]6&,W.`4_+#j5G7Qk+67og`SA8X5RB1)K9WG\go0C_ao<m$^:m[JAA4RiVWn_V`c/am _]F#-;K^ HV\QBI4UD()0+e>N-2sI<b8G)2V38bA`?:\Js*gE)E#3p@_Q!\'Ghk(?!ek\S=JFB+U_P0?Pnn<qZMQY+M+q"[+Ga^<<d25 Z&SUg4PQ3F1?<KG@kBY=sQ:EBda_oNV<OF7D03FJ` /Y)D3m1d[7@JPj)LXn8YknJmPGqOEQo.AAPCI;d9*<3eIiO98tl_[]m8LaAhC';5`ta2<H8Y+.*%GDJDA,6[+g\@dc+3c[D:B:C;jr-0fS6mJns=D%G'Gt@Lo!DRPV*!e=Go/,+dP>8bQ*>P_NM#%ie,fA31lW[sYn)Z-r#>4lA[C@Spt9bG0YQt_;1$V%O\-Srhr6H?jM\GX"KX!CpVK,)Z)Sa/YB6&^i4TpU\FNZUgPQ#`l5jnK]-.A*l<](I1T)M mQ[TM\;AdEF-n'*f[o&=$SD`oD#*7Kg#R?0'N=FomX:N"m$rM <qFI+S_jg4bY7pAf=UP6`2%?l6Q5/U2dH4_]^a OI@JZES6Mp<1Mr6\[(/J\b0MSRHDh$6pHA![3r^#M**XHJo?X]%E`Y3%6E(BZbmUht6*di2T$DSSEg^8fI`@D#/?:"IMNW]`Smf$2&R/P<qoX]sHKQgCQsMpQsKF4'cgTh\@DZ;SkDGjm_ocfF_4qcWn54/aH\)F+6EQsOOif4sa 4Q9'LTK_e%]HlDr#tL=\akd0A(p*YLhENc#DNA(:t84FYn'<,Z0/NqP4E7#XD$T;>H*_2X1o,RRolm1@Pe05A)X[3Asq<ig!'gbhLPd`1t_,eA^O9R] jl+a=jlE$g+k<"$lm]FUTi`RPZ?3BUU8A.F0lelo#drgnH2oJ -dd6*>n$r0RHNDAfC`JoA!e*.E]NQWh.O8CAM_Yk%s0aaP22;=30;9p`,liM"tl\@(q9K\<%V!ifKFoh0>QWs)RDAA=Ra\o]GE"3"T[2iC$PL_ M, TFR<0G%iR[j=4EJLZ:iHnSsAGCQF;-gd"'f^PI3s!WP[gbp\p2K</_:$sbN!V=r2ks&;J&Fe$:OSY`Pal2-K71mpkr.)+>g],fl(NBF,k;l[bE'27W%cKWL(J,8RH^PLqi5d[&W%Y5iU.IH5\6PfP"-2htG-L#W8b^"J%'XB6nV:Yk7'bE`sp[^i"l@kZ@\*T<pgMMK OEP@0;5<_>0jnA4(]_pf=R^SYRG+EFQe[V&i<c:NK1.6ACM)NUd]&GR`<#1()LtS_+1@kOK:GD3-9+77di^Y'>W3OMp!VRghd)Je+^<VM5=f^)qNs3.KDRBCM#6gJL?:(e1@M\U.&R2AJtbdNO&9 [\-T"p$<H)bdbVUPIIogC<lJ 8?'<oI6oigI'jY=PLB)`CVY /K2rJ&Y`CGd]`jT<qF!%''lW;<DYTq,Rl0Nf!jX]GK4r5S-9?b]TZQ?/Vh45G%)CE4Z"b*@ktUl[tUL%4;`;)KI/G(h/:GW"GjG.2Nsr79_+j_(#f)l7kaO+sO]j^jM>+PLQ$Bco QOiA;o;N'HA`eAV+654S[o4[>]AjcN/g'VJHS9Ltn7b7*k<h[<o<>F5\\`rkP@ChHLh"]W8!;V8C)&^%qLE?Mq88IHbJ-eA$;+qOaB@4kCGY;O=d8\.oRU%s[]O?\D\0JO98 L`imB\!#rHo0]i+02k9"4#)5:% A&9Q:,;sDZk0[o(GVlI*T-W[-G#J+-@r!,AF3NG6OhUcK-hXd(##J85GUGZp0Zi"9_Pj4^e])>UC3I8T+Hol=BE ([Y24p[<]CUcnR-,G=hO3WH`WDo]5;`=EGi3^d7aj#G.r2kEP6S];>ab[<d%0<kE7lJNQF+pboAUf[;< l/&<gFY(WgTsAh<:[8(i]^@\,B\?($"QQbQAXA-A._A4<^-d#ge4A#G#@?R%k'JS:V!Z[D=0j>3jh2X1\'!2D'sl/*+oZ8;&\"VXrI);dL<t+HS0(6 6!^=Zm+] :)3VZOi="O$Ynbc0]LR]d) kS=rgq4,mmKa-0\0l1aS!f?rm)4L_Bp4FQ^\)q;)F)jq3)XJ>A%d<WQ#&E4E@0"<Pf;*4BJ.^kfn>\(c?1; Qp]/?g?:.b8%J!N`31"B>Or&U"dHHk-+.`=27f%IT+#r:$0SfoeZ%p7[4RG!3GTUmO/JVKYm=5aC$WQ!X^@"9li>0s2qj)2G,AZ6%F&N#lHlaA (B5r5U5*TX\LJGd1!hOV`]YpD)_>[i*T,(*_oi*"b6a-am,)Y"nK:-T#Eq"-l>R9TSU310G8h?gm$[7DgXt4B2i7fB+IEWi`Hi<^lRseL7U>f@*+N_hAsH)J>f?[B$(-,E*58/44`l%/9]6c,Kj)TfCDaNAROGXnlUaN=WIt_!Y9b5@@?@57K-68'\0[`cnBG.YRD@coGCTG*&ChORm*2%a"<'0s7TKC!hp_`.A2Vi,d*)Zd Iq6QK^KSO9[n`[soc&tHMWD`s=K]1h ?BbJ?pH.n>A%CIWKNsboRXU"/p%Ma"iVi`mA V<a$IW"fdA-np8qbLV0P=UN(i]i2$cr&%&Ddb@`i:+jL.sb>'R)b^e^Ge!iqH`dqTs@a6\7EA(lWKVHW^,,2o5@moD^Q4\GN9YPjq7K4e`AadDQL-R]3/b89]MJ9jf7*2#m>=*RW&Dg1`A)dAjA`^&]^,<VUqairOTOY9@q%CA>OV.iYWHliSEStGtBgt71qQY86*KcG453U//XH5:'^R0<[=9h(IsMdA)$%L(R'mAW<m&07;O1 N6a8EqE'ZCXkqF9@DoE^UMGOkP);plN"H[aqVD0cg+J S00;(DcDDnA1VZ9;484q$C5%<ddiR+TK>5BRHkMP\5dm.:"J?0]+<SJ>b+=Eta#\XFb9VpAZU6;?1S^VLWq$\!V=./:2\+lnHEC=.oMSj/E72a7[kE1ZM$ h;m1=lfT#32?VZoCDnK?EAA*MJ<fMq-j9?f6i]dP-YM$I=jjPD,L4@GU0P &JV7^5sb=Dqjch%B<^/]`n!W9s,*1ctH.o>%MGB_l\<&/P:3%Me(rQ3N&'@,b@>KGk`4D^h)Fl$DmI>L:J>^1"MYHK.o^!_]!qj(Z[=!'3S._MeE1GdPrI#i^#jGq4"h\DZ,?i?jdXMcI\MtsT1:(PG8#?DM?Zse)Gi1OC1W:d`69"akP7!>:PcQc64aGhpcnC/A+d/nn@fQsG3D@9+i"GP?G9[f.3W!RACAqVrdn!k/VWJSfoh;f5C!H:a,M@n\7_]oT *>nDGh*r@N?2;9"6cV0-.e4](:FDEas<%>X fle&l=!C,q;6dNIU`;?C#[p9*d+'L<On \ A@egA;=o)["A"0,O0$C46I,i^LPTlqM_k-FYq/R*WBTBAt96f8:+if2VjTP#dh BimMR0sgI^+ik^71Y;h,d:EUQL?Er^O"\<(gOoi!]%`3+T^FtsK4U(\B7kps $_k_6g,VrYU%V?A@Q/&h]64f[L,l,!)YJ(;45?d/i#Xf`2Z`1-OoXjlU:2?e:L<E/*$r++T)cX=Mf*r`rl3c@i-NA6CC'HjgHaIPaqLG!)V-:;&Kca.21_[@Z4??N-4p.e!b%B3A TaB_*'27 Fh%&e g-9;"Yh:as$\*Q)@gsV2Ne9Kce'ANN--E<O`o3R<nDi\R4(<Iqp7$qVtVH+M7JHtZ9KR=YGeDh7U#[Wf27Fb9sh7Vr(GA/d;kF'A'!5t4VpN\kOc.gT$D\c-4[XIY4*jgX[HZHcAA$g\k*8%c@:=lfo;#<mCjVrLE<k&BN??K[hLrWn1$1Nl+1#*C8ZGl<bB*C@CfF<abJ^PQ5@ D H)MF;2Z\-6Fd9f*KUSpj>N_aX;a.e2PGRkcVPFIk3X*q qM`"jRY?>#E]"-`YLK[C:QTa/,8p=1J7_rZl7XX-\rlM0;$HGfZSt;_Pd/DPlGJ+E*aaO!X['htANedI)<'j+s!KKh@q #VO!HT3m\SF$Bt36o@0tc-ZYFs?VnN2)D,?Nf^['h4m#0;OLSfOA/dcHiX#L8b4dnDs-nV_btDU6gJ+[C%Q!&9kL^.Xh?JrO7jiCTc^3d@;\$,t,+JQOjjf^FUj+*m+*A4]??RgFBWlA]bs/CcX49ejPb08lN]h)>=g_C9`9sY'g+e3;A7At.1j@>4gM^Tk0S]E=;r1Q*p)8ira/O:I+9/_QiRc.\R<,PDD_lGKK4ff*<AEG9rt%s*]Bll_M[1B@DV\`VXtD% !+-2E6^M]e\URpb1>*n2A@HK=&?4IUAk2-S-[E E`Jepsj<LR3&st._hb6BfP)*QNLVW&3B,-:9kn>P*B-$@`KaMlrHo]6i-PBP]%i]$/FKR=$>-Nj9,m.RmT8H&h.Y5o,Y4)8.MPWLmnRC$A.D0pd>3C_sB(-p%7orENVmP6Q2kd*SPg?M+GB-RBH0'JU%NVt-qg%>-A-Xk'!V2sEXF*"<2[:htt#e L*[AMYK3B$ .lH-Pk85-mqpcW.2o$jlf9>%UCd%E2(O6)#kR1,1K6OPDV1[2$&)bJeFc/R@(2Vr5Ko==WmK80+s(4>Il.0SE XX= )-<g6\FfL;-8;+hA;sLS,mYNX#]=b't]\/3mj0lY&5gfCE&)F]e+SJLD$.]Zd7Fsr2qbNMJ7#)E3Ah>[W"=@BNT//C4EGCWVSGo5/iZKJ@$A2:5Z:02L1eR-1Fdh[ljahX"+-XaD&c2`=eod1g"_l_mIK,kVP!.1^7J3\YR%G0Qjr9N/]hgAdC3@bE$hb`$[A:f+Bp1rYU6TH0!KcnRN4( r9 ][nqNnS[brTD(`CEkeoLoKAZ-Bn227d-k/%$i?aU2kD`I!Cjg& 'H-/o"E'7bdaY1gL6bpAefnAqJabJZfnQ"^G@%SV)S.4 t>>rrdNp7f5?Rb@EmA6_q@(%OCd^_]SDsbgf+C488AFd%Kn@dmQ9D\8P9dW\^/+g-;_?fDr) qb#AY+T"R^]JkF-n8IP7o:;Q7W=4s&A8?IKrn0U9URPPf0Mj7^q'AL^<(D0:UsbP>HO>&N6@J1`s,&^j/Gi@^#i+YjnEf>G&!)dohal(\&Y^d\Z0_+LC$c6OFV>iPn9WCd`?eM:-Ahk[#"daffELAi^sAqbgKAf9q-+=^V#4:WJa#fI5rFrU'BM:a?b-&_-j&[T;,0KH,!:poUkAORn6L-U9VsCX9r<25r9g\hltAV79W%b'k2WC"'E6H*:EA A!V1`PnSba\kVrr'AVShRN[''U60+%2)kll<+f8+MefEDtmsXgB^;_O5A6cG5j8GpWVs#bGp(;;[oNB9tD,/D3[pcJ.@+@=n\F*l!CHa%KW@(&@0>=(W%mOj+"?og>4b;3Yl]ocT0Nr'C_o< P':8(\3.Lcs9NB8*WPk,3.[_29,Wpt `+h%:0\]?>$5s56aeiS;7;tHIgZ`5j_WONE,e`gJPR^88K+b VMQ jWI%]mc)3]1tOt5\/?;TM`=$D# d"#pfLjUn"Ns=:RX?gObQa2a[i2g&<^(jG.ZQ]>rJcqWpPjlA#EYif^<&.pAl\3=H05lr.=K'@dWb@AWZD .""MQ7dsXcE^g0t9(:TYUlHjY>DB6DgGP>'9[$](VBh&a 0t&@Uf1B9Bq4ef$]sPI'S'"=ef&b\/j<JP$9RfTA&s_o@</WN[sF=k\**29HY"(2ok6bIC0]Vcqp:ERXt7'+m:ASj/s4'EHTHV]NAcTk"4R2D3>'HAM"s1tPkh-^'GV4j"f5sAl%WCp[Y)9HJWC]@VNTf:o+'5_L5 =R[Y50##nJhCEX 4(!G#<9A?oi$pq`Pl&`lPWVAMrBDYaVam"L70VbSbACEAi-;]WP )>Rp4ep.3Ap&QF2Q[C!LI6WM4a*f)62!>29VZ6NG]7F)M'%H@Mjoq#H^+.XZtnV'Fp4H#Cp?055[?AK3LIt#_if_"9msn[+Z V##)Vq\/_>kM%I.,h=WA4[f+Ds:SVRAoHdn!o:CS;ejT"?@k-Qj*2!#eXpm>9RN&JS$Vn6kq%iOQ-g%Cof=`\A']IGVV%0O O7"qqeBtJ)Ula4Mm*86#QQ\TmkR/!J2G'?6e`)6RVq<DCIf""2bATAYWG.?PrG2ls+VR_b611R>5%*ItWq)P:5pC#X!:K^# 3 E-"eF@s5X9=$AZgJ>>YfZ.iq_C1t^JgZ.4D0]^88G[gsRo+=^/8d3e/(lr ?n4_4EL&%VX Sr$$S]@@d3SfX:\!>FphR;%P$R;TX<bL`VU3FNLfc<0osA, ri$JX-IF0(:A)PWV&sfiFpe8h RWBEeEagm+Vf^pnktf:V&nB;XarEd6A=6VqK<X#4L_3=5_+>>\$q=%mafk\@Z(C]/UZnI9R"P%@0U^_pf`opkp8.>?ZE/c&FVqlGBdYsj*S!Dq^8!K1?%mR:g:PCNqagL8hS"T(l[ ^<\J&9ZN%Q!A<P`C:*^c+RW1#c\_?*bnIY?5-%I;+aG:<Q3Nl)KB/H-YX4;;FR>tVKS;DDkbboAKT'nkBqa!Q90#LJR;..-te=aabVt@40KFBr8h/T`Zr"A-P\1`84Xq\fCl:USe'(eR>dblk.#l^YIH,*rbK4(Ws,:?Gp@d#W0_+.,2aiK5trRDn`KO(+4kemO.lJ?g^bOsWG%D^P5NP*$nf7kFG@%0W]MlP*3.$TO^l 9;i'p#OMAKdl/rKO+jU3F!JBFdg!qXAl,&sR<'o]*p7V[A\k[YNQDr@"oct>!h8eIH.QU5'6L]Vpe*-0XUhJ,5aAkK:6]UlBLMtm5--at  3PA/YT@^D9!E;%cUR(ec5*-SHVfBA]86_b$]gT@ FOG!kf!mUmpI5A\lH,^sN- \%?.W&ReT]TN*jJ;3!Z7GWRW'[\]=Sf%A\GK$6,s#'Hr_ME8DKc,HiE*H@0f*_TC(8^'qCZrbh#.`50hC]9A!oK-Ie?]f^gZD)'sC\JEmKPK]1&6U:A<A=HOlI)9?$ErSj8$\)6.14Xla@eN,lj5+Y;g@A,=V\l7$h&BI];RMK6(__^n\[Z6rLKo`oO\q-p/$q%AqSEB-X"A=:AlDR1lKCHVl.Cgn`4?5C2iS>&g)d"GQDg4PJ,1.ADoP36IMsso$*m!@4"Geh>QM@e]Xd-I"C)D=`:$5An$4sle" +\s/k".M#dG 3T/,,LipcSZYU%c_T&O_/HrO+U,IA.$a+=U GBt4BgpPB`!Fj6< &#:5M<??Qr .T[`"[Ag"O^2!9 DWIQp_/7B.t6+aA/W9DZ($JcYDAf+Ne@iLs\;P`/>C'e0o,0](Clf:Dfg@-F"`ig:*Fr%>HIQ#V/?,t5H4B<Qs^A[l%88+d<$'aMa5Cm.fD9:A=LAHbpA3^M%5=rcnMAA$pCANJ0qYil1jG,8IPA/4.,b/JX#nhUbM%Ynn6S1]*=`pO^q_dlCh7ledKj1HfCU8$"sA=<\K=qKAfEX5+*?liR$rUBh"W`p8m(**5--fCj?,18QS"?h5^iaMZZI'V_qC#JPCr.`&0Q=n8LmNemp1Z32eBO;EACRQWaIaj0(]8dalOb@!NV2!tkfsC?+)\'f783/-1Yn4lV7c*A2Al9*8:;(^JSd#W69%p$jqQKJs8L,fAaCLsOPT5=;+2Sq%VmEA<1h#6J-KpU$0A-aA: $a'NV]oQkk^(f?eAnQV&tVO&a9p)A2Vf.ata,FqU]$KsTf']49JId2t'R"j7jO^$A;?9:0HiEi<scJnpnG] #>i(OrTP'Wc_G#2W[Z^L2AieEf%=k&&-a0f..E8?2gh7=S^-JY'KkHm;ABpb1&)@lZ!eQ*!<JE'>QXs0.qnTHkkO/Vi?pGje3%^0`EVcan>G`Xi XZ>kheR`oFNGZ'#pRA4:^2)Y).tsO%g\YYK#n/sA2gO*?MZLNpFXVcY@R;S:X3;9hHgF"N_JDmYCE,=lPY+"&qkIgr@t!!d?I5bMd^Jg2 IVIA=FRRat.b16dEc7l-V\7^Om3 LQd0I,tsa@fG\sOMF%P-K56+\82XDJ445em!")a.*49s@>W6`j)>]E$[5h+b`-ji*Q! gCZ01k%VIBlCt']*a&1 MUSJ4H+AH(BYE&B$7JT/TLbqtY9%K,r)Bt>XRsk[l]^9G?4p&N2.5J)4#k''Mq(1/FnAeCZrKqWASh/Te^'+p>)O\4rL[hY)F-Y+X,,@"#J2m:a@\Wp-]VbfRRl^$tA\!)('E-KC*[K27;KbY#<ErKh#`RYX>$*l")_lb'NtU:GX%n=[BX`.$6RN5[["/$pA^,H5/*/;WF/H.D'As+N+/6.YYhfjX-a1Cq&?6I48OVR*"tDZ=#p\&cDnbnP6Qe\tN6C_Wt2f@ATsR8]9[0#s*IUI>gA^be#nKI`4fl-]%0qXQ_VM1Q=bY1hn*,3UIBIMOF 3@QLV' )F>H>lfHZs[P[B#bRK_f&d-5_d)Lj\*Z\Q+aI#U)]D9TN'&!pG=<8KScpJ'WjU?^5&-EaU$aU5AK)E5eCIO[TKt[&WPomg8`m=S5j9lUKB$`i G<H;BqtakAhJbX"TK-41AnYEj2\$ID&PhN(sk5e1)Pqmp]!G5nD4h3P<Glm!Z^^!Tji.VZ aj]=1/>K5+qcW/>$FKQ:_rTG6K,#%PWP qM4f'E^ r;<_\Ja4/2Bo%a:f>)Z`X?)]0.V-<-=fkPIe$tRoPdI1M;;d0&1W5T$^dWVn!CX&]b8@:_AbB1c_V+,_:NtkthMM6m#Lh/PR?VEqb&lrCXFC`O!6+`Ce^5Z$s83MeK2`Ho_.jo\25P7ghe3XQb.3bfF&+?#sGeBp,?"*KNh\1XUqdn>j?V*Jm87r%U+ZCAgeF>\(9SPU@GI<<,C_j$QjT<fn]FFBGFPo-WqS"a@&T3!;Nj1qjCkfIa>>J3k +9`RcbX bL!&*U5Il$PjL&^W>:$=FcVZ'qg-8VGg17-o1"B:B@iI$$'h:F$5#We1rS,^onIE?S/@%_gc2oC_ AG-MnMZ b[i ,-#BG_Z/jh0;ebCkqCQef8UO"$M1cW O<tP-WA /US8VJNV<'+/3Q#nWt>"Li;97/9?Z1bH8MaXEi;3aAC4-2dLtfU@_=>R:[Plg8NkJF<4,dXk\WOq)tSP=T^)b#G+18Emjt.eHFst,G`]Xa(GBJ=5;"/>;/=&* +'/3`Ag kI-[i*Z/T2#ZK'>7PaVO,kW[20(nU+(BqGB@AaZ<4:YdG6jUAXB0CVteK!7Tn0Ai&rq_J4>O>siC:?#FqO6n,NY\_;SElXKtLD7WQ+*/J_Q19*]D"H(nP4,IA)p(M\X`or6MdT?RU5d-Mg8ZU)FIn4Jn4A-AF[mQ`f.a`;j[AgZL>3$<:jcnWk/!+Jajgf<F!&Ap:Hl \PE$KX,Jd,bnNr<$>:;p3reF6!Y!$f`&68$COR&#9<["a*O2dkf]hWRNjKkl2K/Ts+m=@TjE2%^/R8ST4?+*cSY`M-+`dNhd+Yn3d9GV_lTP/3#^LKM!h-j#0A-QJ98d8(DL]Zjm?',U=+O5e_$8E)ikIY\Fbc[PLVco8:NYq/dIE`bYm)0@7Y+[DtHrlTd[B?.TYG02neN7s=fF#HrcdSe#B'R\a(X%hKTUN>-Gl]VnX-i)cVVI4'TRSP-X3Y<7,K[KAqoOIWbhWD18$\*^h P]LL4s7*KdbJcX5HSOLjEJ:DY&SA,nZ]\\b&^r41nPIoQ(83k<:K^]oW940AVfHYIb`GW2,C.G9X*tPI;G+RrZ^c65Ar0lp3Ah8Pc2CAgZr=9DBe8X8JmT;7*%Hkb9tWg;Za)Lj(VUX.>9/XbC>GrRHqtJMLA,,Sc7X:<,SPAVF]iC?=7CX3(;Vq es8I8Yjb[(mkYc%"+j!hTkP_c+_K9"KLjHo_2)$^;:;G;B@`!$Q6(W0G Ajb%tsAI'YWIFM;gE2;05=$db5GT#s4i9)bp//Q*GT?EknHAdeND;ABONA]*fV&3'-.@ae oWH0dCS[?5DK!gqA-<H:Y\-sC^D0@'p/J1".ZBB@*(e=/@]1BN"8V:FmRc[pWIb$*]R9\:GYip?cI\]jofDFVk7PI+3DniX.[?m<Srr"[F/00.cCMM2GkTq AA<.FT5I.m<BT\s"I?0eA_G:9,$QsXDANFVD(0r/7!pgpp.qgqe83ZmnT74/%A@b'RWDD0hB]jo"8B&iH!Y\8R.'-AB`d4p-r3k$MoL)XHgsW/SA$0Wp?-fRfc[Lg"Z[Ql_XXdd757DXnED><cSga-r`sHH))obA3YIcNFIKq:<>b)I7!6-&ND<'@i ``I/YqMqY-6d$QCGOR-IiDk93Mbrcrl4K9/mK*5MP>AQZ/m6_EEti,m"A3X [fY0f"(g'ZQgE+@-OBg]=U CN"=?1m5\=&h0C2G3t-a.Zs5i-PaF<qZ?g?C.BjVX tVUNXj;q6;.&'M?hVCfN-G?462IPJtK2DIM4Q6YJ<I(LG8!q8#cM&c]YP9D! 2TSA:ABUnM3[A>1;QnAAZHeio-9sq9\UJ6Gj =W^(rnNgok]mS>Fl3Nb##)6#&DVWKP=+U3C<YC3@p <Kt:N@q@KJhWGdM,acAF0<,nGNAY1jm=XGaDBMcB$RM9E5'd5Z&;KKADHAW*#a.MQ>WfV ;?<?<+cZSpd-+3V6o"!j]p53_b3KQUP0G;72`'5_ipWF59>/k\S*EjnOe,Ep=WhR9ABBiWS-%?F.6NQq>n#6k<*H`8U^B88+:-<(^=T,5qAp.OW%i5ncXA'[#2@72_tArB3s?'6=^faQ[ak/XQ*bqmJQ`C6SLM'E8i^Cl`bp!c^f,_5=t)o;\G*0(U/"m:)1qC+JUdt02caN)oS(WtK$=pB/A%qC6:Y`Y4E[UK5KTG47mePiqFRacGX9,ps\M1sK%@r@S,9fV((ond[)ZL8@.PR_o+2U"J[IADF 3!5sF9>UJIpQn830RX2VfpQ@Nomt_h]R0#pa?lXDjhQ/ZqWjnC2T-5bNF 0E'L#-.t+bNE!:U_W/4Vr?Up<\Kj&/K.p@Zh%PAtdXJNA@F Yp4D55m\p]-[/G2PUo5>haQq/^^Yhl*Tn?Fad=jp,=Xrd_eN&0?8G`n%8X_Eq98n8O$hY=\M,[@n$b32JEBA(9=-AcX'H3BX3\Xs0U'9m\E<a" N>Vs[(4)&$9AkXc:(]HX.dL"Kq_mb^2O"nJ_A/EbFNXT9"pqsZ!FCDZ5sg%jm2fIf2A:_A23WTjS^?P5ei0iq)a/#:jV8C7-r;SP>M\c_coqI`W3ripm6No[M0W+jtcAZsPS+)BdFVh>#lZ7De 'ora7XVAS@c<ZCB2gnd$%''3h05S/#%$'9V_Jm/Y46X^e:boLHs+2kIeF_(s#Q'<DcSm+_reds>AC?CCs35JjCXb9'!AJ-D#2U;MO](q] ?jhTskl#V9O-gZL6!ad&b95Qs-UG5hNWd%a%C5B;Sq;;"A'P^0mJ]F`SfkP2aQ_-@BpC@TBV#DdfO7asSY<qk)1\FHJaZ%A##mkbL(CR AC.0Q!QcHL]E<c\'XY4.94r_YQg`TXt%\[sR+GAAgHF69[2<lW08PrW=g=[b>'!De! ]IT$lSo-c;qS"Vle^I:k(Oc+Y4DD jQrFXATEUlm-3&3Za]Fg<05T&^!YLcL%<))1A&>1N.YT/D+):#!go-,+31P"MC;k0Y'p.<;CoJGo+a@4("!pX=?Y"$0E1Y"%UAZo2_]&KiNjH@*PKmTY@7I$_a)$1cP;OVU>I/$tG3RJ02Hq`X^c\_E<!_i2Agjqr\9?K.O$Jj!_W8A+cgJ$Ln2rB)8J%(Bs@A@iQksIQD<GH,tJ/=ekf]!mOtoW. >MCX8Z4#q,'HF/B&KiY"IQ&p+$@:i )1)3/D"*m=2MHX\CX;mQ+]((C]`%$A*c.L+3<kJE.,V&l<9hT#c,8ArOqM"&6GG3o%?PoJFSA, XdL >7:A!@A\66Fih9VRW5dQD?1'"t;fq3.lrYB@R>7Mc>mpp>g_DZ$Y P@VE)Kr.WAjScRpf:d+af_S39#79BfE00ct?DraP:=\l3hNQ9H9>3_Aq!lD^-ta3GZ\W;Aa7l&s`q1?"F\JOpAR&XW!QR\(AB[ X(t34Rf;1X6_%d4-20)=!4!TO8I.&#nl/#.P\CAYeHJr'c$b5EJio^a:e%m4tqZ$3H?%5r)E$$5q98rtU2-QbqXsLmFA`q7AjqOIK&X19N#beR,]q1>^?(Y*8rMhthFT1qsjsTCGFJ6BPpJCVZlWC>hpKt ljt#+1DDZGV@eci,19LnK]j1sA!g>f9G>&rDQVA7m#Y8a6;1q8f:3Gk(VAc8gKXh"f.YXb0(H4mc%#?sCOh#jX!/Qa^c]5@*NsC0.;WIMJ2l W/h2FWr'Vq),Jqd:Zi$:!eDaC'k;qG$1>?Fiq_hSJd."BEJFU!QIQ4TMd%A"5rD-*WAmR_BF;866s-s&Ns'D)fQKWrp%9Vq27(fZrjKA;3"NWDl_]WD+_Ji?lY"D%LRZD*7m+:(0UqS`3WA:;AG=rKUii]qJH[$+Cm2c;?te5#YeIjm@V@(E$U0XQ^-Tq/*V*@hniBiK$M&"3T1]hV3""q@-^7d+D! Ai5D;=k_t]Coa&&4UesRq(3!S5XQB"j`0B`VIhBt&O9q+YUUn1f'1GdoKk"H$&[A:bst\+V%FX1,,]m>k%b!ZY!]mk6Aq0aKQfmbA?`-"@&_si2ig^KnJA2i4)5RR.m[1C?IlAj6X cQl5)OGp`SE>4&=%)ofQ;O9.0r=.pcm)HY*AMC86%"g`2_Ac2n\?AbA^p<c8MX*#*d[SL5N9XSpP]O)JFk,1@P[d3EV44.@RF*^Z;8c3KFKg`iYA-G_K^a*PcbN`GT4O8"n46?A51lACJRdmbsNY4Pae1tV5+3L^ZH!,*4<9Dre!AhUb)T:f/aT_'hI9!S7ZE(->]!,HKj>g5scI[8cL<f/$?!+5iQVL'_^D6WMXg6fE\ImXTjY2pN.aH-Q0A=/SNO'$F6%#B/;AgcWY%cP?14a`l=2BoFZk<`2<q'+$Pq=OfF?s'e'<*@C$g7rm/0PjrW4<e6N;..#W\X*@s>R# 9snT;^9-*N3BG"rq q#R;K<`"eb+`<"ie:@sA:89MVQ8N4>2 9\UKt':KMRV7!>j*Hs++aWcJOOSg5'QcFV%E7"_I`k^G:Rj"rH.42PQ1fF00L`f#pJsroLXFr._M2]-J] ]gPaAi#BA7M8iB1e5P-FSl4j!GTk'*U3PnPZ)lQrQ\Z:EUS:9i3G87PB. GMM?=jr]=D4BWeWWtd.Zp$1AbeSIAr-+-GJDZr)g: k4EOKl8g?EMYqAmK0U&N7ogmHC!A,]kGG<>!qThP`+3n7Htdn9$#*WKPDe"Z@7?MH$6AiiS[RMsq+$2f-3:U7N"X"(<OHg':MM <BWW%-pZA6 pn^8?Ao?Z`OO`/XM/f1OJ#VRP0Ke[>1I?\="i]1(-JmY%Z/4%)^AMdk/n%=`%Nom@Nd13#(YD`(k0FJrFiI:a.F4#N]U2WcD@rkT!G:^k3t4DC'Rm8C]L`ND$q]WYe[5$m[4H(%CBe7.;,t+ArTW!=lTKmjn!i=_4#BdX(ds1#1Gok3GC;DcO5WF:7@BT7[Cqgo> B04p'1LQYEYR50PSsAE@1hi(*fjocJ@L),e>[3AC:_ )0G))l6p?05M\n178XlA#h^lpG)>\]DS^_D&mULnqgJJ:2^$AVa_lIFh^dkAPo[gt?C'B+H>,1`_gboi-M* 5 30GeG$5B*s:l:O(ZBeUt!.o#'^86\%Vjdb!0tQj5Y,IJ"(qUD(Apj-s3[2I]fM41Wj/#c@?HrT+J=/WlpU\>GUj]so=jIqEV5BA13AD"d#8hl[#^2siAb'[&!F_(fRH&%h@NAm3,>XE4&O4>f6IP\6%nTrb De@EYF,/Wbs<dB-r=](81:nZT6%EFam7fP pQ<\U]-neKhi2HQntoU_IHXWbAZD0EI%&`i4Yg,C'd67Oke%iooo[b1,Li30efA6r6sR9GM*r#06@81lGe(&+ R]@Mes05A?]SL2W9o_QDO,.nBjHri+(CC?ILngU?%t"/RdCUZ2<1RroLqSKk4E)+&1IXeCTl]H%mhW#EI5)c+Wc.GHI]cHh8Kkt5!mUpV9$to'0&m95/c>3%@p@E$YHQE&Y`Y_D)g2@'/$4]p/Q#N)$XnatM:<:HrPg6&F7doN,Nen+bHtE4lJN&QT9fl^<G5&h47X';`9=/<)(\s,-p,3tjf(=37aR<n#R+!*(e>P>W3j&Y&Q!kra_M9[192YW>R`!U^!AS^62KE;=[AVrPK:i^_9] A)mU%SMngF]GZ D-Y+5S@HbHp'X^@*/V@QcU*>iA1dgK e<""`R^YY^):rZ!#9#=ApYQo.EkJ4.*EXcjqmS*:kQD6gYdi$.HBnsCni^5rq+SY\0hC=:t:UH,Ns9+V&k,Wt$DpSF!3HfAM^fI+-A*"9!=G^+hL9R@4XRG3S21VGfZ5a  c!(:r+c7iel3<l.?HpmOQnKSC*]5j4H2g$%qk>(ZAIbQR>L1BsVnn3L :/Blg))[-&h`&IR6YGFCXBKV&G0)@AGTW7QY'$XC0/U<(W&*<nT9P_1/bWVDS)q@^?p\T&rQ:.WW-2VB'ms2(0L(dYMXM7N*nt?^EXqdZi;Wne9_t2`&Un&_'N)%n]\`Y6?PM^]GjL.^+1q&?+Dcq>1R'&Ynk*A8Gnl]3j20ReM1';6T_BK*9h@bB k83;"nq%n]FqqBQp'?QD4>6oSb[4dm.:+@YRTFMABYW3eI.@<D@,'o##hVAP?B*kMl@cY+AshCHMM4UClWn#O4tpgtU1a*"<OgO\Ora^o2oU`0k38E\V,Rf 8b&lg,TA%>5 cJ_Zt8E9640;C9AkBabe.0nZ%VYBYF8;kl`9^^`aF7Hg''q#]bcXKV#_@pj:)Pla@+ +!6A*no]^?$V8($RlJc]jXWj6]=9M61r*f;btbBT*(N5Fl<[ON+'4#X'hsGeGWpML5&6XAIGWjsRs]B]8'IU#-m$7i-RQ2HA)Mq<dd>NU?/b_KnsYSD7=8>[d.)*SQs^K/"+n1Qe2B`R/+oK/3Yb@C.1O,>kG9d%=D8A2'aG6Ln-P7nrtoBE_;t$aA#OSj/#dJc=[X9D#^-#i1:\rjR3A*5aZC"2"bQ$otgkEkES\MoU%*H'/i;T:`f(n8:\;"NGRgBQA<.Z@,7a3R=;gZA9MAV6!KOH:=tKWJn)fdoSC=ttJ*N,B5E'_L1?Wdl-M]bGpf@J6'[gRU,Y#edf=T[($O:22\<QSt[,8TOA6Hk4qB>4Mo(Zn1E85:6lg4+"%K3`PtR9*R$tlCJ7FJ,bcbd^T_N/nA!7*QO\0t7JPSrlf:-Tn=q`S7WXG1;7d!N7a5<_6Ul`M_eTE0eZbfb0%E2])7@P3hIDkf\S>#i$Z*[p5>s@ZV9\q=n_O/Y)G;*^S>?/NXM"t$M@t'am*M92] \VEX]^G_XTfDKL4\tA\Ls)J;%:1E%A@8d>&[Am,:Ke\'8kZ$=(+K[s<STch@rHkqO7h.PE[s!nf_Yp% s$7RK4Jan:"Gr3f?nSAD%^LXS7]RIO;VA%o8KAftsO4HE(/nZcZ69k#n`F49Oap(K/C=tP<9o%./Y=S?ENV9N"?Uk50BNnNUA_=]FHA4&-n34/o,B]%G6s$h[0X$ f-/1N[@=P.#PiQ5hb"* T(\LZ\R*+9.3OEi,E$M7_s.#h$UjV)Z[?PPHT4Cs^>)R]rj2X'!ID"#VO.>Zh?L"0o-=pY^!=BRMA5g#ZK8-/:ab3:mo/F6tL-jb-N)At;%VA["R. _o/Wb#;5C_(NbF1F"G<a4IINL+I3p>4N(oh`^$18bA8aL`8[>38W#c6t/dcEkQUoZ0+S;LS;G]a\>"QKCsKT4pG6dTVg@kPTZ6F$&*/p[c+n,XeFd6YiaE 'a'n;C@t".Bt*Z?Tb8A`2sErW0CXD:rQ&B?]Ys)+`St-2ikC#D<I!;ah@a=t7E H/^pR!=D4%K&l;nZ_+`g)s%?K;C+^NTL6@F(5Kb)=B(>D5$!LORR*jHj^^eWiQV9GF*EYnr.:RT<+^oe^,DR XQbpF\JalQlP2%"%Q9U(?XX&ER:`cSLl9-%78O7Ol3BJ")P![X?J?))$2T+395?;<kl$ponP-U+QoLVARdA$?eQ7T)l 5(-A$p(V7BE\3Od/+&U0<N8[3FZmH)E]:N3L]Yh/h]maKhD@7=-C!f1%rY"An@X"V(='5_:7M/\sD,+saTiZ?Z's`+Xf[MkM'eQ\A^,RJOh??:.g+m3lj1*Cj'U3\@X=o,mN)]8m_Bj&75@&ZeRtR?DoV2;Vh($W9'_Gg1h_Q)(/=<p_2rJ&C)^g,oq(20sh.-`i_MZm-Wt` p0$P*'9Ti%l#oNnI\YrtB$?/3.ke#Fht-$m;`phQcSNMAAj+h\fYbMF]*AWAMl.A?),A`,+nk'6^]+P9,d>[A5/<4kqm<(tKhPGf*D.O2$-J4t2p%5OFiQ8Y^1#b,5gNYWsb"e/t[`JqnF(*D+5aD2!_"bGEcQe1V+>BARj*J:t*MR3.\WiSNg8BP53,knAVNm3:pD)pAh.JmTnC$A1pZ_$9VOs^[n26PgFb5g2 WWr1^#5TJ)F,2=R%KSp2J!)?Q_b$s9/?lNTAr4kb:/Zq'/%o%K>Kt1$=L5Nroj9_[3;.;+ld=j/a0kq.LE!Nfn?[E<UZ?3f)(1DA/>N!1@:GsOElhN0=qVR=ik0I<"r/m^ZVk]3.Ee_3;aACWCV<;0thiq]hCj\^3/eC*<Bj:\.*EAXs^C&V26/WA"b(`m!Q!^fJb`Y[sT_;EY6VJjN0jFR^?KGXWYE&.PNiAo(l4Yj3Cp6QbAl &S1frIP3lPta1'^bM$t_j$H(c3br&C)>8Y^$RKh7^lBMQR4<C^MQ5RdO`djRIcbnccbY7a4IU@2%3!M9[6CtHIQV?&c2fZNkCnF0=dlqQ.l8i(c0p.1J?q>0A/7P8Ap>4P).gUKPe2XD,f7pAV:<goLf[JFeEED/H,<Zs%VRV,O..7=<SS[/1gZE*3 U=t"1KNt'%W7]n12+C_Eb*2"]'oOiU3q::&AUbZA[B#>aL^d,Un`am8iJ"+o;p7<(VIN"&q#g's^eQ1lj<G?q597IW]g4! F=<7I5A[,H@5GlLT"4dslHt[^Bl=0fT\3sY Bs",^K.Tdcj1H#Mfb\@cb33pkjI<'\dAk(se592g-ja-6Qj^(PgBUL"iSGhm/-rs1eaG2meF%8i7K0besQKi_?L@54>k&LhTHR!F<92ZQDZg0"GKS&9^eE]$7-fad<V.48j)\=Vn[pl66',-7VMi2!_ "!3ED)fsrd_KD-RebP^>7aLC=2]h.4IT'`XR(_s&#NEptr_h5^>5[2Ff@O[gNZ?\Pe5k/AO?MlfOmHL&jk`ei$r9hArAXg."tEV1+1F^e6WeTS`MjTM4;/SpUt,0&O+V'41Mr%%<nX+!H!Dr=<GB12^olgI4BdbG-lj5#+;qV!TA(7dnFO@?#fd',Dmc9g_U: UcKOXfsJfU[_Mq I\W&,1j'GSsJADDAeSAAn&-ct&YE_Fh'GFl4tl#SE)#qf"#\dW<o/6s`XWfl;0*0j[?T7'rdhGh>ZI^t#gk]<]Q[Epr$VD^00[rP5lA'OdjbU;R1FO&*#)e _"N/8KCEOi)QAWFl<fl EAiOc7]:JKSgSACs5aZY48\Qn)BIT#^^W4E:ls#%X4bT<_`<Zt+p]%aTf?(k,MdoMaKH!rV0"/e5=_]rAMhC)fL&VkPNc8Me`;Mh@,(;.Gc(?P9$LqWrWq0@n8IY/$A]mVG#;\)Aq';\?8-@W*i-D_U)*<Pr!IWri;2J%k&UAL"k1qQ< F!NbLt?PE4/.k@A'$qV7nrh:;+G3b6T>;47_k<[$PA0RR c)HAB52JL<.+TLp,!2sJ;,UGVk&L#ii!4V\mibWR3Kr6hp5;e0<h^W36s,-UmJ)#a5pGJ&*dSNkNW]h(7E]2btEqDX,Qc@9Q*9,d)c#kIZO!X-hH[>>]d.X<d2C'GkH'$?7X+K7)SHl=^],S?dbX@PA)SFVoI'jG8sM@O^\@c;F6\3Bht)lm&s#A]9'6$tjXNNWM-9a,2.p)O4Q65;2ddWA]?V'D\"4qgnmA9-4\-fQOI8g -<.]QL7kiAtUf GBU2K)jG!e3Pb3G-m1hFt%![VD:K]g:WU#qAWAD93O/6H[&8i'gt/sRIrq6%aCBTc!:WK;bm>HrKMg2*#IWT@6#f$JR>W6U#BnqeJC.iTePg9A?T<B(&T]916Aotfn/B$XBV3_D:a-KMhL#(BGq4&r^ZDnh2EtNcH>E>cfs1Ip_N#L$s`X9aJN\Y^,2CTllW%8#r@MdsB^@7&MEfCMpFW0Ze#2!:S0Xm< +S]6lCPk9L%AFM$<.l:V5hF+eXAt]i>%)C8:VA&QY]q]Wg[;@G21#mO*5"3ACRjDO24Iq6pf8e,L_JWU )8_'+&O[Li'IJ#<&(IUnHnhP=7q)kf`2lX4m;fFq0!>)p9k+]a2 c*:'^,>BWlUD^W-63A_O&[X]Zkp\da)r !WRk#[j2H)N^4Ss>k3lVpgiLM&iSe\L4Tt"oO>s=Np)UqfAY/>LPQ[r0L=?5lMWFS03H,XM2J, VN,%O5&2@msR\m<(%sDJDPAT,`BL%sk@a9.sq7*]A;n5iHY^?&ail;J?0**s.^'C].*sAKEn4[D\Qg.gSg>jXFfX!%6AhFBt@mM<^8jOr#Ni6#U:icok"'d!r>k(=E*5sQkX?^<^-4R)X:!a%RCGU83k"P*:eNCCBfLjtA],k&+;oKc D+`slC\c.m8?LVsKJ*2Jc@%FC9Ql1*o%>!2hFqnKD0cUh/Ap(_4a!AYA(gf6?;L0"H0R#AM(Lr6%q@A#qfDo8CaZppKbk:H,UJepP'L" V2pLY@eNG`;m!OQIE!^?RABSLA_pb.FbkNoA%m_'F+;^&AfA@m]<*J?*!$NPKr-=Ze%kRU\gkn^gDsB0_?mk`QFsHcpJt3n;A`.0.5)5Y8NttXQ;]LW G7 b_3,XhdYA0Ak1Go[1j0K!-rC7X+1o;;U<UF+c]GFkWifp/XqsRTQI5PeL_1`b2]?(gs4b2PIBj8H$Yf?mq1fBcB3W8^#d90a2jCkkW&].9Dpt*)&3`=L_`i0UsGc8JEBe[HKqWJ?da9A)*hm%Mg!ajr[tm_V\/PK"A)4?>*9iOWE,C*tkLVZ^U-olaeOWM?hkQ2mFLlOfV5Zqt16o&,C;<p\4sI.a3-1n%"O%;]?@&&Kkb'do] r,Who/hQU<`Jt ^N0?d)pHl2h+,,m3o7\4k/3]4f78Y(=N"JRm0V1U``6Y&rBfgfp?'FG!bIFZ"_GefA#O.b>(LlZbfmbX N0q/c[@WlhTsEsWG&2CO=@@EFWdL0sAsk99o## L;[f4-*IE>7;%X+:A@F(=-U6o>nQ<#./LV7FPb1q!6aROsa[[\@I_F:/<2(7^TAL&8@Zo0ZcR.YO<+'cniABAE'>O:"iq<j/-P-VV8+7JALk;f<Qj:r9cA<"8IC?X"hrkV75ca$;EaA<_?`LFUiT(U2U)'iFY.2F2<'^;rcU'^[1MjdIs8pKcW\fo!<=8rj538'K.6"UAsU)IZHEs/G19N&;U!(ir@,0BK`O3@7\h !X%])j;R!h_A(NhhZQ4g%<"L=8A?6A'_Z!I= WDY4;>>^=5NB-'3375YdeL hRCPe7UQXLT*bcA[13a"@.TWjViKS^rVT.L.`-o iS$!Mq?+K,Q1Y %%94)m#8g*i QMdVkn5X*1=`$&8jNs?/isc=b,*SAmYT/^MWA]"@SM(*Je7G;7QtkMfCo416#Pl:.*NkfSc]T5J;)!ff0m&q]`7,nC`<t,>bMbpUn\)o7=LTfP-c%mTPhm:?*![U*"5((V?8,FC"$3JL]7n`.>D$AjCl?Y/E%%C,+<A[/;.9XpXCUb5G=n@Y(BjcjpQXUO^XYMqKb\#W-C$I]#n>s7\Ee&Ch]^ m-tmoYADoQX6Vj>df&lXVCc?cSBbdCXEVaI-2;72PVG b$RB*iBT]\O!)tOH&fTbp&LMY bAB$3,m$SO;@Y>&>"SqE=%gLQKq@9A<%'_f6r-9V]`eC,9`!"6cEn:@e*W%tI Oh?Y[j9Hj#"t@.#K5tC<rGR=lk;8)rk]BpIS(8MCRU1c<=oq%&ra-'kPVc(PdFK5,ES"@(_I*)8\"M7q^EeWflUAVCDN\M'MJsTZi+kXPX)43T$.aW)-s<:#o8*Hq0MD1=8B23Sj:>J]<f"bYDo]":.r;'L/[WUbel>qVVVN #A0/A#CMrgb2'slW>-"Wr4Dog[$-j]eo"P=Q-cEVCE.4_/'QR8rT+8=8T2h,A@'N/\NL8[.2K0T\;OS A?(AS&o2:S_TK+b`G:bm:e$N)[G=# ,@;\KF:R$&`D];41=E9aA)c b[Ks+K9l,3r>lZ%LBs`(AciUpF;A*$"^Nt-i,F6d22+Qmrk9@s 37'LPk3-dHad;Efkq$nJnleeLA$YIASX_A2)bq15M'1l@W@=7Y&`bqfWO,.6p/pj2^8/=C._bId'"Td*Slpmo9JY\@Fj7L"(YN!jAON2CAtF`:rDtL9b3JQ7\ZmWZ1LnD9bi,liT0(e HY);_0Re%r1=X(>fl\9`[Pb_.O)3TeSDF`+h@nQfA#3SZa@__C#65Gc]$6J2R(sB<T(r=cUZVSQ'1&W_r;I:-G8Ero67>FAj)A+VL/"LGY5Par[F^bo!m=sbTY-&aa^;LeRCD=*JNrF0H[p0U1*U@TL=2]O.?iK6,$T<`@/;Gme^Wd$\<S:W0S=//-Q@mim^i:JJ[7X$ '6Q5=jnGC/53rr[[mTgo<^:;Q)%PTYcli lDS_&F&"GRFhV?B<:&/\T5>nN_/b8Ra]pZFeq#g,t?D-V]M5$II3(^b.17rU:(%_I!:.j3M1oooLBP2SW#(V 3I$9CVNU4mdl1JpP&oq>,`mJJiIf5e@\H8i@IcP@8hk3]O,\;43*k4?'q=12)$A6>0DB:7B_el#XZ!U.5C ;/?r:qM]QbO3I&gA%#.RncpfG@UGTU#M) /SH+"r;Z(mJ+M?i]*CcU#dkn"J<4510Z.$YcW=Gs#0N:7"?0X9(C$7,ZITf$-1<(YV)i/8it@m;42Hs1b1JZnMC[t!4YHU] @*!q^3l;bhQ<F&4^(,TTgn]IP:Oo9.=?>sQGolboCh0L3oO\a%,eHENt Qc&R24M$j0Q;C?b^=I5=A.ZA>_j^GY]Ds/D"E(jRf@p%dkE13&O8AY;^Or,!?IYUH%F5k<BGsdi8df)7&IeBj@Dl+:`fgYdo(4A_A184r9q8M3&$Pf/S6RiOK<ThnJ<KN[CT@MLDJsJHN`D(+P1lMaDc=igP)Q"^dESaAE9I9>_oCpY#A"FUWrD*R9Gb8iJ<p0:p27%XHpYNSL7b#?KfJW5 $STpEPQ_9N!_P!3GT#l!rlA2o$D/U V;H3sQQAb&0c4\A902=W8ZYX*_a3hqL-5PiKYPp-)R^`2I!'\]_jgBKF!PeprB]:,EAd>Oi'HAKZ/2:RYhToX!qIIp+`N\Y2K@ e,_3i;9f.LMmEO.Pg\6b$tjF5[sQkd,3XHK&HqVJJZ'tUcnK\gikacet-hQlH&pPAD5TM[ehBh;)LL1[#-O.e@-*DWq?7aeI2;LG%UF;_QL*osn[`TKs^EqZ8oaE'#:p23P7h>HBHd`#R;9&tS(& qKeFHh<$4'tG!TdG[L*-';>+RKU J$aNR2O=E3I'B__9B_\BFolMh"6O\4rPq$f[mXa5'3Tj4I!5t!D1L4dF'rbiUdtFj!(*fhh`L27$# PA-YsF*:&o+7%AoK!"T^<,Jrp"WIr8BAB\mEBeg,&GUT"$k!0(Etj:T=J8W%G"1YGqYD9]P&nkg2-887t@d^XhEJGPa3RAeiAi9,Pqobp+Xi<0)h)BgrOI&YW=R(J^;;_HiX_f]aY_=8@ZQ4-&AKh<q!1-tspf-U6At:!pAGO"_$b_c3coN49QQ0+ZA.lcM\PqW!$GY-/XB9a$S<P&FXjFFdOY!d)10".lDKA1[\,5rP)h!Am?f^9iTiKBZmA`2kEUVrPFdK@]DspH-X7?0P#%RrH6O+E57JR:-t7iN!A?'7'L7ZelsZ=QA^WGa&&kC/;D9U,"9fGW1kf5@,FW:[b*QiZotGbY5(92X-mp7<+;ES&(::;M]$q4D4q=gWH"`80(f;MVO%hi/p%kl1< MM)BmWa0-BKtVt2\&Ec'KNqd5BnhZQ1Va,5Kn3Wneb79Hl^fd5/4)k?&7I\ods`$"A6d]cK-(,mo/<)5Ljii&jOH,AUKI0GHfkTp"Y`.?th.`eCEA<,@RLmsD1!I!oApIl?+W,G87jU\\qN:;Q,T"e&An;mI@Gt!4hMEEF&N1rIQh.<MKb!3r\CtGT,4J)E`P&gp8;#abj,gCc$H@2]j3=H5W!/li:UZ/7B\IeIH^9a^J*9tM@rgce,HO7%>*RjZB`rL"'rMnZf';Lr+M/E='=$VCmB)O@o6T/I\!Ut]RVCEM>o99`ZHXp]81FIsqa_9ab:+Z5-MK2ob:"c16C [p.IfG",\GPUBAA1JROjW.c,UpK,Dn`'@co6AQfr*G?TN6kgCX^dI]>Tb/H!IUWA`nU@Neb05D0$HQS_I`'Y4!dTl-&:p,+CX^MMj\W@1TC05 icp/=Ce*YVqS+ZHb)Xr*U[2(oN.=CVI[H"!;diAT_Fi!M)L&G1p_lR0NFYj.aB@@_X`sB YX*J9.9'r-`6C%ijb `F]Z6nAL1X/nUas1A%b<C]75JGGe,q",DDncIIX/AM2=,rC6YCZ>M@Ah3Bj]d@ ;"8DcC%orqsAT7)h9\QA=i4A+Ka)6sG,SY6X6qh)h$&*kLL^#&;ei!;()!dVO;>19A\iZajHd;Ihk)I?$orOYU:scq3Tr@<+&$E53g#k@;5WISMGOicsOOq_6n1D_Op4F:7l#&EhbpQO(r6r8aJlJL' d**Nrr/\bfhpI`Q_>q/-3M)!8b<seDU $<4 []6";L]3Og $D5SeY[d/Fam*c1e9g]qA:Yd<>+ZZSF[Y?: d6ri::(sr%,.L,8L;9O'A5cq`KI!$9b0O7A"\:Nc@3LYA"eK3UgBJ/$\j%OI_/D9<;2m.DUr`q4#eleY"&UL!AI:=8'g__)"r#:VN3D1#<CbE+^0Zb%8LF>Y82mEA+Ubb-\g,AaIN&>?POXk#(94`fIfA%eQG!(A(;Z2`mFGs]c\qmY:nXY6#k5"<7bO]>5A?(m?^3PQ^C<>Yd;WUFRs8@D\C9l+ GS9RC/+R2VWe!Q3*X5=_sj!3PDC=A-?"SM_`CG#^.j-E'R:7:MVMW(TL>lO?l=M*4rgI>:052*0b%m[dOD"f AI.3n.MjLTn8K:aDTH@mTqP'qQ.HaB=?6L?b!ma5:"A=3tY5C)VRF'GIdIEa3JCfKWnQQB&^e7BUcZ>Q7?WIP.2dP)Q#T^gd0&AS-<EX<:^Q?j0(W2#REkN2PO^hGcsBpR4jkrnC0,r6(XTZ b>0L<&@4\LB6pcW "VsjB@0LPLMr 7qm]ga1--#P3;Wf4FVM;l]I)[Vk_^:IiW+KG>(,SZr8_%Apa0>SUBh<AOT:YAio-E:q1Qr70gp%.i<*i=k poXAGj8qNT>AW>VY^3\JA\$$3;<KZ$4.saZo8V[QCi=rn.`hE?$?5]lO$h+`0]tBa,dW40!'s-!U+<A1"VH`UJ'_7A=$9*$QNo3.im_qr[5e[W3A62TIJZF%6>RfIph*9P\MbY9llP22N1%o^Y3oU2D#k)*W DCN&1$Y"@TSp+`4c7 ]t0mh(IG"/AXZ,D?i?_-%l.I#g(^#Z3%g'RmB4Us-T`G]:Xo'rE5ZDGl5@</<6WW$M%$DTW>,]3crC8_:^HQF6h>'d&!%3['k9O&gFO)r7SEe=_]=6Oe;DaK:XZ%VNm$o%'>;M>q5qH8@DFFXFU^t@O8DQP-J*'"Fj+N4Ur5[?7h6).#+C[:J6I39>Di2CF+] Po"7*"Ih";gA/nhPJ>EP_9"?e*m3*UUAT##9i7eS%T[/m$%Ab, S^!^X+DI!tf?cN9@!t*L[2NWOZPRfc=Ao E$AH=\("8?oe15>dT!B]T<ro+:pAF1`'aH;XMr*$U;)p%9P 'Hkj?04I]Sl;j&$(,S3IC8,\($%XND-+i IPY]DU7<HN>s`@PBo?d-bfZ")mOi#$b2J.A3A]Pk<c;`eYeeN7\kR4>RtQRo Fb6G4YJcKB2-i^Nn^t7)dTOdC:/WlkR1IoW)GF^*:=YFA>tV94KRfkYnFApkbb^qLqkc`7 K5m4"$[\RIIYJ-Ys&Qd;P&RmL;fs#2=V1LQtJ[K10n+DYg&ig <Z;* d48"QsJ>eYsEbt4EjPP@FsaUjs+^[<i4)Kh$2fe(`<n>b%GqZr_+lgQ>idEMS+7'V)&=nn_m1%=G6ZLP8XTP'rNo>%[Qb4/4seF[&XSB\EVi%!S^SrtiD:ARnB?3As,%L@_OFhm"@:'/=N*A*OMESS2@M1VpaXTd_ISUSkUO@ERQE`SaJm%V0BX$#WAd9Q>_#-]SV'[:N_,_W4/BeP(<,PA+A#lQc+RF![]Xs#_A1Y3Dl_A3,kXp@OXT(i'M>m: +#b9+IMkJ?!94+p`q0Gb<M341AoM\MbiCE6La`EcY'[j'= =k2>rae#sVoTXtlbmSFt(^3P,?jpp#&H/f#9T8m]UJKYT"N?,36RDGgl(5i#j]% # XE>6l$5^?0&kKs&9h#P-G?$q1NMUXc"Y[Re</N>1,K%2RI3D q8?7J6lbG(>jT??)E/F8%MmcChF3Ie1M*d21#"p0K<UMZ/)o[8A5qd=Xeb`3feWnq@2P0a3JZjdIIJ[;D7DLYK-a1KF&Nkas?7JI_GYrK#aiX`P/sm%a6@#+2 BpJ:&D4D)GI.75Hb^MA #"HRlLD7em,F[bXDP.qXNo,`.+%YMNl PKmbRE=Cs5btD(M^QOP#Ka+r<t]Sb%Pd2So',(=Kh@\_(s@T4H'7(X2Ss$N9g7(CjD)nd4f8)^RS#:J7L=ONW'=1(EDk#t\-*fYQL#S$BE*M%g:XWfFKmX9.c=d2p7A/m:g/9]\SqUb:p`p(TX(Uqq22R`1AQA$571UcW7EJ2G&,%2Bm;K=bb<Jd`3YHV-A3h^dK&F$D[[.'W>n0:Hp?8/XRF! $T%-<0f8c&+DV[ZCV#+;a\c'<+^"e`A8+9!<03(<FU"Ih]^.m8SAAI4gP#Cd4!onbCf]W)678X$(TY"C0=VNoZn_4%\4 #J-j`+:M[!LF)feC)R_1QWW4G'0`C?X9TAB%A2h@P<NhDD`%R&*ak3-(D:%-UdZtdCBE9C1ba]'A$AZI05+N>F">XTr0,hl-+pZlKA(9a\pCQt:QtMjYYman]4nI]-kD@`kO<D#+'42ij=b"N1]!?*-XAEZh0;3"n,.'E,-2RDKfs*$*pVVY=AmkCl-6)GJZ1,O@lBL W6Fm&"J>VZX3o_`Jp#@\q+hJ58LT_8El&d8%.%=o(,!f&"Kca$Q),D<F>BJ)_FNob(/BD5Jp36H;.R-.(fE(^HXHeUbJkN>X(Rb-<o!=P5l,68d'GSP.OGs3O$VL5?a)]XS.5"j!CX'=A2*O.K(3Oe^AU3Q?9Ft0Llm1Q;%"4HM; i,@h':b0Xo/icY,ZV1"W B .c2gXih(2%D(Lapp>V!k1Lth&XdW-Afg$@0'@[bcA52+=at?gA;4W#354d(Un]l`=+^_'P+$pA/4&STiO&>t5#`HJs4V%DTF@j<D]H>/.6Z&U<Kjt"Zc:n`0l^#]OBhO1]jInmJC:+nktQ$d,bK'NBbgX9`)A<ZrZ 9c_#f@*MA$DMjD;qL@(^.:$U+!EkPWp+j=jAMjAFn_+t!V!d_ Fa%Aj"6eX p28I4Qf$FkAfr=X3s3*C`Pr-^re=d%qRsqE;rn4fk[m0e4Q`+kX)&I._QTN\^pV(0:TZ&i0-d;(m,_=:kYtm$^[#g$06k(l+()tKN19A#!QTZ>>'*[da%>TkjrnN3\L.PS>_g#)Gk&fXrqGUJBo+7"oS?U5UeE<n6NGTUJJ3`1O:JKBdYL+oC _`^>'@A;Jo`;r9Tc#)Lep\scM8$--A2C(K?SZlXU0E1M00AJY+?XnhSE7WU?L l!S98_XBA3$ddc"!rtUcTDOe9i;hk1R+`k(?a@K1lmZk5:eSAo*Q&n>Xq`<`I/sg*Lg"=Q_VO0=pgqX1+C^rO-.V& :>rMD^#Mc@-!f--t:KR+ 3mC%[4&nS5!sC`E_W,]A?,5CDSA]i)k0pj`_ne@Fi9GJt6q-d]jJ-jh4PhR(KbmDgL9p:KakJZ8C"?iso4%Ar\5[!Um,i)lgXB6Xl-*U8V.Nm<%7Esb_`?*7tTMqhjqTGh0.3[%6+@dC8W+h(WlR2;27:a6_O$5k3gQ_o(bh*IE0H#E<PskG]_#m1?XG_+L10:\U#Ra7,63fKDN#k'pfYc*/[F*UE;dV j*UkX#`(jJ2@n</rWokA5L'ldIqt/[eAC80j*eV8!2,.]>).4b>9bm<%NEI?N#&GDtP6&N>cV3.C"_:O.=!23?!?3LHd5m> NRA)lO3c/d+\1A[QB`C\2U+57OpQEqSc&]@0AX!d,\l: H sm<"j5'(d"[gHX0Y"O#`$hU0mOkh01NWt90&rAen9)NA.io5lq#do>peBfp<>A1BeiI])fe!\R)]1\"OC?0Fc0k 409tn!#qQe&N@*E[FLpPR3HoY,PS,%8A9_iD@Znc! Kp*gIhA*nI"`>;Tsr;g[R`1cmt6"Fj/Pd#gLr!=8XR\:Amg \")eFXG <]JL +Jg@`MOD7a9Xe)C0oZPBE4ikP.QT;AD=3#d^t3sn1il3qM)!2>\c$\12;!jkUftXecD"IYgtr#2tR*Apj$rRT:*-nUY5]T6o*fFNMq#I :.G\ah3sq#`<QX_A()=YA$;/ 2,C43YL:Gn()AlA_5L(Ap0WpptgOlcVD6B%\Ja,4jCg?5\PsO\m?%bNtAnK&!$dR$&kS]3$S34A]Gc!qFE q o1BM_IsZWE875i"VIQES:tND# Vf<hG%TCMBWfmhtI35$A^]q49nrbnaNaomsDpZ<E@jX&so_PKS*_)UbsFT\4A\@NNkbN"_KA7Qt7LU-TEte!XE?iAL_ft_;,rT<cJ+)U<j^TL%&!Qac,@ET$i%>7mT[;2tW;U(Ps(ohs8?SStj13fULZHM2&-[9#/q V\fifI8dq+Bj:NCjEpYa\g<1ef3>cBJ\%8aklFb4V<-A3CW/+L#C(9r+XoaMar ,C:t>6r[KYT3XC#5Sr1oVW=q'/@58a@qD!/X)A<dg@Vp7"<>A_LrB?Z^V?j=WD)1%eD7=o9)Wti:`O3"]r+>KjIK/K+3+ki11&ciJ4+p>`lA#]p[int1`QTg1/K"d:CmhYG,h&@F3#>h2dZ$kYPIT#Bmq6m4f,seO5R)Xf1Fiq$Dk[kHP74lN>^mapAnWrCiSb4HsUYAYr++\**e-%UVjtfP1S7$K)Y6 0 &;OPXKY]L6Npc>SRHd`?n#A4O3[:tCR4*!;&DQ5c0`lL!])^HsDUJ #<t@+c+TaG6ScmA="V/,X%g?gTs'`acLUe.`kJ9!*$=!YSjjk2<=@ZDLlP4sEJd<T?dhb\%!B->&ZO1bXbe1$:q;/Cf:bH57oUE]H%iJ6H8^em60DEeAX6WjXhV0_MiJ]tdAaH<oh,]j+P"R^e0]sJ$AWa?XnK]hGCsYgk,ht]_7])nX2*,+?3eSeA0L^.OUq6&F^[IdF%I#ofm;/J^W#N6N,7(>o-k8\6FSN(a K(6?T($;dRT0Po5\MJOXqg^pVOI[.W<8\3Nb(s9g_-P](("A_3$Ra;b_tSYLb W3RKP!_JV9],P.q!O9>?Z0d^53"Fi+J=bf/0RFnPa]'f"iY-g\QK+ir!K?H&MK6K'Tm:[>+j7P?/>mZ[s9(/$=sU,q787+2bY U#h8<,qnUc6tt3nJ[d372 (WA&*936B1%+9m_]j8m2-Z4OOHppbR-GXQq!s?HhI:JB/4,AO1+b+CtmAAS.In[)=AkLOMbmcD ZP%sqqHrj]F*BeAaso=.5F#BQm7[`h'3l\3Y6&!S2j+pX"]Ma8M; X``jhK(5<%Xm_(DbU^I@1m6qGk0`2hXH5T4Yaa/#m`+cI4UiGc#^Sdf .">A+&!A:gW_MVb-TC/S"c^r;9bbHc6TEtWemNqNn8bbDs9=pGi7A(SoT2d&=Fmo6W!o'haZL>GG`9+DebsocV9q_T_g03?Kl-&'WqE%>sn`4>cA?_@-`p64Z.rVFfH>t:)d#Pe7B>oK&Z1]D^A"A%2`kh#>_[&o/HXjhH2LOC$fW$I1(.?r@VIH2sgDa4o4XM(1VTm4^!Ra6`AD6T;U9d@$;tNR:]4k^ 5l359gf'b"AA&9)^.r!>hA?)]]bW5F>U&Si$ss'7_3,6[`]Acck9AC8Ca\OL3bb@fdQ=VS(G=ieci2BBb_jFq)9L8>o0J)DAL4<]VG'E\a!lI1aEaG-$(3`N 2VrDrQm+!>t_O-X`Ze2 $mI9WQ2T+U;\1P;aAgAHl<i"40L_(Tn.U/97^@]3!EP9.!cG-'J57-Ri?Ms0')8A-_4WV18KJdI%.6W%nf!0I' #\A\$lKr Xsn#T.rE)1"1MW1pT2QcY.Yj 5YW_?41a`<H&MZc!9V.LW)J-8R)D:i#B:;dHF,O9#H_m"U?3D(Ml"BY$M1;FK(#k!8bk3[PBiB?Fq;4Ka]FkWHOOL*kcE\-<on1HJ'1<>^Jn.;-@TX2C.T2J\R9A*--2kjc_X&sk8r;^'$AoDON5=bbk6?1,0rpa#+R&?pGAl8f@_])G@lF#N=_ 7cLY[8JYO'k%d[XS$ LdF@lE4Sk%A_AZbP^7lZb62k3p0?XR$q74j`Pgc\Bkdt!3CODA5Et&8@!:A&Z7B4d3q2'ZH.EhAGt;rWYYo_e">WQ#417A<P=Q.$/)#Z;W.->Tk%'Ro,pS5;`5'&E'<PHZ$\62j3+>\XK>2o&B??IHl,4Uf>95a)qR5F9;Z _AS e-cWA!;?Qc,UiT?iHdY)5rQgD*:"-:* /l./Q%&^b)_`h@37IGR*P)V0Wj0<r[]AKN-d>.RIS+t _UMJW)d^S[snLfAocTL(GIB6ts4tr3%Sr6^S&P8:npYaAlVC>n*D``6F)`7-pdG+L:e_e7MnrfSJntJ GQISBRm996%%X?c<l?G1T'A@'Ih!1hp9U*[Rm,Y<@l.:'.i#`S0,nW6hKGn'\):IB#Na@$,5JA,VP5DnErnN_\>tKSm0);?L&`D0E`[;\Rc-9c\ihT/;*9\j'(V"-T@#>lgS$0]^Aj04nKC$<9/D(2K\od'XbO(J5F9PR6=BGFp#3l[p"n30&NEQUe(OkEiJ8%)BAPiK]L"6eM7Q)VO)FE\bYk;*,R %,K$,^#O2eX7#dEKk>]5(Z_p\B_Al`f1HMokqnGU)L8&AWEbl"?495+.`>IO;o0$d32g=b%W=n[>9Bn$iaB=Lr[gP3ZU6;htm_J^EpNtWp;;9cXO56Rro-'<r!L?`2D:K(/b9_eS&f$AAB0t  P bh0 %^X:fA#W=$$qOZ$W_O_(DVXBMrUPA^_iidVn"5CH%9`bmGMC+"C>13)&C?tq_CX[g'QtQ8fHeQiarjm3ha^q>L@Fd`A'Vc$i!FiSXKDh=*Z4(d6,`.+K>Kq`Np%`.4TZ*d-BAI#/q[Ns+(g(]0s:X,A08)o7ALtHHCOOL&@NqhmikX 8,>=;]!MCea7RC'0sHWnW'L,7E7'+o$A%t2Ff$$a(pZoc5_76#cs76&,b$n,XO;@M"5VRUld*"q7D+s6.kBY]VbTIQAB3PePkO9gIKTSVnZB&0m,AA^?_QRkk*\;:;UiS'6`N:;2.H85:h2ptSR`V24@ H g&F)&@T]A!Z3EdA\L$rnd &D9TN"hCrMls<r^MSD"7SKAN0D#NPe1n<<;e/%fhZHOrV"gLe$1j8Cckl=Ei0\#tpYJ?*pIXc7W,j7r-25<+K`7qh$,Q?DGdpNA7A+Ph<NfHb+jC)UIUt4GMo2rJU@BF5F4RBK>UiJ'Y9Lnad?8r^;^;t6Did,l4\5%jH[;fPN(0.ReEQfRcidVVY^lX]F:71LYqL;A`m$M*t<g]c`hKg UrJt>5(]c5d'A8%"7%!r'mtFDUj.+g&S].*+?7^DXAL[s+/;f-'#&sk&Z*"b\pcchVBdi*7k-Xf\+"-#A-AlbL,NfbcUf6">]^*PmcEOGU4SKjp,1&(]?/.rqk%Jr:UQl3H!X iHpMOr4)0ZB"-0jMqA!>21F/h@%_X$&)Ze_R?_AE$YP6o`,\6&L@tnB#Ja$n,YOF1;e2AZ6;>r9+&IWK5N<3Y'5 GrJcp)ZK>r`TXr%8QWs_m80GnWE[L%geqW7P_6XIq!-'(imGMnKg,ZOUf='#d0[b#&L<TB]iRhVkR>F%'kK@`;/edX)=pGqsjOnGG:467Vl&r4] SJ<NVU8GJ9IL[)HAh6a=H:C>%sI%/VQX#K363QfJ,*YGK(1hHf@G4'lTTTL9>>[T%'I3>rAG-:r=GnFE41HgIo=&PT[^BWH]M-!;W=)Ad!.MUs@p#[:>lmd9&^8 ,T_iP9"Tj1ItmHC;-Ib'[r,l?RRV2$V-j[#;h:HK*P8?l+h,$#=t$D,%-Xo)t2#)RZr:>T[i(jlBc)E+>iPIP+6h<Xe\\5FDAX`8@]aGHjX[Uq2k`tb<DZQl3Za%Q39bpPI'RT?O[M(/UAdRsOEqF6A=6#&_G?aeNHYItHQ"Sat2R+jpA`,RB#H9'WVA(45m#,FAR9&*7TK-I$+UgGmA+R9 PC%^hcZpYmO4f%aQe^"a)DC 3@cb"p,>k74K<ht$pKfm #fBm\3J6"!RUb<=g)Ob9@YV c7;ZZ$3=eDM&`HY,"J'7Q=`AhG6m97g(n=P2#e>WWML4<r38Jt-n@Y+)@h%'XYElcDEFe.dBU^J2/*[$3'I7>*3Lq/<L-5;cdQ22>#6[bn&_GsnLPMI-+cl>[mNdb"nl-$W']\'KaLPNA ml]t^WNOt\W3aS\7]"D5./8lS'5g+Q+<?pNBpNe&M-^g/fL<r!@@43)&t_PR52XG,qil%WH=^&Dqa/^p#Xq;aiNgpGH@@k%'VIOgF=V(fbAWg67@ i+)6W^*;nB!sfa@,"e()fk=""j0&Mp5<`KUNmF*bmWZMT"QY(^3'1L`g&c+,-1JUL#^_4:S8a1c^h#_8!K@hUa>hlZ&mm;OK;f"@%s]qkT1n$T6AHtX0FM^en7eIdsKZ<60;(:X<hIGAP4WN<APS"*D5E`]0n[/nB^)AJPf>88gEg1W@9f&[Y#j!;R_\7K">Y"35C0IXdi0O/$/jm(!l+nmON8=2T8fe&Tpf@YYJi;BrB9Oq&5gDl'j@9F4>/"5J0/Wg;ApWb::fBpp[B'MCUCsKnn#7Uhtp7BqAtS!9f(@Tc\>pYD& Cl&ZY*:5mWKZ3jDVXPZ2( U5KbP]\)#qAK-^NjVd.b#'qk>#F.Gt?ZK@rVt9FgG3mQ;iHIe&m57(h5G9i/8n`:G&HpfXLD:\g:RXg`P)X\k\V-`Bp8Q/[UP0<?RBLNT5Y(!"2fq<(-/q?>OBCCMHY$i"X61b>q.Y^-7K8ENOXTF%A92nmd>72e FEo(JD?ZNYM80>_iD+1.R^H;pK=AAqLFXnDD>'@oV5,tZ6rpcpAh_F-$A(ljbg-bS>N#i5 j%dT6I_[?_$`a-*)tAjP Pf$e]ak1";1#G/\k)%+c[/3P7\[qQ:\cAE+4M>^;lACMfV$_d hcesHeX`,E7a$_?sIZho7V&49_)a<JT* s9EW8"P_\!"QD)_0\bjUYH!80P)l6:'isq!t4c(Fi6Q>>X9]mhD""gYjf[9K1caC:Va$SPl_KLHR1jo?Snk[R-l$`'aWrA@_Iio^_b!2ZsP^Vg_6Pr`8@>BdRtLp2_G\#iSoJiI^jAj3bm[=T"<h?:%J)4^:NG3-SQ\'hOC/=s7mo=CGC[=V""af2R'=)]:f^0gf:e]"Za^>@Si FfG?o&r(?"gb>% =(jheYkR(BWC_H^Ki=1q-aZ=g*h:Ls! =EMTN[-n2 [MC9*d$s2tn'@0fr%KBG"6k784fZ Dg%OTX0PpR7Kb O5..q`kZ]CmirOg6$*Es#<5VXV,Sd1X*$*oo.&ak3N+g80Uje[H0$l+\1I]*lRi)6=h?T9FOHk+>)JT#a))fl Gd#/"!24O6G:6@PDQm/?4k_n7%[!Ei2Ap@VXmP_Agm9?=F:7WeW $NF\3C0%aI>G.ZNDQLQASrn(hjfH,.Z(kp@:<e0sjtMrSpU8WS<PS:Dng?D,8mWo._BL^XoIMU0UA"D-TYo=&pVOLi"tk2X?4r[GV6j*I"G?@4'&Xolk'<.ORsC79L^DjIj:!'C7q3'E`CQm>&jI^.?T2rLol<;8<ngkr4&1']A^?U1^<j,.oAsdf-9%3"P:%f:)koC-FMa/<se*FN+Y31l;(18;>o[P5tS#U9%6Z0UJ!dqs?(d7Lnm<'K%_)m6n^,IY;-j'OTCZS`A*j_^b-G'56kcZ'IGa^kNJF6#.=X4Y/VFIG[19(A`"`KjoTcQHfL9Q^0jkRNZK5I>'&YR#g"6.(A3nU?OIcnd+QL[&jN!<!g'`LOUoTWPO3/W^R^`#a]'En5)=N,?D;TmBitXdG0OG!JD=5;HkkOY>AVN];igf.:E*>tRBO:S[*mYjhPCJC)8Qg2$s+0AKeBd4(s1eZ3WD#_bVo'6m.)\&c-?V+f9=&A_j4L?9ZQ:-c'pW74U%r.m#DEH8f6F7H1BLDqa+eIq_cj&T]dr DLjep+oNt93$T10 GXAaL(Dsb(hT&(:FTX,OtVO\9I4#2%boc,0Gh5p(f]'bU$L1[0ZBkF#?ogBjUm2oQH]pTinSN":cD_FaEkA7_M3\*:Q)^WUREFZde1APMp`McO8pe^:-^Y&H9QR,#+n_JO&0Np+9re11>)YM]fYAIkCACaA\3-7fKIFfY7Xp[s\oM)f&*+p)pFXkpjGUalhQsV6iCn2iOBU"?19Ns7.m-_kh<-qI8OlU3m<\r;tM=]]b,/.]'%Lm*Qg1%jGlE4AfWh5TR,:nCU3ob!)XMF@^2%s<JY"@\>Jdi,@/Am2Pqgsa,nZm;*'%^XK3e9R!96eVbt'2GkO+s,%\F1Vcg^W"s`NR8eM$?&'MA?]^Kj<@nS75,jA-V,`;<J;Lj#K>=V:=p*@L>_Th2>&7TI=,.m;XE3142Z#0$m$8&(!7EC%J<>+$t#-;-"1EVJAW,`AkjOtXb:;IaS#q)lDk6J_DZaJ-P-7?]MO1XrqU4ad)G.lD%aH4m[:`_Tg`5^=Dj_nNSfQ446ffRC<t@?6VaNR/1fk*@-$qb%t#j]aW]n)EG5XJ5:K*=M.R=)eAgsTL@OQ?m$#6t@e-eJ'_J'1BRLF=gWN6;3S*CHM_iBie]VGUeUGI!.0*DR-\-[9L\mWgN8ebjtP\$S0?_cR??[`HX',O=>c=9#Y.j%AtJ4l:+H2oK`*5;d9mAIl_J5LX$S99sY#TA-=nB*G^m3/#T^"sLOb4Lg6(nGa_'L '7$i;bdDq'j@j5ME_s1BPYWDn!j2Z+MtB8*Q_V#ofZ7Z$?K\)g2Nrm@-6S@C=^tSl)`T$bm2"p3jj8a^UlME$JD1#.XNRk/$,A^g-\nj5@>&!-mhJ*XYNKHps?' jG[*S"<piI0HQ]<)ob]%A$>lgP$H"CGQT m"hkHk@U)N?"dVp!I(]]0$0;kc:)Fr2DsMXGZLWUFT.s&U@fk4$L5F*j':N&X(DQc.P]p*0ai)'5=^6r4,)%Wi]`O9,L`mPj,pJH)_S*IoN%X\[X'A+RoetZ*q4b<^;2I85HAbh%l5kgAJ8)+,bA1nL!H:8&F';1!V(6D'O;KDE&PhM8oRQViRNV4%Vb@Ab]qpP:Q^i6iqW%/'m&kBK:dd=j58ITNR+CRgI(g1.69cq'B+'+0Y[5[ti=]$0Pe9=7H>s$oZ,6,^iNoNJtg8,SkCjpYOPlSoZ3oP^KF-s1ME@)n?U*KtaWCpCSAFK?C*CGmr4;hCMd3]bLI2%]m*4'aPg%K5He #TLa@#%"_!KItS"4:;9lZEoTOSI6['*(_I^@qFf0+Kc=f3E.`(0hiK&C!jq/-@HQrk&8T*Y4\S!%q"-1H(_:-\nR?O=jKMFfFin0LqO9#prAm#%HHt[4jXK.XFEH?G;""Q0O\5>;jWL;5@c6E;`61Ne?G'T+Xp"-n7pF=#N=@@ri<G^jf oU\UK05 3*>kG,/Ze-3hB==Zs@:OY\AVX=_Y.UotK-X8H;Hk'\U3+dg?Y.W$_Cb=KUbm=j(AYc\CZ%82=JWY53$D2p_qITtj/.1M+:SGC/b'RJF67h7X=gEREg2[Z[9LRM$fRZ2RL4"r!`AYn+jVpPT kPZBHSJUq?AL!fBo`\ ToH1XVtBL0(r50hV['=UCt7Fr%@&e2K^5md;r30nn^'BL?Ra^ZWf&Bo#Xa@_FFUics@m[;tt)P!43p`hR\@O:eYqdAjmY-K<D6ZP'U,:A&jRGH/a7-LA(_J$-Bbnp%Qd#WEtd1HEq@6=lLghDO-Q%CtCfn-O:W*L1T-QK^ptb':`S)`]l7o95VbO&^CR`teXGj\:PAG!p;&3$_a<:a]JCgK5qI]TE$ipgnNJPV'VY`i93SbUqEL.t$O``NT<+rBjN V$-G5Dq%mO^AtlXC5b;UpaOPgUEgp*r"QGce/3?8q>7';gQ6Fqp/rKqYn]BsMO.-UaA$)#=-b:di#ZnVaSG:)*]AF]]q3L/0n<!AD6bAM1NNR9J"WjH4-^lnbT]Jo>GU"]2E]MLh-gp4s'QhQ0;oq3WOtNCi:ZQBf,_,"3Q;T&] XFgE'rg*;?MD3`*=N-7$#%nj9sUC%XN%,h#CA71ZAk>q%mKB0mO2n.I]h-1I#+!Y)n,R:rdpBbZ[BHlAV!q2cs+@PSb""Yskj.A81 A.rqFgiB6gJpSc.V3N\Nb&jJYI<(+%QZa7dA<m2MS/'R0\Bn!8Zp^0j-hYAjA?+iLbi)*rl,.XN57Jr0FZ7j1*o,#PD":h9O=tD'REC!#CpBP&Yk]MWm`>TpLH'H:F^3FS;YdGY25_U PeoQbr<>J<+Sh(`$P=kcM"0nV\O<OZ>#%lEcGnrN_=X<pG_^5Rfk@p2UPaY%&Q4>n?XBT13k=qq).!E4BsZ2"pqrGU\;l1<Vlb',Si]XHN</7X'l=SfIUMG.RaBe,`$fsp@Ug+H,f<)3F`ge1sNk^*Z9,cAS!T1@RJes"64iq'p;T2+J<'Z59S.-6<,[q?gAL&kC`I*?:RmKgCOsIAW+M5)C8-POb8BA"-JYggeM[-QX5I<8F#!g2H:8LDTcR4b*K_!@e#!!SXX-@='t5BG7o,QJ26>r:re`W>b'.nrZL2I_&S3A4OnVW6V\E%14qSG]FQHi?&2);SqGFPZ)q%bn!O<A' [7m*@$Y@IpG-3^p6Z3lBq'<rUH%^CUir,Nt=`ikL*it]gsAn,Cgd_SBW\s?=l=%D!%^R]Y:]_FBf2\,Y?@Ssfb6FKNrT`=]lhPXN/D] 8kTXTJ0Y`WR!jSp!M"(9TK,$s%=e9QT=?rQ0:q-; 6K0#@pIIYSfO3P_&Q7-,OaT?EjZ 6i.5lY8Zt7-0?0%D'MD4\*XE9!2<6@qsp-E,VkmX<RUUnTG>s(*`5C^(*>0`8f5.D*9CFf8,C3mMpmdn=5E!X+9Kp8'HHc  [%Llr?t-,*RX59hS4_I7gl;;k;%qG4bKscD+RO#go605<^JCZM5pBcdA,oJd'75+Olr=aUe`l>[rL!36J" Boio2$`)Kl-=Mgge*+@Cssq1n:7KE(pZ,2$dY.AK[ D9qAKrjo; ZeU:Xd+q/-KAI&1Wa<VO*Xc:Y_QU:N?sXKCd]R*FW0\0L!O"k,?C9*r:$5f=oO'g]-o>UhsJA4i)R17&_1LViJ!EDpiILQn^sp*1"$s(^+^&]57\5A9G,rI_$&qFSKBff/)WBe!+6ka[k*YaKYG<0RLEA,t:_"g.Y5A5LdTWl"/_UisPLQ:O'Y8-_`.4&gHYIj!1#PfbL7M]g:=hT@M>6<i;+gpeZj&DM:n.3gP/,>%1-t,!2*nXtltI8#X#<)T.L857G*F7JjXq3:n$5q(Ad(<V=+VjV0A<<0thM?eA0a!=8rrO'D,tpXh+GbQJJR`Y&g(:"D%`V<_q%Y+s;R3d('E*]+d`T.ALoYAJ]U5nsXl#W[F+[\n>8>7J#H=4si+]U5\AAE2PP/h*!cEG?JM0:8_5aC1o1.cI,h'd8B%6BH:E<2"]rrfbOEZ+=q4t$@iU2hF1[AmRg@>t=r);Z 3+Hbd4PcHV*i@Nk_EMD3?Ct0P?d<#A:5W_!F+MG"&kK]4j]-Xd Q31oql;?O7Qa9t@bNSe6A%)hRO12E@VNcsSf407#@?#92KeEU2=b<SY4L[?2mL5*80pj.=3P)9b5/Ri0[:`lmE_LkT5]gLKa`\V> oes)XZnaDg[eh)3PG(*G>DB/:^GsR^-)WK<&BA1K*2i8gd6L"nn2 ,8Z4O5[B22Q0p"r=T .]Mr6AeC[qY?5W)<t:nIU#1d[^3i)?U[nd[psX>d,72#0:\d]T4LM-2d1)>79[4qAVkE/Z^aSB%hq7@UL)iN!Q1=(-U+2WIBqO_RU\L$rBJ(q9oH53n9kBB5lr[D1*/fie8Q?LB\M^0dIih3Z*^J?)Z11k@,sa:p59]G""sB#2Q;LX@?Y%NBt?t8?p5FZWl_S(g[!U`oD,=A^_]3?8n'FeY(>,kqnsFAN)9nE>;YpIm+#\0lD/:mU0jDZ0+Q8BD+G'oAMtV%EC>FNl6Tn,714bS2_f`X!lJK0JikF#nqYP8DSi&d0+,%+CVq+V4pOd>Se5meYchh2-f4Uksj'3R[m43qh!'/.Z^3j]B$#CJZqjWb+XLUM&-a`^0)b>g2lFt3Ml%Z$g"D(i#H]4FbD E9G+BtjS?8[1ojO:";nU1s';M]F[8DTpiNP7iaPnr(/&1t,EW!f Ige-AD?U8EUET:3YB= &,E@JT;%7^rdl"-1A-@YLU%?sXNo?r8m,A[-H/2nS6#jEPYnV%?8s[ZEKI#;th?Gg`=[r!O=(PIh,TBX(g_14V[jS*oaF=I$]1sbg[.L^U^;gh(YWfco8K*Yo_1m:Y<9XcMf`cd>4B5_)2tP$jja#:\4!Q&4b7GY`NoO5)l:-NSdZ!odhsA<0YX:T`=U,f\%TD&t:"m`> M!V92(Df#!`WYAoBl/A#NLH"XGVXhdmrjc+[)dJ*dXK,\IGLEm)lgX-\MejV&!G=Y:j-ck52qU]f:?rkh:i7<OD;/I$4a:cAfF3^[WHA5&SP$$p',\i+GN.q@!-$`L#&XN\^sT-BrlDh:PdqS!e7`WBg9t# Y6rq:T@PT>?2;1Q-l21cr[\o+JQb/1L2)t5^A(K(9BMK8ZALi4=<=tND"j]nXAgtA(i`T%!"+;A)nFJFVQU)$Mi`Z:1]_AA[aVB@XD>;h9_6WE(l2Gt>I:nBrLcj(nb@GM"7=g=S T\M 6Sqi_o/_)cOr]O:QDt@qk`:jA4tO^+:j#MPV<1kV^;k:)$;)_?,mGqe*AY8#Ago.k. #OY5g:>?g`$qSg+7\>3k:ak*qmj; gdGUiig&5U,BYiB?$QXWArV4Kj*DB,%W\1*9ES^lg^=HB>8qa4%Pol\nnS8*!r`%4Nsqr15g[*Sp[--kpIAq&^N<OKL/OB'(rOcp.)'AAAgj*FZ^flc#UCg?%BjJ+>b91"\Tp_iT^&m='FeOUT&X*ni*rD\0P%LKUetBDK3A0^^EX08qjg+O2Wrc-@U"`M"3R291mG[$7G ;>pnbijT<Q]2lJnBc@@ra"WBtAUh"+Go 6U6,<Ns]kheJses]+A>)6F(,$e?88$sX>=(P;!]7e(ht0^MgQ``%7KjDdCmVbV1SLTeWg7PE0g[:e0Q+,4VPfHg+k78Hm^0UO:Ea$>AV\hB0c\#Y3NZiA$i(hPh>PN@s<X+e4SOTp\_o?B_7C9t=LAaM>_bKW!W_El%bNg^sA<)b*p66]'!R*Q9(K4'&YfSUHY>`J$0X.Q.m'j _%.LSMKF2 hcael/5(B=mNh&#@7pb'ZLR[41U60[S2L\Fn<pn]6AZrM]ip)-?T?A7B[dk`7?e.CI-9a$ejs%(&:bs,HV$@C?.=2)X39dM5i!`;h#@hn3AO/ pmFMOpIGA2t*@>@eRM_2X+hGYM^-7[G-^h.^4m_d=(m]5DYm[g 9)kF0/=]Dog=hA`@.A!0&'kK'<dg]69t`mqqT!q]K347>#l.2,T^qBde&[Wq2F.bl@[(-?d-,l>[][34(NmM8*/l,m/fjif[+b'7gn#A!8+H)tiOIfY-VqEbFZ_*d+(Gi3n^cWGP9"I$gpO)Tn\@m848(OA=mL'MLD+#aS^eo.mA0cDK@Ug5O`ig%s&b(t*&?T"O3RE;'g33#cEE.Q>B7Dl"&`\[DF;(RL8R9@%l'e4s$(;7Q3(Wo@Dg 1?GW>,B#9f(48d;E3nkY::p%B?E]4rUIIl/S>_Jm)dkbsPX]I1iedL@/lhDr+!)O_):A4=cK\S.U:*t%V<cAeeA1*5[q>?A3hk!"i-Cgl=KA6Xo:/DJ##(3"Nm(Dh+j>tg;ORJ.t'W;1=k.C5W1sm^T?g%slq,RG37+!"TtcTI$U3UA+B+=O8'F`?mh^5=beG\9,e^69I]@(&%moD-N!12*d]<.7Glqa!*ddYLqWLO5j#$QbW0oJP7XXJCRG,iXOM9&\=[HQ"L_I)^,EpN$[A@0&VdqbX`E[`UiCN%PZABVibPN)U&/l+h_E%h'%!t^k?NKmL9?1i^nB\OT?-_+,`*X4'OH8h%\#],cmg1Mr?M3elTGrA&po0n.XNh9Fk*>h$[(Ol cr-K S,)2mYCtm$HqMh,d(3$Q-Er+=6S\YWS'2tE(6">0]g3D.9*7t O!rO1C-g:JTq5Fa/>MoASLgTj9FA%b<sBjKpDQPe8HaMe4(J70%NpK+A&_>*%I\Cj1.jgkX?3n:,#WmA;@EUAEa&bJ$?=5(D.[*4F2ReSk8pq#oOWCW-k$1ks=<o'B"1DB_32:OW)fXK+hR-BpGCdDA5iXgdIa9s.Od6n-^L$A+J,\X4;E(h$sJYXmDel0FK_.ng-;-bKZlY)a-=iG>hN q& (PUA[]iq(elgSlXbZS"I%$iOcin8,_h<*!@@N\raX+JL 0Ln1GTjgIj)d,8ZU#A\<84AiW'@s%#FZ">/ #JaU0hgBgGB0!Qc_RR&rQQh*7 UR3Z9@k-(lDP)XnsEoXt"An-;LA:*4KrF*13/-n;Q&[\U&X'&e97jkU',IY7AoppX5nK<Z3k/^J)A_I`KVGU+X%&) ALWm11a.&;#V&7LYm?]h^"?$IblT7cE'ioPMr7APS+?iaY5:SnJdN?i$;hYAooWQT-oT>Z#s2JS_na@R6ZF2m6pE+%-"$6mt.t5\/:rcnO1B%KC@ r4sr`p0'RoCQ=lfNam6;^?dLp<SJ"di_"pHp\=@P!2`)Um;t(gRmFcqVUc[FA"*9)AbM,-!Z/7Ge@Ad8e<WP=aP#SS, BfpOcB-Sf1NH# #_,DkoqZk8?ADO34bJWaG*mdBVcPt@N@0nH&!!=3:2'["U_[cA4VYtFt6tLQs?l<ibB_:_fi[Us\%@^p<AU8iI<7<YbCKP^ghShis6,Ob;I ^>.'3SX;-pZJ?b,kdd;V 1#KB8WX4`Yd?ta$5CGBdo<U=Tjd;KI?tN-6hah Jj&_FdV'K]M$] r-]3t(++pSR&Pg$f8R<`Al6=RrCR#3K 59r07'5;";`;_c6&0HR [,RSAZ3%<1G1YdP@="),VT:Yeir44h=n!-Br-"a,C,+E@WQ$*%]/Tn`?ZX)=,3#$LNQboQA<!n6%H"YP\]mB5.;NX1pe'?`\@$^BNj<tQ/8-PpUdj_Ck"=&FO8EV0 ehmnK(Hk;n:fq2;G=_Yg(Xo8sq!*VSd5qfW!q6M7@nd$5ASh^2mm/[7rC/k4]5^>1" P+tR< ^o<i@X5f)\1:5JUnj+ CCbeK%jo%Ne2bDfVj;i(;*)7J$6g)BtY9<i!_PI@HYZ^ %[kkK[hbds?-tl%f_:_lgeXGnA5*JtQ&0t<'f>q-F=0-.J7Kj6)nmq9H>5(BWBc)jG%qIn*INl`TI/np<d'%:lf__o"[jOsqiWUa"1hK+"bA7`"/*+/6%?F$n,^rGfc?.&c\iFICkTtQeBgiR?_9g/G9:N$lKMdnpil^^p==U5)5?7BRiM0l?b78K"H]c%)GF^dR<4\tM"qfhWcKHcJHPH[i7a!>hUP<4<@19*b(^]?:KTZ+P?\/GE`[QMki%nfAV?A6l+(g(t$O`\-2pXCkcU 4p]AY;-+khk6PoZ>lUDbnGJm2``G<h@p$t+39jh;9h+?^4%B=VJ<Y3<</0$i9Fn,H>7^'I(_B0^ok/>K!iIe:rE"5UGl1c-;O@Z)ctM#Lft\65Yh<@c#js.!]J"c)jQn\GBaetQ[0WIGn$P(Y6;&:*QW38ffW4DA.Ah?;#-mJ)gi1YT@!fA?7`]Cq>[87HL)rgZ0hYj\<Nm$;h7A)M#PS?$Iq!oSjVCqpaS#WIi(J5=A^c*mX)/#S=%UI-LG!pl -(!pWW2#XiqffEASLdN,(Y*]FR36OZ[EIcY<q%S\?dC-]"I.,bf+rdB)RmB%9I7q8>/q+_t$%+.E7=XB`.PGg7hs7NiZm2`p)PM'D]*e"Y]@-a/7+)DAH[KJ%1?rGgE-G^B1EKj&'CE>-?`mdXs#"\b,P3LmFqOP^d7C:d,4OT2ZpAfBt*^]h"+Q/:8e.3AeW_9;4.fDW@]!!^!tIss`*le='i?_4.F=/L'N3<Kijr1"d' AO7(I#0NIjW]*O-P(R25<&`.7+qm^kf4tpUIJ[rIn F?k"]9mF`""k)%Nn2-+#Xb**5@om2 cV$KVc((.,&N(Sq081q$cI]"U23aRXeOOa7/KcCs3;IXj)1jYF?AG1\YEL=Det;,8Hi\AmQn`c1O&acs=]*0'DMfdA&s4DUl&qt$a6G*/B?'-_]%Jc%!gW-.@be4R?k[M\ji] 8$srTOm'U!jP;W<$pXL81bm5Vfme26?m3as_4?M/l6>(B[d$aQkA%4%+SF4Jr!AHRTWkLNlr+)_H',e:6sEWnF1YqAiDGt?(5Kgo?&aP/t"ZkJgf6CJ)&ER&^44_dnjZ"> @`1L<3f,*t5Us(Pb>bKLBA[*n:H5MA ;V='WQ@[iBiPFaWcj"C\=/RnlUoJ-HCTgEt>F,l.*f92ArUma2 3m5oT4%N^BS$=$_KW/pP;bL6E1lDUPM6$F8OOcI7I?.d>*E35",<tIg/JU%C/T!sWa4:;ohiZ0,mXUjpC9@b?TJpJO>9\>4R4>^8i=/H@%_*iXi!@Rf\akh(dl+#rsRJG]H)B5"+QEC[1ci,I8f`(QY+>Ws..DmH+/BDV@9PTTA5!?nKhVgAF?['JprQQEC4^@16rgRqELddHHoSl $:X3HCrr Sgi!AOG#TNg&*?r^o*Ms@< Ooi]j28T)^C=II-tdag0=:oQn&>)E-d;+mVrWM*mH1d%m@Jk<*'F$I@KJ>.:25Yh73gOQ!2?<AM\d+TY?PA26qtE$5<8lpqreQIpk1R2EAq=?+?P@?2qkfTPq^J[cJ+S],:AU*kW6A.IY?s8sQjTo2^_7m7llAi&:rrl+M,bKVM#J%RDlo;I^MZ^Ab[HS&)'JTm]U71fW=;!e<W%9P=#/#_]NRY@C)&W%s^4t,*rFtop.4\I&$/NK96VXVJ?aFY'A$!<$f>:O?2a=/(G#)\X#_rg35abm8rBj8K&OF7$QKH0YCp[D*ROI8F^$\"e[:rFN2J;W0a"-Zqa?;(Z1CU5;OdaHIULE$`^O^m=A5t &Q'\"0U#i\(EL,j)oGOKmU^b>\Td=.mn=9\EcLH`N9&jWAcsOE2!HEkag7:LefbK;MkAA_!<e:7:N!-T?ORM)mY!*^$!)t'(_,Hr$AIgU0@3EJ-3%hrNtq]Wf`p544k*WPMq#XB[N7] V)4ej[Bip(X(gJ?=`ArpfY&OK<?(6?UlD3jR ;,-M ?a*#>h?iAWBN^Di_6R[>0n@[ FHg<_A_-&l:HNP!A_j $<r<JL[H9]&IC>"]s`Q'*7dRl'd%F\B<N*3c%8>&P.%Q?L>q)\]B+ce )qT\KRgNNHQ#o!-e"X/S=(I2bDE3)FV&4:fKY:?&9;nS!RALA>q^\FBY'-4[>lQ,?]#3/8F3.8;J/FG>$0,mJ3dJ&hi$,n]iE5P?Il*"mr3FQ Po-=<)id_<r5!A@AgD3NF$+sHqgUoHj55Gfr2rGhVSA\Q9[P)2f]911O_5)*cYcY\KNM]V_YACfZ1$!tRADrAWc>X)e/ZF!)qCA:#0<M]`/ h33#GTP%#3X4l@jE\SX>Hlh9)R0L$P1O3s(O5XjCK +$QRLM&Lf#\D[tJhQ0g2%.Et.1EhW-I$@8PA7ElQ<D`F]FTQ^0lC^&)_qn$R2tCd_-pY#7B#0d-h?2mB*WV ?pD%.">FTX4 @Z+$[0ER'AX.T0A&m[J%F=lqa,sP]_2,KG6J;AN,EpcbjNpAM`HP,F2W%@,X(/9s7A1.haE4Z#FV(Ut ;DHrtNPr;p_V(@9<`YlTF2\`U9Q_82c#!(]T;r0&= kat71d";K$:+LnaWq))=ON$KV:rIda\(@Anf_Z/I:>&-k:i$jn-^O4!j#NfEsGh[#"Vq%5 qn3s3+)b(^.Xd07Qd$dL61bR(%V$D!s<dqo86T"f66 c'q^/lJ[1/"o:$pLILA*rA$G9R'#gY[OJB=(3\HJlA1hMdPS-[(h!9)dbDp/MOl,_:ebkl+V@NbsX\D%6-_dp3-Fn+k-,P+SG "kA-h3C;<Z\/ae2k1Rm1?g/$NDZ`Of/3(V].(.^j6V>Acrh"JG'FK&r,d%[thtZ1Q&MgV 5Aa2n6jV+Mp"?& "i8h+dmKbo@<'k.<mG16:-qL]OlOU7ICRT)""d$TBd*&4jfgFUV";gGKRK,dNB_GL-JneUoW`*#EpEVi5."M\2O_<OLAMV@9+C&VDX0Yh!*niX1@0Sfdf4;oIL<HYP#!#"?$mn4P>trdH3P('@$-kJJrI7^.*$"Xl'Z/C#eQ_7@8dEmsQ\L<(8lqhf8OlRSni=T$@'FgGqBD=Xo"m^O8bJANBdn2$78Kd)Tmn.Gm.]f'S4-XCO >b i@K#>bL!a gme-G(e%-kbhB*SGXF(&bkF4M5[B 2ksLC[]j=BIm_C^n5oMk7>mXr><^?YRqJ-88)nH.lYeBA(TlT.Xsf%bM&i[iAqhD2nk#JkbTS.Bm tnE:?h, HONo<Z.<h2K^2a)Q>E?+(+t'q29[5Gg7D*0"EgODHeaD'[O#SDbpNbO%h#Z6&7*0AW3*9%gZMk8C,_#4R*V5Z!5Aa``/PAcpnIc7)q3NakD44nF6.r\P(rB<cbE0XDEKF=G;ok@o@'+]4q +-[s%"?!t9p`A(/YO'["]$NZ9R6kOZZ0r>!`cQ#$>PE6rn,Q'jq2Z$.t@clQH/q)K@IjIV?Aa%+.qQ^o`6+`NT-Ac./4;LQ!"HJ&@)]4kS-dVEthjcMWCM[?Uj2l5`!(la4LYpAt120S[F,$+i]MY0q[j!bOcpABT<*A"Ge#%>>">l>J!E=#_#pd73b\J&81(+-=b0;ofqW#DAeENO26b=Bte<=Q:LbC/W4L'NOJi*]kC(<1A<.ne;_k2K'(KA!CN5IYW'_f>XmZ3J5E+YHf><U.Ie0TJ'A'9gpT\k79EXXKF8b0ZVM CHlQ%oK2^ZtaOQUMLc&hKAA8A3']1)ZTEOZ<o=W$t1q14YPAlP7>66pe(+W%MeTFtGO2C^kjd;c[td7:f"JErc^WWW9P<GpOJ+8?4&i,+SfH/_G4gqie$fM06`*M;nVL`BQOO=mGet9)$`o/]'eRnbqEgs+ee;b'JNQ1'rRh9F]?,`.?M]s7TbZ.-7X=gI^Jq[V;aDnAa+XZS%+X?sXr BK,.G8`7d<p28WBnU2:ph>8X"EGNb`\P!3@kc`]ThN AYGM_6jlqXqj8RaH`BpnJFO2G;^ _A$Q0Ol#6 m4hSdOQJMfg_"j>o5Z$7gnSf%i:A=s5P`M/6*>oZ72@;0\\O\NI!bo<H>0IG`/1l0FW/<@lnX6#\BVl'nb\s.l4/KP60orniFN!MnRO^2`l'KZHHne*0:lA(Ha<*Lq3,M'>&fo5';oqXZl.tbHU-`O(sJrsD\3KA^,LhM!:=YmKqDRCN^&^:L_#H2SUS+n0[(\SE?qGOYE\CV[7UEIk<i6-*F` :&3X4r!O5&F1#Lb(A ,iOq,bM;= KZm*4\8A+^g,KTNo7LM!.<5FW/IbH/+%m'bq;5@GB""IAA97Jt_VT/K;9EA^t4rt[;0^.88>jR)bPsA=$%P:0jo%B67\S>F'D*Y(onLJi''3pJpDW^$Pd4\e='d[lCfj5m"ncOQ;FIGS+"*#kB#*.@ tW\Z&!rZ/116]lhp23o,2?=qpc"]3#8>$/QXtslaYR2e^A%NGOS6?^h"1-9AS%H[/tUH9NF)0cKjLAl?WT85G:_\%28?)cM#J)@i0ajWF8h#f!%9d68&O2;LHS`G5&8hUra(Edco^\Af_fNcgaoXaLH)b Y9DI[]_8B`=F*8"H&*)hD;]5O<XF'lZRd:;TKHWGK<QEmb fq?t;J#0M32#G:5/%Eq1hD97-%5JN>!DI?]VPR+`VE/.L[QFc._d!kJD;5.;pG^`7\?O(tsh$nn62%X>5h2j B1*\can[?.t5>:OElXG]o]BE2ni.m4GkL,#AM5(=5h'o5P9n sZJ))QU/]T!3ngkVGW2:Y\\=A2A]VQ'$-g]taXA8jY6@8c"He4j4ai [b*5G^>bRXBCo!^f!8c54&.I R!a`b C(<=.`Lhssq:nHF4m8`5BU>Wf(Fq/AnO:BgHbAXd4S@TKWFscj3@(8DA fCt3Ap7Af=]JYGcIC$k[#,%/jE+X8 f7<$!kZpZ'sT53W@@oTiKOi*9Rsr1Y-JI;>BOIqY]S34A:*s-hhkQaL3UCsK7eGVcodIqGB<O*0@*(fgmF@A<)Z2fDN,t82a7aMX ^,o//oZd$Z&ZW9A;r^5`ZVRbd:#t[G@>`P6\(M$9>q$OYtD-_`,lF84SFOAWdEcsW8p1fn6\UUoi(3iXNt[M-7'ZDh*ij_rhO3dr_V*E/3[iGGl:G%9 DdO%+[L):QVF%E9oo6_+j_o=@hg9c;nGt;7pWCA5OSEb)beNGrl7Go*:Ab9/La (Vc,CHTp -ed\QeI-L%^$'Vp]YT"Ce[HsM3"7?T#e,8Gj". e06qYPms`_'mp:AIgealhh1Z7$o5sD[o+^XjmC5-kaX]kGZC,0Lo3S!dg56eJ$*G#U+k=. <3Y149a=1@ _Q8R!DPMU^/Z-WKoDM0@!E5@Ja+&)`I]-H$3-@*_tMdI7;A!Do'78BOZ#9RXOGj0Hhq[#^m4&75kF tr&mo6OD,#G (Db4"\e0hJfAj!I#aecb4UEfl>.a9tA'T&O5X]j]I=ia3HB0158N'.%h"6j6Ip/g,nke$",.('-%UQYjCQ'etA(]lGP!Cr0aFO1GBX\F2;Y<n_-XTO:(bsl$bs2]eT5QZ0k3:cQ0HF.0c.mG0-$L4B6[SQDGaO0n$ed$_9c_"7%E#qms2S3=%BP+AI3rA=Ugt!&%=BlB!Q8rl4(p.W;^ABkk.(+%3Bf!AF_P L1iF<&gFYhbO-0H@Kt$S8KQs(YLVFF]Dpe%ljBO'#oY%Lt<M(0m??4F99Ekc"s.tc=OtYXP"Y+0e381+5=h=e9QG,J(QV2?1`h/>n?j ?DK"]kVYLb%\1XZab0n:7\mt1sHdf.pUOS_)#B+lat?3L:.T."\JbMJ,EPN^2 6d+31P,TJ:\TMRa6)*]lT6iG=B/W9l1)MmQP+oBH<O"KFZeR,sK"gFfCD9&Ae_S>&&"Qcq4Ak+f$jphpbGUc\f[UZ@RXh7[G?O0eGJ AC=[ot6X5ls!ST!+^:`01dKna?8=_V0s#Lro4'bgM52UR1)!ACO4Vf>4'R:r=K-=6Y^j"RFjjL_R ij?@tpa(EQ%n5.B&bCY]];Qr4P;LHZSm2b)M?:0rb!f/C457tRmAq1Sg\=GtkG;saf9Ag[AS*qF:FYp7$rm;;ksPf3Re9egW>eLT_V4L(a<\LAGjmkD1<FX&5DEpmtU59b]1M32#J(:fCoWI&!AfUgghsnTb2m_.G.C68?*,PF#cd#^hO)nA@Wj>(so:)mCI\4QYXoXN9d_8R>+@& tGbj*f,FC>+F`'\Ep`J1Wcj*3N8#nm;c1=qIi<N<!(`%AsA)Y'-NAOhgnpKXB W-3d'RB?\/T?B8Oe :73r&Ac.h g!s8f!7H@)KAN'.@cs01Ac;r#,;l.%t6s@gW!&miGDTWS;OA3GF67]!7!4,;cpZN("8(`[GR*GQTOC(_)tr=j)Adh-W%\'4\LMU\e(W&5$4c'IM<- MUj\;1O=iHcA\9D:Xtd9^a#Ag:[m`deAaHbQ=QdLhAY;tK/J&LW Ld8W+GST@TGhh9c;0,&ks $TObV`+osdDbg_c<>9*#HMbtdk<A*<mEeoV=rb2Q#PtA,ANTN,=:#= Mo5M\;Eq:9lHi>J!q4Q+k?VIQ(NW&nU]DEA&8pMTVq@6Orq;NQ[h6q=)?AEoHTEc<DsXBMqqARD&9O!9EY<7qST[bGk]F@A0&-Z*KWTI4ip@cRr.SW/)A8/'3=K^ZU:EJ1q@.O+p_JCQ+7s\eYra8^CCFs5Ebd+Jas^Ga0H*S"X.:2@XT)8jHT2qP5Q>QN?DYD%F8N=7F75UsA=^DL(* Y:odI+^'3"c`OK.;G`c[8;?c2[9bUmA37!/EEfNIQB*A"1#<sQJ*[a0GBV=FH9VN'tD5?>Y"3_._Y/'Ug&C_`&5V'')6[t.4n\<b+X-a[rH8Ci^:E5a3b XkAjD]&HWWVS-8/.pNM/n+-AMj6=1P>+>[qn #=A66c3'"a?_'R\QjPd\-f?c 1ga%M`^3;c+4RUe+8J]Qc^c,Ea6qR:1N_@#i+BgPD^QC4$@[7'<8Xi8^F\gEH7_,mHW?ef.$QcN6:C/?-W:]`RDCKN`d8GV@@R*k=Eh Pj1@94h%n4D#m<QdD?a5a@ ,Ws#A8G\6AAY4.Asj(l/\<b<NaQ[%F-/%InEjS6E]gVdTLjBEAS:mb?H"$l1XTJ<(d1?L&64B[RAA`>A8Rt0O<(l7;R4(sg)EZH?!/(iS@WX`.fro5+$Bg07]NU^+S7&3Jik'IOK_ZfeGma;rK#$ZF-iPa5+d2LMWJR504_EW'/!&[&so,'GJ]NJLb2kEp'S87"_VCmX<USO8M4!6AQj>sKc8&pDg399c8Zcqo+(^9VV\-4QE'79ir/;2eI#HTb3i8nXX9po&?=i+75Cg$d8QYB"qAB0RUGUdZjq)EC)99>ednIT+rG2P5>/"l<$^#62@X.OP0<\l&t<i/aQAn2-K*bJ"JP1SB\44d,77@<FL85Nt_B8$\B#DQEni@^c_nX^jGZL]4W*WHcacrkEsZ3<0jWE9!JWMA:@4/B+sE_Mj O>K2fqSko[-G5+WXG/4i,lt3m7j*gp-Fqg,2;DQAA17Qs\*:UZgH@MD$7.Yg+jAnA,_E$[ZrA(SbGGRn$P[ Pn[$Ak]Kf1tm&e"7\3ZgYWh+Dp4r<`'ha;]^34 ^PTd8$Fd[_r#L*tL2S(O/TG34Te\7Kh%WSk`CocYt@2tI<ZU^"0 [J`;l!g;B9"jAtnG6gqjSh89#2Y^!DA8(lgp+EboS8!Q%)UHU)BW+!XniJb_gjI7jZnqj>&0YIVoa@#:@iq#5"gL79n$[Y7Esp?b-3Z+QjrVJ1i<LG]*UenM8`='sdi9B!)+^Zkbb,(R.+!H31&=XQ[/X[)oF2?GrLV\hl!`?Ack@P0fp=kL3o[g]__F-]<8Mp(2'f&YpA#9S3\ibKX"9W.,&RM@'k53k/I[M;?T1<^2E\K4tkf.:LE=*,0>B&m5p[nZO&j\7BHo@k(,;`>b@A]b)Y:*C*%g/ab=IG/^&W`7eG?"X>\"D':(p2`D>QANkSke_V6MeJ3X4&gB,fes+mGORj3NApg34f0\+L:%JPm\PA=;Gbh^D\;[RM9rV/!pB$qNAA9sno2"bCM\QRA.MZc4&Q`?^OVQ 9'DLP-S,'U3la.pjBK1\g5Z)i>)S33M& T52iAlVo0`A76jFEimi&aafI7>pOU8]_SroKVeW. ,lM]!(:Zf1=V2%@/"ZPF:XF8TXDtAC'&rc<GitAK!RO@EM33MoBTP3G%7U9Mab@8.ZF@1/9(&S,!8q1at=5*C2&57I?phjEH scF`K/(=2raBP`AK,!0%BlY1d0L$W)+mc+6,OtL?(t&qr)pLS9b]9ECFm!KZS(V*oJo:g8_X-rhI[p.A$OT$#D]\PC6G<44 +5<rdIKBI(.d_M8/`;3,m0.!V*,q+WqU8pBL,>%9T':;oLIa<&P(D$MF8KDsKMAGig]UmRaIbOn<YbsU=Di9XooN02J'B#YW/BU[J9%WD]X#8R"a#%Ffon0$9<a)QBid@:t0_Pd.EON7:i"'/%pEf#AKsrZa"F[De,F[#fSZacHt3BZj]))[jm%coClL*)lTOGrD)@>P?9.Yid]s6::3`e4[H*l0Eg)\At:J#o38<4!>Jb2/QQN<H2`Fgh65@1n<E5=?[e(P4"qIhU)C!JS$a(1qN9q2TYBkh(a2B[)15mFb)Y#dN^B[.^tZ(+XIBiCqOaf"k^hfCdt*[%O$HU+9*l+mG@a]TDBHWVZIb.HE%:KCUkgf;0,#WH+-E2ljPK85OPnd!<25`AK?5[p>E*^9An:I%-bm,)Ar'i?0,So/k-G)S_(M)sh></2S(%ra7cA!&,Y6_n-N:56nsW#Hq5V[9*BXWGM2qr3QR;W>TqJH:_2T9n^P\A>g)[Q:`L 9X4[k.#X424]_oHPg.faGtb,"!s8\ PqGBae+V9R42d9qQ$#GC?>fTUd8KG!VIAiV$MWr$aMAf>,e<2jfgkB=i@\;CD$Oro^2B=FN M^o+ n8@07?E!`ebB^@BWN1?IR];O_f(sPdLnd]6n;5"7?n>2I[N2L?69OH.>.iZq6&`;^iTaCK !?Ai@S.1%n(A2\$;/fJ!6P0[YL8XT0@:Q:i]C*9E[-S,t=Jqchq:UW[AKFq%A6I1R(F0,'DT3UZe5PbG*?FHaRoBd[MNja0sN@4@X2_T_Sd.^> 8Z]A(dD>(5K54HM5@h"CK:`F/4='/0+bgQKc >Vq]Ff.HK*Xm`Lg+`L7mk%1"32so5Nq2j6W8d%.QnNZP`t5eV, U3Jln$]5^5]^O4lT8@SgbpS"F)7'p?SYAjBSR Q`opb$BV`:"3bt>WM%_CT'(Ap3P>i_ C$rbf47bdK760,a3\&EdC_]d?:\Na$)_5XF;B:_ENnF&Ltd"XEF[&0JfAsID)k!?*21!rI&:Cp?/tkUh>:&:C6KAFqCRQe3h;nNtD$kAqj>4kJ#s@L'YCp-mRRZ[R^p^Z,BUq=6=`9+!)&5AoJEg*rWK]nnb@)'"/S)CsYO-<Aj-pAC+LR>X@5?dq.MF[PWEU5pt5F[]W[M#rZ\Isa%#;KeQ=4t[r%K)mh6b1o04L]N8jlEB-*F8gn5o$TcJ>T#%;1Q',oiXOQIi0Z_lm,Dh]&0e6+I3Qeb9O[YEX)VB*K\_1_t'N;nNc*$I_7'0l-_if0pYIRimXPt?ZGZIs<\>Vl4t]F!X4E&(rEEV<I'1!+9: S$Mg:/*p^'SN,W4_'-mm+F9b[pEa$Di1&jU/,n&I:H`\6"=!Fit"f+W^Z%s:b3-2D5,]aeD5%[a.=F50nZb^Rn$>o6Wp[Ei^=+r*q)(lWCFrUk 40p(TP#ATs//KMZLGDmD3G9nF]A>_E+*bfHq<nB]hO$KUAYS6%B-I:_]CN1PPN );>A.A_-X')92n<S]d^QJk4Wp7 0?YWF%382[T5>DI?cj^nTCXE+J]Jo\"$=Q`l-,.blk58Q3N<$X?RQdA5B6=B8pEDR6:KH,ppA=jJa+K@n6^bn$'$O/)Y>J?c$$I-d,#3j^]j80Wt41MWs\?WJE,;COD?4ms,oD.sIRQ9a\!i8t961pg^r4kF)6VXh%&Hl9b)q6K;`hc#H8^n2 )AkTmRhAMi3I"RWbVkaFcN=+%5FYH[*>XUn0/b8XsF!+f^5/0ZfClKWRFbo)M5tjDPecUD2m=''7eSmM/[mLm!r[f?JmZcrkg!Lh[1dUfN?dA@)F.J-9M)3$.Y20n8Zg`3!(UGd<GFWZ,OLk3V2A1'We#bKF&(.#]1H@&LS8c/[_#&paml4E7bisULq`>(MW(!#5ZTk2.M"2cSaNAOAUktY' nW2%P$'I>U\FeZ [N"$%gr1Uh=[6AGTHBICP3:\*l#_Y0k"Z+i)W#8i_:O a9$IBpl>:i(VYHQb=`r"6 _fW:gmJ[^6*`E9<gJ-2_6B#Zp_p.DK]LC%0K3col2g3_FWKZ9/R ge&+EMk </5p>21NAIAZO^#7'9Vb?oI&.\S7c%#^#opo9IXehk=\0$T0,G%e9#82k=g$S&G%6N#^S@rDA!+rrf1"bRe%AL (FOT^tDX"( `1?C:Ip4sIW(W%[>5Jh\UWaBn>X<mJt+@8EgG_lIbM+)O@NoiR)FB\fX=XC3_G FPq3:ECsU# 9on?r'd59J'^/>."Kn[=A.c7#a"C)<:kfN" 9JLLN_S@aRHtdj<[DVF"f*9?)do<>pD;1kP>]0Vi..`S`,5.>9fq^pL]A0`k3Vs6,]857=RYbq@!UHV7#9\,F6f[O8Rh5,X8b!*h[.&6o?BmZ#9/Z)=[Ff"EK@J`p.i7?7s%BA+n6$I\-VL0agqa7[42#t)+a<lkcQ,']@$RIUdcnnW%"l1oU3<4gNki&^=).I@U@3[aWLTn`'QA<_4$3VV\?9Za5kO_/U_>`/-F(Rs,.6$+6As/EQAETU`7_`*NQJaYlW38t<[FGQ,\S2*q!7mZ]E3a2[gBgS.p=<s2JStK"Aro<,?UZqPR$-1EOp_b.,kgN9:0qI$RfC)f]rJr]lPr`WZ,/IZYSCM,gTQIJHE8GX+[UUMLf_@FA=HEQ5W&>`(O20#3ZfCMTjW);J;1_>6$@ZdU &m[HUg>Q<tgQ_!)k_QE`[%.ZUB9]k>^^db"&rlbj?KDiifhg/ZZ_APqgXga]<I?-DH!WC33EhBEm:UqNh_a 9 3YZR`nlt3FRqXKC@5e-T8E)NmP/H)gSL%bdT^Ar6Wdlqbm,1;"d]hL]>(?jl%0\"OeGm?l*& ",ptA&]q;N[%KIrr&p_YC/BpJt>aANfsB" <=<80jfO3+pc`%iQ[G?YO6eP+]>d?nq"5,^/b+ZacXQa#(/!&"bCEbSqpD'3WPdblq$F-AJi5)2(B3>5`jF[9LDU@hh6=q_?L`R9H3&:TSj,hfhNA*J&%d2[eWol4`ZW^)Y0^!M8UM)Fcq<;610>oIQ6/7GKALd+o.:$:3kqk)Mot^Ne0654ciIqn%h+O@\$V9D+tt.B pB!1fVL;MUGE`s;(<\*ZK3'.?WPO;jH9K[/G&>P$8Z#-&E_i1Q(^(>e+;[-g0PD&.AIlFo?\RFs!T*Z?#W<d2h]oN@:2`R>7aB/.+4oOgQd@].*bW:=T.qJ3\j#%5^!N^a `[!tV*dojYTeUId.kI>%?8Q&5Gp#IL'^Tsct/5E\imT>p*oJL KO#5Dr>1.1mRS2eKJ_rZ2_cS+c>rs;kE3a<[K3[T*-%R^`@*W1e<i?XfV#qp'#7 <5n1(M8Fhh>L9&_&l#=3NW`+Y^]KVcg]ZqYG,l2Z,j.7,[02J^J]!oeoG-5:U23"5Od,da430\ZNXIHd.rJ*;jUt9d>(t*L^GPkX]ce Ya#NC7c#MGa)!7cN)j5LF%&X0?D@Jn%*/A"NAV$G#mI-+mj)#/^ecY`^!WKfRk[)Krjj1ARmUip]/P#qG4I9H!<]*fVBJ)k*dr3,gI*\'M_bb4C8`ip<-G_<?3qSr00rZ`%W`fA*7Nqg6m`". t] g2mdFdW]WAc9)4=#U/P>ngYq,YmqEj,$oYIi\#NF(>ZsEZ"JWrfdhTGDVP6tSH?`Z";]:gMo_QQYXA7I4Qg?Z#tE>?_t)*t](SE;r;J8cS3EP7.@3p'VJW<A)kt` t5"(Kq(5$9cM9(?7cZIbID&b=F%"\"=?E5&%5$i)AKY1&3IY3cQ@:\!:'BsHm)f`=W]7A(F+^glU afRa5_Q<KWr153#1Q[&B9g`J;O'7"?MJd-7]`)M/8$QBh\;e237ma/4!D9aN:FJL;SKAWAkDIt2IN!5'TFKVm?C_SA="(>gD(9.).N'LTH5eA(sfaM8)K'8QK2Y8*pNK9KN!%"6'@ho>PL,fHsD%eim[CThlG&SH>eTd-BUo]MC?D=gptat:;":Q(X;YG*5rU7Z<K*kAUA=/oY/qE%?ft`LdHnI-j// =(aqk\[K^ohBsC`$%LEs==T$M `F\]U[5WQVMA3oGd[p8l]AJ`m?-IoSR&JU\c\!&?,##nrQB:>HN&[9[!)eRGqnV#8A44nOnh(0Q#+G))c-nQl1Wm/]t4bfpO&A(p)H_8@!A_!rP+0#(8NNa\53QCFI<tk+AQG-.=cJ-#5RcTP>!Irc\#NmmKX;AX:haa'Xl)haG'N+(A@hWfd'QR(Xql,mX!#OA.-?k&Zl)HK5Lmf6&Kp!!d<Y\8W<][Q 2.K&b(7`4nmjl5ELj#PiZja&G-`!fXQ2q<VKb97D44;7i1bTe^JcPJ#;Yn[E>S[fh:rabYhCSl#c#B'F4ZZ-UZ\$5XJDf_X74K]nr>T+"jem!+*`s[Pq'$C$oc'/r=h,'6!O*=3.1m3.SPF4D]jS(X0#&@ZCo)[GG_?`oddGD 7s/7[bL2 fN#KQ:7i:B5(2q$;s=n#^1"c$,5G^6$`V!H?!I%/M.t5n;;?%rph(p0YP/[heg5E,:o3toP@=.OPOPUSnd%RH=7k[O&Pl6c&kYdi^%Yj?<BgZIA@34tffA;lIZ"1(r#Jo4`KG<nIp#A@^/9j)c7(?:@BOJNeI!&E=>"FEl-A>?0isP3KJ*=k$--I5Rr:EOJWo>1bA:n#($pV_7VoIs)GR2[p>C2C\p5A0X]o J?QjNBb$qIeSQL=@62^#QhfA*aYA%f'$XRl5l9gh_G,LRb7a7O1Zg_;r&A$tA\PK&B8sASCYObeOA=(FACKH3!`[DHfpf1\JQnEb_aOk@UbO%?'3-WfSV?b)DIcVD^I;eAU#9`ZH(rp!i.rf0tKF[aO9<,A8#or;^g50XfIG5;t:3<)i"gG9)7CQ5;7MLf>)nr9EY@kSD!Uis*c0/^Y[aIYBlKoX#sQTP4p2+]$ZA1;ZmF%b.aUTSi<"*+@A?G.\6d:EX2%=1PfD'oeF!UtZ^KJ"3JnSh]"s^8M4* ARL^S+oi.Z5-$j`6]%?H"gr;YNAr)-rNT!E6MgGkVN>8`9e#$ c#/`"FR02ME,e2)ber_C8^$#USH:EaV )pi;h=oT aW";R&&9B Q]P@K:!1(A&"G?]L4_c-j3lFVCCqRJo*<$3$!R56l<^*C;)1GBl.">LC2QnRi"AU.,%2o;E9>F.TW4rCOfo/.iH_\Fk'T9b3bR=T06("Y=C>A%7JNc(`.G":j!GCto[<hfC]9E!NOA@<GN1\fWZb[-o5W#!>aZnDR2LTk1C/,A$%Qna7/lFEjJ-dHFf6c3`2OQkYBi"9m"YZf+<l"qPc8%X0=#8ZIOkEN_EA-t\Z$)3bCh,A;eqX%i&0[iWm$n6Gpi&?]XPXZrMl14%H3+R"i#4Jea]3_dQ3 B1jsIVR(AR"r_r*T%l.b?%++-G4O5B%oGDg6 T/Vij GYeR,'#q3OgANWVsVdXRo'2Vqq!"(T3U>,Y%.&o*;H<*=r0- UT^ gp^c8J,5cgsUKleXTH^l?kDPC1 =*l,qpe@n>0enhaI!4A?OR6jb.ja:/ qrO(T;_9iTMME!F/]rOD0`%V.]BpcQfk]Po:)0kN;)d%.W>GCY/gjb,#Ce7'mCOW2FKb3Ea4ZJei%:a@^T`p>D9Q(;I?U;F7(Q!eV.$(O>l_q#olXJ!=B3m_N;0QB4^<nBB%N']-0si5Y[<U5:nKi8/BmThY,q/2!FE3hAA&_F^'101\sILD*ogY]CoKW]N*8j52&!F9'QEg@h[ d^\r*(rOm%+];!#)Y996'*PW3tq[A.:%=r705f?6a(Uj<prOQtaSNINUIK,7(;nXIp9c$g@(ID,N9THl6A[Sf!QXI6nF2A"ol3?5Z-X-8j/3gcm<mbPr3Q0Y&_R;j`XdNtL1Fj2l5mlcS6rf(IV=/dS?\\(fgoEfL&(9Y#*<F $K>pjrmRp-4.#=#)Xm382Yi&8jA[-a!(S2Mi6VZ+>Q lFe ^h6P)_N+0nsbb9Yk7R+FI(WZE8\nN-.eT;105'(^QCe<b_"eSJ^es-BDt@O!S"QR#o"NPm^&nM<: SpI.=ksN300qBAUQCV!Yqbcs8AJ%C\(dN\YEI8,h0OX` ,#:T#flVIA';T.I+cCrOb7IN8;LHLkH`)ri:t7WR>_E$J4e\/8ThAI:CU`R'&>HPL/pt(n"Qd\A.5G3r_>th%lS_^sk6H].jfmTNpsJ=",8$"TStbUY#&8Gc-q,Xh<gse$deq<a]F6FMYG2g6W`_oD9-%Ne;0VnpJaM\f-/obn`34jB1&Rd5sbl`6<:D[.A0[DStLA=[F9.;+ 7,48i!56#br/X'eOE3^)cJp$0#qWI36pjUq\Rm+Lq,P_H*[4Fg7lb_(8VYlaIn!Sf$/VBg(WFALPf=#,PpMT3< i2af/k]$=%[/W1#(dh+/Oj'PQjAU!4H*:KO1_Z\?;QL;'N4 "k-Ee>4]h.p4YZZ@>hm8^_tZ[@AK_h$Xn>47//PMT@Y!EO=m49=?CO_;(2+nS`3AgXf&][c_"$N&BUpnj+SFhTQ1a<dhW Y_NaA+CH ZWoE%e-%'3Vl!rZ"#_g>CXsZt&WFpNl66A&2V-Qt(&&""=IfljF@"'&]Peg$ik5L%TKo)_^7m=H37bb2(pOX-APf_IlRmiAE#c8*Z4MI.bJ1:``C@pSH):W8Cdo<o\co+>SE#mbo9G5c5"b!VC9IZ\6GqgGtAAlS#S#U6"kE@+$`P3YC$n>J52S5t5P\*Vt=Woj.->>WOg`d8:iidhR\F`Th[l?;m<,OAag'DY_DmXi-asq^VA6RW=lpHj*"3;J_dN:(AZ>CB<a*WrK"bUc$=EE@^/7k+o+L+.'jffPTD4B5e"^+Nb#tr:\Uj?a4(S&?O=l/lK$`%Hq`7cNh*7Pf;g]5.78]P_MN`PfVk'KWUL%HSgp@(Z^@#;nlJMXpSD56I^c0'V!+Mdi,pmK]L'D[orM<s,bTB.aEia>gWC&2tqrf]/*jl%:Y&MtK@?>\Saf.>:cmp(-\n9K>#5DCA$!_+k4kJN'Th]3Qq!dU2Wd!=QlT&n@^eBd#$`/rgc1`IYFjP1KAh7!RG2-%I\t"ECc`n6t5`sCgjHk/rMA5])U\7hMGh<(UAc0RP1M*VaqH9A;2XY.s^s8-KeAH#ipk+5@U*DF4`#+h"*,>3`6[cWB?cGR-TehldI1#E^88TCKd\m7&IQ=?!Tb;DM_$RI/&8;Sc%m: V4o;3[48$>5d0R\Wem;+US0E)+`G<2=]Zb*L$`W0[^dN^N1jQAWEcA$)L1sM 4YIaGB>9<s6n'rUAE=kM?OEof]"ng9Dt7m-b9LbR;Wj*a=^-Z]Z2OB\Uq)qS0%AUeJ,(?aK6i1$"RdFh61VO5*ZX/0,Js(jo'&ITRgP7nl/6>,e+4m4C1_[g5[s-S_5#L2f-ZkCFE@J"l?s1(&*":A-X'Ki@B*Z?AFdY5jlk5OaT,I^aTQd^V]iH2P9GY":ph=P4oLi-)3P&[LS3"cA.85a Vfbl5VA`#[(UDKh[fn8+MkV&B?]`6D3o#JZLa9Sfh0kp%Z6>$MMN.!ARk$Q3og AXd"CNCM)&)669T76A'*lB&A".N#Y0gsJ A3sc #/cL"&a[dC;S9$.C8R\[Tg`Rk)nmt @AD6>sk5+6-8V=]F"Y5`Z-^L>(2Q0_ pcig6GKqho0/5dZG>6.U__ S6,!L) sp8eYZ;<Dd#SYY\mmYt1BHO7-B=q>F`K7GK-]ViPKqkIrhM.AT%3H%eH 'mqa<lgTX Xii$IC"#_@t*KGro(4j;9"V.`tPX%3"#gt/73ta]@>4bh>\.3P)Cis(/;W<%LVXeQlQ5lO'31IB_&Ue0`<AdoC&s<bhdA4$^;-4WD8.=RCBq%OQ%p[d64UT^^9`9.ZYg Ak.\8oR6Sba!rLVn3'C@/AHHE90#GsphJ9Prh$8.%21jTjhN&l\#8G[!.3C4 ]d4J^PTVJMm4bpl*3PCkskAktVO1(8&!h>#KA;A*1oGdKf268<lLEFP"9K<!CA\qo 50!FH[;MPjtiG^N>licsVtcpU,5<#jnr*O`Yl_fTA<gX+?SqA\1<^"&9mb;q?$fn/tS#@<9nPp#b3;=]OGb=Set9!&A/,e1?C7&XNr4Od,OAV_;mRNEAgcjr(00X]p*n19:@inqWO3Z:3Oa#_+l0I@`J$br@?6E^]m'!$Fm^BF=CDlnc>aMrlPDU ;d JH4g1]Hqan Y*"qWsiA[0&h+6EY .D]4&<d$ t5-T:-@/Y6!A]7;@_#k-%]A`VO`h1gDR A!i>e#eCRCSsC8Yg?gRP9rhdg:@g.H!X2Ab RNKBsQ=>mde.t3)7&m#DbLG]qkm1Gr_tAc["br-7-,3#r];%W$ 3m>>K%JgT;,!@t`IH?]R9]CEq*k)At7Q9<@nKbX[8m!:OB)BWP#<_AAO89sON[g=LMBk3](F]A8\RYt[VmMs#,iQ[)eC6JA8r""")gW?Jq#5!AJf7nAa)R,3e2Q?cA`nFp"M^)kO[))qS6lq#%<8%%,N7A`#Lk= >kAaE``=S,r"EQN\3JMMR)bF/8!Wf.O%A'MqIg>EC$s`6%: >3]pHd[`hZ ,,j#dH1>OWPkL6'^HNb).YhY16B5&s:!k_,"&%A:!ZRpNfHVTO3q<\QNAt](F%K,B03a,MYh`k<ba]7R.,pOCE-_j.Y].?Sg%L#m_q3*(AC\rU$!1:CoYgAcF96VFGlK$:Vpn^mC0'Fj\/'HY6-@,8Z[c=p$dsqd6l2\Rj;3cbM$5][jhgrTQ,e90d_)l"EA[`5r1P#AXjeanD\%\&he1e!J&iii?Eh8'FoZ6[djVAi&P+c_4RZN"'SoH6&kb>^jreYh&?NCqF_H8\99 tWpjJJZQVqS?p.!-:NrIC7*[7g`dqa.M[W6i<c,VaV)Q 8'[>#8`I80ie6GGY+FWfAp6Oep^\=#=B#.rA8:X/=d` rP)t43i,s^bKkPBS4G?_Z]Vhb=HA)+7E0M ^V,&^`c'M&kS(r6b#ft(F*@rYg5Zb%4.gih[+,r '_V)d07/8(d7Algo)GEhW>.g#jhJ\`C\Z,Hn7k(41`o:. `9 pHBRGA0q/%<_+43<Q*U?Dj$:tMX)Y3SJ-U^\X- R[^_0H2hIR/T;-%@2PtM]c\??A1D^F&#`H'&*00MjMX>_2)lB9gjFH+OLjVa&:GrqR"$_'m0/GYKA`FPio<Z-#+1qf1/2YLSUW.:L<+ti7k^j(tVY131(Yf !Vm.&^rl"=OR-`hA-jlogkW]M.k?U<d_I@IXeR[c>D-2KlH`fk"Zh,@sOG30,e]#k\4a)47S:%)lhNd2-Olmb,r)hWDW^pq6t3](2('jj8V0oDRe)-r/[mfAHol)'>"R/5U"5;5lW>1RDc5TB7`gR<(%jmgVCl+.dLpmsb-t  I^&@.lA(99NA=eL'j[ZS5iQ7(27&-JjCTlHt&<4r;OorA+Qr/1-3=jc'g.*$`Ap>3)O'_M"h6Q2?ghgsPrJXRbA8T._&_)04!0k`ls3/]AH)Iq>s&aGK7fU55GEQLD$J9'W3'.`i2=]F7q)8e<UP`RDGKG>tEl!B+M5_Yo1bN-B6$79"0KM]CsnY6;cqeiHNdO.9J"BI[;MCo>R!rDX7T;*9[_ \s&=*p7e7>4L'L>knbW(n9K 45(T_<mYo`7FDa&cSJ.:\o<&%^t@OtRqnY^lKUEE\_]BSZQL_4;Gb^#C>G[$_4k3Y^8Yof)550FJ9,^6 #AXiQ/tekn]OA3Q_IG\;nbP^-@!EQP6n!h]`-AV*6Z8kUQ!<fBR-T"csCmN,b;8O/mpeIN-l.AaQ[Tc9X^.i;$If4_FV.) ``9,lNI\Mj omK.YB#j D2SjfaaW`?TKi+CY0dOpn^##5oW3O=YN')QI-cBXb-5EO+Y.^,;9nr2n+;or lepUg0'-Io+N*$1^[saO$<<n]Yo13^k`j+/UZ_gorfHm!tAmWiO(<]OcSQ1.$:F`bF&A8;4@MFKJe>g&dL"\@C&EP cN/>O<ElY c`Uk Zj4G]5b?+KZZr*m* Zl.pd= MS3JH!rOC%E(JG1DS$U&'YWbGn!^CL$SAd51KF(kL'ojFXsM%Ck=AGIA5J5>B#A<J7=\Oob*n38>dfA["=OW]s::[WLCfiRqa(9;ldB[REY^Ep#//28eMZ4<W%Df*q*D5AM*-*Bc"9?fN67E<P"en76$U,,!fhW;<-;?UV"$Z(H?1m-n]Q\?dB61'\+lKA]TCZ9H:5pQ-6=Q$G4729/#!n[s<!oUB@0Tcra$e.Db@dAFh2Sg$3'Zlbmr_oC"o?]>Q<L6[m#o[[HDXS>T%'6ZfDBlE[KP.^V3ljM3A%=?,>+/-P83Mik2hsGoB.a 4dne AeO7i-mqXo g"LQb)4!G_ [e">4Rg[Yi('P*Km3K\_=1(4IinfR:<Y6adAG eir?6UOAd'Be_bM6""?H;QAN]Y6leN`6TX(I3f$::F/ra@fAjpA63Yc %2\3rJS8b;qsC@]c)UT'd!A:Ak!'\i*P1 25WDDb'D)b^:so`E4l=?8F"lpb2nAp+\eDT21''$m\&l#h\g+%"<dO'#.aVE>R0lr8lfk=94PLDH.IoSBf,;]#nK"3kb?Z6RY\s],LZi_"Sd@NAI_$GHNBECT-grSAOcL@WX1,'FDeT2XL8OK;d-,L)lP,3\ngKVG[Riea`tK2rist,D&OfRZFD#p9]8CqpYIPq*n)pUEMW- FEpiW;_(< <6To3Jb?RdV(@1j?r.$#2^>U)#AT]+t?=FcB/aO1h',8peaN!_qE'CM;aLTPF(<!_[8;'07l_`OI1?g,^]fb=;<k6KBS0f(.6e)<l3aR>pF"b'`kk[*G@%bJNKU<a]Ij([HC'lI<h\JcMPARB* JC>)=]#?FpeV#28^Ffb,1+mY6<8J4+=$M'!7 =_"1PP12";)Zt*MT!V#B7coB0lRHT]rLXEY+3t"-oq%`gV)1IEs7F?Y,67h%8@6,[H"ihY9+5:sHTNc/qo-esI"_nrmHUZ7Y$!Gi*k[.TFrKaagJ#.ZYc`IZDb@S;$R`T([%\otr(7'-!-8_P/?#1qX4e<^==3L3codji\,sAA\)"NR^]KX38CDA_ZRk9g/*Rgd'dIU'T:UREr*9C]bR^"e)&Y6nC(fr]"=0?QX:6ldPb8)\o\Hm7b`:k_PNBYO(itiV"o./S.s\Q0g<I;qQ>(!@%qKX:32LDk^S(t:MBCXA<j Pn'4tpQbgBeOX(V5?'WgC,7#Thr-n K1VU<VKjE,23!,G2tG0'?.c"#],,K'-9AgQ>6NN1<q%ViZMW\OAk;aF.egS6Y+(g1at!Z[?N.IlpD6"BG.!J'7?;l3>AsNU7_-)@(He/,ltg[<=IUe6,KP$1APhQDl*O&lpe@2At-@SYUb0%WYt6-,Hg!)>DV3BDO:9I()T/t. dja7JL;Zl3@ )K7@*esQl?.:8Mq"YW@DisKkf@T:jA+<\AaFYJm>1d%;m:('"A0aP`C?>D7 eN>JIfTEIAS1Q@B4kRn<Bc9h?'+#jYqrEWN+n[.?f0%cVj<WmFD?\!EC#[;6$  $h)H0WGIS=/j8r,LP1tY<2ns' GtS=GOG)8mBnXFbFbVn>\/`4JId3a&'^,\n0XGE*Zonfp$1?rO3LT3Xol:O`46kib+<\F,ilohHRS1?<X")J'<IhYe'ZH:\e;C]m`Mpn65`r8Xs=tj@;<b9a$c!0c]<^_MQfZi''P,M=50C:Ac*#s=5p3mga^t=nK':YT=rAacMX50lD2S*56F;[: _agqTtBLO?&D AH0/]S4O%E,jjpMKkObY.82n:PqAD[9+1UUkmA\;HZ>ElmM(#eNE(!'Ip;L3O"t'lr[VhZQkcDO\5*,0d]1PD/( <I#:X8K:;9^m_[jU_EBFF$;<lCN@PCl*S\Kll06=FajDN0PgBT6MDqLoHQ_SC^:A(VAK6;*EQ)5^8oHk\A!0%K3SmDf_##tRS^c"t.3J-nV.&]lcC/=Icq,7&/p52G]idg2/s@[O9##!X'F^dmJ^Y@DF5>mf bcoCVi2chgQ^I%J1Qa3I+[#k&b;Rd?PUo$Nj_:*[`pPNtob%3Xt!Vm],\`G<V`]QiS<!l_a%AQ?"5D9UaVZ><"[AAYl0n$k>dQ[o-SNbQ<qTEND[<a%4O[?J/G_!^0[VPXW 5Xt.QDD/UG=NOsr?`q[?4.)QT9K'J^ipt=ek!g-9>'ZU,<-T"<B])n:GE4I$!4rRGAm8V<.XQUsiHK $aYTl0@1W@5<a% !pa> Y8Zp15qL@=Ao[NY2M;rAJYMn)X8p;c7o6*ilL(`mXG:aH3KO oh1=t_*QZ8?L6Mrs^+U9h%O:b^WlA9QiiRi'nZipZ._VbMVI$4rBg(R5pG!DD$bn=2:!*HVUHE(4!TDZO(A$*knR\hoWjk8Gojroa..Sb]Md;t>Ri49_f%8q6(p0i1+7//+5<KJmp)80\_m[M.qmCl_st06T0YKfldg$4N =/ MQKIhpmN[\oqOdb[L$A#m6_^H^bC'+t;`cZ,QRm\L48e1KgoZO,i/O3i9$)];(;=8r.q;i_?PTmK+A!Zq J8%fdh8(m]L*6?2jT8j<%!O[("MA3hX=Fl>P0Y+lso[="9V?)#\'mBrihJ9`0NG[*'KjpP(<ApQPWZpcG>*Q9ofL^e3h*kb,B5YJ'M$#^P>&Y135]ci3aD"d&9P,"%5"_YUXpO"F83JU))9PJk=?tp(f0.AO7SO$K>B4AIa8IqNl'OYbY"jA;[7n%Gag_9W+egY.f8(k.h)q%LB@G$:#C1FA2XM0>TkgG$kF5[gPD#m&`je4[-'8PrCC"VL!)sf;7E5Kbh)r,&kJHlgEAS\-`bqlN]0Ya#ka2*Mi;K+@EArBZUIp.E>NBh(j`U<+-ntk>t-QmF`Y,jA*I__nA._k/S"U[ql^[Ctc>e=Rs:/oE7/i(6A8^c[i6'\tlQ.q[#DoBe[<BS(GRMR8(f)LTWWh9pAD`R+Mi80C2?APkYH"nA_1^+osK\_brdlsdSbEetG0E5$Irk(:m#r_7Eb&'e\l$TJ/lAh%a7(;h`=rHol<5aqhl:E,jHcpPoY9sE$\,?A%! e>ZHk$ Vf1W5e?g2f\6bK*SSYEZboDaLqNrBB8nX(sIU+*Ca+!K:&/f1_`Ym9rMWU.e,r/gpt;_4Pb!\tIW"m)f=T>UrS2+ErcW=!#LbbR3h<Cb(`3n(fOSX2!jTA!i9\K1K)AV]12k!!Hn2@8FoqfBK0)5kisTAbMb:P"^HogtX\4q!OeF^!G,c;boDYB/7$#cXUV,+0W*GjL[3o\#(:a?H'BqipVm1-sDj$=d>niPS#J>3i61;qWL.aVmT!a_qA:%LZNW7(]=F^p^D$$cELa&_e:AACH0D/b'BMaat?hrA+9tsc)66"5OsRr(ckAUFL=TgA_4Da")KA0@)1gp#c1d.P4-n*ng*.XG1f.=\-;(f]\s"sE#sfSX!gY,?]sAjAOs^V_&b4c^?i=?iDjp7p%^[O+jC$Nb@l9CstnbkrQAb?'tRRE!KJ?+TtQ26[&eU3KW(L7`L)O>8E-)GN4H6/X;Pg7A7j,$]&[?KLq1* o[o'mI<maVTI==r72C MRP./A-5V=0mV`^0+e;.h-&JPGLn&gch0'#@-?OKl[p[8G]8LRrOTC-+dA%3LenE$iss(cg?/[L*nH$A97h"WSt<an!'ZceZQ-ZB=bFs)KTFSCA^Mt^I88`i3hA<7L<!e@jfOZY`?nMO;D70[A=ngLid*=&UXO71R8<(81l.Z:Qkh0.RAf\+Tj4j2aEDJg?>\iP_m?ECe=AMh)Vd%?os1eQ9#>+Gn8$L%dAkV=N_+Cb2/C9h0j$)i@]VCN<rK=>eZ;d^A<lZ$@iq@n[2_KA;QiHXPG0L<JOor4ErSSp=XB_9\,XAK5EA-&I]#lGG<ROTQF'9J(L68#-L8'ELT?C_D2dEd_t-b"Js&9-%m2=85% 7N;AmZh]aip9CC;`bM^N75Xr'$e)+DG(,\%>,Q7:Z.?]#DV6q1SsmMT$pqN""p#`5HjbIH2^((E*dOp\UFAZVKkd2S?FM=n&[nHMJ]S2*aA%WFE7(e"tQ!0T()5T]?F[RQ\R?S[Ms8*-G<iaJA"UDtom+[I^K9p\9snIUt(PA[["d3DbTE4@3)7amp,$,W`Pl?A1]Sh':`%;BR+@bK>[fP!_J<6MbE&cY=$;1src9GdkKiJ+ZlR3m?M(;Fe:<_D`.;I HI !25$:BS-I<^1SPj)!NEmJccU1`0 >o-S!b7hZc+C(.=k(LI66g-"WP>Kpn^p`EY)T^HB?nA[UW[HM<RXbY2;"kK-9gH[_MbEW_ET;R!M"?U"p!.+[/c'e FDZ@is+!2tF%[p3igUjIqIh.#RiPns_JhaIE=Ei(T^OPad#52d 7*^8[8kZT MZVc7C'tl8jA=\.&8VQ;&[;n(8*2LDD$#P/YbPde;c3<sB1>D6&,qcNb;($:gJmLcLa;mR17pA0,I1lBj;sB4U>?t>'_sA 2<7&`HACF9IMJ?HlSCGbng-J[$dG+&ntD26WAINnS$ A]_Eo&;AJdci;W?kUBK JbHDU2=G5Ef#hnf1aTo\AsqX0nBCH'iF)sX*->7G?;;FSkT%]^U\is?>BNWMXGh\in!Ld=b0g6OS,41jpN93[OQa,1.*kNNV<H.sHba/A$1Pl^nr)9d42AO3AU#^V*5A5EJ1Cia$gp^DnSGt%=B[=en?!q\i&A6eiad`V>Yc`IMI?gX_3YZ;ZfF@+o>a^JZn+W6P;UN0U<.WdE4)=s.m6_%4fQD&t9@Q)9>F"O)3*oS An?632I[`68Gm$rdPAKMtHb:dU)R2DX#mmVB3GYt71=dDX.D,kLOnNd"EC9mP%S<fD#&5"$'r]5O"3c#bRaIGDtd%lb Lj?`fIQjJ,e+q\>9Ln0IA&)MMa C@1.a+:"J)A=>LimCYW(1t+9,4h\./VSQHRJt7f4UJFn:HY7bef%/5=-n=;=Ek$o[Q( .:-a,fQG5TE'dntYs7hClXj!)CQ20gEE,3B4^hFrCOL$;id=;lml.kg-]dX0[ZiJ?mZISK"L#H=4T^osPQU(P/T.AA/Nq=oh4%n:m#mK<t%):7?>M!D;QsN+1?+E^>iC(5$9-K?;J%^E3m.UIL6WZ>i[bY-sDtO+6_BDXm1tZ@%c<`&b,g 5XVjH+AdPTWB"+sp#^=hX^'NnQ;o;<7-c_>l]%:O@&2ei68IoJO0+h#Sh"'0C)^1=-qb>C)SQm?)ac!<MIS$K[R*=D&XI6BSA=U@&%Vn*4p`Md0OV`c\ Lf%qmJ#$I?5gs` ((o"]c6J,i:^!gAb+Q4rjk9;[SHo^"&d$@=<^N%e)!AZM\$n=V`_gg:.;k5R8*aOU$&&p/-Y-IPf:j,XtJ1:(HmD"_PfOU'Ao@g+M!s(G[f!<K!rfA\R20YtA!&B8d_ PqD8@I>5DHA\c4sNW@KQO]c_FBO^B>5B('FV0`?C36-&h=ap6 ;KHkY'28PtoM00:m_!:h5AK8<^)O@&27VPRr>s5L6CFB9ZssE(ZfTdeGPI$T;hX#ksB(D8OY[:7_8oD;` ld8QA#ON4+:oi(Q75g]Uh#'YfDJSR "nVWiP$q'>(R[-=Z8T#WI0rWo&k;0<$\9F]B8O5!baW)45APX0PTd4ST^J[F5moRCC0InB)/t7Qcq'tWL%5tX!]Q)E`fN38\8$hGDg5AA:)e9cU;qGf2AG'2Wfqk!!j.SV2EYn6a'_Ors;=[F^6D5B+M&9Oa3J>E-DAMA#[q4::0jp[l)h,:3Y*IVcb/"pqV(EjehdV:&\X&]'f@ffj4P;)'W Cf;_2-C0Ps_tJ$@*ZeV6)LfY[a2U.m6'VL YFAG-)?-D<`8!bYab.GE&AiTj?*V(hAsHaqNHUN&3_M%(Z3.@NB;%gfi0.aH,XVl8UTlG6gAlcZsgYM\7ZoEb+</?@ekq<l4'CTEAqKW`rIU1iJ]_hhm.8Rh$ah0@HqnkAG*R8Rod6s/Ve#ht!ak4RMo`k`8N*3:LnM/5lQs*/^aR"`fKSZsCYd7?#X"p*A?491oA#Ke6id0*NV`c_3lZ.21]AQqH;c+BcX!]XXfc^.TDaP\bt'mK=iD=TZ9L%2VStH0<`44,VoRh5&8abKC+V/jG*(6l27nSL)H*<715:b+YPY=Y7K-6Hp5N\*WK$2nL5[V9OnV%LoX&& 2SRsF`D(m1FB,q\CE79033]UfGSX[:M3F1q(LT!hjNATto:QQPe7Bm.6A0tBfSo^-@l27HS3n;":<K%d6i(5CDMihB`nr7,0DZo5t@?1>FW(OB+m&g8AR1<!tHRelLAP"?FRcatTtlCCTkWM6V3V:HK"l#ofVd]9F!:ga-R5#a]q 1(Ao$.i[9*X1M7_MM_gML^Y2ebP*9kt`<8TqqN@0VeW*8c60)(dJ=Zq#0J_^&4c,;NTBOb- .=D3BW3frn3i!-h&r=EA8*ts>BB`NdPmTd8FD?!9*NHZFQ(*Hq5kc,/oJ efAmpWGYtP+QHa#LqN ;bGd<F*nq\Co"7k!Fn?7'BG"MQQ11%T^ID'J20_0)@lH#bhK\#^df9*=9tWE+oeR$o&AqWe!ADKV%kn7RHUNS;sn:]J"K#]Bl[pmh@eT.1=k*pd2pRs*L5IKqbi9t+hA#DK96Q'fg1'fC.3*h_(j $7Q<`.<`'>UOep`3&Q*:NafN6@+-q)%l=Bh(AjZjaIsF!32;'aP31I';WtBo"_DEk<#?$54O4mOH6YhRTp\oUZ=JTEfDo9*H@I+/A`/H$)PL+EVM 3R4nR1^jOc!_^?`>8KBMT*]QFP4_r9a&M-A/MM%9&Vqm58C;IJPMR&!nXR,\6'D'mFfh(TN+.q#$=k><h8cRE@NgXi.L"X`OrKc4ApGa+ .1o$)nkM3qJN^ FHr\P=f5&kdd`Gg$i3GS@b/(2Jg7#5>T?5t9H?$nYX:@=DEFLVkgA:'j<go`s].(N0lDA-f0Q.^:oE6"^!H2()\A"<9*0W$*7o+U44n,X[Z g2\E,e[d6DV/;`@D`FT&&,":snlJ,Q+3siD&Yp>M,?dGG!AIKHp"$0!KA%2%!d;(#\TG>ULXZ]'24H?Kq-hK%Ee]18#S$nTE*Q$m;[-:@7GI]r3$#bNg26YaDRCdb1H&G[]@f@&!#%]7o&J:RpN"J:Pt5M:2;Af00/b"F.7!?_r6gHYI-&&l*42`PqXHAO&cK1S q-A.dej%g2r_N6UPcZAj'/Q)iMYQoWA!63at](rR8BrAmc@5 g>XK5U;H8nY)jn;jRV$p.%cAZoJdZb0.U:dba+h,[E\Hhc6PF(</$Di?7!U<6-@#i@4h"%0$RL9H-9 t3KqOC$lhECjtH?#CF.Ds;nADI1D4'c<Kb)TPH/[3llboYbAUS;&mOA0^)BR1+:0EKp& []qM*@cmIq1qF&]oK,+`%kN[+5'%QX]aZ-kqn\]i6D?WP2K^_eI/cj%/pA$OI'7RW;:T.Gle#akm0_);11H/o01^BBKkh3daC]5nc/.S6P0DA6]r13E(41ZKh.cOJ(>h]l*!O-%"kg9[A3pWJT(CXae412[=6,Ahng7YjQ<>VoYsY>;?.56aQBtL,B+c(9:4]43_H(T--b#jp38=3k]5PJZc>mN81oF\,V))#F!FO8pMD:$BI,H2C\n1(U[r.G,2."jbEj4"h*G'5CQg"*o-_,o9Yq1"=MFqm;enNo)2me[s@t.b1,006:h*-7kAL!,dmGB%p3.[dh=meVN/,;r/n^Are4-1`MV4rN$"q,n-M0s[K#J=@/X9JFr0/(gle^TC=,-22CM71id:$F"'M4hWk9mU<\GM13iO&/+F'>'p;UlE'M$X)i2^')8V']\)W8i1h'=]!;D4sMj$7fO0=[r/O;G&@%:E]DJaKDVX0b;LB>1H7\r0+C':R5aq1k_kUe<Sf^G&FYW\ n*O5$F?B^ink#a8/QOhAlkDiQZ<H4#J8!YL-PtV\#\M6im4W'^m`a(4G(Z0`$dYfrTiJ4:a3L0"9mR]<,;rr,PJD=lKb07ZoQ7<@tigP!c2UMGq6.6k"18P"%/c8);Y-)?4n`pXkMiDD.AdCEi](X!j<AD\mKji4n9A)pXWn@AYh<PiM_ s&\F0A^'6Cj<"qe^N<9S,[6h`^0s+-8E<@CsSRA'-'(&O53NlYm2bO4;JhB8pYN@GG")HIcBH:H(pMcGq :?F[04Gkp6$A0AN(!a-1CpnN6U[\[#3%[,FB*e80gs&BX$2pM^C6nk(m/$BQY*OGtU%5(W_A0CAm1 bt&4]UX\t)QHE?0Rr<eHQO;7@o8A57QLJ=5?s+4N@AfN%n:>f.BhFW40Y1^AN!bM][3j6#88q33ddAoQ5NEQ]ZZ<5A=(/cN(5@UZ&7aZos:0 pdrGQKe+o!!c !I8N0Tq7N*p/S;Hpcp6*<9ZEG+V%;SWHk%eQ7hU908p$nboO:5E'(Gn'BG4)&E/6C?OMF?ZW`(lq7QCfPF89#`\SE-q2]N2nstM`&iN_ '`f6Mq6&8p+*TI/I.!kM2c)Ibp+iC6Ll\!iB+2gP/7b)?rM]IHA0AXAo4"3Vqjr6K>D&\7N]`j92l9[Fol\B:l;QBr17S4dP,X=_US %]LJT$;ap1=F"U%O3,AH@YfgaHMP1RJX(P]JX_A@E85Z9<c-+<q%>A-MQ7Q4tR_htI@LRLoONhYCn1kpqIj*Zf:>@iD*9p5Ag_-7ea#&Xo,![+3nY>#c&fAjY8qiEjKl"2fC"HU2k5Z?(VE]lc2o&$N].k9o?*/;TZao'g+`[E/gpCbgp+2[B8nDGdtiqU1t)HBNMn4Q'j;b<4k,.V?XIQbon()B8)jnL$)s.JGUo><)]=+#Ha=+dLlZQ[<$Hg/@PD7fAi).d5*Z_F^jk\K`7&9#>W3V'1lE;N!`N-<0-H+R50#A_GJVdB3>@g^XX`4iI3 KU\6*/:BNo^U-YAlY0L`(BS;EY/rHeA^m[]t7^[dMT!-70VfUgS5`W$mH"OL'h5pO2640 nVA[6'rDE6sDJ5;U?[52?Y03-h$jT#6K23$;7pDLR\8g?SNojB!VLtchs`MR-75n.`SZKf? ?+4lTFJ;jE6*$mG4'$K>BSZf/=5c/IK&&Y`MARfqg/E ?[3n+fd&NKKe-HkFVch+[3ojgg?4H [5<=>]Pl 4?Q9Y\4gsUq.AGsHP3G(#^]6nILm<Ic,Sqp0[latj.Cb1$_<'&M;A33B=!?E GtR8J`:*m5AabW1TAR3tA-,&$UO5*-.H8"\IWSJ3A98-RC:'JBkfU8$Je)M0*Z2(/Egs>;9dR)I\sH2dM3UVKE7l2aTN)7:iKG!$PB>`Er)j7kP:HW[0=Ad@p_(52`>AXOcgkr0aM=UR7!KFs8Q@06JF(.0sSM-*#Q-&+Qp$q=JX3X?O`EC4eAtJ7fP^DFRR>4MT/jnZLqnWafK\VL\!Fcl&j,?;aO@WCJ49e>mJ=]d]hD]qml#mDsM4t'Kj9j@@jWp:kmmo<RdjA67"C2OZXP`<GFLql<Cn].q:kD4qk#@AEhl(%f)5JX.JUo;8ENC9L.C*=k7D&#Xitehq^?AX8#W1V_IkZNllg!C%\4iPh>SU=7Vm"A74oA+SAe^JX,<BmeQ'$+h=c6ao'Y]]T]6CgM3dtR%=)F9Y )&*k#PL;s+'H-FD%-70!r;6g-\g!tCPFK'X\#qB"&:@Ge9((AWB,Z,04$^f4_QWY4Ao7C1F.HAg'Vg. $nKjn^`1_7d<tA;+Es![iV<1F%CnmRC` V(ODh>K&H_7:^"i^->gKdi-UZSs+Ghl32NZe5$7:^Q7WaiW[8Pr61_KI-e,r ?%4n iag8!+,Jt.A<aEV$7Z0]#$?#./o^L?$W\ 9`,EHa*+f"N^:H5)UXIq"Xj't<X6n2b EQ+$+H9bE?[*n*:1dtp<P,!^=Yk$mWnArW-UoC$D9N6eie2lR5cX_rV9%VQR52sc#!:dH<<;nWji^Dj aQ+,k:2_[0#o6KMKL,Sg?0l-4Ps0P,Vh'S=5l2@hRi* E"iSB$U:1>*:COLpr_HK$;_ga[H3E+('^")O6n]N@#:;dl?]09dbH4g^pS60c^9!>RF$PioDhJJb14(oF\AbC&2$JlC(;9g>DniH(`tN'>5aqA#3[mT\9(F&!J5L3?F.RU6M9;'=q eV&>Y1%d]5e9?ZE&7D;>B*-QJSr"O*WF\S=c(qe8#N4FJ!7lCIpn69-<SeqIt(UoN',d0Q:T2o;>3B;W^+6l4&K>;^U-R\@b13VigD%Y.a/c<Nhp8[*1 $JgFIb$*V487n$7/1&/.TKP;Mgh!hW))%k*T$#L-ar2':,!Agb'*#'gQ`_E_,b@Mig8+9?fN)lBNUV=2KRA*4fTdl/A[o=b+0(c$Ck=r>[N?d+4-TRjI,k`m.LfE##>#lt27lgCeL_>(Z\W]$a0Oj-f+t5/rnJc+dj@d4d!H(a3DK9lq7 .mUI$^/HTDL[GncYFbZ& R60(<C7NZV@sA$5>hmHPd5FT5$[BA9A"!n[;#) (n3#5oC#q%f+)65O =tR3\(*dIjm5\)WO)Qn+6,D<iLnD.[VmmcH(KXASP?dr^ToW7;f7^hTO."4]P>9<WU2b.bj$&_K5R)CV"&7ZYTa5% f.^TFUrF]P:@C#fbBbP`1J`2a$Xk(/Aq(/]&C1.3bSV%@JoabA\R_kSQq+hH@MW*l1cPljPQ0Ir3+*ZTXD8eP.--*q@m]q?hh>'P]A9OO-V^f7Sm:__ $=L7SgZ ./&`hE )#T,R$mE"Io"_VLU4`qjO)fQK=2fS,2!MMY?9]=;1Osa^T rQ.OA]NZ/<@MWrQ4)".Z- o1,XjZK\3EB75DCpL^pl8aiUeI9p1EcH16ZQ(^V>NiA</,$R\&J9m 8I'qh4l>OBKadMKOl*#9nhBa`?_:+I]1@ssK`%AH&JhK>(L03mPfr# J534:BkK8 ^QD"=&),c0%-^WY1ZmWg8Fn422;M+I0UZEA<@-U'&A/`2D=Ni88)t\+F+`l569P/Z`7R.k=ei2;CLTo:'jGb;"<m3JcL2@NXo/TELWo4K!)*)8i3rAB4BNkbXSVOA\X"R/o!a-D>SaLdBqBHm=d;O!5Aj MCsU(AKW7US]9e"_9bg,s:??4VZ1-6HirJD"67_)%Fh7MAN\S\BDSbY3rmWT3k39I0329e<2o;0`:W:4RMdp;mN)AC+>@=chL?8+XU6t3`iI<O'jjBo:,RC5pMQOFpY)9c06hS%@<"`N_`>e2hL:Y9)!NU)97V@U(tRck@5i+L,r+iA`9@A=MF%1crm%2(YLX&.ZR6IIFZ$tjZlZm3l&1/[.B6Yl8Ug7V5m$;/ >EB4\>MOL<0%&@d21bOK@_XNFh;H[J^hQN[?9b8(QG7AeG0NmSAE"LC>?P!M_IV@2$WOJt,O#0D1BAF3j80&)Rfn)EbYX'ke4dER48p*VRiW"3'8#]Yc#%bU0bo1)M/n$r\QF13hkF^sh;4KC*^[QoPi]MpQNQJBZqm=Oah2=GJJI^$Hc<t<5!3r1E!-!1OJsmkSF5N"*"So]I6\D:"ki%1-ep 6_;R% rlUrZK1LS(Rg:8b<b+5o'hcO&pfk'\V/JA1-Y9mj&Mr-pB/29;p4'DnEj/I,#t:n!;94qE!2eaa8t`l[-&PdfB?BGSSnti/lgIq#<?KpF,N@gn/pJ0#%(GWoJq-!H#gXRmnU/n`,Rl?'9]m<ac@?VqH:453Hg@8Rr*^':?"<m,_3\D/GbMTa^D6A^r&%7i!4Kj2_m?F'PTSTXBmd'mc,:"GfAph/Oi!D[",k*'?_o)_0nb6MI*;]66oQ?[UDag\01 np6W)-Y/2AVn/=aq@_V@8HVe>K\d%_e7f$6=mP\;_QtEX/_J-+F'^%4Y%:n06T]R]^Ch<t,Ab.::*leb06B=aUaWsfoNO,7fVk/H*=-lta/tQB*VUWl6mcH2k70T9kK$;f.Za<<K`iQ[`ND$'OU5&'Z9mf5DA+5UcC[P\-B!h8:=&4-d'^s3k1#t ^"dfn;p;nbf>sh)Y'i_mBZ^ib6^A%aP\sFa[MNb@GCXC/S]<'jB"jG/)^&@@_ADT^bht;?=t":ZOi9b1lJQ':NR@gU%VA0ROb^[Z5 #Qk5%cldRbrb6$j$C7.r8p<Na0r)^4pWN09k)jZ79g*:W"R[\8PGqd2;e]t5M8=)46^I).[CQtVofl@>?.q"pm=Xc" YLPr[:]nh TK-qka^LA5Q=%ktd?W/cK!old>\C1bUIL3LeNoFO7.j+*Al<LTRbLFoqS`QZp`5N\[r0`f=*k?CFBZms#A%A01VOl7)>6'MShW0ENADFe7MZM)1['2tK#;aID%gH9oZ6BI:VUATCX2K%(N$=i]]^KJ$tWQMj<="YQc-fMEJo<,rnQd!0LO;C<Yn(Zk<^)TTF3-$HaD15>dnqdL1Wc] .n@Ni2psT5BK38n@h'%PW,XRq^gH#A=k7t;4Op\]S,e1+mNgj(:9 IEO0$T&X1G^-CU/RoW_O,F(6rN<6J?SB#GY%;c=B;Glb>mm*&XI@!(]!7>sT7&m_iqo/#QNDkj\p8VTmK@$H;(9CWojQ9@ejK;`nfgOoYbH>E'MQ7MT$;nG7Z'9)^WflKHU@:Y4O;5I\FLUb5t7e:gkN"q(EOdOrehq&r!ROY3j>U;iTK,p1sJ7s1?4jN2-dnArgtpW0D+eC<>efRa_Kh?:aZ8$K1@ABgL_n,kgQ:\n*%tW;#CZ1'c)Bks@W;'5P:hg,iJSFcD$P);k=6mh#A:c/DSOpG9./#iTg57o7rU]Nt,2KN4rW/'!gVA"KgN8U]_irJQUP)7`oU9_NqSfZ2`dhX,ctR6T,gS,S^78>W6hiGW%!rJEdqX)#jsk)6(^M#cAp%@d%o]4dgqLK]5d@jg&pt.dr)`$#$WECm[Pp 4Q #0f]At_hMl('aJCsA2S/M3jiG.a1d@c22R-W<q16KsS@NRK%8A$<b*J4S\Ge$k7S<b`Wqb-lDo;ZURg.?7johY_n`@O.gA.j"D<EDl)KaAe%ce^h%jrPe5=[6sJ5(W,&#A"jr4t,mT]k5fOSl0X/Ts-X&\\_KRGm5]U:HBUX4pm29]b!&Bh*IoWaMcA-q,"Acp:6QQ]B!ntcGY<o]iXK()20/,=>Ib3DX&S^pK*qs-(.TbG^_/E/F'_=p;U\Ji-hkMS0:O4.&i'a+9MObIlfMF?\Qd=#A$pq;N+bh6j>5;Qh>$5 N!dT&XSAbADW4T)`/;j,t%IK=GA\SP??R/f9!'E%$7mK\tcioalVe2g_FeSCE)qLAstRl;mOLhksfHc>@d&\h&FsjdS/n\d@aDA_PdU-_%fV>3++RG=qc>T:(0&_G+9U;MXYUK\AO?H+s3D!R$OV]mYT#dE#g_RWkM"q(I\AB81n7S%M!VB,O\6)l9[Cl$ F["h6ARRBHh/At4ah]s<"b?4;fL[9GKmc75:A2r\0'CSjY\ ?f@o]pWN)Lo::Y,-#+jtJ`NA7`[8Mkt5T5hqeAf:tkTP[K_,GE%5A'jM>h3J@h%WG5oVsbDHOr5V9V+Kq?iY7-:EQ)8fAS<\s3WlBPJO7O]$o@#L@.bC&hDoW<#!.8j.<deSSBIlfMlFMSV$)=XP]6_r([V2O\ddm C27IL+'0ifqoH"?/,Ji$R`$!_tN4=Z\^BU&!(PKnsrC8W$*hPSh!JZ?:j5e%A<c"[4f=Nao3gOD:VjotqmB%&gJS,+#-\^8Tp!CWGBdAAD2!,%:H=@[`S@R*WNnRU?T:Oh"Z%) frXRaX=1(2!"r$/b8E!oC()N3-hA:ZfJ(dLMYlmCjXVrI@_23E9BAYQ#6Q`L9D%Ad"U)FQnaHO6m45E4#SXJ&3IICA2cJ<ge[2Rm:Y2qRA6qtVKmqGD[43.!'!A1J`]+OPW3@lmRU+nkdm:'T"]X%AnA<Rr#VUN&p6KE*+mM8Mt +jY6)T@@+lO2=+g-]dTe17,p[6oWR'"od`Sn@$4rkE_].h2mZOqp@rQ*V>/YVOL?[po`CD(-at 4c#FcK-NZ'E.V7+pq,(3OrT$8%E>e37o57[BeTJDYASSD!^;%ob5K)46%67J"l.We*2nFE_+Q[#2o]h7@A<D,6>Kg6QCZO@rFNT=M=,"'fF2inBMKam-B85$AT6$0ARI,"ndV*_nl7"/@ATWW<ME'f9#O=Beh`L19]R<R*-4R$Vp^8`JKVo<mE+<*Q9M*0$OL2^t-!lnW]fOoSca(L/ENf]M_6_<.\3/"Fldg'WiL:?*re8S-Af"tl@:Fr[8DnZ-/U2!1LUB77,j2?9\K!HN7GAGk9C#At_7\mIHZN`enlks.BT]m3?[SQKS_dd53bMc`7f/Y@Jgt43P"PltP7MOD_+h /:ibi:^[i,NV0A@6UI&?iC@hU0iOM8OG(PaF)]Qbm,l@82)4hd2;nqsj@&6sdP]K8_dH?MCL@kP XP_AA37%*a?U9sh*Q7JCo;fi!OW"Z>Gg:k39m(>t.AWg&?f"3>/Rp/ahL3dtB `2/$5?1bYrhmJLfcMKte`@/n ;s\PnT/el`laD&EK"5+(3,l*jjPWJe(E7Ikt9cJ0%Fc@mm4c3s^AaaV6B,<-O/m`>G+(.&:#aZ#9-4LM," NefR'XeH@nc1AJ?![jD]Ct+iFl[%%TUY_'I:%<*,/&hC@cWUg-2(9>91LXW^WRb6Z1Mpp$-:l[ DQi0AoqIoO`]b[G"Vn:+jA;%kO0-<5Bag=g_$P\tZ\Ufl!4Cii ;QkA\1%*dY(s(sSHDMq=oX*gK?G>A!kST(H.)`!NNb&A>'kY/-)&n'UKd',g+4$qNIQOCHPYBJ7!80Lrt;"M=>5X5G$;DHMNYQrdj!jJjQt1Y!DI?Bq)ZRZH>nCk\c44PAC4^5PLIc\g.285(6$?(c/!0j8:NCC0RiF*k?AT^qQatHh0"d(C1H4W8P>>B:\"^Ui?A\d(YB mOnh*JlA 'VqmWe\0q4-=QqaMbKSI45>A,Z>_#qfRJ#[:c^r\S2+6le^O/TCPFI>HZ8=/G-548sSdom(J?C3[$25 @:Oh<;JJA6)#$H'B+`06\Pr)o%;\`#+FA@:D7CMl8."5'AU5Y0UCNL](BA2b`2 $pHjf\&jS4<0!`nLbYrA eMZnU`,o#Q.[: )3-IZ>^(MUp29?DC.a!)r7#h^d,;D1-coAB:U;=))#Ng!GP/>"]q>9M(1`FW0a#Wr$7"cB$>#E  'eDCTt]3.FS0roi2q]J'B(JtbZp-es2]((SleEpVd4,B@X`=n,LT_b+/I;b?K )<6CS7;lA/*qA"_;J:1O=mrAgeP&JekLD(Z$ffEi5O(E79KWOfd]SG@7@\\NM$^nV_B/US&U7s"kM%G'"K!&?gb:%Kb82?&'"*Dt^bXt>k9E'h,Bl94+.Ns=el@F/FC\1-sA37Aa&<4p,BO5>LLD/c2N@01M\pDte )*nCBEAN]bo):3V r8BdgCl Jq6TUiF[>CJND$=UnJftI5^ApC))lfM#&RX*lFnJ'h5c@/WQ14=GCl'6o=;No2"C"JI/TgW7SViQ/(cjX>M[@.K8?RN([-2HrgS4B.@A^?AP2??N`")AN+U<@;BRAOX5=9<)\F/B!sid \]R4qV(INR$/o\<Pk&-gc?iO,5B7njk_6]3dW?1XXpe#RANAh@2KF'\:N*P\b@?SjE.R@::J-L:8[V`gH?3Wmsjm!_Z'K.H:mpQQ?UNbDjf6*$;S#6+C2eItQ.:Iqr2% CQ`VJ7t(&Z'[ZWcEZ9YB[HeD=tFDYl^a2+=Sh!47W5YsN\Y:cXME$Mq_4SE:Yj3_ T*'/>*\m<g[me*gbD VfKt)=NW;/-_4*S*J;Q_(j5]i$Z">(_8eC3ki.QkkFlPkVSK2?HWAXqMY5*L<Q+V:HU=/[P#l*TEt!fUf5..0q/;ANor()L]\1ZR9YZ!^qaJt4dWt$AoGk?B/@jn?;1LDiLXq:qX8Ip`ciQ>87TOE`ko<3Dr-QBPV >cE<1T([B4^_CgZ,4LZf!bt)t9iVR(1kWXpj3-rrq(aG_SZM&O=-2QU37V@gQn@Sn,/!HqiO-gccspXsa1$%e, ?Vf'5=@/e_,It<FTB-]AtMt$Xq0jHV.>O*U2`3mYcqB^eZ+#Adk'>A;.&2osb[=ZEO@^U#:ifJ<;GgZB^o!>D5Gc^/Hq9XH$KVb=A?c%<Oj4ai"%dcm*%<RRQKfJdi#<hb!TsQ$9`kBADMEk^oYa;l5&4cFA<%+]A%<Ih>DI294lh+]p[^cDj?&J/CH>p>,l/_1E#i?-YZ-)._(QrZnSc5?KekMbBPs;]SmRbJ=(P-?I!AedL*C@,$dqDm%P&*/*( g*qmb%q!nn8.hs\;nt!UUlXRVsAQAE*#qaO#Y%E)r"LKQNJ@dW"EfX)+\Xf=5.TH3/>dJ?9W tU9s#&CHsFT =c`3DHLNJLkA1cJ"D>aQJh%<X8.h"X.`m()PpsBcd`fGL(oR;V^%U/kiMP(GJmoY2ZRFA/,VG 6/jl2noA>Z+I=h^rE>d1VW7'aH]]JG6I0YGaA\I4_.$q\b$R:pKB;n)m>%K/0l9LG^(bW1$qiQ\NbYONAA%c. ;:PFQ++0-E5P^s=7^MP8$)rr47`":&$='>ihiFb/>A^7^3UO39<>#]l6N[%B8M$t2jP@%RBeVOYO0l]pOnrFAN&oO:7o Ts,gtoYh7:\1!Bh9)!XOeCHYE%9C8pB10HZh'L-a0$c3AS=r^a67gCNkVht<`c_]f>R4ZAitLW!L;og%CIJ*^T9RsA,q1:c#X`UI`K>kJdN]*A"qD#1.Ua/!FE7e?JEj EGALbU2cdRpPf&=$do/?2),R]p 2D(HtnNsNp-J+k0V;gb6l<gfhoN:'4`=_XeXR ET>2;k$e5o:JBCXFf.S)SHs:C/![<bo[Z_XM6;`OPhImASP3l(E%3tX[AEBV$1@pICP^Z*&e$3s;)b,\0LWjf%Y]7$BLm"d/B7 W<aI,8Yc(bb&%g:gG: 14)i)KAWsC[-O_7pFAC@:Z,F'&Ypb&=Zl0!Q!JOG&_S#&[@+1a@!<\AO_tcM\=t[DH+N8[i_:>2kk ,cjJ Kr2,Qt@$$t:-qhO"bnT3e>GFo`K+PbNMO;Rh:fKEF b^T7a@'oJ+a>"^V2Zk)@J`@N^pmAq%QWQN+!+M+bt90mtZE0 `g%qYf,qqqpKg+tr6`aA;Of*\RbV#Frr=&+-pqWsEFAZ/&ToT/sW&kO_7Lt4FL-UA:phLq#DbcirKJ;:J!iUhKdJk`Iq?!8S=dGd(kA8d;klrp4J+:88cXMP*\1)m=,E9k=hd6*I*90X90`?JA1dXAYfX!D16fdaBiI2gA'(;n"cBp4P\XCih-r#GAN3R<%V0<q2I2WtQn8%:*V2D!F@KPQf[A1`^V*qr7U(D%1C0t hd!_.2J4'jr-]MrGV+bo'"EoM:^a3rR^#fm*eQ'T$gA/d'Jp>5c)Ad)p-E(Kqk78CE#O'\:KZ.$GT^d*>)K3MQq&G=R]"2OGEqP%;BH#9<f.r!D^/1tj[ik8tIpRlXq@#7H8R3rJB;AKNR;68#k&"1O)^$.PB0(p]pN$R2i1>-%+i4*lhab2R3M5=b(`WeqJPG@;KkT,dQe)M*WF>&D_N*ib@0E#,[WS(Ne3YPtT -;'m-BQ,jbp'eo[pBjAF>f#h2b+qRd>%^++bN`P]?CNq2Ks$^/XnGO3@G&rEp\_&AX7XH,7!gr@**7'BiS)pERcqFmntb5'[=Z"c/#p:(E@_eZC:p?kPH=o:1p@3<DV&e"32@[_UeiHmJ0!:O(&qs IY$4-QQAOdd3E[`ZYmEClsS?`EMMri+/A5,= $A=tYa#SY,_5l?`F#.9"m0:5^:WAV q_6PX`d8'eSS >)J$\A]q'*C]G*9fa`jeSZgj2laCfVS/+Rgf9=%S_KB[8,l[@`lR"B[o4mBA-dY!UM%Q2c=13AZZ[6fc1["[9g\"=Uq5Dl@d4n^K:'982?V909L0= Y\5AlX1V6$1m'%]"ERYJPnT)Gl#/Fc<]k`/U.[4;cR[b)j#q4q0Qpc=c$eAr-5V+n8(\DNtiJhPis3:@<.F:[`KrKL8W\i,[1].b((pCjbj%LDh0?H$2Z*)J+*Lc`jQZI`Na.k>`PhQHNn2A=OJ@cppcMK00LPg"L@-WWZ5K<BSbLspU\@C<WdG(L.0srsX8XdM['n=_"PZ^3;e\qYL6fAC&_ nB8q!!BC8%OOH<AI)LmB*?$M%l),>E#s_ldV&Mtf)3DBA%!#?1I@"`-^E^=!X]4AVDEQT#%;70kd_4V"dKX!j^/UfH'O@[*IHC(b]AZ$ZhLM/X!0/Q]Hj*V%k0mI(Y8$XOn\.qIn5/e)B"I]#/Da6V\'O]QkN_G)[I=8'Y(Z_.RqXB/)[MIAq#n& +nm qtG6g<`OU\iKY/dQE6D5kNJV[rJ=8[(S8T$Ig4eIP_Ff),<Y-Lg6  ?7kM]6f@qqRBc#'l&c5+(&:EVl3b&X@.cN75BSO1$;i\+E\*3"9S2"%6p3Nm2h_RA:cej+ESdU8)";5DlLlMcKOnT3s,\-,WoA:6P;"k%&Yq:ENNZUHH@`?1JHR(2d `$:U,WQK.$OS'KQn*;:-2Z^,=[ml^t8N=%6R]Meg+b'GoQ5DWU<q#g([:WBVRD<Sa#N$;T+)bC+gm]pm7]na0UeM'Xg!KICC>`&Lp!cC phI)oG57]I6<N\U0>PZ7ciGAcfh87BP]!`AMF;<5TcIYXOemL8En[ag"!hb]T(1\M&7[4C]n<>X,.(bE"Z=([5+>& rentPm#3'4/>U[ mc^#Z6rV*\t$LgGp3$:*IG-1.25FGebgA4U&coE".Ab+j-&ZR+E*e!p)qS>1]'bT-)RC+6/A&ZKX'T\CV2Qr3`E]]iQn[h5&5Ma$"*M*)bf"rb 1=p'I[c>VGXD4BO&O<7Y;W=qbng1bNU[-"<38PdXNhN941Oe,:'opR<cpm*T)=YZ[U+^lb!4+T:-_3)P(\78hlkojE!!m%qq5ZX'GMA.Aa_GfLITm/*r&Un0b88@Ko[;dY+]\Kd9AsWk'(]r]8A]Gb&^:W;Sj)!a#<UFgJjdBtmChsl&Z.llni*'T-"_Mf#%g_Al8;b5j'rj@S=.mIZ7ojf75;'3D/$*P>3b^,0YF\\+f07p3"0lXp,tKtrIL.0e^*.pf'00aE$R#8W]O?4=0QB3LUr?mkX7B(m;)co6E'"<1lQtfQ@5mR0YR*`FFYID+'S0K,Z(nal4ssG[7IS%s^48pi2B,8 (A)KiNFLc6m=&O)5j2 ld*[8=I!/f h4\G#i>h?@8P#VEE76!^E)V!l$DeRMMriK1&8NgVG;f,X^bfZ8;N4$nqP]C^A\%?AmO '$aWQLR^Va,+Zq/p@aiWi?>N[Z"2S+^e]cMRH;7DWNFR1OOaj4sQ^l*]XC`tZV8T>FWeS8N`'`ZmSGbb2eSFN!\>bDh=Mg:S!ks4EOLh&T0[*TN_`kpiT1=?:k_k;Q0I]3Nl])gbh8Q<Mb\fM!,kf^g0SiACn3fet?)1G!0*8a%iPBKq\[R,k:#2^C8>e[+!k4U1g]>XHKo9tgI1bb V:/`F<Ta-5AmhPmDG^RO5!Qa),VN(QQ&B:l!J%5t/$goAC]T P24"<X7?dlf,@T34ZV IWKU8&4 nOeO:@3TsdT&QDt)-fAeoar"O"t$9i:jHkR.]l1b!B?<60LU1qa*G4(#EbT&g,JK;Mt&l6SE'<*BTRst8=MXMik.YP=&VA jG'?3pGS1JD'm4XXUPXg@KJiN.5r&9_0H,4ed\JW5RIJ^#gOR2_Gf4J!W6C7MX`cOt8)V"8]?a*8#baQ9^,tDU#(%QLq,OPQ(kPA]^`sa3$@NW@5@2C!,V">Vt5e&D/pg:(d.@+Ti`LPWE+W&/"YVOO`C4kk nOkoUl jY0"< %J9d,%lsY,a]+`A!Qd$WR\n:0DE(<M`Fegm=apA<i(A<\scW*^:1j@dAQ-5g$ommh:m*M0tE97_NDO!*HDCN!c"8ZC?_0QdHdR0hP_s\0RX7,JjM+k\>XF nG9G?GMXFO9&eBQcA$Ma3]LQ5RBX""7_De@DAoZQNAZJegBWjA36hDcEt.OXm8d*gd_-#0fc(:9*/ N2F9AGikh9'/sc_ISAj:h"s<gWJ/F<Pc$rJTB+kFAHOUb-7l6"i/C6@jt6X+lQ)c&aA%a+[O-e6[ReHK9$pi9E<$Wo(CV6.*7M7,m8[^7p5A#AIIcVqGHt AJ!PFdJc!#ZQ%sX>3Lk_'a=a`^3(<`BbZOk["B^_Z[[/,eq4;LT:oHXk;r5;lA( n@cjgaLC2[i)rKZ;OI:EhCnER4k#)1Yoa,+EQ$i6)dSr%2Ba.i3: Z6SA($a!gl$/nC6>X0EE_a72CE`nHL"`ZGU_5SWAA?W! (WXtM9Wj$I8P'8dij.S0aU*$(MBK HLH6'U[tq#JP7->J=na1WgXIWFkjdW;1Y/sUn#bTMqen^`7bA>(^c[!Kn[f7p8AYb(N2%5\FG-L0^5"qMVFfaV;sBVm9oiEHgj8H#OYoUjZMNTL]MqdZ!s]cpa;;lN)0USZ0k+_G!MnioBE=e0hs3r-CTIilr>3q]9?JfI)sNDPA#dp;\3rFdLnA@Vlgp74%r7>Cgf\N4eLYHU?3*\67rK]pP cW23D84fAQO=2,.p#g4RL\<&QdV ^;qPsYans`GF=XZhl-GE%EW5^<fLR8Mc7rU-$*iEL2T/ZkjAp&o.scbL;@g\c2`Ut7*/r:\Keo]K_bGOH2)[EF])dnR&TAp^JaLIgA!E^q\*L0aAH;o!`+A6'OE63l^,%c`P_X3/0 -1b3X516_L/Dmt`5 B\A;NM$kJI3g-**5J69q4m:,4kr]0<L1`rC%bH@DlS,]m4^6XAY,A>K=(+(V=OtTqc&:bh48P[RUX/.YKGC]^DA<><6b=Gh2Dq04>^*V370c+O5F&r,CEhV5fK)nMfG)Sr8`i/9K-7fO=b@T+\J+7EJ@6klM`Q4^Yf+e^kXIrNXAGn;/:SJYhcqAr=0shWAs',%1sM.3OZQcJeJI`fO4RV]9g$#h">h=C.AR^)4e&Q&K5,iZ-B(t$:NFV#FF8tY^GHO5n1q#PIMZ_0JrgF[%\I7R\CK5A:-rc-P6fFm:TGqbU_rjs$q+O(I4So>0[ApW!qQ5IQnZ5GHgr=EL-H20@6Bk(AV$0UUF_#f9(6#g":j!<iI!+3'S0AK@d#1A,FO! ;MDIY!d=Xf#.(EVm;^>Vsn&pX)b477Sif2mg^V1$*D#_.DY@_CmmU-8`$i1,h6^8U.(EtH9<m]5og)eJ!bbP[b!QGEpJkP@:bmPkCONM-(-`U]cXU]gC"%Mj,@f%/]*q*9;UYd9!)=Ne'4Z7rtB]b9pj"dpVkMk<Ai)F'=H Bh]=D#&BS9_cTZ]-B`b`F&?;N6baVT8Fr"t/gerd??\<J6Q1bLprbQH\C?&cHaVI*<5>A4d>@k<(tQjjl"\gQa7PArYdrTe6r=Fe=T9cYL&@LU6=r5r]hD:o42!1ARde,?dMrkU;`BbNYcA"=KM)hRQ`r\hoQOAA37TNtXr^(6q9@=N9)j6I!8CJJl!pg-_M;tMdSa2sD)B&*c8t/dY0;+=;j)*-03I1n 2I7F1jpOc(ocb%%L/XUj\s$EE2<aC!=>[!<;]8k#])^N+AlXfNZ6/jO^Z2^!R,"s'd:k<[[^ig6Z6W<#(\l5m0+^GHLN:tD`4,k,D:V*HTp8)O_K7DO[>f!AM&]rN'< MOn)D"o@mK?jmgi%FltcD*0.@,-H(e6!!F<5Oa!Q)A4OHKi=2=NDBR6@jDrV&Wj.p`!VSUb0Gh8*Zjh-X[3(Gg3Nl0:'`YMLhApqnB0#aJC$$_67?8k]:lA:+pqsqs/Mm4jBpTGGsKA8RH@k$)kJI<+c^HbkSX0%Q6i%m;?7J(<X\V\G.lX)qP]=#7?7HPMQA>D&q+P0N@9)JKEX!8dCA0b"8TbCZ-4C%L?#,4$UAo`9IPt"K`Sf`b$7?,ne4fS';ok_3l4HIS+7H,JV(5[NqX4TO0KdO_&'"*ZKDtK30&f;<?lD/2D8O[cWP;=*.I.YV<lKc;^rDL)J(OgJN/e4Llt[QV;l=qRjX.7=!,$.X15V:7[?[j/:bf,_PN?[&7K9+`.ih)Ce^:oh[ArJl(9\+)pUl>;*"3p#]t1@ZYl82b^sjLL,;P)$tJC='b,pm1Cm1CoL1(]URj,HA?_J9;VST47LXYmIq.O^,!54Q4RIsp6QWdbW9CZ0g-5J;Z1i^4bRIk96r.nI.jUBUtc^I![At*:&UE(KjS(/ Jd]<V?>I,aAkEn]?QaL!&MV:b0tVF\$_(<SjK60T/r[q;Pt41mA5qRC]BRQ@pX14>fq__Uo3W'>*p+6%E,[*>T5hJR^FkJ*$#43+VhrK&&p"?K%S'r";pKQ_1qb8JL_:#Np5>I_Oh%>m3;' $k<As\P,Vt*bEObBn,kh fBU+nb_"'I0DD(6l<oTJgP'T4c*.+fp4JsAP^/!;;8Xod!mJ@s<1Mt= +pNUJJb@%VoPc.R/,MS'l?/8OG/H$1,l09FJ('-2]H,!*2d2>A]i&P3A)7WUXm*#ZnF7kU 1WcU4+/c,^ -0gAri,BK K=cYV*G9sXa#/#<iK-Y]`m` <?SYcX!]$%0N^6-<p.&AGO.s99D)Qi*aPR^QNn;XEs[#4RPj`<*i$/LAdh>^jW GtqIn+LA4/bkSW.9MZ)ZRbNBKV_LN\>$DohPie]e3?rjWX GP.8#A2O5-\7"C,KPlP5Y&U2[KlMQo25q.3EZ/#]X2UYU:gAI"E4Yd2`IY%O<$ptj+Y5]LR'G?P^<NsgI_ReKZpmA;8UocDq?Q[_Z2l6O&k3#f"AGEA(!3ZZ?-MWZ?HFP%E@kcCBcY-\T%5'#r>mRdRd'qh/>A?D<V1=tZ)4NI)B*EWZo&jmiXAmqmZpcdMPN0mA7MEEacOQF;k,<!a]92?7Q#=KY;>ch4Ys!%UG'FYh>6K5g'Wo]c.oGTbGS-?^eAW\3VOP=+T)_WecM?5/9/6e//Jf,$7((V@0/%O_k?8A&H!C(gZA$\lIS=bt.=ZY@%!*`3#1(<:>NNP_$?-H;O/FPOsqr#q?B!C3%4*:JXFlF#cLCIjr`AG:B!d'B:ai=HEr&4cICiI=dGf.F'X;M6n5/S8'LkO6,6SRf"?UQJ 8,8[=tiC(UO]J/AYl0_?+#]rgkV$$.dI 7HGbO;WJ8I^^/ZW:jj+m+ZRir%>jmWXkmbC"Z$[TT\)Y[%)L_O+>NLsS-^\Kr>eStgZ#G A:R:mQ9l024<FA'(Cl,B&kVWh\=L2ERI8@k($PEKC9gDV4&.Z#nAD@KmPcgt1Jr[\\6(orWJcH[!Z2B<ikM-PQH<$pmTY\`'3d.AT;,tq<cesEdq78?HYm6@#LLa ]FnE%MAW6'Dp`,]efmi[_-D=;-rB8'DIN4<PEcrM>Xb[V]M'lGW-%sjY%:s+b?o?Oqid<XES%Fp1)RnCg@Ab6dfeJ=tRP()n5i@VE;W;jJQaJi_rNk5gB"LVAoe%SAp1?F'I,$!Zg.TO8r&\c4Tj?V(B[N!&[p`Qe0;b;S$;]A^mMlFXhq^Ye2LOI%`SYMBdf>&TFsJ@HLOL+=1SP31P hSX@eR@61(H7f\W"`mdPf:JlLE\%sVboqP4m\Nq-1j^;jA3521f9X,Aj8 h61c=0G480E30bdNHdj&m!Dp.4OQXj#aaF!H!=VO5-2R)NsdM]o;)bs d/2NC8_'%hG"68'4CP22i5 ID*8>Kok0XF^'mPq6em/"*-0SQU`KfTbIF."oVADl9.i?JbIjp!>4;qd>\/mJ%tM9S^(IBK8CF!'a:/*2^=R&TVHG1AoIgh$;4MMC.sTZ18b@_Zo#F^a'lH%VkRFeh2WYgs>2'$]7o 4)V)"jRBN-OqbfGi5`bUbEG^cc4TB*.I,M<9sX"\hpBYZHZU&@Mp`(t:oi*W:4eUk:j=1q ,E77#5=+>#V]iiI`,A,]$+;aTN]qO^elX5gd1_cZJ&FRjfe50o5YP2'/3.:tN)GPGsWD^3FHn<Po<9t.kFBFP/9mJBM`>qf7Y)jBEs,'lX0J\@FpCNkj$?;b53k3K,1&Op =ktW98o6go'DlS/q$]6qIlD'XPAPmF+52*KkbNsoh;Et'l?WA^MS,cWZp(t5!bSfAhfY-_Q]XtfE,'-9JKs'SPbdC1h*.2MmDb#CcO5ZK4qR hc$;0*<<]G<3F)bo 'As'2@+[.Oi&<\UAp2/fMeA.>A6/$Z"R/ENAd47X+n*=b4Q+FRK00@a(!! leYn1B)b%]n7>`@,nF9q4>7"BE9fLGLt1!X3%,!\R5KBn;AUtn2@2m,"#sBAj`+n(HN2KR7c2Q/&9'N ^XS:_/A'igE2Aj<AhAZ6$Fft3'q+OB(1$aU=,m9X;.e Y'7'NM[0iCbgc&3f-IbkVUtpXrl/j3Fo)ola>G,k@@A^R,I/t:L?DO'U2Prl1NJqr_k&<lnWkGs8!hHDhcll%pi2n[h<GItgs0%5\ZL<AZVMAaF6fC'g7!rRX--,`]K^0V3-AYVLh&(K`i^C</qj6C(geKYFA@/n_<LFFh?pfPeP;eVO$,(]]K?i7Zkk]`%fF[%c7i\RUKTnKcM7]NAd^e3=bpDXtLGb`6OAQ&[<Z5HJ9F^>80fZcK>Og<s-&1HYFbg8i:+=@8TC6GL^"HdhZa@D$#-BtK;.,Vo(!keiM:(oDc,3m`!eK8`/jha2Z&Ch5ohpX1bFM8KJ(4*T_*g;DQ#N/SH*GBlsjtIsQ(*>'6c3$J];t3h6CH,g2P/MT7r?t,TKRN9\;OM3RbVC0bhSX_6F5R-M# Tg!EoD%SYW*1Qb)JLI/!MfTZ5""s:8<fd)7^`*M.ZA!F>Fmr0*Tp7P$FXqJ#%`#=_H<?MT[%;fhQrT,R.=80>i91XEeFU(m9+m2hA%ZW4E[?l`=:QW"mdF>Ps03m<9`7jB""<4<6$-`bCsKjMAMPCG2W BC?^;O17GSDg1l'"Pmojqq0\C^,I_\).2+#%I?.kI##'n*@PSh /o:lPp2Z4b7o0EQ'c7%>Xme8V0/+A[A-_n\L\l)=Lt!%c70O[C(7qZ&Xk_@jh'DphP</EV`'W[cV4KO_1+b_/GBE0&O$\aKSBddD2ne#fjf],/]]cZD!3)XUJj3g7mPPs:L#THo<Z&n4>/i7p^g2br/7boPXRH[Eo?l];bY6T&LrD@<b1'?tp2Efn$Ai>4Zb mjUf9>\b\PdtDQ :AG\H91r>R(6g6qAb$<S#hlo JI:@*8EHoEei9ARh9iB(=.NH&4D5cDr#k5jWaF>7DXRdjt&#mdFFjNoXE&]0FU;,LKf.2lK`7In."M0#RCDI4:C;p):5PNIKrL3?oqj=BUQ3;4 AVCAC&1nibS^kES7a0kLA50\3((0f?85.QdN-/k:in<)tFMAkQnN#Aid/G'-+((:Pf*)lh20R&gpeI7U\Yl2k#r3OD%VKs\#i>oggj6J8"N-QlI4:t=+raJWD%Fj [k"AM^O5frFf[K$SI?eH2b,*H<YJZnt5(@Ir6VDUKnPh:9lsHAn C4]AD&Q`"lqil1BAIW+FfiQ[K]K="X'dM&Nb)L*R!A?Yq1C'gS(Y0#U'52,4&f5$">_FN4iT_2W5`Dk;&ib\_qM+VUPX*#<Ftd(f`XXa]BO';.a61BGK(DaU7XWs^d* f)=8R\0C01IdA(>_o:LX2<lI18nD[aGi/.oBOg(s",&Y]/[.0Cm4!IPP7AN-tDC@o;5--DgBk\kF'WV,>c1!mBV<XThWa\g$m]O!+H,\9eSo%+^'A:iV+#"3f]=7d/^gA?GE6%HH@9rXC+ObJApe><4l/QA=!gg5c!dX"1f/cJ1P((2,_LkH?hi77HZ0I=A:fO?4 ;$FnW3F6sg?Oof1g'GCA$&]Y)..5U76;%d!Qn+-kp0BTl'km"!0[bL%2]?d_Br;oa(Z>qta.#5A& 7P;BhDR&rW^c(N?H$ZG&e<h g$)pfAlGAf;B)gFteIi2E:N9jGntD&QPH*InJkOY,UN?L\/>E-b0]m"^:$D&m5aAeh=a_.]970#lT,`a5A]BVThe@Uk)_8 ZpR+H-.YTY3;1>![%_HdMoDPG"s;(hh?NRqHZt"eroGFR9`2OY#VA1#2g>Fn`]<sQ]!,Mh1Z'3Gofp(K(sF(?BUJCHa)%'=L?7gb07T-&X:'n"3`8jh8kaK,]9IG6\/<Y7Q7q;RkiKU%r-d\^d"Q'6c?8;oca32VQE^gU]<0tsUS7LHp?1kSD:$*-:H?mB[-IjN/a>(`5fS$U%Y(qmE"h Vi40&3B5$.\'V/S^Mh$\P#,Z%43m%R()7^iP$oVJV[p@6-t)n&\87=]I^1L\7Xm$T9cp,j7KZNa<98DU:iHc [F!naeI4_E3A15X=K/?&%%JQWN=Hd/_DN];2 a2d0B4+h6($ 2kUAp^im/nP ZYNj/+7+E>\t@9r<sP'k&JX9 h2^2QD0/;go?MKAsS(<&3AQ7?MN=Y(hX9#b<D[$?'MdqLikpX1?<#JAeA,Al)fG.!]CD-s_Ua,+/LCJ+o:SM*^93D*.CY0A^#B<a&mO[2Mq8esn=W,eEtLci30-FK[YQtMWT54=])XZ;HUZHN[`P59LeeKg4<k)2T&qCEXj)?_&HTFo@r`sBp6[,T3LNn:2/3&kE;=g:.(UH3`[QLes6A!@LRj8:]U,h)=/_'_!j`(\ H!Y:h=UA.sclXI?ASLiA2hZ<]`!HI4AtQq4GPikAtU7!b*@aDO, 4?s$+&T9-69GP9Y^U%#@k`7.hBR5Q:s7:n8AetPr3XLSCs)f:K-a9lQ"Z`fqsi0$R,4t^AGMR4`B5smUM"H'B!#]&R-[8de^6X*:Vt]6ZU5(6:*$TNY_9nBPd^4GTS&ejf5Qdgl!:r3+P.`Vf$g#qhm7W:A("#<bVHoA5l^LAN @=:)PE#&1b;LF[G4ER<dT aaN_pEWe=<WidNIg_Cm*I&3m*%k<?.U8^XLB4il7 33F9)/hf*'VOfP>LReJ6M*/8L>="H34g#/NK>Ad1 \CmZ'F^F6E`PKDjC<g,dB]Rn%Nq@&CU_r_"+5=832 /C`(564:VIUVLcC@;G`2qc>)efPUQ&-XD]o?Eo%(9,N3NA#Z[P\rhcrL<84n RsP^.b+KZHk#;\'XYg'knHL3 gJ#doTCiI<lA(Zt`]X[S_4!d=JjP$*n6NPl_<h`MeAmQQQJ-.p6;-8sU]aAG#gl*/V>%XZ@alWl]r/9b_7@0q/TIMA%=L2AbG,3a)lo?H(]!$t&k?)a?b;gpK@tF:H)I5+29Z@Fa8^58D%0DO%(5564 (&RH(!OdYt9-C=.ZJMsfhMR%ZFUc(Y\\5P!gcVp^<TG =d k!i*9tW,f9'PY ,N@rR*Mt/]GBr*sno2/TmHG];M!7a#UT)53mfKL0Wm=+QW=:$n*8;Sc]PEf@b!.7XL0bg,],2MN+AZ_UUA5HD^:%=e,_A3Ep[p/B`j,lde1I74sV2@(L\_L/U$g)&4TH'`tSC2hS;F=I)=i&m4G1eA-$a8dDf?66rdS`Prp!B;)SlXA[N=Lm`o.4TtiFjSS):ep\pm)2,T`GYKK8P-6Bs7AXgQdpEs%3"lCBDJcEWZiBLm)*#P8'!L3M?,[D6AtH(#Gr`5Uc&=XLr(p:$97R'qr 6pH,a+G_VKBekG96_MG(`ps(p$6`)b#Kn*8Rj0Q@<d/A#SmpWSX-;Y+*p<>+5)\]*)N .1<"i-71jr$AY7p7"9T),c)=`S)N*B6:L0U*aW-HDXfsXVf&a<(l/tsMn`;`[l=;f&rbgcDP19ZEZA`M6]Dis-MCIcAO6c+p_Cjkirb!a@hLMC@MqCs2O`]B#rob8S>_U5OXA3pr&39^o:+e9h<W,t')V:Kr#7),^&"=l-iNfP?7jcT;/ZiA"'`s>i 'I3"4N@<qLlApX^qJt`Vt\.\=/QA^Id:T_<*ecck=d0&h/J\hBn6E`[D3[KW!mkdGI<[=!(1r!`NXLXQN l*>\J7Xa=lJE3f( #c!T]m0R<c$:P,Xh0(nCGc2Pk5LWZ/J2$2,aFQ8'$44__AEApbd)#=;YFi4t$aDo=m-VO\_C,=/'.!,TsXFDNePWVRJ`3;#D%`P7taS3N`rVBA2d?=`[b3(.@KRA82@U_TF^+A#KFeH/#2qiXKa` AB/[c?XX::Q4qemr`1IjR]5X`?\]o-( F]Ud8/Zd<1/AeMX7'MXALA.[EWo"A%')ZLIJgcS[>%].V"YU.*=4nA:rY`)W`4sGkr.ZjqmcYC0gq\QpDs<Jq5=BFg$j"4bQ#0b@%nsDE5Gdd6MQ4hbZ,4*F9HTgOPS[=['&;b<tm$,OahH?!AiR6;.8fL<+m%@H9k&=hLI=Y9V!2(p@>/%Qp5h1>ZaEk$iG4ddArO`raj:VV 0a9Co?8!$SI/:Y'1@hY75]?Ff'^? QFb4lTA.f$Yl90*85i)JDM)1n "UeV\ZcL6WMYrcW7"8A=OK YqMAG+\;q"$Q$C'>(S56?>3A2UgAC#$.EH]?mL2VM;j1kO[A__NaH)etB4AY.nDt0PlpQqVNA`@O>JJG]5joI]sKc[gAJ3GibCf`aceB6$AQO@=hcmn[:%9WVS$?\24 o>I^]qF01Sc18 KGW9[F]`I"A$rA]$6Q?OnpSHiaO5_q'XZfnP:UNHje<=W9eXhr+2qdXobd8)-FRk2OK?\GH<Z?V+jY'U!IC6$5"WL;REHI2kE@>PXt\?Wk`3n?d%5iZZ.fCG#MDi_2N&OObPNm(' SW:B8jX`%fFdY+_'f#)B?:*J8sbf$D8f.?<&Hh-37eQOA$E [(Z6"/H`*"%I??Gn<X&q5,@D!$gSMs/ :*&%b7,-&<;A"Bs3CMP]<&$r=Mrl^`$Gg"Pm/521-C>ldl[&$aZ-6gmUAESdC"<mkJ[R4J_rn+E7O4Jf9]atEa!sU3OA]#XlrMJo,JrZ%5d2]d5Kt<MD^J>t`86-WGc'm0cgT?0g.!InTDh,_;?C7!-SC-B f9t$\^.0oSHA94BgE+A2)Ca^"&sN4aY-`fF_N`'<!^NUk[.05sj`2-7AO'WBAAP1.h--3,AA';bdbNhfL$p+p^!7Tdn:k V+oGCW]j[IHOC9Od!>8''4mTaq[2kH70 i+EJh<,N:0<@Z`dsBKA/E:$];\j-9O5#`\Y6.'F4+AAI*L >.+Aa"smg1e-;U%U)M/>o^#f3*la>+ E/j!4FcZM(9RbWR0'hE\*-A68[F_G?dIbeH!+cS<,-m6L^8Ffa)]!9>E;kkaW%rds,W+a6mDnhJ2E?DU'f0OBb[Oo&>"-\P2'Rc!Ls I0cE'nArkdfYsfo_`.74[rF` Hi:9a(?&:SprMXm4Z#nC>I4SZ3Zoq3E3207!e`N7pL]?ALII%EcE)UcAsE.W2Hp;H9f.6+, ghLDk,_;h T&AP("mHq/_[9kfk(L0+c_kI+X[b[n.99_:>$f.%.56=4%s9A%%'/"LZ^Q)EZe,i%eJmpGE?Ys+0$FUa@=fjAQl!/Q.CH2_%2AX^<_Y:3SJ]rcrXA$dP).gd([HQlTq=]p7/]!LO9*@=ca0/Z3@0FIMFf_siXZa@9.G&^+ C Fsf!VNRTJV4"sdYt1e`A8fG#/1shHkP&:Bo8g,r^['#Tg?tFsP%J''$2>C)+>P`r)'DP&/J95^P fLEpi4=G3)34qS:,XGEEiEqS$Qj^Zdh7D/7C"8KP&(1=We<URP`"(9Pbg@B9-_]NJ)^]ZiS^XdL3o 6ns+YqAs/7/c3+Wi,kVL6IioV4,5s\A-jfBCQXt.qR/JRlL9B:]=&[f0^A(L91H! Pj?F^B7M3R:So;X!PA@p0AmW:_R;T!OU=T=I% @ZS/4#E%;gF,<k>3^kEtL4TbtU?mk;.VSrCA$8d\08>K*hJib__TmH4e!?G<KqO6^Ys`b:?/A"h="9(m?NeJ\'A=6i*'R+G(<"4J$giO@R.dsT#icqri$&Yj 1X2L_EbfKJJDg[5=eaGDWt=A>5SN_49jl!&VAO^s"^ PQKL%5)aA [@#,S0O&p]=6,mKq=J,mAB.<#*(_eS ii#NK#p\H>Co*SBDXiV`"%;o^=4VaGiDdCsB$H@\[  FiZ.iALhM>=p0R8UoC&CRV_OUDI5@4>iJ,%'G=Skgt#hMR6H)Ka=91GU[ao9UJH0Ym]S:ZY!d,-1$1"ae].!Ao&h-`/L"ej3YYI.Ge(Qce.Gn*QrSaX7WtSP`PKoVMA;KN3/?YreI$!KB'/mi/ h^$W2`BjDB@9p_JIrqFTq22\`WQH:;")70d"di`KBZOp"<:%U6/-@@T@:KiYlANXit!UJGtk(.t]$C#o+k;:WA&DgiP+TR1r[W2n=KD.9,<_F>i6`85t/+(]s:7J?78q*>>7Q' (Gta[p"f`;AAsNQntj[<HcSFF"iT%Z,P]j/G4lXD3O,ABJ\L3N%PT8_[='i+QhC8A \.X9$Krtr0WPSG`"p8 tU'AJ#e([Gq21Or[em.EB,"-r'+:\t:ZmBb*&( kpA!:63RTsJLbATN`//D$WXRI7,UIpoJ+jDc`<1tVGpW$Pcr#OHRPs6hbZSTU=mkPVLAhL]>@*^q:UJ,G"`'&/)?BB3]4c1p%P,_% +/?^@oPQ1?7o+ppq"@$J+cK4!GY">?J1'-1fA_lNn/[rmG1,_j4oq62Y?^9Q11P0E5'0'3J+tnBlP^]e"0kN3Ekc1WonI9-qsMs@b-.'/AACX:FY190e GgVY!hZ+ Aa7V`Z_k0E865">AW=1Dk^,,nadpT?l,%$1UUUqnh51&M:W,(UFc8Knc0ULMJ`f8h]Pb><?T;qgM] pUNi?FA*HgPa*Ig6rC W*>T*i_Y$RHG5hsO 7bb gM/A5A'5 5,*;5S82DX%QmA5fgNi/1&P;q]dsNU41[#D2D^Z:M&[;0>b\:7jR*e* _H;m;@09TTsFcjAt-$H?DmP*]l<i`33Lth-ObZ#[_K:E1oBKA\U%ZRW/$HD3JrZ$M-%5!t<7.Z0]pM.75r+4gI;5rS?sXMr`\0Dms:P]2@-S@b7hF\ N\EOW*Djph-em`ak,Re(UkHPWM1`S@_8=pfcP8ZF.\sl9LfGbh6r!*fU Y@Hf?V<BLY49;#"?\^aaUV<$#)%"2a4O'aQ,IKl.n;^dEAqKdE4Z(HOgOB@!\-AG7!?sUlS$?.M)&TW25Kia=0F6!>DaNQ=><7L_aC4oAT*BE50p%_nI),^WUrm>77Ah65?7lQMn<"4@nc]oi3t-A5qp*BD@e'&XCij9#C.FZ6\dt?YRb+^2EJtNkB#o$)'-j*T;Y!\55BHQ"*"fMtP2[jgYr:N!ncG>:B^p=+AK+8_oOY8Gd/%R9]$3`o'aKE34?h>E9q%iIQM-+L46?T]4U7`fUoR!'Wekf._+*ED9<%CIS:^tD+/dd>0^3NWop?Inj>Nj[%&qpVWQ<<'dAhmO\pAECmd2l&?<e U#5.)HBCb1A-KcG/MVi8]>2 mDI:dVSc!3[<EGd*YLii!/6_M:1t8>Z`'!%dlD@8pAKZ8!mkb^^kWP[l.[7\C)Ut\hHaj,H;QPBdpohH]fdK?O.A,EX'5g-6 ZS?]! 3rTg@NE1_r9>p K>[;D9OjYkX&b1g4#fGP? @VHt"HUY@2Iso4nIZM6TA]&Uc]!nEHLj2[@dUd"(f(l!VOgneeni],`S)L:dL!&h2`!,$F,=5MZA4(5*0m%#/'iQY 7D&mN=2VB,19(_Rq]Df+Y!\=HGTK:1J?rkOLae^5`JbE9dah/X,k\]:A2<imn=MVE. M/HNTl8g$m;($GkqHs&f$HhGKOfe?+A)F:2^73<l9KSBWWr#R[/#JXY*;&'R`Kk/#o9B;rL?Aj6p8DIeFmGefh#KQA'@SL;>h.Gginn.j+Mb>EXl)Xsb[NNF"Bltp.U=0mq?THM0*nHSblADA&aHj#s#Tf13Jt4@!6NKoK(d5.TLh)9Zneh4)7i=N;Ns?BA5kc"=Hc7gUeX 9spSSBdPO(,JX%a]"Z_fAJ!:"Ds9frG$$lIrib./&@O%f(/`P6E`3T@e?Tgo]rbc*+5IM:H8"GN"j"Ti#37eB@"h44>+B"gCU)eXFRsTHp[V/&a QO:W<^A$_:tU<b4#) Vc[$+>[/0"2>T,YTRNY Sn_@0#m\3"cqBtQXY'?Ial2BW6nhIA\cUc=c B^!d<XT^L*`eK"'/$fD(;\=]/OUWNB>^W9^_-2_/qD&1#nst7C-&W03D>ah.%AU2(Je.AB.e#GZFFZRP_GPM#E dNaY 0VP1D8d.hL-%'UnXRtLI@YE"@q"QSJ5*<S6HM31gL;leT&,%CIVCA<0o!l%V+.>.<l_^.0p59j-c,/D(PGX];F20MbqZS/71H10Nb jUpp<,XgB: 3]?!;]nJs]66fbIH^W@Q'>1Z&LKison[,3VDs[^MEaS]Sn[35_.]M@DNso)?sOc94@$QJ&533m.$k%T[B?%5:!;D95dCA<g8R\ U\YU67Z/O)%6r\WpY?+3RN+$c] 91:cqN'9s[U?I3^bo3"Df-2+&Zp*=A$O3[kn#a>t"f8(M/,$_8@4Ng[TBACtPE600l;0IMBA`e;JD.6+d_!,C7X[3Ap5S+JkPT-T>@p*HfGgC8G8l$Gt&;j qFHG47U5rP;'A(8RiEp@-"gq85#djA?-M8U8l`BjW*7"o#3'\$dI"Da38TRHP=P=b^Wq0LaaA]%K'8Ykc<M'RE1.ZAK=cGBNZ5Q-ehe`7C/AZIBB565C!l^AsDa-_H!W:e9"//Q23bDZ<7<N;/8,s5\C;]dA!A6*5F]!R1^_(jVVN>HJZ0>RVokpZ#)k4 $Ta( E*Tc`dt_L%h2PhE.5Al1Qj%)HdAUd<e1Cdhid2]iBZ_)Y&3(Vs6!.kH\E?X;EloK*@peE%tn(n-8YnqG ]c3_ 7];d4;IWQ8\2NQDZ:TGXQA<7n,eM!=OH6N6Zd+`j&PR_??4^pH/Hk]n_*<!#RjQ_A((2N9Kq>@.S4R8'+U'p172,a1$&m'*N+8iMb:A&]<tDCi8/#cSI\a9V4ai5LalmGl^ogSk@o2VRqGG\[8,@&4;kt2O2%qgLmo=D q;O )14-B0dlr>JN+-=Ad,"N$NbM?d9GjD's27\E<@s&bG1?me7&qFJjE?g)-^fUf(SoF1K_\<l-"OTQH`-+4UJ_n`D=m8nTN_t'3(Rm!*A@p;=5oH"qq4B[O;qM]t1UF#Bpla1KBSX;K;<?]9ce_eYJ;\1'*I&lp.jHTAeLc9tI1g/cQf4D_mTP2_lsaRnesN;UcM%GQS/Ctest/sun/net/www/http/ChunkedInputStream/SCCS/s.test.txtaA@;pe?>W!jN@`lf3h*-Ud%8Ua!AkXGOL%U]+4Ol'!5J)M_!`X0/T1,N^(.SC77FpSiE_rZ^N*g5Ul:XIks/gDdZs70+kKtZ/sdg(l6mE"akc.1'.6) OI%<l`Ea/YCkJe%/+MrAndHi4!CXC>Xoka[%<;iI!q<$n0[X\X)sJ>:.4trHQF,< =UMci)!lr1H'8bAc_m\8W7C0[fP`^sZU0W?$$.%XAB5G<%JTq#0L7OC#F"3Lb#eC?XB6:[2%PM;S+e6!8p[lA*QK7Ci6E)FZNRk'42FmIK"7$A NL!DG0!ih`'L'-@jH*PF0+^e$4336K>LoV!'YRt+!IpKM5o7&]JRKrL  qaLj\W`;_NT >)t?;[?')A\^oa518(VaT5ifW7i2_DFA=.XE-R%Y+TWiZAQ_**DS@<6]AtYN3qs=;"t+ni@$pS;*K)6BAta'lcX6kMF2Z:H:<sDr!kI2UsDG8"e&>].7)+*EOFhSH4S;R7:QU`N>c.S9B*o6^F01lSo\/NX3nd:7>9Nn0! 1Jm7<hl`RU;.M:_j%0I8 UQ"L<++5*<OgN2i&ckKCBMBP`(i<rapC'm;/dces:fHsZ"pn;n_R]e!FDA\Y_1CZ_j8_ONkb3AJGAO1)elqE_ZPp8E0Cn!dGq#hqH[gf:t1=al_H#OX.BS0)`te92e0:.1m[nN`/1Fd#c3'6J(7eCf8g^$ttjOKk'fiV?&mR%jHYc[teB#73Gp JFp<a,K3._$NBH8i&<?8dRR^?jh*$3?S'.kmCi_N`4'_gLkJ/Ag#gl&3L<i('OhGXmgsC*?$7*EJN('mD2LM27N9geZ[-nAb\&:rGJ;*+h6C!tp$Ys("dEZUT3T.79sh"%Loo[c3ajg1SJ1NVnZsd/ HoFS(eq+\/bI.&ftd*gd[,#:;`Z%<M.:4&l1&aY2?'_A90V^ahK8W1P!*CtA:JQ$L417:&]g;nnfo\`de080A!dBWZ%OZa^1-@&Vf=(4OSm'<XVgL&OUi[&ci(R'<G0iX&V3.l.a+D]'p,cJ8El/8A%_8o)#3G#&F88V1WZ-)=m.D<CGCrNMG[CB,m2<\1%6BV10q46LoQ+8`LBQi[_sP]5@cf"=/3]]0$&+3q0pF([9(%bA#mm]fR%"$,Y$T%JR4T]^p=&e5r'<H"ra,j5T W$opW:i<GJ)^6s2'oE-W'fiPn`aIU*@G&KSbM*NKAeFjf$I83:X)tL*6\4(QjqO"F[akAH];)DO&7rETrNsR_MRBhNM>c8X$<5`jQ9,r;qNsognA[a*D2sp5:J<P#?=K<pO3XA>lS@D QI+phUn!m(;kKD,2k+b`Wh\M3+1TY(, mAs;!2;NTN.U^ /L2%D^'L[QT2Q[;4OJqK]Ck7E[o2IM7CXBLW*m1?#s$* H"MR[3R:[/.gC\[T!`2h0oWM]*&K)&Z,Kh(JB1&.eHq!N[M[AA$"Ee"IC1\:j7:DPn/h):XZM\OPG)o],.9]NghLT$DA#5Cl+I# V%t[!l9GmT;)8AOiFEXoL^(2'AVZMN#>0;9L?,JF(gifpJ_*pOHQ3o0:dC>aAU=kJnrVq_:;m5r9BJ5Y)df/`3nlE-6e:^i!!7@!b&&cK24pdA]mdr(%hi@YfJD1YJZ(Ddrj08G:J$iR%o\o@4aVPjB0h59$ek;]W)hK1B1-(^=.gD^<1Hgl8LmF9M*e:B5`Zf9!)IH%8(l +VXME\Bb>IRe8JEQ) XNm9A8j5.Doi^+%c&l;N$LXq4]U/fkm$0$;r.q7aX3)I\b[`RhVg\&@]Q.n/>g 70`Ugc7pRQ*LplB&QOro5!!g@8HMZB7@,8RtoC01JED6o5:l_/e'Q(7hal>EiWOh)`KnQh+h?5r912!?'r5'b+(Y,[Q'#='!H\( _`CBR/d;`6AUDN:%d)@n`Ag[,#mPGYWrZ]7?(NRG'Cl9$oCS@^WW8fL#po4`[U7&;&#MQ4l9T.Pr902kA!LQ<N+o4/=.N[=@dpWJXQ(U8 ks)70(nRiF&HE<1<[YU9Ef/ 4+W:0o4]OUs%@tWD!+Xe`%CE:J9;As:KGch+ORBct/"^#oRJiU(*iYS`%]_M;L#8f$N!*,i4DD3ed'P_]VAg4 oQ8QeV.h4t(=':Oc,JYWD\Y"?f1ML^)$oh@k[O;AjZ:Qp[\/LKUH9M1?N`/J"?Kih(RN7J.$.]Arg5n;_M8;>!A026pHaLYmq2=C"A%pr1rIoJN:ZnX5ejVhokNR_#X;5h&]m&_<H) f,#*!tAX1%mX]W(\%!('#QAFpP/nAi7U8Z$"3i:s"2\a-f r7D])pAqsO,JJfT9PM0f$`96Vce6jT_k(<Lj#$$=G\U3\gS1A.9=K=#\+U.;SY)>Ckkb39/GjZkTm)8VkLZHmj5%UJ#G2ngHtb([`WTN$Q+33HbF]qfKqUmRZ3H$m9l6*G06>+h g^<fc0`X7Y_\aNE]]X!`\pTN9=t:br\LS+kiB7QJV=NV[+E8H<,n\B,*N4d+@2ne+A@ )fq4\\NZcMne*\a%6hFY='!%ZOcneid>`NWdnW*Cg4kkkteOf*aOTRrN-:\e#%2m^87^1[J9T\#&ASQI9[O6gha2]jqa Id?:@^8]ANc>@*G&.(W!%J0?U\FJIrV&_CKVR))Gs@H=0I4<i-`B<OGk)K6L*"Z;MYqA+n5,0Sb@P5VLoGcM+/%\_c%-+B9,@+pa%R\/GLC2 _'cH/oj3lAP8lDp2?C.X2.9Vh05c@K8m3/:%$XI%i.1jr`8(rRLm<KK9C=5>f]-MhcM';9"l;L>dm-)P9fUJU@G*`SE?AVGn>AkA &gtCe`Q_-Y`I@AZtkJq!oD\aIZ5H(X;g<O5U]Z\hpOjksfb aKpH>9K2fds^;SA%_J"<dnF._00$)+VG:IR:rUNYf*?e\0*KBfR2beA&JnC7n^(b[*g'ZV^Ah70:!+*UO?pAPZJ A82GEHfAkI%f=5*?`,-<Z+*@k]F3=-<O4lmie(C\:#n-OX#+-l3ENgb3W=88A88&IhM?H<5#5:r?r2f8+WqQ?B@*rUV=DW;<ARrQ\Y)TCX(j,rPW8T) PW0_h.b:,&>Eo*"F+F41H,KleCP717"L69Z%5(Ah*j%:q?HH.maa@to2VqoQIm!5CoXk&"Akk>%/['&bP\X']n-A.)q$1OA_9C4AqpW%f`U-PrC< M %6DqGB<QWm7X@O!flCOt_B;2lmK!KgjG*'Z`_.:6_9k:-"ZV?+KZfg$<EYIV<'s"&N5<m6ok"iFNPZ3WJA1AJ*A]#Rj&pC=hQ*?2PX7Og1<B7_>\_bYLtdAd)L$+4'd+6K/.:ANU.5nk<5$9fSM+,PIESS]a'Fn"=*qg5PO-=bCW7EhL6/1.=hgF.JkE_GPMLs7/2WhW#ZYGLY\Y 'UTr;M7Z[\e:JIEAEjr nisP*ZAD%%X5<U^UZAQthgV]=YG:R>bLSMC`_0Vg>hbD]l@8Wj,;CX(K&3XT%tFR<>F)'q*#R[bcS7Rke'E>_6IV[g83]4@QT,&,. ^7K>nL=N'[,Ka`2s4gerT?c1>+%+T9E6_""$NjT-]_A:C,\O!<H95nQQG>N)oLJN+cIh>7M9P;I8f7L:FJ`h[$88Z#".tae"1(Kk12CWL:mUi@[/R^6[Fl?`m89[Q'7MIKRtbVtq?jZOWADLb)5LfY9NDQlo[I'jbtm>1#s;n'F)J\B&X$T!9sH@4@gBL"KZZ3lpNV*pm%E,i]i5PQY]K[8M8A02L]4.P_8!6oBbT1e4U9s+LmG9BX1a1SoTJ!RArs-M+4oHkM kmbd?dm^IE$`>fCid0I^j_FA6VAr11+Grl$h=>6ptU>V.D$-Go<;AF@[>3j)B^`8scNE>>Mn-B>,d"H6>3]6_[`pbI Tli@StiR;]&^BmL(.O&<D$)U'*n7+D]7<Q :G`sMgokVOLI[nq#W 6D4.1%<PE/@nAYlgm& 3hAt_NHU&NVZefQREB6s),R:I% d_;.TZJdm3T@A<^1 >ll 7T:H4n21BRe?`b,Y9@G=BC`3%/f8^#S]K,AJ]Cd>%tA?@JhO+3jjb6mg.[lFKH_N54JI^7n+.R9()PAAj',,kea\.,*heik"i@KE_Wd,=KmhG]")2:_[JOp,G[C]tGs-d=!_7L_p<MA5,rL]jb*?p1cq:S$NLHAn)eMOLqiI\PpeUhSl(G^-4H`WVCG<7]Vh4i!U_Z>b\'kZf$1I'2"0NlS5XXH\hW0+tL6tIa8gWqDQa6SWil*jk4V31KfU#h!L-(2kYC=6RZSMKj.M&W44@Wikh*,8+A/k=b8h5/*O^Ei T.X=b?\bmFe4p =Y\%/5Ad:(39>AWP#ASmINmgl"gP8&^icBi;B?3,qR,UdC*COaV^0r9^j'J/g1'^k gr`W+8\reRBgta9P,Tao#^njl!.aR"nT:YQMp[+;sLi9m?"h, J.7VpH.?LB&'75J%9JoR&iS@9[rK=UldXCCraQCD_O("f>ahCTF/-Pq,e*QC7HO%sAF9-@XEV5QAft?fZ+]j6If9?D/*Xq,>H]8qjGaZ,4coEai+qPAnrsoL5!OCPl#OQ2Qj9SNTT5r=@-ghrL#+Z?)f9Cn\^+VT4['%"0Apm \ajn%s;She/E2cGUe6S7HifFtC\C'f$Drqhgn6BknpXP`&%lOi=t-aD\j.X/SAW)7AIZG&UWi_(%A! I9pLp8hgsS>;Q;rV5oG9dLDI1=[E9K19`__]/68q4[nWZ+J3Y0X Xop\8bDX.*#el,[HVfpa#`@JL-`dp)[Tk#.:sZG[J>9<e\W=5V,lnp4i,<g_cmqV2O;)W5R`64U^=Ad`f>P$:LU$DZ--9Sk;"PMja,,b+r*i@qMY*07mWpi@@c*@ G'%setr`Oo i$*<)K6UY/`X<tP2qM,;.An2aS6=$B86<"3\3!731(Y<#tL*X0[B+#BEn%F6lHP7/K$p6 bH.PBt=V"Hj!-T_ 6@Z=drG0j5djnd'BD,"*5],!!W[4epUO)E7\jdeYUbPAVq'tY<R:EjX0/EnMLIUffM0"TB^$XPVSGNnU5K9XJs-4JnEsr`@4-7931N%+\gAh*>\3./4W,<S/RRGEA5o)#Z6MSgW<0TQ&V7f;*dNpn01YprAAPoFH=&1Ta5([9[Q8#D)+Xq)AAqE+V(Lto<RfAJ,e4/"RCUgIcY&g,:IiCP&i]?p>cg])P.^>ENU4ZbY,p08=b9KW;06emM0r2D]rk7*eq>]UYAQC)68bl4>opCE\@Cia?Yjh'DNB5e!*%JLf=/:.eGj+P4?DC_Om=IFNsJ`Q,R`E9*te+:d6sR8O$k?=rhKA_+]7Z]$]6aNKc[mmE,:FtHn"Z[SU`r.E6a;'n` .6L1QO(!JhXaMIO@+Qsq)'+DD-5?B4d$!Oqb!;,%/c=+I5tW,Oj<^a?%TD:r%f_9U]1t5js[JC>f&O_cV"rIgiJs^,mD?<?a#[6G(U4b@q`T#6eJ6.Ab!M3#lmO?hsEZL*(dkZ]c2=tLk(,oE6jHZt&N=UMKf'-,$$)6 #7**I>g(;(_GAV)i\M)[#kW''Ur!O*kP57AnnHY7[47,R[&9SbcXW*BVr;=mr8+_U,nUr0I_r^@ br^=pAgHqka3BEOph67]1U#"j3567IZTC*`oGdO21Q3l/V:m7$KdVE;bV28[Z#G.F^&cISNhZ82.emT>oY/^rs.//X=<$%]BB"528)tTn4ETK _5C_IZm;"&."APR@,;=JGk6"o.[?<%Tq4S+9WO,Y:aB#0J<DfKk(5b#5sT<s>LjW0#Sm(\nr`o/sP3Ql%&%j&<>doic^smX8+27 '4\1M h_0q6)99eo^tAm^GH!C'QF`e5r:ns#*bFm7-:1 ](B`E2trob<6e`^FeI\XUA9kMIt0'M5)T_IoX5pN`2C*E#\2AcR-Ns<Np*/%X WAd`q_JP_gEEM/1(Do<C8XgY#Dp<Xm/%LQ"81F5=N2ip?Wgm>d+ pqo5=;0JsKDQh+'kN'%;"o%:ChHIN$R(KD5)A7Jc[eHBs'!C1>3m(-fGVYj$ZiX/Q7HArA'Mn;8r.W]i6m8/f,>4>XB@MJ!Io(o'T8A@s(?h`KbIGDOkMW_XCee:lL;\#@1I:YO8,p&dMm]#h,*B[o;-E%qUt_O00%l[_BkDt,Wkl8g\6@:S#a302_O>dZ>*>8)Sat@-\/Z)ds3.<cK]r=m?rMJRU//=EbSR$cY=SD2([/I/X\8,[noB[3;ors H$FV/;4C":NeS_0Q=R$^cai6:+r^/&Yl?BQV,?edHXV]5IkLG/CFp[19UpnD9sA=ALs3&8WJH-Y*r>t6]-a:eLO/0_0tPT-Yen9(*eGfRT@F")SfYnV,$?L>%q,A7NT=/k'oh.kI9f.4kQK S(%_X%`:"%g0/]-iEm&[U\ARk8N+U3bl4(Z]G$9_d'hbSoK#bYreD-cQ"]W1T<lE#l1]>26F@^WsI QV,cpI.<WPTP<L0AWn,X.8N826l+S`=o^_M"<<ALZA/7J`TA+CmW%=Hpp#G.LQQ7,-+d\X_;XKsIh:V;?^EJ[CgDO=W^d5[HJX^sf<MV&9^EGckgbcj>iGi0/^_H5W^PS<eaIa+!`I#',0+8EG_45qFL6`VqR<?0'<+9K#6@b1iV5lT=n0;")M_As1G#6s;+SNtAoM"@po5<'RV))KZnbo#=h7%Kt1C9glfp7QdoYlP#O5<ne4nA`qaYG(p6W#-<'koFtAo$aZ/iWiDlbLFj)hl57(eVgAqV:r\VX@J7?Q2dK#4JmaK6e[AKpS\:Yc=Wm=Qc*a+n=HP$8Rca8V4""'\Xqk]Z-(ER'AQhAgs'qL4b#R4#dfJ9ZI[Ml^+ V5Sgj&!)!e"R'qLoig$a+22Xg$%Ha]aIbfPgUCH/Of>etF:UY-Q4GMPIg:1N-Ol;P#iQo3i4CE.]eYi!b.HPqP8?8rqMK&)%ltAtt7I[2Rc,.F3()Il`)9B[FH0NMiF"imOiBAAQm??^25+I6r6eonS@9&nM5t#5HMGTm&V?EMn(#^6B(X%X_4*o&["<gpegC;NPVl<q!n^mh9(G;!9A44i$aG B8._?n.9Kmt_Zj3VmR2>iS<lhfLWQ"r\(S.,[FedA P[:eI.[7%1=F9feY+/-pqX451L:lO'FDF99QQr3 N?7)e8n=JR*B9fd'CSUR],Qm`e@9#bgTe$TNn;aV6#'!Fl?D%QIa&S7'dg,JOJDlp@ZBl;Q#_-Tg";T. AT#NRW;.50QJIm9aZglf5YlG+?*"h7hZ)^Mp $`9&<2X_i)"snl(JEW0[4)D9A*/O].#e!*V`YXIe<;[*W !UY6+;+gMZ*Va^Ik&Q;_`Tj+S9S2b86$*Na;?ial(-5HWQA'T;rp/kbE/#9>mAC77R<pmk,dTJbl*l+&Dt4*$5l+L5Kd@W=@@r)"YYeK)RQhDhAWtU;jBHjg<n+XE(-4#rZ/G*/Ykp\nE;kb7JZ WdR86< 8.V=_O<HcE8cdW!\\&VFIM=K9)ZJ37I<2SNB,K`&9FOIdcZR6/@-Ykdb-hXdSi,5[#gb(t6Nc>7$h<(k9T(XHbMA7/&C:WHXsLIsj:_JJ*Pjpe$sh@tIp:F*]"#H8KFR=QiEorEFC2VZhO'(\4^C9qN<UQIrXifg19elc4/Ebq;8^U_o9Xp2_f(SMKRC<8Y]#)eI':0-CiAtjdVV#kZ%!3Ja3UftM%_[FWt_ =*X7()b^A7B]M]dog.cq;b56+MLVUB,fO0<,>Qh,rjGm8[JAmGAC0V@=G;mMLn%Va\ZK>niK0tYo9E7\)kK\U<#6(oX1Ngcf?Mo;dB`lpDI9fVs2>#Hf>LXnq7PtYp[8>:NaCgFI+Z@#As?kokS9%.00\jN"UP+F9*5dQ:ph\)b]Lr*Z:E)bkl q8k1L3mKlc\70&ZNfp7Xq&3]dNg@[T3&/p,id;XI54:&`jOVh]U"Gd4Y"gq5)\n4f!TN!A#lCG:4NV< ,%p`b<-4q\dt^n8b&lpgM+dc/HXAsPgFABAakW!5h38tHVne0prOK@GV+Dh;.A1#;WF5Pb &)A`Has6C#0[TASJW&\8JYpDTHK3_DE1RTlPjRrcm;G&I88C2CrFY'Lf;8c&sr&pBrTSsN-&LTj%\-ct[k^\Ro8JPP% J;Pg]p&8C7`CRLg:cd+T=L*p9VD+'[R$EPM"iniN=s(57WT0eU$K:l,;rATGAKKE39d=`!N-VEA&5[b!MH?;.kKP"XrkJKa-\kZ[SLD5VO,Z+J_lNp@2\HE6^^NO%l%+D0^c9>j6D<\'V;;6[8hd4)2r@\">!pAjXRrKW_:hPT*039!&)D^slWa8AVt35M?6^?8)XTqI*9O9$SGsX!cbr@t!.FSnIGf"_TA(FO)_DGr?Cm"*'hhOkF)C2fiNoDP8YCIkA!l0gOG8bCXsn.F'3=9#(A#r@K@Uq51k=@_,Qmf4;^p7XqnGH=0h#]p](HJ?Xj[>r>?U-4ZH_iR3c;LenPcIF/4\*.ORidj\:Amc]oJ.XFN-<es"F#Q3IA9>aNP")GnN[r.A9qFK;Uc;f<$%X>U+eU]\#pj=Z hqWM:MTq$/&N;eS&<8TLd:&Ab*r$I`^Tjo9Vr=O)->.eWoX67"jKGNfFA%?q-'EK=8g'_3k:PMOEKE66cTU99+#(D PREH#Xer)2ZO_:4H:'/d Hp!I)nqOrglfos*[lJ#rR&]ShTa)$W;ZKenVk`)S[8@?B*'3dHLh$9&h*XmqI]Vk#@AZ"RV8n(tC#LlbRUJ?(hjnf)ZtlUY[ sgHsHKC%1nREJFq+@D.nb4aA!9pS?c$#$-DA*6GQ568LTrtQOT79!lk2d F<V \=VL),,A*r7Z`\M8Tt-h6b"kK0iYt<3jNM1@,16$2'fZS#6XF?)@U 0paO$6SGHL?aq:nOf1 F=\]]8HI1qMI^MVRTRK8:rAMciqAYgWp-;V<*eim;N=!c,ICQf.5jD(U*Q"s9mbb +kppVO`fBYCr%5DOEt?.=8dQ,^JA)po"`]Aoc&dVOHI"D[2ZQ&4LUl:-OA-LG.k^Yf0cfJJP)jBF]0;QV_c\^J[AbN6.t,*Ya"nlm,m%$:i(LURoO=R7C=*pS=!=:El3k0PA:!Q2YLAiNd3OhDTX>Po5@"s!WY7q`=s1(Q^S90M#2I/3pHgkr=3IlK% 1r\_'N\1cEU!;668C<oAKN*1JToC/'IakSWG2lc`DA5E ^eL6(#RcT3"c,Jo5EJ&(9hWoq.];E;6#Hh\l5*es\7r5h`O*&,VFX>"1-W-JJErl:VNKbji+2SUDcdH0\3kh>c26a1h#6$8AV3dCAk<5EbS1Z 4`1CE7a7ELnOsLFXTVF9S =N$7b4;a&,7cUY2hr*P]nX06GrASL`<\03eZ*[lG`_k`i);at3041D"Q$`9L]YVZ)Im)IX<\62,DmYMR\HS"t?]o1:NBtH=[:>b#K&Y,$Qa /sl][0 &?pbqX>nU?)1#?jkC0)^$T;OIEGAQ6RT>Z2+')DgKA232na)2586_o1=A>?mBk.9\J@isKbA6//kpEdDbA]pCoK$f!%#?`e;Y-;d[<`&+=XS\&VAoaFZWlAJ#N\)4E=0tMCMKXk$6 Qd<#5@rNCh%7bQeAke(c)Vi0bEG/"8`maPqA!RC6D1 ZH8ME@A_[flBH_CGObF\AAL];j<a$\sCpRQXhFHJ=+IQ'Ap`NnY?@dpaXiO6'V'9=]XA:A^a@dD&9$;GmjRT <5BcG=72X#SW_-jm8NZo *bf$HDJT<F99b[a`]5`Aqt$%lr0[-IGP1m<L1tElo@J567#/\[)q9J!$q0RcS:48tfhg\?8I9B)bd)qqZo-;O$?! GR6O X7E[OqO++"X2oFnYr5AZEFqSNi!MAAJ4>_@Wkf?hM25%P6&fg3/0&ZQYE4(ABStJ'qKG&=YQ"A=esLc<W!hKDoiHFYa3?9]",+Q'qDf\n'qF1*Y3q%.C;,es+'SXd^dCto,X'<ZEel$Q1kos$a(n$G\Iq[].13;`PA4'qEA?X8o !Nn0!e5D<`m&GpQf?AL%/iV\WZtgl4jrC=(5eOQ(TAS9rj?5%,]j3>a`BO5b\!,Cs%U5WTM@Xe@59in0#Wnl2CGU/f(I.nnh8d9nL:.ha],dL%!O&(;Nq5MR]r<pR\#Sld##DF;Z[sJ9eGCe1\I&V&qCqEh8h*ttJpT5X2eJEi(Kf;)JQ`%AWI4g/9.*=?H?2@3-:$BNSWXGXdX1)$-fNk/7q72%GgVXc?7.%-7` Cg2ksnoVOp#K0K1'N*1Die>N:/Z;ga-Rd_JjKB)*`_4T'2AY=IC:d./8@WSU1) [8s3E[W#gm#Y]g4;[r>XD`LY)lAF4[TCgf$-_4' 9MH"I=N+!+g4q:;4m9WI.n/0dm?!6mW,,C==\O0^I"PPLZq2b^J$q?gQG-16I<rW'6]$dII283 UUW7V6D'[Vc)la!]N:Ym*K'^0$U]RH_N,U:]fChQQ;\"8\A.Z"\1-!mP#3P"6TY3:Q]6Dr:&6q:N9lYU2$QEtY]fR3aCR5P^#hO4:X#--91cW8Z96HVZ$A8P'm9p,8-2_R-Wsh2Ckf@4+@Ys(UoK@*CE(U":0=1OA_.Rqn<taYeNB30THNp#c-7\ZZSdGK>WAdHt5a>4J/_ls R#6\J5$X]o%<%'"3 `A*]=0>+@dhpC!UWb>_+;@E;ka<HZKR8T*,"<7J060U">\a h9Y9M"7Z_IET>)L k$d<W#+Y-)D,lI'Yp;_ACgMEQmhQWtn!$)&9m(F4VZDP0nWM,;dqgGt,rFM!A[#JCK!gfSE(h1im]f9lW7RVa<)(th@re]`/:Cgs>bAaL9]AM>As=oO(Pc-D5@p#<'NM[JQqZT[P=BLtscn*t6C+EYZ_fh0QSCk$LI0(a&`:jtpm6^%=L?8?]\F"P"C](I*(^fSr'$[gatV&o:&k?m^:PMi.f?//`>jOF%`N/ 7-7N>d(R5l"q8=<L2b=?Em0OkSR.3"\rG:o50,sp0GhRrS$)e%Af1^11B)^ER^@mjZA2%`/T]0Yq<A8`;XtM[+[,\S8"[\RLH/tc[<%6c mrAN"CkL=bVE(M';(5.Y&76diNr<PDD1ik*]7sprI) ] Pa /l.@O0Bt9-G'N[I(QGYdRt3&Gs<QgCJQ'DU\OZ$[8NVro_<T"8dt=Ba&\"MjJT[&ZMZ@'7 sQ.bMcf0trcH],A _r^A$p/*7\mZP"*id I>D^C0(-M&tddJCYL:UdMj:pZPmi$_;/0cb7H/1?AlmR(S62#F"e,&CpSQO[m9[-,&dal@DWZ.7+H!;etAsatJpZg,i*okI,S;8Ef`rj$F-N\'%=DM\;$jk (Wg7!2531OQ;Sj$^j^m0jU%(l]j-e$RGirG"po^71[Ie9h+(OLAU9a D4e/HbsAn<P,5@RG'M:#g/eVa@<@L0,(7)X7<sVT&,R!0V*3c%Z8tkS._Io(Cp^)Tah`r^6FdQ T8p3fXjBQ82bbqh8FNC`L[i:O8CX#c7&NA5p%Ph7Fj=Jg4eTV4_8^fBm.:L7Cqqb^>e.d%SN;;goAQ1_`SV 'N*3#kBs 'TfNp`_JsMp$VYrcpIG9C+pV7[j4d,5N^\EK.q1ff!AU9AQ$44B8T6Hg=T-E%"VjgbM%dq d@13`UgbS?#6I$pdl=Qb"p1;A-Q]0Ro]bA "k&5G(8>0`#6)JtrC;_hdrU@CBBrb'%$C=ohkmZ0Q[\1a4A'8l)nA&o0#<TM1aXEGm9.%BqO^dP(H&?q%?'FKQ&Y0g];8,Y-5c"f<1V.t(%#H:;ek!imGA"`(k8+.ak^_CUl(T(eZ@^;sf0!saTpj)5peDp?ZE8?S>n'=3!iZCh-<:f'ZOb0<f&)cZr,!/r-]^I<cQd7FfbkOOQcmX@p`^^4;%OKtX<pLK 7s*r3W)kWFDn^J sjIQ4/^Zj=&7&Z:\&+\^%4-5bD^siO^5:&F9d'I[im#fMPDHhVJJTpJ/sAabPtV85*Qt2`_!2GePMb.g7E+`D6)]:dFAYm)>;C&mAF\[7(f7=KfAhpjlM7RT)%=jrK%C&I8J2&E8,+c"mag3<rUK6+FR@M'=@L5g.t#$k9Agjd^(-I@C7Z'!e!''k`[Nl'km5P;;#i"OfWWtNVPKpZ+6QS%\3l;Ot;d+NM,=h#Nn:&]UFP2n0_>"re'""-#rrA?O _0G;KM2gQo`HheqqRGAmAm7"I3r2WYc'eeioojXT"V!hZ3`D\Etrgo-O,VaX8UU_#7GiCgsXV%-PK1(JSm7R'&eN$kQ "#kUArkU4lS_VQ;rVsiQ &@A`csf1E`*+EjNC59F[V\'o0$#Rhbs)><^/Q^/bqL3Z3k. [Umki)clEnQN\. s]S+8ZF0?MBlAqgC\[o7F(1WQ CkHB@F>BU2f2Z>AZ694KkP4q;tkSKaoF\RJcB(+-92"7=6Q_*$'[h>e9W-2,'"E#:D .TqXm'"HeM?]3-jc*(T *QET<^]bb3m-P Y#-\Ql'WL\X5r: H_BjbLsb9a4N"Eb/Em)"hc2XLIKrp.QIXGDL.n*X5A6:Iob=-6k;SAQ_N'>e#C<DAeL=8_GZQTE*brM,-o&FALgF@G^i+HRLB)A=H,.(U5tW_"F`>\G?BtOAd%r'H8aX7%5C.5iR.`,Ng0CEKL6_:=UQ7F])d6r(Vo,^O6[I. IJC(Z$kS-sBWMT(mRG*::NS0$Oo!1O<e!7hE:R9hJY6IE?as"^YBI#/Cp'9YGW`V*c>`IO,&)k%lQeG4&oQ*2\aPM8]Fka(/AH508dooZB@\\I\5;iGUNH^;S]NpcJZ>j!EF>NGe<i!2Fr&"T\cMiC@K-h2\g^pTTPl%X3Q#2%t7H/cBGACb/q%>rU>On@+&d"5;;Lt2A=N;$S67l*ZT@Q%7A&t&c[&04&C]e3M;+!:k&ZpA`B!oT$CJ:IJ@Zd>ki/!2_-9/'mki_alD bhQB,nUVA#7dW^8EB8?R[o.<B^,*,^7%lf.LEp-pHD>T(A5E-?80 DSoTFEi0<plbV]/C]#gTHPoP3.+5kF/KeAOUeW>4?%h1h$HL$L-L=nTrHlLAj;q^A;lL1E\XL'p/B5/@9orORMon>Gmd+6B8_r='+MABWfsqL:ipbmcc[lY!A#^f;AS\(\;inAR$^FTn<6%'<rGA KY]PqQ(B CG8km(^4*FaI#9/AX5dqWkn:)DM5eNn.iLnl>P3dckS&]nV/q-mpOIgF-6\kriesO&TM;<HBX.]iUlX'D^.Yn,HQRL08N9l7)9F$,hop&[:;8e<`k4."P?Y,l8C$Ql"hCsEa-8;e!n':))D_+qCBYZPDk0hci5ZoNKr$t5=*U[p2gr^\Fo[R.]T;U7V7''2&N*3KSFA:`3NcmBr %A"%4?AACV9YH`H1p]3S]Xk%npQMk/4%)t= "rRRH@o)9g_Akhh>B9hX.[d[>qbd-J[Bmfbd_/j(OVKX83N8Df"4JX^:CH`\fT4,')p$T#0XGfAqY`i]/rm7"PNQ[e6J1OD#LH$QYMMqH1%QL.[tW $etq=r$F=YA^L>DNj4Y.?_C?+2WppMb^:j!.=gl1/<Pc"V+0mjfYF_<m!0t\N`k[kSTP:Aha n/<3#"2[Wi'^?.r:I@!Y8P< 7seCS0OBZ9](A5?s)Gal-3UpJQ**nj.`b^1O/f:*HG1DoD?:36F:*D0U];^Eg+ PR(D)['@Y;0QT4L>:?pBa6#tZltcS)R58;MR09A#p!Rm%RDaTT^"o@-C@*%<;)q%/4.W)nB7^SrWMB3l>$3`UfoUkbgRW>FGK$M7c:gV6G4cWcj(+&BXnc]6Tp+QP%.RW^'-d3Pq! U%l'j26D41c H*(gS3NiQIsa]$Ion p8H3nr*>A^qpl.W<mL*:J.4RE@\g`HXc)go QcYk.T"QRlV9XA@N"ei l=HN</:l,m>[6)\-o+RU]Ydn%s.ON3@Ws`O1<TUEH]Vc2erbp.GYs"B'0K4__8YpA=E6+R1Z.Ad27;$!T_L\#7d%;4c-5T:D"!4h7koX+m2,teAq/H<]bBH&@.'hi.g8J[?o1E.T ^$::r:t&V'oE`)F$;jbOnA24MY2Q59ms5qYI`Ai`P&]'V]fhmi6KT&ZO:1P&eeUZEK+ 9\-00jsAegg\+0;E+F)_A*ptF,?,/dVZ'FW>*qj/B5AVF4W/-1!ib\(B9@a^gIpW;e96\E*d0'bmpb]\1)22,D(jn1<Qme[^])fZCeD>X?ZEglE[U[9;%D^n7Ad_P7)iAXj@tOFI[@4=>>%[g87r8T3+Pt<)4)5Hh>ODI>'?5@APJcV&bXH*AY`<T$(Rs)a.+K"EHpJ^-Q=1pk mj%](g\9<>#L<4`0ef;N?<EECbn]Ub`W5%HA?):HA+_+cRP7#fimbL\e5SsnXN'Md*m&1#X%1?d+D6pNE`J21s*Son<O)i'jcnCKA$("p+%ZBL3-+:L=1Uhi$oP60JN)T@Q<AM7]Tss+q_V.d+GjYG@[9+D!G+`jS6_sHq]M-acLOb3+*!_gqp;\5Yo/P"joMkrZh)L5fA0W-_^Q"&^lDi:aWef?+d2p>aC1 P*76q!4M&T3T-/A$njY]p"KSCla\=(UAaWKAi@>iViK+" `]F-EJk2b&_:6OZo9rJ^!tWW/OFNC<Y?I1bK5o1N1QX8]iAM>N<3lF ES=MTpc<kpe1G32)[*p`'At?J> S-AnSDq0'Qf2,.)r5q!MQd03c8g=VCR:)CEe[2HVNg*7p'+Bp3^i#3HjDQ(7i#!!XSAmt 4P-K;,!k9iJ ijHq4k]LZ %KNOA+kAN/^X1fJ"2I,0#<1mlMX59[XUg7ZEm,$GRW\L%LW>Go/qCES.A-0D/fBHd3R("7&n5[Vi;&q)4Rt)js+YEJg^0 &\V9A"KD&8r6t-@=$>! (2aNc:5+I02R3qS9Y n/FBP%$;&T8Tc]_X6p7(;*D)m5<#b Noia*7V>Wha)9/Z2i VW;S"8h=LsYpW;%_.iM3=#g`L][H1rEKIPHVV->?):`8!*Kr2<f)Js4rEP9p>Tl?hq!LQ;\4=rAfL*Aa"RgH1_lR&S?F5HAjP&T0PIg4XLAYRAh [a1Q+lkSA [("*1BWR+$W+i&G9q1][oPdi\' V_1[kqL0K3ID 3h.MCX@V<8Q3PDP4K@=]ob7A)cI*6YOkn\"R=o2@2rXaZ=h&&8SLr'2?8ht `2Ygj?Td,lsoe`b9c8hMpQX&,:o=A``PAX_W;(+4)UmgC.k%k1`?HfBg(.l4%r2 b;s)4q=/kU07;*Z!qJ/3_n$j9"=@p<([2LfI7M`##'[*meTIHG%AZCXWg\6SUo]>aLFk'&#RA5n:oZ,2raU7dIE)l/eo6S<6^EL+tZ*dQ^@m.nr6F`-;sX'@'hOcoT +D)Sgg(\5B/7%-ckN^1gB7<M-*YI([hqT]s^4L7+,6<q%`aZk[8M.DOX[XBA3q350ViQ4nAsbS8t;X>7WogW&+=4:f"d."r)paXl3>HBFX6XEGjLJ3*ChXJ<s&`2oCRXeDTQY[OLD8`t-H\f@\1t=cnB =0PkQb:FM4tc2tLJ!OBR#VU+#mS1GI:Kb2L%Q`"*Q55c5H8-VnAB9'>S)k.IXhHZXITitshjDD;mSU43qBRH!,MK$AD-&H 2A"H?q!dj^rZ9= \TYg;[G`SU/@>A`0n;(a@Z/2O>^1=5);qCFnM*3EnN-rSQC ;"+$BK: ?ZjaHJ,FCq>R@cBhXG6\Nf?Yt^99f!pI2e]S1*\p)78"LIY;AY+f5%hU`s:heEq;At/0?^2n\V&=pP5/n`KPVO9UFmNTgdZ[ZgVA`\ILfOfA/$\DXq>@QZ/1AC:73)shS_[o;&%iW<;^2M3=hU'@TOmK>A#)OW`#A:N^@bWOpi@[3st>adqdQF>5]CsdIlI;JrleEc;"dtUI.iPA6A:eTAs$G^oKcUJ?+ct4idA+(`C$H%M?G42c*h(3Fa\7j^#U9(`34N8R1b2qJ_dr6dhKdU62W2L%];]8MN@ipji.6s*fh[Ji@bJ3Agpt_cIBU89Tt('!t)B'J`3/,W?NaYSr92X9t.n=3A.djBQ3Sa0p:@8/oqFPYh(*P42s" 8@:1D\>nE*sn`/"^ATJS3W/?atV?Bo&P8@m1 HK;AS7+K,*FEm#<ciR%3'[*GYK o@\DojfNB4?*!/2P[!.<rahUR!U5MDX_ka'l_h$ cKWN"XN?c:Dr`)9'hE[2c6mD[*_OSGnj$65o$>4X9_oqJjXkHg=S^#8RWRp1`!j)k*PY. MmlA&1\r@*t$//AKr8F!R^.bqmse14(AF&Z:Q=o*LSj:>FpFn(erd;IsnaOKAmTMH)9G8G@YFp*(#nh95M.@?iX9,lK"]%r<HnW#qJN=[^I*9=b CC</N@eVcp_AB^+N'ATI[FW:73C<4\*>><p<^' T01#ekmY?7leqSFN_a? jA4B'I.VB_K:)P4#;<V]BT`6=ho)Xd]k<g"A?a!!&o3C3e=T1D-E9EeVTo9o7BPRB7?^_A9L!^Cj&h6f4gDqOE_g'$opkBmGp/Bs8g+]`(LG\#A<F1]=%\@e5"9]D4c3="g4e:eSi+8@O$g>b4#CR*A`cT9q%CUV[_(NYU7LJ%ciL(4P=DW\G]/7)=M31E=Q=._hI1+(Y#4e;EAK9!6qbZX7 9P9YY8q7a\#PeKlAWO5Z5A(1/@r<VL=>1?J@FA:X5[0+j9I9,#)>26ScaPBl_T8G$RAk4^b*K[F\k653<aALe7A<nT8T0 ^mZB9WlJaI))n!l??]`9SjfY/\Pti$+B50"hp#ZWBm5NW-j$bj2)02!^%7ZoFAZ.JZO$/%-2Yg>JaN1Snf^lBG1o=[$7<``l1jAI2TsIl-;#.16D%>E(C^t65)0Xm0(CkpN9F'Sg]VPQ`j/D3?$G+?L;)$[Sg$(^80m<].TF&C+h8%[-,ojf;GN8 qWYRg/CPL$qj7b?7h-D24*G1mC?c;"Bq trOD*aHJ+8:4M1'8AA,r2*fK!%&P)[.nQ'af=`W6<gE9T\?)l`+--aAJnQ_OSo1=dmnEZmdR)SD(+IshZn+`5e2"Ba7,Vgb/'#?qNL06;<&#BdQ]hS)MnrJ;XT::XPK!5"T&sc_@0X .h[1=.(;cf5*doeLi"=?Pk=Zmjq G"YZP&o4^MB("HBgZ?[k2l?WNBD5 :,,[[+o1#Y3koq(p9t0MIjV/dlL_-jJP6n;[/e*XWW$'SH@fo@j`(c^8R61arG&O%a<ZW'7]"hY":csZtB-IW2l[W)N53\_\ M DeXeR"9P`<>/0:h9!9W06U2&YW*=m/K2@ANJl&KPS"e:=S$)sYC< _8E*4`=d\]NMLW!R*=5H!@g4rV7F)AtX0!^U CFP4e-:b?0AOmp2+UQh[PYK2H;@\cmW*!QfTraE2BFWQ]\M1jBphT6>_?#8A]'A./9<kY=+Ip-?5l-&Y1Q./Ub@Bs+Ae.3s7:YTdSrKF]^li@*( ZN"%,FL93BPrOG.A&7I_Hk0*C2U *#WP3V"=ris;oN,*`o[iJ:"RrHIOQ:e$FQpcMqLF'Yc@ERqN&PB;No"YjE+JlADehI^-"5s+T\XNho-S<,0+7SF)g$!FkC@r3$M3 _sB_+'^'!JcQ6-qL"U<3=1o2hL,% :jV,:EJ_1Dft$6'^7m[A:alJ.bFa)MmNkZ^T-SH.4)Rk[cHY(7T2@I8Y[4XDd [!ioGAh$<7?)%i::pZP/p<VE"ZpD.@M)DD,R"Z^raq- p5%UNiX$_D..(1,6e1oeAFI7#n-C*eSlgjrS)C40pMteohS`(l(?$<TdWpd($/Dqa*K!Z?s*;$8_.XkJe&n;8L>'.[%o8W_KcWtoF:*>W,6PKR`P=$N#*b*R.0.F*gIQhgV`)j3mcLZDpnLK_*&=@)>B'.9sP4DQV%dnb]>=.f+bMq)#kHHUJ^dC7"RiAL@QDLj#r%A#QV)`5.<WMs7@PU5,<9Fspt[AO#1g kTcl+#^,ON`6;f;);<?a?g;rG.N_#eABHX1.G,"\Y`V1Z44DDWo^4gKGiWTAB;g]';)^E2t_rp29&-64<()@No1`q-#!VDe>6esha9J7*>-[C#:&N(>\tCV*aB[]$XQ3S@tE<$%^Njd>#n9>.K.0A\j@pEbP:FBAt9qap*"GM<X\_gV9.ElN>$]=Q7 7?kR7l6,)fXV;^^GfoFNL GVS.ni#P\@Me] <&>H5o4(B!g9<F\+7_YY"fW7'$\ebd_U.s-NeAi><a'LmjQiUj!@PB<Kp#bh1jPfhb;dKE@6m6b,T,9im,:$KL50lp=.g<>pUY5o%[o7dnYtg[PlctW`5`T.RprS0CD2m?*/a.?+sHk0BpAtr84RE``9iK"^$i=aMg_e79AMf_p1qGGjY,=@>E+E%5Ft PLFgKN$;bA)XYFNdg[1DPlck<NMsAb2! @0t=<B>ss5mfe"A>Sp@R`mL%KDnZ/=HU@ZA&a,N"cA?KOY*(W &UZ+f]Wd6R`;<p34mA>q)bgnJ(m>9D/c"!6(ki;AlB8UGY-?0m6l`l[q@J;.`RF!^^psAIHXr)CMPbDRNJ\dFA`oVG1l&\-?I5QpAQTF+RhF'!#=F\bOh.MsUKUKr;2:Arg'(Sn<Oc%2V=E0&LsO5$qc8dK"#`6a_>l$W078sP:kPhTiUGL[0Q<!sk8-8t(D&Bhs!nqg YL(hX!`Y03k:*R0'(f)A.,toa>!I$/!+)1i!@5+/hs9@El2XkddQ&JoX4f]cB>Q9#EfY':^D.I&Mtl.cAR@75]Q\]PbSlsX"G/Z6$NUe.$Q)+gGpF:I2iJ@O1HHEgA,d=ZZ:-jLe0U4QjDtN:pK.CV:d&_^:U(,EGZPF5rA73&L8V\ t E! Vr6\J;*\[NNE8QqA\(m1dQ[6VHT.\?PWq.O:l>"WAm+H^AdIs a_H\2FS*tLBZj=*oi7+Jf!T##@ <Kq5IqVPK9=WTOfIXX\Mm LmXd/f[`A&Y8gK)[;\$=eoWIBh<Z5e`Uq&^K2(%p.T JD`TIj:`nf*BsJIm\Zo`Y#c$3YE-PAQ24K&DE9t3a2rA1-JNo)6pL".L4apa<,Y@cO?f4d@d;Hilg[9-"kV4DKc45Z2'_?OnC5ZD$<`:A2+$%<KqP0W=)!6m(#1Bf\*r h'ZC:&"NGQ(`84k9(<U:3H[6t%@?OfjrtaR\+fJXFsGU&[tB23C5 \9h 4eF6b_p`8VsUQf1J.4M@DoQ\=hpcH>'gR\Rgh(GL0^)a\?aZ*53&&t!Z9_h)CCT"]^?XB+>/ZD>e,==9_YQOYZ@=4C%J)n5"t<7mA+<e55U)s9!.>s;l\?K%e@pCjq)Y5(QCt>[&L4m3kb&5/7'Kmq^pWUME.pNKcB Rn#b5Ti='Fr;c64M!@Hb:Y/O(=0T]K?8JnVf %(:H<59Vl&6o#ijl&r9SQl(#?Srmt'#?co"JSWBT"7)PanS%Z_=4aSf.:1-Oq>266R>OclW]*4h9_A,j/^V PDEN2e7cnnNn6Wb6qb4E-RXK/DC_nkW5roNrb0k/T_mjK:8)P@[ i^-:L]_?JE.S^im:89(g2?a8F\->fZ\\YqY$79i>p8l."H/EmBP=QL9JX[jB1N@,c,bg0f#=/nPLaQA0'a,oX)<B"@$GCO3CWHdAhP4PKJ$sH+Z3(`7t4b))T$WMgJGSp%. +?Y0[icHQ=e\GKmE5"pQ$>C0Q1TQLSYs/$;aGm 7mC&<o!2/ph`YH;ek;#pT7J+RO19@k7D0Xk4K4.sVX_aA3FZfX3(9Pko:q%PY.H:8@^G&pL__G<O+_o(Ua(n>5^![#d?bcRl-kQq+3WtiAr"EMiTTUB@Te@YkR`1W(TfAf8a?dP+aBj:A7C-eKSFcY?KOrl$U==9e:i"gA(?XBcK`Mo,)igG6btA:%C$6shNsn7=[`83AOth^RM*W%*oZ(I)WKae@:K-"Jno\#OaH!"gYq*Z^d@97OX4'%AN+lQWgEd*K,\=L,iV]!AY'o!ba+PXQiaViLAW P@Q$n!V9n;].sM$^o<.[mlHAcK?b*=XcROiN<Ch#k?6CicD4M+5'HA"JL'j1\s(gdS<*[^`:i?`4lPF?CqVqf,qm1MJj;o.V,X]50r(t-JTQ=Vht7!I_To!Y4#4Po'K'g#\;*%qRM& SAS/0"^]A]ZQ:X-VZk][D(N`A^7caVN+:X?%l?t,g>F]eVD9Yb*&iq&TWnlFgb e%1e1+-@ gN*Sb/1q;IZ%mDJM0r>Yo]i\ZA!%:8UF>@CDT-e&t[',Ag5#0GJhM''L'f7tli1A(rPBYUhe5U@\%!;3OdHa%qO4V>!B059/Z.c4-8GCm+=q0A]b;41rQ9W229`FprnZN1o!#.$^#eAp5R(*1K;/\i(I0<_ISZ>.?\^Wekbs]eZERn@5"3)OD=QBrN[krVmA]00HjR(j=.=3.#G&jDT%*%[0QUAh7RGV1=O>a"T/KV)b&B<%JOM?!dkEf-q^/d0Mq-Jnar7HsTWVeZ3j)ONakRK_FJN)[YTUQdsC/$^Elt/blPLHhiW81hWX?19KVeeB()c(piE0CY*HaZ ,dpSJoWHnrkW)BtO<pa?s;M9K`E+1]$-W.s7pCC(&AL Kp$dpX`/Y0@RZ5B[;1Cm"U%*D?.!__E<[s=$XbZhT2iVH@[a4JRDt@*XAh]eX<V,\NJ"hO1F@-! (BO:A<k7[F^_]2#B8J8%.r+Aa$^4AQ$#@O+Ig9gbX2Fc]=QT5)'8]5B2oR_:9]P*l+D?[V^!5h&3p3\]:5Ap#7LKtn<j0pmknLqK^H("h'\o( IIgNO'Y!i \nF@l<.\R2_Jia9p)89PC;McU4bKXm GCE3.BYl`Wt>Arr4pj?YM2555jKLI`2:&A^ad)s,#0K4mXTpU..-@*FDU@TX.N7>%(h:JBFtYkr!KEG>Gh5KstO#)H7Da@7j!erQ`_6qs3 $8T6D1gP!5H5\`nP-_TCk8CKoDJLNX5-jbnhU`g5:gTf>g#"\QUk=VoSJ4d@NMV)ZYmbP &"rDGK Q7roi.+^XkhrP\VX!m(:-,lEY*bd3B#1$*UY&ans$GBc*:E3=&mZM419#E/mettA@+'=grDQJLY^]GP42R;c?JZ5;;LCnD0a)nRYoftWdk4_c(5#A?M;*D.!O[lT\Mn(2A.$F-H&+P/rg&TXCZILAc9YjBXA'28IZ'!!F6A__mBA?D2CX1:H?hQ^54O\Ba;=F=?rYPk3)4.^c^=OV]b3??]lU%$!*g`YkAa!GRG+UQtS8=)A!Y2='d:;#Fp8B-X3sl'qg+iW.EDU5n3[1"]1\<^4W"oJiE@Ma*CdFJL9`K%-4 'lV:5'G`mj)[]bgA3W)e"3ls`aP%05SDcXSM]d$;-mOc/?H)NV/#j-bl0YG2K?_c(N\5AtW^7mP?b)3;!!$P8\2BRsML.(/,.9t+?d>2(BZCk4AnR?AG*Qfd=c9GAEfXIp9(a3T8Wbg&+A_MN]'p$EeTXB0_4LUB5YiXOsMigM*SY2?Z9+&=gHlk\i7*-M'TP!e,!n<o>b]0i21r6EY@/c,*np&P`( Y4<s^=Dgng' J"02:X%.ATst43Z;mN#hL6@**0Ytt>ntisD 'R4DV.h7e'=gchIDed:U<?P_d]h^J!(9JE\/NNZAoKFA1'''pWd]Z!HFt=+H\?U3-I1!#\;rHr+>?bR9=NO,s\3mm<lSm*]cA_`Tj"3964YZHtA :fYs:Df7f6OA>[#O+:8+6?<J6MVY3eog0oTM8!Aroi&1I//0]^EQk-kpob;S%kt11h,"s04 4fna\a]N)^5+Jt$0j*>hRRS@*VAL,UH\Y`"Da<J4R6""j5HnNI$0-iTl-3+Abj?DG6QMqq7iig)U^+$MN6$+dsm+^V4q9A3Z8!3i'ej%i0AS78EG2%rH=T5Y*aj@B=DnAgmMcU]W7b9-JY!+lVXTmPo(FhdrnS>ZcgTFqX<"UYE7F^DrG?A 2l3dZ<46f9*"WB"Cd]$&VAo!JK0=YnoF0QN*ATZ\$16RY(qg]2F5&\,(29'(H'8q!)V_'pI1l(R'm444.QZC,@;7AJmP.< QnYbCkEC]$2,%OIM)'snFB^4T%&X8RMOS+8Z\?J/'8/N\2Gb/<20A1\V0IN$(O.MDh]MhK+,NAN'$KKfUXb(L/A3EWKOk$Af7;ms"Jrs%)H#VL>#^90!4<KS35;e:oI%GRaF6""Q:l(Ch;!7I&-[_m[\Qp/U3_)a8s//PYdoX[##6TTXFL%HIY(T(;d\N#d8I55X"6k55Bmf1RcRB!(BB>2jF?(+btekZPD-_>RH/q[hY%eNS;MAMkAM3[E<2M*6C)HQ>3+I(I^hkgE*;Ai-e7-U53bDR.E?0#f2f4(gm"m%B[2J!3MPZ\DXn33RoBN=>op\XBU(.:g^)g@'<>Qc#9e?Z[55L]jnW_^Z5U/:+@/`c9s\K`)6OZ[go(agP,i+Vpbid'A:N5]Q8q%V@!+/*V%Utd_R?MU1e+;@:*GA/\DQjcO8H])p:4A^,i[:\<-1tj0VXI$->% /5m(OC&";77"BmI[^.8C%_;)AS6+m,;j^hKG0`Nenf!@%oT [Gnf.n'Q1WQ,SMVp\'rI-M!tHce><V6:k5-N`h2qAGfK%a,G#l^D/l q&@h0edE6.P C 0`3btXKsBKFg4:C!!lUiL"5D[+NStAEB;A@EW-_sjc4hb5GBCEQ3T7U!OE7dN31C]B_ &Jh@gN+^6hk\GDaJO0A>(+B67J`NiFJi7SP1>j>$)&T#)tF_b;p[ecN,Y?RN!$F!/_>;(>:;GVT\dJU#nO-qXhI],t$V1aD[/]-[2B1%l0i\E$fDCmGK?hnG^p?K_H)\#UCZ)O$C_&JDX$F/_o6UJ%'qg%#r,`1jE)lDL^B;TnsO A'mk5pi/1Mjmc!AET;Cot?F3[1J"-(i*X%eRGp$.nKfVJ=A?h)4B1W&b6=8P."oo,?VWWIo-<TdmdG2FEB>Y,DZ&DL7]laAWLW)$sI5\NQ5<.eJZ?5(h.L97rDJa4bb&AsH</gZ[5rZ\mWKlQ%R#6rcAbsfH1"Zf322_3l4(cT?q;dB;DrfsK\mtfJ12.^c!hlcFJZY7qY\S$OtHXpPIk<mY93^ %Q6*pEZKD@n*Z;:G<:sQN6,6[-tAegs4'`S>^!Q%=5iSD?h@%)<Te#Ad-R%\^Ahe\oF@*'f0 n-\5R:,lm/n5_]iji%d$;!]W06#\Bo@D:o LPPEM@d&JW\n**q&Y:R&E3b0>Aep ]PP*9f"q8-]Y$hA+/bfbe5b-p!"H(6C^P&k&sipE\-"cb],a[B.kh^ ,"A=/]B[)6L7'9B#LjOR ST/]7ID`Y6/n]D^j+[A@V.&UXVnS7.J0Pt)<-[tZqCi#sC2PJ*68,ngP?: D3P<!*)9ta/$=.'q^dIRP.*ec*2/^Y<k /V5DVNTMm%a!WONr<\_2/bWr:V2+islr/&*'Zk HO/d(QsdPjF0l! !-Z ; lG%9Kd[^5*5$'hPI4W`X0tse*k;Sq75g.s]:e"5Z2#-%]rg;!kQKk"gQBnL*6:\eQ]YOr/Oi_Fmd`)OB(1r<J,P=3eH'4n=$h%(-Y*;A<M&3?n?b&&J>dC&JB3Db^e>=g[lEAA"1G5p1`7nr@sDgt8AP7:\dFYSgB\e##sM)kQW=tmI?A)qqFKfGn\F>5cIs 3qM0\fC]KJL?A$.((ij8>";_a2[=Npr[H",#s(=I!a&*)TY]bt8L&bhPq2TK7kGdQQml<[*i]jF9o<lpXm7"R.m=nd@^d_*;*32P `cR:l#kfVi_Ct1!r_cb15R>7$]gK=dd ;>jU%4:(^nqQc/c[>T]iS9sXK_UH+UqrL!lQdM&_S7gr/tbFA^P2"#f[kYh.^Z(U(al5m@TL#Et$`(LO57%Q c^t1&\4dR1F lqANA+o)'@/IetJrJb%b/WR-$8N$A=d38K3[is;Y.#7=Xt)cQA:lX&.&;cdq!si125Nr#GW'f!"@jX#oNts9+25Fa5[jt0VNpBVE2<Z62'.@de_`T,K\!$P*R8R3r&cm+*q(dVrL0/]j1p/r0)LdqN;A3'tX,EmZ*E4IZl8ci6\^Wf:=J5= rn^2Am]c*r%3E//1#Z2VCD`\97!?:@qoN.#.%.@c'D7la&ZK&nAeC+.Zg>7/@4IPk->VGdg$ZOI`c? TP)OFJ8`%nhE@=SflQsXQr!T(@5hPA<A<G@B?B7)S>F;mVb@m6<2LKDedE(o@r&F>#F?,,\Xb0c"]!A31L(/7fUf4N!Z,&O7n4YhpK['K>FVE1R+oT'4)YR^,=FMNCUIa_hS=8''%VofLdgT,Ik*DggSD7*X0:C!'`PY]qfrU+76Xl"P?sZKmLAgn*LrcV^#mF=1'LN<6+[.@qTT0;0#N"FIV,F<_s=^`nF$tm"1h.-Q4Ri0*OI2,iJg05>*X"!i#_ctf)lV"?kn=1*0(p_]SU[%U4J2q,LAA,b-h q;BFRs6)kBgp'L/4EAU/kf2+KP_o";?t =44MWelLiom7@UfkO:N"k\Z2,=AhrY$s]'7&A&A;_I8Xc)dMP`-*Db9&U8>YeL<4#-d\eFCM3;YM1;A)8\LL9q1G[fCd*(M<R&ZTNICKqSkEfD_A \43Mn7e$1$oC&))W?)Y'W-0ebjkDZX;\5r+^b628MBJ1a+@brWkWEAagc8QihI#OP*Ai$KHhkpBW7.-(l:@H9,K$h=/E:2CsHP$8he3N7pql-?cPsHfmAXSROL`-GN'Ihe/I&ia'RhVNARA9a V`Lb!bXJWCn XQFG?]AN-?Q4!?sZZ``I%T<P l`&k#+^@3P"[ j/<#11rEF")YP<E-rPNIZ-Z;8 L!)X0kDa?-faOs0P"5D-\Y?1c6(;nUfh?CC)K 72J6E#Y^qmc)-)mmsA/28[9&4%-Jo>USZk"/LTs42#&YaFl1BFQ*-/)a>>@2X-(;ndjcTGT d`o(p8ESY&Edi;q9?#:qG'"AbAW2$aK/;.UjRU0-@Ih:[$n!c2I?n'^IFArki5)Dc2,'XQTO+5r5L(^N^PP $OQ',ET!pp5dLO-E1kJO9a2=g02OV?Z9DV@a+fASkLjo)aF"JNjgGZ3p^8g5^N:58?,)JK#Zn&4-eGrHXU2Z9OPj]p5$+/Z$-Q3=[Hib%jL6\6L3^G(sAZ;/;$!9MIe!sVY*c-)c9hX ^B8!`V0=CY5XW>FmA>3X+M2KiWJl#nRL/]<<=WG3Y=t;_j2hS?_12 X7O6lAq.%n)&@bbm-%g,e->2ipK49HW VD%@c6'SE/81mAL6?\Z0ig9"l(%-&bA@NPapRAeBosJ*H;e<K7<'sYW't &kP8%Be'C#,qA%jdM8%eZJ^U\0eTAbi)t?kZBO6`+rr8Hmorl.:&Y&XLTK%cA *6(cX*IPD-`fNEef;HtGD'N#7FM78r%)KdI8!e*ls7%6'(Nm+\/^%08*KBj4t(OU)6bdlc`XK1h3UH`(%o;10I7]=K-T-YY=JDoD<%HFfInO1Pg+NqW0Li]o>SBq5eNfa7KI\_`FAe?f<*aRKKmm4Y8\mY.E?a\AnRK-'nCM6R4_rZ&7@U".:pJcl[+SNVAp0QVkA.c_<3!+/-KpW#1#gPoTm$-AVaQbMm)+` #cY^(s1(\d3-pG[bQTS#X2e>jSN*6$6& :ZR87O>&7=1C,7q9_`l-f]fln ^b`^CQ^QI5%nAH8=j'Z5MW&BMi(Osr$*22[[js_:%J9Y7FH9^/$>%%L(e:gQR:f0;s24gOi&J%5[[39bQ&f/%CO",Y'QZ>>&g7=ag=@q&9Q*Dfp:7-"6hJ<"7dXNpIT1d;]"s8SV6l?9Ra7b=heU^<4Ackg^FQAVhiU;YdUIB&V_m2#B$/c.`Cf*AK[!*0Q@fBJ#X)cZpt$=pY:_&bJN<mo[hZpDtn>Xf@&01[g+j_Y<FH@@m/[oiHc:5gpsl;3b3T)Q(R^"tJ3>1bBqBk6tDRZX/\\lmQ&n0E:"@BrsAD#`8MX5d-;EU:ODs.Mkbf m:\"08hIRg^6C=kItD;WM$8[PMNbMJ)K'3#sbH6s>QSlh5o1Z367dNDXCRM4I)N>)SFn!:'E^GN0A@6-6,sETk?Ak8=rA$L_@39h]X%-5JAf,3eeCXHWgo^3VQCD mVqd!Hl\O$15c8dQfHVSnDCSr'0nDAS:Y/Em?DMWqc.hQ2Y*;WAK&CH7F'gWTSho?DTQOj2_!#LEBP=NA,><AaK_&KX;or*Qqc_A9t#E`p]$V^8\d'bOOG,p-S^9 Gn/iP<PLop_"\s&#fVQKZB(Y&X07"o'p7]sD)e/^gQ0JoIh^9)$%Ae04QMp*5#A+kg!e,l1`-2^NS[oJ8Q`(3,j1]81/!Q>KX5&>o;_PTQRO>\Y@0gCnerAWa!6D^+KF+YL.Z'b\-"6(F?g\OE;Fs0kDr"1qVA_PHSWXO&;Y+:2mhcGaHsS/G_Z:!'Ch<e_sN:0E($>Z7I^Z<+:?0.^-@IS@1@? ]: !"$s7!SE?(KJa*CJMmdD,1rRKD5O.6t:j6IddI-! UfW#H33O'YM]hLQY#JT;=5WH@V!nO@BSd-nSJ:8&k"0'S$Qt[-K3,m! RX'daCqMS-dfPHCBe\fEKRoF%ICJQ`NcG'M/SIfQns,7=>U[_4iF(LO(UgQt4h844%[s<n!gW<K?NPNA2DJT-6l@m_RX[HPt9.Nn,[rF/56mq"Xc`\&FQW:f[3_hC1!GGdd3'BZPt(st*/q"Uc9.ID(f9reXQlk XAA6#*)XTjWo>2_aP!mj4\1G"6fA:3./>Y!:&bP/+NL8:4c6+_-F +J_-[E[sV_J^Na&RTj._ 6at+M)2&DF98d.e;]b@4%KA9;F";Ag-"t8>l(-(54VB$\=lFO4[5tqc-,QtinJ*5]D#i14`&C@oSP9n,ma]*SXn3`;)fF6GA(Q_fl"K#gd$T&_Akelq#%h7kO2qN*YPY*o_8'2gXSmE,Y7K?"$7(KF[.C5imgT%87;WI^Tnct1@N\C!+qIT&a!0U"[)).N>,K-rhQ%p`W'RM<.JY@RHepUbb;?-3(a'r\;"hk^d[7H<I&3VH2EcAm T@^N>b-95b(/M/f4"so2f--WAPQ7-C<+!?B0SrE$eb.)m/-`A8+-j44d6]U"\QQdq`^if0mrDqa`P b0B/8cni((k(oTd>Z[]d8k\Glfo25A)^[)Z1pE&^5dN4HG^($FB4BFg%TK1^Y(:,M+>4os9N=d[AJ)qZ!o[J9$F:6/G2f[o[3D?+N@O4:U29OLK,acrJ:B..A%N[o=n3%!U5jleoIPD8Dc)SoT! r^B'a4=+%lp2%(*r"]ATCh^+\[KM@7 h7*9-S(fc_eaUK\AA`U+9P;DQ1HPb@Wc$NX%gOgQ:g2dR>0,e$g;\Y%D.BT_jso>FpDAFI$9I?FUMS1?$iI5enW`ICBJSP^Jmm)pjnB3.%s?-M<KLW+P0/njN1btYdLrSZc-Rt)^\oU<_=)`LsprFmOPC;^8@1[F61!^is3asPVVA'Eni)OdJK'7dqL^`:;t7^cP9#ph\R0Tl+J)=AMPBlFH)J,:&DR)OqXUt^+LZJA@(=0>H[t$612MJ_B'"R X\$aV".J!sEp`q<'>[nbZAbbm$Fl49A?LS%Fd%g;[ggO;FQ-i0B+(CS/-?g*Jm%1PH)gOR?4Q\IogY-JXn8S^Qf0AW<QC#]!sL1W[%rV.-,7s3BS#@4EF%<Z7\ao\Fa7Ib!//Pt'RPAM"^qK*8)RZm/NMaXWg=Z[(2Aaj^OM$MN!&$RIQnZ+g0s>Zt=HjmS[)Y'CjWrSUA%1&4>o`GA$gUU\LS[kB+,r`/cA-J.KWbjd4]X-*$g P\Al'q-d3q-AfbA@+_7k>AtIJlL$$M4qo21\SQFLo1_V[B;tT>!$^feIPTK)/)V>EYiEJOi`_) ?<BJdB<E`<nr=RhcJcqX`gJ#Yin,d?K.2 A@oo&Y[CAmr1j/1ij(2Ohl[p=GM:_1&:_9'RKMYPB60>c7Bk1)XJX#PtR#eAP&T-j2i6.=4tsZm\Ht9XAI+;M@Zj>lh6aA*P^9Ymg(-nB==-!A!JrP@Ujn,c[r*(jRfkdp?C`Ka'\tCX"c-]eWnE2]?!>E.353qKs7+!n 6#@GFonM(-?c#7/U `%=RF:Mq*<"(TX%6m'N##4BN`FCU]KA'IAZIS6Yl^M@.Ac9lM&j+B^nBPM_F8&U9A>4A1\,?]Dm"HjZQoeBS+g@P*r(0$h-(o%_)tF-^\Zaq[G!a!2*+kZEg1FIUQoQ'Is@!O-q6,RDW&L*cfTJMr;Oj@K-m4'q.h.&*g>6UZ=(NAE6(&A`Zt6_.a"'B,/4g6Hfhln\_$VK<9b%sD6DS1ik7n?VoNl2"AkNMRJ(srj,ggIqTJD7qinH'Dr"1T?,?%h<c-Uco<]qYh5_7APE6.!sA'D[Pcr+k]LepHG2bmBAdernTRGZiUJ^r([=(oV&OWNEHV^Z6icZ=$@b]<$9$iK<H 6U4<]f8HQ[9X-Q=o]LQtcYqe"h)`m&Oa*Ei1\nUCq-C:GABZiJMU.]5lP@ *5='qA>bS$j=<-khf7pSLbmIOs<af&TciBf.>&lf^:q)eJq-t<<Bp4MYX]R,p3l,/!L6f(Zp9$q/+Fn,<<qtY&;pLEPUnfo@kV6]lfE&lPW6+InXRm2bGg%Mo_Fb_#j.?mWW252os0'QAH9lBi'8c%lQ8\2sXi6gAH['BAoM6Jl+>clAMI"nj1["LM3$H.A[]_V;R5U&`:]b&6Y#jVf)[s2<3^EFT@'1k[m.sAA^O_^LFL5<i@I!Q<: 0afF/=fZ]gXKh1M'(5%DR%iJCa3faIJIN*dHkYY= Fpl1?Kh"<a558gPl90dr3q#brqD^Sl3bD>9`KL#`c@_.37hW^3D!7q-d+sH]H"PKBbEGaao'4X0VO*q_]DiJ#ETa`/.\VTG:6;/hY=Wa!&dS'jIhi#gQg53R29DWgDB2mM!@0YmiXSUjT D!&gnKpPXUESfKN#bk#]%`T&M!DV5H#\6\@D`s#Yflk3&2%qXLo/kH-T2+lB3B0d&IsS7IA^oG>>h%GSF V<Tl(c.j'6N,P*4^!dV)M/,GgO3Q(EU)KKAZ4YWF`Af<%3l#tcFXr*o*R0:;H.G*@s&D.3#ZRe1J7mFD[L1_J>]s/^>I\V7Whb<_U5;P;9SW;iK^'9MkJbf-b>'I^DY% 6/p1lqe$rmpi%@9QBQLOCh9Wa$ABDN&:17**U,7=]j`42D]FA(X='_`0=&J..5R6qj#'X=_SNl&n<0UYriB=h[1YL>bUtqiOrXhb)B t= cb@@148"gmJ<%kTK QA(<IM,'N[MkN&\``#J\(MJFkY+*hpVtsl_anG>T9]RnQM5*,[3K/00#\qa(\$r7<?GgZKV#$%Seam]F7HIVt6if-<f2DC8"5qiSVoLA]qZ<k@k37aQTED(EF?$5MFrVcnd7e bGbm%e*-./i!K78<[pe-RT=Z1/sDr^nNJlS5QWlI"B&dX'Fof;5?R2\pttL\cO> pID+>)5j.<J@DiQogea:[YWKp8$ehT/"\7/&GZ%&4TXHHXB'-bAHZ14tYFA@+gSEA$6;/Y/fS\6k87OCI"kiM*Pt2!1*B9SHM=KHiqXb4NpS:b USaOSpsJr8Ie,q&/00NR;XCOL**O]1D>mCf[oOPbk *Hq]Un-2Neb**1fRf$19k]UK#)%#/icFAV62!V2K=>\f3(@^SAhR6rO9i`c?MtkINO)W)6m9r(H2'PB gFG4,I[Yp0;d1!BqB[S;'L+& pVd.dlcQ<O]f*sH6qpk$5K;1cA&t7+67]MoX4rOq2tA=J7\lCKa]nH*hPS@a8H+SgosRb4t?=m 9A_bMP9.Z)>*bXk:70KQ;WC< <O4 0[T,\M0h3dL;rW*\m-A%C,B=p:F/QK'WOG47'$)1C*`/I.tc7*``C7q#;%Tf+P&?gn jN,t22cViK-s22LlGpZsFE.Sa;f\QVM!`piM`[X/BOn;b]@p1I3\*D<B#Fof/F:/4Jp5X`4!Ab`/ ra4j:RFrQjYq`!8AA!a;<G*is+]e:%)$;VJ<D')71 oSa<^&Xq[p"LB5[#]ESNE-El g9qtTB<n,\pCoOFWD3=>EFEEB.<f[50b;?X"Octl/m.=`A`Ac0o640&tI2VDri;p0^6los-<A4d`U(P1?*026IfW;UQ$^'as e+AXDDn@Y+rYC5$pA3 !"UmTc/WC 445`Ifc CfO$0)Z8W'*+2qlG#6SXd+NIbZ`Yjn8dBjYX!6NT8<27Th\HSHD2A5A/.,RMNe^8 Vs@?3<bA;:m,HEq\284<J,m\tdg"(C=LB')WU_b!@Y0R_>A^piDC\,Im^#IfeW(68F8jA%+/Q>s/BgLP1DB$OV`lJ`REf[-Z?cGs;A?ec2WMM)E5QT;A10:]\WaUT)s%-iC%7nSb6>=Qf#!q7Fjj+#Gs X$k(m9qAm;M_4/:AsX$Q_V!L5@1`aisf--I,&;AC[7`2P4,RNPD45@N?C`k!ZR_YRgfWtIfA*6Vok#S+>E@>19/TQVImrkno550EkE"V)c9'Ak:=[$#_,JiSFUg'rJZMD3D'fQUc<fT&:"hgO5pc^ZHWXNqQB(\EDO+m[!YAUldAB_H<nF&==9^g6=k#&Em3+,W.[o!T/<YIC4,LA;3AY$S1T4('W#o'bOi#aE]V9ZH$,T-qp`AFST\\8a?tk$20J<4N:SA*9HneA5r%VY" $E7K$qt-ng>ZsQ+*q/MbR]JtbAA;O?Qf.X,4.#q(WnbNEd7K_@]eeqZ MCJIP0Qjl<5XA#+c(53G+)42KD1'>-#71FPlOpT:)L=gpA>nio"mCS/C>c^t@An]C_<n#p>m?Kg$/\&fJ3U>TtJCaDf&!+O"S(\&i!0'Og;Tm1Z7t@"jbk[D[oI1qsV4"i@3Rcq&doS$0o-1+U*T:MB!>$E8qA:,s4*UFg]8P*P17W2"*NZWk6$'s2@ `bOp,s1C5>h0fC!gX`X@Q>># BH'>bB$BF%'kd/j/8KKIm7W_`R4Xa49b7+Fqb4O.qc)A`iVW&6%S!,6IE K4o@(lpLEUX96o=SU#cE:J1HKn5VFb3T-kJh!!eI.b-Mfke/EhEm7T0U7h+q7K`Q*]D0X6o$H Y8:Zi`Wsi*VFDtgRdiPY,A<:_M_`^h,YZNG%YhF:_I7*LF3`R.<-.0(o?; F2,A>sW*Ci][t3-=hpVaAQY?Vc`R@$2cY;'8+[,kc"r;fiQI(6[_GF@TU!Qi4NI*?=0/s$VR<_YZIdI.=9@]gakFqn4@on=`"Z"`/G!59#%^lhAi&:c-"Y1oN:dk;isr'Y7FC0`hEAoh6,2` Q-K*``XNoAc(gpA!A=[nB- r/\R;P`(=7j:UB/(W\F!L8+]h/#]*;tW<dP/ai#piqZ0sXqT_(LOb*8.=QQcln\CWLL&)aA)fGi=Q^DN$B 'Z/_^r$O$kW&dU39I"'[E`)$-X$\9 CI04eEc*'n(Pf>C&*A/Z0Y,Vgksst7)T^Rfi9=38]od>kZ\$]h*9cUU,DMlqhdQJ"?h^/;<Cj&&R0252VkXp(EZ!bWA=nn4a<\POCOC3TO"a-&O"a8Ve(ojXa!k#C6H-"-p#q9Hp-A'421cNd?;Oo\tf(j^fqkBQHM3fdQ']2l,Wa?i;:(<k,TL9^UV-Md3onB` O5?AM8Ed*'+J@T'?`'[>m:@:%ho@6ZU3'gmrAhEq^D2;"=8[O(h>Zm^,jO18*&>tSt4UreJ, +Fk<,;A1Jld[J(W2D"41o[jBL-P_Sg+RI)S6jX1.<>B rd.TsO%nj)X6l<bY>3Qd8@W.`WN6F^j+tJg]pdf4=?q@,eZg0&*-ALgS"qb*St>4bhsJcZWA2!A2X"Qb`'Sr@-MVjYLo."C@K*VC<!",q1ejO)A$'f$)<>FI 7kT1*A_HBA^M1i\j@.^b`NQU\o/c?'Cs6%hCQcD08#J.2$B;aQm <i f@.-%0S=al"^:h*7s="O)\W>nism8,ZKpA<W)YAEV`fS$Zic"4LZ0jAeYti/M1\\F55F"hgO_(1VTt5;\*.kfMF%^:QRBclt%EU$6SWi85Y?5m=;iL4f&("R]XZ[ bD!!n;21s&(='S)8(pOCqpi 'e?4Mb2o2BF8A<F14[a<A'$?m54Q5U'GaG9U; _mXA<,!OXR7SR#2J edc9 8H79p7,A?*qE\f_N*L'0MA-O/C4MEEXbDKZ>gh%.6-UU;le#=CURN+:R,$5oPeg7<.1(okE@\UHV0`\e @4Lto7<1I-jC=PU*/0rX*jjAO>U=7q*/-4\lWG>#KjftF@`/SB_cJ1h9L"as=]ZQ'0N&<Le1fAO[3qfr>0Kf`>Okq:oXe*]j'hn;[[dsd*q`5kH8_TkB_4-ESEqgMU7d02[s#OebDd8tBH+jo*<ZMWi6*K>MQ s)F$.-UKfl"9+f@4'bd<im8Sj-opD3J&o)hH(SQ-*:U?Jp!<^HnJXplhGJ)c%?Q$.ktb[-V4r8]I9b ^6BW0abHAhc-W9,SR17EE>0XsbR^=`NJ*#`.;^E,ftp;/6#AA1(VM\E9m>*4tY pe9V\+Odq+V4VZtYmNShEfd9s<a[$C`3tN%HWU?,p<CPL_@WU#Tnl/nd^ DaR"cW`HAHPW" 0#][5A)`<X-OT]Gp`2AsiC14S3pd(bsPRN&2<bG?/cSCd_o96R9\KG\/3"[,d6_G1Y9aTj",Q0da'mlFm=Q)\h6$aA?Q C<d-^&(>'LTC\)%4Kq"\2p`O,;(n5TVe.JjAtWtt%VBs^<`ZV(m@9W:hSJT#%IA,j5O+pA7Nac7B  ]b+__q9>JnP3Kd4,?'R$;$a!;PEoDHOL\GO3R\Z%*^0-7g_cpbSYgI=U%&?Z2JN*"c8+/g4n,MUeG.ACAd41bI%"%1=A->InkNKHVX'AU%LP^@0n<t`ijbI7&#@H<S.1Zk/*!5"@ rXh:#M<[sYS'NnPWWT<": q?t` GMBK^.+j7mdd9?snet0Lhc-C0lZ>4J=Z+:RtgP<ZPO[_9rJD;o>;#C4#r5!]4<XH`-.K:2=;ZQ1P?+&#Ap2Xii9DO3#$X /pQ^tTS*\a'U"CkRkAfo:NI*"Fa'$a/X!ZR1U]SUBGhN3m=kctBoaT&m6^)dB>kXAh/rtSRk/tah0h#qq6*UTRW)`?9;_&agZ@<J"L(d9&%$&W:rIWCD;q&OH7<8@nC9:@:E[7U/&#.SKi/)1Hp#1CV$[!O:(Gceg60Y!a);BjF:gbLWW3,65%1qEJ Hj;+0)$rN q'#g# UOcf@p,^WAsoi&Y4o(ID6&l5%sAjAq-+,"`JUV/B5HY070!'F3kNWTSb[A9!gNFG9%3-\^*Ieh#e9'_2]DnEg3<:&TeN#WSF'0,llsE+^C,,1'6\LCg/F/68aJrSHjY[BI1'&/`Z08'0YJP9&<=m,jYFBl N'JJ+=t>UYMrtFFj53\c.Ane6QQY,%FtlTt[: _>\P`WVoMnO]E"ne- BL>nM?r_L(.7P,$l <'oV0+_+h.-Yl5hLP_tRUMYJ]#`/5@aW[0;rZ(\DmXN.XR@N&jW8_RL",/`s"4V-[l.VF&DW1%c.<-5p:fY$"bCl3CNM[-9Ji^tngOUdo9WODbYcd)3@r3#hHR'3/K&/DLA\LNkD dM:XDU`=)S3tKgZeTSt^?@Ye&1];%b;NI4qde#_^Q+mSk"caS%p.NAIU/6/Rqq9J/?X_e/^W6"Osj&3QAcf,A)+s$NA7=h2I*O PT7!jOd/(5RU[j/[J+P`2XM2JK+q_f$bGlJVM*B9C@IWNoD-!>Vf$ClFqj;J5\@PX i8T<J>!PLA@M69mfY+<X*5AH"`:nWr/R 4[Ei<d(?-5a:(o#T_E3UAI/P7+LsB;&3Dd \:h?pJ.J.Y2EmW+%D76]`[>$Hj&GV36ko?,P1XL#o#5N]+.>Z&k])W2JOC-,Fe,@o>@H+/];/0<!Y\V3DlZ>kkj+aTqAHmYBfDiW_:I!JApEq<`,oCX2DI3I<V1G?a"\pQ<8[WA>8ls4ZX/CmRi+_LMX4)`/b+Egj3W<&Yb)-,mq:[$).fYR\230Q6N9J7pJs#g"EQ\:O-#lp)@e`NpB[LHo$_JbNJpt&-5..ct@gm_6)]A8qRtA-P1b7-r3X, V<^OHNB!VLciffttgVP`1XLDJ!Us5H?daa?nspLARhrasnA:iF[PYI4g]5E]6X3EUe5-3AQsMm.*[J#*El(M:SIf])\A@hJ6?U &*Q+sJmVC sE[ n5!WVkb!?+n"Ab00Z8gnQ?i=FC2B%gg5qi;k#Cg>8"2o*6YpO_5p7D4g/c6ESf&'Ao/TpH>WhrpA8U5tO-g#>t?SAgG/-h9<lAL54>gYZ9sAX\Gsc0m$lG^/%%H(gY+E#!.iN6BnR`Sh8;7.-ndY8j2jrnC92f6GmAq""UXsE8-(s+n_3rN&04pj]'"8#TV-W/etb3T;$q=%>Wf1S^CEZVr7q6HV21L`<pg-f\0`ifI`/fmVe<R-5.[iN=M7(o[d>6Bl!F!#'UcL 9A`Ltp$=bS7kn3*8cc<+3t6cr@^Rok=*17%(KJ; $0WRPg$7#h'--o22?aWnC29!Y<B2009oY_&"(2@l<D/<BCYQ[tY1Umh++L Q`97*!ZN.V!elE2n0a`[IEQn<[07/05/24CTIVE`&"U#Ih;t:YK Dk\&0BKkQS\=.Yah2nZU$1T/-RKXi`rcB86C5\E*L^Og!s'?s"aGp`#_r&d;>Pe:b$mhLU\XU0&mp4UM=Wqrs^htO1\<ej[8"<t7r\@'XhL5./X,>>aCI6X99s_9C_09XU>4?E<(Di:\Rr&n*^]DWsZAI[iXr1Nr?j;gfRdO654c*'/k-D-K'k^/)NTL5n!63.>(&`hrYB'/-2c4lkKq]G YijUHe@% <O]%H<'Wh\9,t'6BP1%&iciP*Q5^S%]rIiQ(=8^D*t2be2(14bZ G^c+I8%0n^,L+fb9\Y`8.t?GOT9F6BT_Rg68]I<mUkAAH P<F6;hcT-Bj,fi4. jkE#jik[n6@o38=37"3&==8;)">bSaa!<HO#4Ggp5QU_ho6&n1T/Ch8e0E$f*_Gkp0@n;e.;.$Zo_9\mJMK99D8BTjG:>gbLLK,NANVFKeKsmA^pb0qWgWt6K2iFSc&h..4+l)q.%)F$C!Jg6*ofZt$h'"\Y''*`SRa.ct)R$ P2JRs0'eos&9V5Gh"&eaT&?HG.ZUBDEH*gD&TZQKTY07"i]t1'rY8SCMZK5f`A5pF-n`b)U&J=p8?^>+&SG'sn#.X(=Aqm^6S)KD@8mqG/(5]^Z4LG[kML3$>>rUX7]Tr,kA.s`RNDea#oA)8Vc)F;NL:JSMt_`9FMlVLi[MLLAU;Bhg4qXW6SB-6S+]!pkG&/IZE4.J&p\=b/Z6EN9*!Sd Q,S t3mfRlZ:$Cs6d9f j;BU&&\?Uks_bSLr<Qg6XoeaXK?M(U-TeeB@oF<S*<lL$/&1TI>NK_ Y S]tnmL?\SgkPL CKVOdIkl40H<M,sS&B2c#ommg,\J!>VapSC& h8le+Ob"7 J@#(E>.`P`IO(gGW1$&)m,j8)]FGtht?s_B93RKA0!^?f4_G!tET9hS6Q0/33RC$l'-FfdHs)RAH17:IsPSD<PmlNIpQgcWUs0=6?;s+K@NAFd.XBkP2q5XJ%Xcairqr_qfpS.F=#\']lSo1pfm-U\it.)M*HGJ<./SlAiT87eU4R>3Y+L8\e-)W\d`qWrkkoidqt[A6PhNX?Hc,kh!,?,0i#TJAdmoaok['CQ[(*J`8=@FQjRT@N<Q:'-H;2QnVbZC@1"f7'd1[psWO4Amt+]ek!n$jA!cQBA##/-KsD!M@fEI&6?KSpT*pA_.?IJ0MqGQ4*0(_ZG?1Z64:e+F!kV\sZgA+_TAD8EF_T8psFsTYYmKtU)n[4I5Wr)XJXN1[$b]8J9h3[3RLCfLY78a;gq&Vn%: '\*oRpI<f/K*=W8FS\<t@*;^[IeI'U0U&@`qp-h<P4^MBLP.clB'5UpY?@9*Qlqqr!>C31hk""_>[IhkY3E/635,_J"A<c#'#a3f<l0bSK^-m/b1-8PQ2I%aB6hE!"]`sj%K+@^B2+K\O("Z<VV;bblt9p!pQoVgp0 bcc)MeJ9X>`H_8GP=<.%rl'dpY/(`9Cp&Q=>(t<$fm<6:/a!O ^Y,%1&0 ghC&!F0'A5dqn/LW?7ehD5?>^Q=)ZB]0&lUPjW3B^2S1D&%,c%m*f^ @NT>Be<9O0No`VlQOVYlRV+=.sA_&ll/5n,@@m+RDkB(0Oo-E6$VLZX5kAmnr.I<qS<ZmO8=&)*;jO>+?h"Yte6A'Ia"8,(=LJWQ_b-#UC%m1I)6AS6<gO[Aq]oZ)RgP.[63 >$rJ1G$>Y(C;;A77A!C/B2X!Y1$L?Y;go.JT2WpG3O/al,H/Y4TP7\ 5Yf'A&^;(5d"kSGmmD/!7(C<la8B!L#:b!_UHm9,qcc9"DYAQ't=$jhcAQA3"[&tF3\rs;<"hiXI3I(#CMFk0&^73Y9E!aU:m*27;!4AS`,X`K9JgWoa?<V@r>N>1?a9Tq/!BmS%(+n8iJ#P[C.9\h6>1<T(&C!9)jT$8iFGC?fj;An]F\3K'Se$93Q!WqHt"O(D_ST>$O"5mZ?=L>UU7+r7A)g?g;)Dkcf`Acq+bUWt;aeqJe&YNT&U-^MUctE8=P@"M0Fs IZQiji)(!)3I%2:)k&Mef.MfPP2-b!\287:Q O43G%D^9T1e$/B6-_8JZ[ 'JKt&MM9+?&d Bb8IX-'tSaYlD8.=hl*Rck:+T!Y77.9I ib2EtT'^>A1YnIIF(A?QPAL-]4,jJb'g^f@[NRVO\bU)jTfRmX+m0+B+^O)+FDi*4IYq@m:#be*i"F^8N8^f^TJ!?W7$Ho"65r8@s12=X ZgBnWj^XhnL5i],M(#oFKs,YE"=Q<(2.s:0632=M_;Dbeb1Ka3K:I#NQZ)92HD1?O%e]Q"/0iWXY&Q8,7!HJnNs3tY6-($@L%^Hh8EHL(s)tlpa_t;+lW,]"sR;6(AX 08Jb3_VEBs'i%$k."rbc]Y(J"CnC[ES"Z?)`pQH&)P^T#V^J3Uf%:B^:1PbkacUf)p-T8Sc]AF2:j0W:b61-]N1khkK;^T-GD,1Lj`G\S93cH;?;df]meBX"@Q61BW?;N\>HJr@b6Uo`e/FJ+=>Gda\7lQF`2D<Y2glUisK]?(EO*NlsNSt5<N"#Vb''%%nE[@gL* (&/UY_&I=htAcTt28DZ7GL@%BBht?d:37!Y _5dG\_[-qTo6hXBM36q_`:5*DW -cG4j.FA,7`@Gp<Z&/tTo2 ?hNj>@pQ\rUg:_M)WfrR-*a(:?\:BnTFNmO3)_*741ZFb9?L\VNWbUQ\ iNOY<'=m[!K4<:N&933(!kAQO+0ZMh>:<^.!BL-^LXM:sPMhE >K<& P$$UKZ3-Er`ZUO'Oc010APmiXmC$YYLmqD<c:K6Y<WaIHH]c>OB:&JJGr0p_h`U^2!Zi$O$+qqr:X2QU7>g-j$rBtt$:=st_ST#WiWG]Bh(m#U?86]Ll=[#M)r'K>Y(Yd;*Z@OPnc0O6WBIAWqE%ChqLXP"4XRI6g>d%Oh2c3Sl@FcA+]9TN!1)5Z_4qNR!JW\(*OHor2E9Z Y<c]KoWZ@NAB7#(g1!X'?8Rn)J'cn'O&h8n:LA!qNh-URea-o;10&.k+sZ-Vb= B_;AN7@d#iE/O]`6I(Crn(`0U-nYED8MR?4]4CZhO5`>F#ZW3%GOHbk<N=rm<I`\6PN]ZL;4J/e_W<B2=%[OgQ3"fOPg\fPLq4jY. NfR).k@s;6*m0,(D$oW\O1Yd9m;'(.=4'W@-2 >er*[$1[)V/l'oNts%P3Yq0hbc_\G:!%42PVKSTE<e+a#P>Xk)ZL,`sRD1Z>Ht]ioAri/5?oa:%rO%/f\+lI(de*J(!W[Y:,fF+3`T2I12"[ceY`4V&'#Gtn\ H8MPfCF"l*d1/4iHnaFoJHR7tG9rPtsji[AL: pY?'VlW;I"31P ;SQsd6<_88#Vt?#0q-gZ?CY%]D]nan26_$07m[/5'm?0>)^EI@q>a N:g^9DMY!#g%)ZmtXr[T6"[]WH&g#Ds0tq9;WH9RAra!0qPA#0^AM#s_&OM0Arr/Ng0Ym*A"MY`+GmNeHKVI#Bk4& Q:oG-<J@=KXRgr0=A3A^P4BnL>oWQe9t+QN#GW57cYNorf(ETGA<MeVgorXY2`U6!=Qs/iU_fDe:N#IXs,)iA5ZB>(T4P(^CIF;\0s"r.T3QQ$Qn1.mk6a,$m"[6d@91Qrt%s!4.c7(nq[n'"*c0A^I!JoZ^BlUrAA;li[E-fC-F_chc>/IW,/VqFPOM*1+)(f=tmCBeJ`CBc1jAZ<'E"!pa%_Ig`80;/4H ;$'Z%9eJb[?W5NaPtG9T"tfC<=HRJhdRT2GRK5rE#9*>)5kJ8KD,8ap Ap="lA*c##gWa4A-c`if_oLc$L387$c)*TNVJ`'\L?Ok8lsV!A\?;?]46HkkRh,L>aV?"A2I$N60>K.06:4XZDh=6MGRheK(^]]EIID7ocQXN4B5HL4q;QS\>6qp,A3"G"GJCo"Te>5ihQ3`3r<(ctdP&!s)3ET*8&ib:1Ak08U0G`?7rg-AAN7&"lc,r?-6@%T-If4`m`/1Nq>m-Uq\hr\tl=hM:DH@YrM+n`(Qo$h9[[!6AsA7(JCm4J"-D0Lh^=$_OpM##ZRb5-&>iT-,l](anU0gdZA-=&-ag<7)glW=ftg_kRNQ043b%AI=r\!Ab6T&I!QCGQiX+[ADl:?%J,AOm#HF5Y6>/6Ls(U?lmlXW\Di?C6[a-[%$.Gl$&]9#d:#)rk`6Q`HEQ/ZR!dQr_K?;7/]>l*VAf;6-2O"#mFDfes+.%=CPbXX"0s.=C]Zhq%-r$<rMH6F>GDC1]fO('PM*K>qB.H?9h8T0pZ.l<9EPlClV&_C:lPmZ*P+Q0\;c]4WdZ%==5Lm/BXMVTH_-d`::Ol*7q1c]A*NNWKM=-/>O@H$a1c@r.=0@;M*FRARei!@a:#O9GAAO%Kds&>ddJLcVT?IT$-AKATC8^MBRmm(GW\SX/WOIPH?1imPf(^!U&2A=(nXd&^(]XQ"AB. =KtFE$A,-8/Rkj^7>cYE,f?Je-AF"l,CA,jS>l`Z?&00JV$_X6262,/n*m+enS@*k1IUG-1f'C9QR2lG,\NcdHf^*N$JZB_#m"4`<i\0oJC;?;>Sl cpW/6,)5nI;j48=jiE%4X_PFnH:EK"QRW?HZt-L6C#?V6ng iia$VRY>/X,1)C6*aU-mO;Yp"`Kb\oI>?9.<A@?nLG!Y'^<.f.(ZfbV/^jeH8bWaF3;pO@'8[+?8qg6)%]q) ^]>0_E3bM8F)%3T<HS91m(0EYPC<(JE__6O_.;QNY=-+K<>:=T  98'L^C2M,'t],;*2d=(AJ?AA7LL>)+cp^F+5)^?Z \@b.#E=m%WTs!3?5A+Il_aA)*(1H>]nC( [o9'5b5%Bc!k.I-(?Ed/Gn8:sl-(Z\LA irQ+LAqelk@EJ!C`:":bpGCT-%Wism20#Nkm0lX@fM1*XR.Xeh4pHSHn=0HUL Vf1_r._85CGRJZhi=Kf=:<Na:JU N2P_aPt+D*3qZmD2kE^Vq:Q/E^LR?Qm#O!NO^W*lIApPRDTj59oH*lttP3rFKe$Bs3.U:b_#DS+E`Us<BZLX3=4q/cK:aL8 /0T&47eC3ge:Jl6n_N6$<@,Nk&`?bFIldGYXilP$C1MV4'EDA1[8oMpHq F:FD_ZPjX'>a7(_(=ARSeai-bX "*&9TZORq.62:6DcMOFA(=NN37F]q1Xd)W(^L<Hp!"DQAgg_XTqP/(0CoEDhR+@Wnc"@2Wtod;\/moOnlSqf`VCehK]cI4%5&=`MN558%B=0E.s&G>5mj<,CZP$KDAr_[0kb7b4K"i#>= "[46g0F/0pPWVpNXUHgOfiV@&b=r* %s2?([p*jG7&re>C\qtb^_Y.Y\KT7GS0@m<0E6766[?_(c)H7JSqT67AQd3&0lUp4.`jiQ'41[,CQe2LU*.,in47K(`d/$C#"qCDHs4?L)rb4,H!]Tn7Wj<;j(f`rI90'$HQL231/4fq3A"cCd]Ob-HH"9`t?89AhYoDV#<\4DWdo0;9PT+9ba;E&.5&(s,,TFOGO."Aq\gn3-r\5#a& FAVPE(-fOUcJ$;*JZmD\b1fZR:'2'dS;fkfEh7B-kqL;FDp#s+[T'tpAb+cMk\819^86`6@'@k'mm!Ci3J1%T; p1TgG1mlKRe:C>H@N&lpR>_2'RG-7')C  35)H0R\88.5lFP0EhdH_FRPRRA/U*7op6<mg5ADOq[;NoXZ]j#\7VkPZ&I4"Q:(DQ(8#fH"?h ]!q)FqVd'`5K?h'.B ^7QK aQL!YhTiNYWtJ)Xga#g)1b>c@HrKbo(_6InOgZOL(I"d12 .7';]bcB=PA1\tD^J7q oo$"`"=AW7o5M#PclL?%Y>9P+/+4I^[k<,08C\`o!=?MQdHI]SQm$SGZ%r7LWG<f%IJ2gM@\mi[sTCrBm8Q*:8s^a!E5";IVAWn@@rXErsrRo!n^@WNYAn8[%B7C/YkZgi)F&2Bm<gS>Z_]Nm[G1Qi9,Q`Y!bUF5o);(q5rdohKafk-/)pi-Z/i#E/1Fpn&3fXEAl2$gAo%!9@*RDtW/")#H&jF!o$4HZQd(k#bT5]1qaY55B5NX*qAkh;^JAdlUt]tG.%AK6)=G>T0Q[Ld+$M;-U5mE8jc7%!QUiNae55V"1LMVqO%C001oeA9\UGglJ2QP>,]j[F?3bV&_X?N>$ mZY<\Af06H.HP"t\*a8!Vck8PR2io0\9!?[!>#]lZh*i/l(2m3%ZkF513FWEET;5f@?OhF&t6AKbYOn>H2g,$[\F7Do9-]dI!#!!=3MO*])A2L`Ii5)hV]*\n6;L4IDPgo.Rtthd<>HN<$:7@K9:!=\/0t'$CPsc(lF?jXTm*gA_5+X[X)d@EOnQjd8f'+ho-P7 Bo&02Fo>BaU<5jFKWrmm*3=9:M)U6<?;M/4c>MtbAX9_;cq$8eWP+YZ-VsB7_ZNntt;!HY5o0%NUq"7Kq]D`r<!6"W7$Y2P>Pf"%!@7Bj?nK.t6L%(H(:r eJ@A&)sjLF"OI/f!h#rS%lPRV:i3fhld]%\*;C9PTAJs_+F+! Srnq]BHjI4h;6AA&,7&j];Bdl;]X]Z[;H+.IC.537HVN.ZM1WFfK^o4aZ4#f:.Cp!rK"n+Q8q_@+99&AEILR4EF1*kV#Zi17-M`+#B-%C(I\ 8D`9EkPjJ:t@\;LAc(P6#%em7NMI9HhmZ,]@[#lH.W%&ejsADRKVa<o02ALDh ?m8E4d!LI9@S=35s%3#IhhDr/_ciln*:U4I;li$!p TM3&'#opi3#Ksc^^A#EbppbXQO$Vs*QhpQo[KN**(m^bU!P'dTk5<ThQPp1F"t9mKcj`Wjqe]#%h=A+Q"&IbF6<l^^&[%$&;D-bq?,?p:DpA.L#Y`7fhUd:XC8RD>!B1o%!RXJa)%98 arX7!r3!f($ZgAp%d:$9;8%Xd$1.a&kZEKbqS1 *TPbtBYQ\fY!Ct\- bBAt'And8N/Z3elFBm*J/J5:qY)A,o@&`f,<DK31#cY! F"7E(Pq\r(C+MPC5.DAqjth%nsOZ]`$*SjXap#P*-WsT!T*X)\*j?%dokd>q\Pp.fCZf\E5JB>&\`2H\1TP4Jj*&IZF`7"h7MgNVV)(Jg[2HC_O)ipS8<P&7^Lm'23qqO2mKKOngHAd&Pq4B#bOU0ZkQs-2UhD.DqA?JhU#%J;Ck$[h>L[^'K!lp3<O1XR?,K$MENo)9V*_"^bl7sQ4A2Oahh gh$%s\Gtppge(EZq:=3OY6 MZ1oSGmTqSL?ARR%= 3*Xf3g>re'pN*E"$M!GG]_f-Zh!]jMotT(32."?4;=o*"&Kks9sBRc98c=gGCGoP_=EA0R&B4;qAQ>95+4L]mP>%,$(6=@G-GO'* F@l>I-q-RqFB>?8@7<4Hb;(R3Jo[Za_dIN$=I'W*r-/.Rb&.WK*lnL`iVrlYa(GNh62Gt#Z4L^L(o>pkCn"oNI6sF\%0U[tLrdpq,l&NWt4giAdE&08K:ar6nBh&kH+>,5O:EQij+M_[@g5tM%TFAo#^naVFUEX `cEs/Fo-D5i(WNQL:4`WQ/&#LR%%>t 8).'fUYtMl?QI/3KE")l:.7)J0)Rr4p$Ui/?rV_Ui%YfeV9i=lGNb-I$HmR>q3(kdPB`LZf"&*%+"X*O@>nim?@nj+Bdd\a@i7tne0:hfH7WIJ75M*)?FUtYk?GXY/I"GR]gl/th[Liff+Q=hc.U&p]r<7Yrl07:T=\:(A1pltB8%dS#//>7%e;K_""NbN($:BP-i.aC*T?AmY-NM"_oDFrY3-pkL!EkM=ZFes&KC\/+:b?iA-KHX"AESPrS(*A>F'X<D,=9ih1FUanAA2`4gp$<=.g?TYcF=H"sE(#7PkcSO0.m0I7*.,GcKI8k]>)+=s/`!pPje] \"(EF'Gc&QT]n`9CM8W?4kraj?*iYB,0[FTt"3#@X(.\VHE;20 m#_da\(c$]3@CS?*s<ld9Dj^AW"k0$htA"BDK`f,/B.Wp=1W)LaA'Ok<dHp>js)U-m L[n3V@[<%e3-gC!Z)+_f8i9p.'p3 #/940)^4&P1SB#.66iPVn:T7c+/rtgOA-CaV$%8jEc$ 23QX9j<9lC[Y_VJp'1?l"577%U>>(HO?qmi\^\HFeU:R$Ik:^*C<m;Y 5AYX&!W(VrYMUnP876)sQjiNnbr3''%QkEE=?$#-&0QUXANki8723SiDB\0 %!\%6pHLamb3&eMWh^,I;,nd9MVKT``F=2R^09a0d.GNo)jj9ge)A0)k!,3gt8tKb4d(Ef_^H]%] H=U]9N)QEdsq24ncLar#O:R<Ea`Wj7@0s&q=5lD&@'nZS>@d?Jet.3@`=Ws::id[qSspkk6He;"kGSOpl__Dn@"!&9$IEUQtUM !i:X'G\LDpeEs:h1g4PJ]GmO@d:lkc^t3(D2WFM/l_9L5Z4#,/` F^&1:bXk9C_0jM!bdcd.j.1?s8O9i!Wg_P8=W13AMS+"MEf9j-'Q)^,o$hnsl@)d#e>l&+Qjh%hO=X_ZrARVQlT3N4Y![N`7,h_VXkEnnP`nTt\!\7!R:QTEK+'fSo%)kD0:#ZWe=*FO3Sic]i`F[W1)aY9kRIaS`@1_H<`hA9.#+.W^`V)Yqq2Hn7f:.2;a PZJEKRJAjQUq<?=9HI5>DYU.`Rm4*LX$Z >r[!R2Y*.ROnXYk?+]JJ`H/K6(G+(l0n/)tHFN%$P,R5_S]B?(AZMH OPbCX$*)T6"YjcMQI^B+; %:@\&+A$KTVB `M+)<@TZ;7$jggJ@b]V*[.jp3;I)$" L**>X+KHgQ*N&PDG6C[Ccs"MN-gl;jPbg)fdR+^_Ds7'`UeMn1,@a9`A:SG]UO]rCqXtQ_C j>AaHtKV,$-cN@D[O`?-A,<qk5cW((T`-%C_?A87T>nU1#!1Zd!R7nb@ZG6+6P''^ZhCNet:lR";8&l=3=6m'p9lA7m=Ht&g,?H"A`ah=qK\O]Kn=<N"1np-TWPq 3C"6+IfQA?DHK1""R6GYiaf`Z*+E1bI:@H?s,GA G=d-T%p1e3$h(gsml<dFK:q(1\RCIc`WIj938[tL;nc49'Y6MW#a?^@__*%(2IDJ16IsoA\bBH2km$\;I7#l5.;4t/F7"sYAJ'0sq>US6cJBAt?5Ti)Q8!K.MeNKn`nAU_Dh)=Zo_,R:>sQ+]O+tX&b*Op5*N__mkJdO*-+#n%3pn7?E 0A/pS`V9:VCi+*40;nXU[WBG]t=O2aDBU9(fLUH`AK(TYD( 9JJ/[#Cbm19n'3H,b(Ob:rprqVFfQt; )b&@WZ(tgah#SAJo+W%?6gh6k+*20T;Dh,,XpS36`4"6DX-nB$7lNq&X;b N,f)T?9lbGVFFL$B%9ofD5\5o)CtthNA]CWLAn67h.VS\Qp[7++]s/iZc,ZBJoA1j,C,A#NIBr6&!H>d;F37(A59@btq5<V\04NCBgA*L<BVF]>./1?S;.F*94=?6@PCIln`M1AaBoge7C18K%JS0m8_D;ZQ?W*4l`1Qa^ [[[^SG U%ZMXP:.4>FpGV('i@fZ`bD8S3<Gr#eEC%j.tL=l<;\0e`p&`)Yc?l/YHRSgDoktZ[\-N^4k1h!-VtPkY%WCX.R-^^Bf"Rr\^rB4I[M_=f3Z\HS-=[LM7;! E2*2'N'D6H75D7M+KZq>4<Q';J(")%BkV-jk2c?RljcE$Z"!FlS/( b&k+e+o(3](Mj=jl#is4A&R*Wda-UVGdA;NpS/NCB=3Z_m-+fs2s1C17;qf*]k:*EYe-5)oAS=%"g*_\pXGSAb&doD0.f\SUjKO?13_1+9X[\=KbSM!0B0C <ch<&3,H(JIB!!g)!>5PtgN( m?%;gP7rG"-Y8,aqtBXne5"_7!*0i/hG&jNV7V5FEGY3TW=L$^O2flhW?7.T1["^Ef+fk=&h!JSi9J_+t226p>8K:`[l^[&%AOI)oI1AIE0<eEmL^M;pWhmi\dE<^$r(2Th<.BcP`a#mM2X!8oAi-(6\_(63<4AicTAVFJn6XMIQ]'m7UaPbb&/b]M#A`naAB':@^l3EasRJA6Nod>A@2mNr*MKAP)W$>l-,.s$614h&b:hW@eWaO+qS7/`)EZk=P)@UtjI)6G^4DiWRB[GpK)=:&YY @ElO5-P+%BV\8;_H=0QV*En\TG%_YM@@7,c@%[3TDLVNi33!2i3-p4UP.$i-653qrVn0&A0F(n<YXO-jKZjVWbZNRb(\U]Vt$C@?AfeCm#KP\lN:B,;8k'T@G/l@l"AiWQV5Zc"E%QTe$m,'LHMB7ht3Z[g27pa,_\(<XODta 7#f <gZL)LF"gf3='a!#$`h(ieX!AYW)A:9^KNJRAAB"1q(f0J2kER"A53,[G*8Ds*"k^`IU\FS^7^A"0Kl?9*V_LlF#Y<4NUJti6ZV_MKf?p7QB5SCdk4`j>)8"#b@\$j\\o1L_GY]F>reb8%k!A?W'7S7g2GF-4`  .`s]H$2KL[)e$tW$4%(E1T+go"ZJe6N8?ftd'!F'i(IooWEIOCo!F:g1o/9LP.M+R`r#[P.I(-S"bhX1mGIm!T"<V39KCB'_C3i,k6L=8knE[Y8Y$j5rqHLAM[K/h2R&2bp&0Nt%f%aG9lIc8fWNQL/Lq3ZEWOkO=r79Aajl'^a-T0ae(+-,.kgTlD7tM.cnqSTX`55tp_aZNQM&k)?maA8L[J]Ye6NH>5tPm0o.l/SWe%<(9$pSDml_9JgoY)\SQn6:b_>TY&5/9_BmY->iD!@n(W!0\2kS!928^B  Jd%jKS?l+S% GiB$Bk(N74jEcJeHF_ssI[&E3T\R)NE0iqRk^c9>t H3MKKH0FU73U(MU&V\IW\F"A%5";[ri=#A`oPY$=Vo=/%il;!A\*D8_dHL%6S)Kk2IIXBBY]3s9F)H!&$ahAOhS1?18SY.b@WX,.\SJEfbI!78Xg!U5(=N<)iYWOJRQAEIi%s!#CN_[/ 0#aO\7@2jepFrO\^ToBUKf@74VT_rg6/_:kZ2R?,si Ks9_oZFd:A/@\^r'@k^mr'6$KICk,F$;@P]1H[fZrfpWFbg*,f7[Ln$4m.+(;3i:]/A 8#P&fU/\ZI*\O@Y)ai64fi"#_G<@4N2>TD<FCfh&NiF"0Q@F]n>lRMe-o$A&a=l9JWtY:;*5*L.>'rID!qop(R=f0SD*S"0j7Sh!@M@HWkOBb+QHbL["*.#eq3,j;Ri8sGq:#6JRj)Z4?m(WtCZ@DHo>W$<(=mS7*dI :.f$X51B9U`"d'QCCr7s1E_,GfqS<i2%/W+NK2s#;;t]IILa2[/d1`W[FeV14 jQ61aU,_.r#od,%'0l`e"FUKO/FJAiOYKD(@1UWC@s@,d4n'Dg\*_;/+*rSon#pdem7'\Ss2H)R&XK4Gqc0;V]RAXfmJU:)mIGA)*[LB5jnY1FArIG=.%AAY)"<.ZqopOfqcT<sBp@#0AmBA +hH`gIA/= %LL0mb=P4*rN X,8B(`7<eAlZ/i %j$e4T<EVEqJpV:FbAH@.K/cpAnO&5>)N4Q](>[:4m14*k/'oW&g")9i>F=mZ3YL=">B$=T1O=M4Y@AdaI7\)23KEcM%-B5cQ'$lp]g\1LLm4Do'I[[+[.KSY(hj,[=A'QAHtZGI)iSB8.O-pDH:K6Nqg_AY,aaeWo;9&.Z6!lSP8$<M$SlHA:C2_Ns!3cJ<EXmEA"O+[qEm:2IMjfc aCEY!nWUsen^1:r3QKdp+;p,P4q@42iT4-h,X[Flksgt!lW^j6Wk7Z6A;J/'04NoL.ADW>WY?%Ucf*l,m=.J>X1(+=ro)$hWSRY<[R*ESAO@kYE,+ZE=B12;UBgB[r.`HektD.RXZfAd=6tMIr0mkAgXrBbm]%hJ$Ia>?]p]>.5>a;8!ZLoc-eC(KB?3(+^o^to+Pgt:LT4Y(A 70sos!rHMEpW@T [=`SA-,jTCB`(HbKgY(!]S=OiPMRDP_kLd_V\?s`^* a,OXlt>i+6Le`,t'^_t[@1,q:dqPA855MEc4&m65\1j3n.+<sp8IH*CT-?`Y20$k,b;@mn'HNlA`giV7KUI!29;YA"jZd7=Sn=nGB&`+D=Y@VMpSVK/cYlg'hY/[V$i']#t(?\2Y=s'AnDPf>_J0-V 1jej!PM4LYrW],HA]3GAtLF*c%NpR#eAK7W@.CD08 .K-4QeTlr2A\R#P6:t;npdCXPmE;=M)H.Ao2ki.Gk^X7OS?jRr9I4D cg7U]'e69-f-Gj'2(h*.js:I%FpTdhnfDI MNLcQk7B+XY\AQWZ.M;&N)l^W9g*g1)O>cIh(t]l=:g.8MNR[^^HpbAEKhN_VK>=/C]'e@TKAiigaOjofP"UTKJ4?g)N,ro=C:q:<=Sfg4pO#BtfCrk^4*<$M_OI6>\V)"m[8?)=9K.!nH_\@,[J\l&$o4ZS+W_32GH\QKWpRSPo\9ST>,*YIQXj54\O<K@R9ocIYA#a@n!X8+IUq'Dg>aWT+KqQg#rCIpL%:/^A/Zk0!&Q<q;0VN7$2r`"l%Rp"dEe3+4,;AIjEm'f6&qljfXjQEAWO^S?;7HQ%*)0HboA8:WLUpX%dRANd:UE\kYPfSgD-C\,dh#E#F%!c/oYfY^Ho]#GHD#;ZFrAk==(c2Nq@ !(]/FTq.8Wmea XJ-@,.X'9r? !LB&arUD2Ai;LjC*KaIA:EEK-,6&'6Y)$jYdf=QM7Coh5fVp]B#/(E($(\b7"rZH-!sAd*VRWW(c3F6 :Jl;'a\."VDJZ"NsMr:30E /]PRT7d.H_ma1tsM&UAI)q!jRH7Aio 1=IANt.Z#3k[_'\3\h;s@nCH/2T![ZJ:aBgUkOP'p4pEPNU-rAGAk,:_+nFm,:b/4AO<b+rIA(.kGt2b\T[d63hjELNXIVqajbG0:HKY+W>MFDtt7ceOoco(0Z9$o:1EV,bq!hT7QjUBK@FRVXA)b#FAG<;c[Ad_&R41&&P<CcTR'taj]EF(fCsFb'/$Of?@1M$!(.'m:Kb`RAXh[X9IHp/ ZG35b.TZjN*!hb(6F+/qUs'@A04<TqGD?%+3jI3`q3ojQn=%^]-PAZ&m+QKl@57 )!p0>ik-#?=YWgjc'Y$)47J*>">o<t:b*M@6a!$F=Zfco2fWiKB%P,_a58kf)'UU>U5nkr'tNTC&bnc,nG*!W5[`8sfC;aF+tTG8t9>1jIf@nOAaEr]DU$chWZ61 )fB4In+i<.]^0af-pJ/C8RlP(ZA`\mP;T4h"c[VMr1X1%fmdpk)4BF9#i&*WbY+A OG;2"V'LML,qI>V4P@U6H\%$lg+D>=B(I?-Q+-$Z&+#mL8f UffC2&RTX"hk7eYXi,55tjFO41th)'T*cSD/\YDiRmJ&4lQD]rrF88apB\qZ[Bs!OX64<PGR$adA:GTfT70q[W*X^<0:S_aiHQsq2%tT3]HYs%IYU'm7Ke\Jiasl258g>L*9lPXApK`SIA49YYMr/D;%*1]8G1j:A#o*MP?N.+=4n=(fW2KLhMD)CQ000_A%XAa^n?a1!ts1sg/V7Cp-:6[fI(YQp*i6AJtf\):mj+)`"[G=P9<V;;`KYh2jW N>FVQJ\H"LDYi/<\I#aKdnn3,$eeltPj#iEJYG\(R[*.s&U!KcS).Vm^tr;gA$kc\P\?=+AhU2%V<_Cj/KS0sZ4^QR]pVSZD\:is+:-GUH8i4HIJj7B:tT63-B_m9K>ChXigVt\MN@BUmBDig5A)4?;TjAPpW>6Ab(jdh'\!lF&IH,AN!Wbq <nI @GWt*"^a%HP@8Rf2!7""d4iC"0^"m=kQpiEEZ(/lr7'r&;@2IY B;ZVolI=3<cJhn%@39A4G<q##4n#j(Vk"b*l)$q=U3>E&=ZeNW6:ci%"_Krid<\`No2Vq^]KG>RW'C63MXS1o$(jWI/J>Xp5=N4Ns2S4d33ifOM1!A$&@4VU$1&#-btCrgF""Ge^MR<s0(HAAiJ%RBcKkICbShQT/W6N8D*6.[UlMh6nU"YgB@FZK4PX#,_o<p?HRm7')7gPW5QV\aWA_,h711$_.0nhh@&+=-)&O<>@TD6)Almk!ZgqKC8OgppkZJHl6ZL tR#n,31n]$i-)AO4)LKM?<K_e`hR(=^5@tmsQ'Z+<'#ZiNL4%[iD'1`01cC?=C37=KaO<<8?.A71,QMVZj%EEoZ]cF".(ta3.lA5QFllF(HEYg:;4MqAAnZWKqd agd>bVV`b[*A.k^R8 9>/ZV+pP(XNi),k(\X F2)T9;*?$9K"-l^#K``8m<@Rd'\LCGqshA9FJs[2Nqiik))Ek.M fgWa[":])lE ^igSa+'4FQ8?O*(DBWH\?8L1qXY(h?k,=i*/=_]l$%d$*cW+5KP87`6RF#c,1r'K6Sg2=&74Yd@7,b`4"95bD(e'UY)YR#kX )A*9.q0sl,j)R^(O'5kP7!jMprGFM*!r5A]BJ'&pkPdeO@Q[B++1KEPLJ0`1MbqoS!GgCZ]-)aDiol)cq@5bkCAn*@8 s-JT!R*mo7PX'&]\A&Cm)F8!1+a!rpK6#dO8;0:gC$?XEb6N.WQTK;cS%KF0*mraSTAP-E[aSVO@7>5$1E##aD5&,aIZTkUE%#9W]C.5@=8(/<XR6p3ksfh)NcQH^pM?s1D^4XKaD%E7f>KHW/t.iDZ]QQ5I=ErFf)HqLV_J)#X&FbIh*QJT[A_Os-/#f!Qgb\!KArLj!UGN#9gl&k3*X3/g;:n`dY-!Y&#RZG8Klc+PSQmQ:e\BMCgJHQ\Oi!jVO!-6g@A3rmb\pVq*B0@5r*ktX\BAdl-L,@@GjBGS7AO^.!jU%icc-^+@!!nTN/E#9)1"m86qQJ$)i2^"<E;V-I<Q6h@)QV4pQ bUcFCU>e>4*h'&'=kETF-3I(=5c7,bqY5Mc5c,'R!n0hr87*phBM:%t(44jM(!F04pg"-R]DIn@"d`'A4##B;X9d`,R1S%n boGUpSY!4helQV8#69MQRj.(fRJi<;'oIhK&Va@g*eo/k^3O+9tOA)V>;gZ*M!CGYoA^Mek(+p0M7AY9ZY:sS)&7Q+(h+t.NRqX %`1)dh4q$.Ib7s ]SGKn[Q0h]mm+G3IUS@/bq$C%<#2#k9scGN*V$/6gL!Tf@.FF//.r5gBY?9D[#mGbQ+paH4rlVGsXXBqJ-E.ZKeP0AKQX(mPh?W_l.X\I@UKb"rHrQ3n*5nk3L_jA&4`@SkL/4f&,UYsrA1\JU75X `<2QeJ(4,(s*SYAO5<-tNh>V:F^p135lAmDd"#FA2_U@raXOmOqjT&=IdAoa"88UD_5e*=7Yib-q=ier1/b>(\b_?%D)kh(A;A,9Y8ob.WQbi'S@QsRf`%C@%F]qsbq-e<XP661H80!Oa'Z<\1;4i[?l[BQ9GG6%Ds'HT\_`@)4n;H^aCG[J?$^N.)sEgR rh5#p7bR(A!8t5nT@c$0eaP35JL*U+A`=Wb$AgWhm0Y7)[]j`,;\4Adkst[$7Wnl;M_V?lonmaePN)HK5V"g!nQ=`"gpf<B2U@YWj)jnIelhP8g$6+g:Ft&6jV (n'BmCD@t$Ncg7TU=fnRLC!h3DFk"NaVL*6(c\kd%Z>&il3-&s/`riH3;+8M7>am<sT.R>MpJXI/XoHAkPKpXJU71$-'?>eo:XbD^N>1J]NBq:Xj9aW8L4"+<Hn?p+tp$R.>\f8[r(Nk3AB2Ca3:9<OA"(`D9l2EmmQ`d@Lj#HskG@PI5F&ckNnk4e>M>>(>r3ZP%S7K:Jh5'_)JiQn"2_ff6>#0K/hh2,*,dUbS(UhFeRsr"ZO^p*qM'BW9p8 (/EOjJqM<[pbme&L`2XT/b&$ 4R[GI8.6ReDO#/HEA.2Md]DH0<_YqiF;]mFEX?12oq,NnE5qIV7mM<hHb+PZ`GS#rUagL;-TN?lI!kmbT_,CZD+\'*NTI/%LTZL5X_gKd*DRd@Ve8ZG1#fcmM6;Q'hFN(@+V;9j%NC3 &]ohb&X$Y"W[/'g0Ljo3lOIDQ-U4%%"#?]g3:dqA53k+8tAd!aM(<N,7-Y7+'B0VJ7E6B?MRS&Zj=*ZU;!S8a=qA^?g<?<C\AiRF+q0\?f#bTcWpB*4:`7JAG(.rMHmq*5A8>, k+a*)D3SQY9*9!Q?=g[m!<K,<]"3`"(l:>mTe:jmq&jAQeCad4Wo^c34ttXHq8Bf&_*11<t?E_'NI6,6N9/! 2E$"Ctc-3[F@`:+9f69b1o2"'!l`o[iIP1rgX&9r^]a58n]%/Zo^XSA+llTTYEGAelN4D_h^,.rndN(=&AlntlF9R:i6gNf;#E8@Ni*:3]*Y7L`PPFM">a90K"$Ti7V-LCJ$_\XHOUe9';=>pfk5TFBpgJ.\<BA1RhL6Y7^tP6=3EAG=JlK\e<Mj^a6c-[d=VG/#L-djIrjB._(/KosS>`)$rV#[kDp@M@%)Z`2MQp&=kq-T*-T!`.D7*e*_BM:oA$`O?/,$FB>,^7Rb<`>?QNp0&P?HH\6e\ZW"+]M.N3GfLPSJ,&$<b-a.?m4LEMbt[FH/.LX%]!'8S<`kL7H'S;%Bhml-O%#A.AQ#dl$+PXE8!Y!2%aCt),+ NK>UHZQoT3qk<7r'RJD9oFYcY%X*LdK5l\M=VVG%Cd`1V;0AV:/@.GP@&;pMo/%70[36V@UbeR/bqp(aA;/8, h3cYKhm8-<pXs3Jobn",N[H]FSfKenq[78f#4Oj74\:L[`O#i=?Un2tmI/mD=po'i-,0oBQ4JWjP=9">!X>`Ak@.=KF/Kn*Lr9A2HBMb+Ma5=6GlaJJ7D)VNsYn>kS+[1W!rF-2=/LV(7ee-LM%)b]Xf@?MknFlJ?6LAbX.H7toG'U*ZhALkX>'`/Z:O7Asj29LgT0&V!+/ABRn=aEK+qI\,oU0sMsfo0e\[YXY]+Spbn67HIJOfCgJR3<43tZC1KnJr=f4fr:.#KRfZ(M=;!k;@HT :/iZ_H.HTPn2VkAnn)s4A1'Y]1iV5#,mI=m`^(4@+(`^%-ia"oh<N:@Nttel]\]Oma*LdIdFt+O6aV/t7MJ0c&8Q%M`attI'R0ij3hasMh]VJj?"Hiq'GR4MWn5aOt-K+DWJ\!\mn[?LXWA?MRs9 ][%Q7+=ZfN>6!%g[_/D&;8!':E1NKG&4))ARR-Ar6=)@Q &&)>/f/=SLQ_#,efRaiKj:*4G.8Lc*>*BkJi#bXoHQr&^=aXB0\-m;?\^F_<ZnUT1W8IsdIVf#q,^t=o*%PXj<dN5W40HsbA.FdR-Ii&0All\>AF?r5oA\EI`X23a=8RZR3LqN#m,VE5+C,"Lhs*mrmFKG^(4ffII==VkpJ"f)T*qO_ja9,\J"-Qt$"AClXSUTAc/t[-dR/?&fV0E3r-D% ]M;SGmMo>h[H`iA%a@.N\D+eh@*-`Ap##HP&$bIY!-Cm14pK7X@T)^%b'bF7M`F;)Lh!SN9FTG*dY_rT\pK;8A#6lINMYs+JGn9Q`?-oKWN.YfE g^?#n@ZFI8"a9:sc5$tKmD8o-;CRJ92+Y[3cAWNS:Jf9/T1#Y=F-64BiIRiQB3qCbIU</Rr)T$iV)q\ r/cAdd:K^;WA?b[b<L(CpHRk -&%PVE8Ng..Nfc_k\Pd3AFA()<3l<4CWAs FcSbb%$j6WEZ,_)O(?(&)>XX=p=DA*/j=nrPcOsf`Ja18I7R=_(g5mABgVD<M4EFPUE9+ *>3Y&*>JKP')OWdVkC-fRrPcX0KMt2 C`Fol[nRllZriSWs']A=LX<3RPV`?cBfY#-A:#F?Y[$Y$5.@2sW7T?L`$;QH$$VgYkr4B_"eSC[a36dC[ cT%*a(C%<%:X/_R6Fq;YBAgd 9)lUFXg$PtnA,"EQrAq;:Ss+tA"tF3VA^7$\]/!*]2+8/ ,0ES-1??Wq[>_$`;2kf8^lt-fZ>h[#5G>j(BNG.'Xqk]?n$cLOOLhU2F?W%MOLM%JsHp8GJ$VO=3h3P/*fp1)hl]iP"32CFGM@_$,G!`KHh#d0L"5EeSn hj'.3Y06q`#_%Z[%7PZoZ;YgN)b^@&'Ym_,_l_q"#)gK(#6U`k7W,ie/W_)a/Q;r6bl<q0EAGX:^.P@Ol')E^/@EPPjaHoM9JZjC6+ki@J^\q/'#sRa%H1WkHEG/+9%KWamAsUdU6rp'Xo)@@E$Fq"KC`W/jLk.Lnd'CoEcA2N36E@ENT8pI@9J:R]^O3oN5YY,^ JV=6J\bmaR8*A0)&</R(t`/+(NC[(6TD_'6Ul10n6Wgd5b*/A1`$fciafJ/@*4UY[[0[N!6?gC389H9]"b]<ltnA@.QYJ#X%'hq]&BX;s5d36g])4Oa:[0+QZ(MQRmsKS`(r%&mG_2NpF"ATY6EqGF68OB05o0k4BU&DEh!(.7j2k>-:@2c]KGGY5WW iKLZe)WWjm 0:;Nm[dF/$%U"f:DoeGgRmY-Lf:tf:a!7_>G!lAB663CedhibAW+PYF-,_"26:NRO@:B8;>dBk?Ej(%NHQ_2:p"5aR#<:N6+]b3J4$31\a`B-,B+)M\0Ramq(XMV>jNKA=Kp%lXbN+E;#EbCHsaX00jg.iAXL:q?\L#1UFRm_%K]h,C%9mo^h*Q,14#^+Z@m<FI3En$:niO.5;B6l,5b]Tl?.!cT1].Ke7SeQAC7AVM^I4U,*>8]FqVtFL\BH.m$t8SqGpc?nHLlMJ=@.SCkXhjE5-lqg= BI9Rq8PSf;LmfJTa>jBUaQ,p\,7V]"4jf@dT+<ft+"3 ;FrUmt5`^<L=h55./CFW3gt9r6ctRCe6+3lZKs['it`J5jFH2@V.7JA8E?RT; UQ9A7BoM%*@2eE![bd\5p9]CPGK;i 2EDGr4(Y_T2X5mef,sH0+Ei3*gVD3=Y.@),$pWir3YV<\*)At6DqAm``JN/6Ld$*nRPSApMdsB^U'RK_tOiEle/XZB5E>,T(r^B#)gk3*FR;'*mq5!2)@N0AK/.`^1tp_p^VZ1,\O3"S]qO9eNQRo`L.eG?/f7Dl.2nZYpd aW8o03SA%ZDLNP3G8*1<6:*hVoJ=TrVa&!t(I+DoLW6h0tkmAnehjg+>UJV ]JTBnm ;hN^l+)S.CG:\j[em6m>;TK5Y%;p=>H.8ZedEk=BN?\\DOG)PP.S-!lT@#&HB9)FOII[CO(e0&JL<O)gX-CiH=I#&q(dAH7$5X'%\G.N,75ogEeb]LmLS0)^@=qAgZ@e+De!<7JAY\#6N2oT"=:g7k\S]?WJ6gM"]bJ.fZ>LJ7V=d(Lr:=dm]p3"SL;'*_O)"6V897cWP$s>Q*<?dla:j)rV1p#KDA&qj.m>I\G*JHZY6/9c[/.!:31'mibAEiEkRa_%]d+?)bna.,ZIf)cfc<L8j%9X.330t7\oUlh%tbH3'kF`'8ZLk*r,0`ZTOo\]AB5n$^D+3l]dNfPS/c't#<aT&Z=kd3Lm\)s+?P@( /^Rb@FK"Wki]h7XBNFMt)lh@aGT%?CqHV*`==Hat#^4!DYTn@Z>Chc;gFc.e'[)<tm]r)As!Akq<(]9<tiZ92SA>6.eV#/itVK+:Lr0HC3$Z4*oLk%0mYLj3#DU\4qWqNBsNS'_B9d-*09U9),e'>bYi?#&dAl\X(7?0%eRQ:V*hDeI84n"X1a/N,ITr5/N,S2"3Pm,k5]s5gf7WU`NkNrdFd(7P:,)(nPD=jH8c4ksI/<.WUfE=_OF7Up4H>qic<.r05nsEoeXfgB2$ ]MVSj5Hj=GsCs"\hA1>c:9Uj?%[Y=<N6*`QE*L9M4K'k@j!eYC/KDs5AbA/-ATEn5F*tG:KEVSKsbc%TMC"tV]j!LA[8EG*-i^TYY),3hZ1tlKbf\(Y/o66iNjIW-_g."piGg0kT7IlVDo1e$ai'iJ 1k$Z%gJ 3n(ZmD1X]IZYZgHj_"hP-a)N5FCL9c@s[j-9SF-RAeDU)eL0oNT.\nXZpe$,ZHH-:ch:.6:P"cL(09m#L9&g_F)F`kLBfC+n&`MaONb\L8&'XOjW&A5V!9FqPYk1:i9*J@<RV.7Fg8dR[!($0RBG8JAjk)CT^*80]\.U.Ll-<hW(HF_';i9Bt>1/=4<T1H[tm'@W,.^J2%)fUBk+SZ(_5Frl4B;#< @<n&qeFD^ 0=#81[sSo8@@tWDO/S#/*`Uh+NNIRRONqtgb$>jA^TCVaLePTrY]2IlGI?SXRiA\0loHkLs?`O\8&?<>3!?SM3AmB)W>oRDU$[2k`7_>Y,a,+C.e":sEb&fTD0EA5.XdX2#ZTM>$X93b37.*$+YrFTorc85839WA[A:7?4>X`VIN3`<5!ZH\h^4pFA<mZ@[c];\6MPj.#c;3.3@6c;<p\gQ9IAH<i;G+'l_8>^JAln:8Q'HFG`jnAnCRf`8WHPF]]$k[B#1;LHW?)W5IS4@C=O$4E"]4!Cl2GpA ^Cm/tJ *?`6pLMkVdd.iMlo#[/<l\b=JZN$S]G]#Ee&/pd.#16olAklO:s,1e+9d2;SA 'j@VP3BEFcAUh_9Y&Y!cnMsh3>af]Jc#Jn^tn?BefEJ]jMMkWIh`]sha.f+e< 80^_)6 `G0=YPUDm_Efb*\&*S?Op6kBI;Ae!C)-(DFT<q_<TF=+ei,8oY5NDA+1r&qr p?''<`Vnp;SU#9.>>2iQk2tOftCQ!M8V(>S=@$RNZ*n=ANm2B1kN#I)PC\G;\aEHjW#XrRo">"YFD(`pU5tf)_T^8SLUZqU#.2C6`#EpJtZ^KL\.(n/&-0WWO&mr`1RAF"&LtQ=`<h6?#:aJnh@H WR,p@l@+(&;2e]NC?cj8e\'!Xi!^7=dDl[2^QfrrXMM0#aNVXB9&Z?02.^4AT#Ln;QLCcN5P&45B^cU)mg.,IJ'/gN7?>i?5opDmm`Aahli-r,H*1(32^Lc>n<,]]-^]0GRn$l5j_N#hr4;*.e6P?-$+Sm%PU>9as`Ls1-JINC"eFPC%5sATQF#,s`I;SRFCN@:- C?R)b:tX\:iVpK<`0FR`].7k:KmlBjI[,Kq"@QGa*QK.mkd$CnOp$5WW@GqDZnJ>p'E4,/j[_hX"1@)O=A>`-Qb1Re+b'!': $kU<W"=s)AnJ4.:4&'S&IY%#CbnJS5;_`!42!b\c*%%+"@F^n]5PfCjORH.-^?_t=:Rd;/lb=B8SjC35 (?e>B`bgrrJ`&"9V7e/)i,(:I:7j5gh \,&I5>&h/^C0PctX-3s'VAdCB6sO(F."4:OL50H3+o("=n.AU13=OsE-Y$8a0jSp+!3OS0Kn%TY1VjAGI2EcnJ/f,9?RRWUhd^AHAcq=%NF"c_O6\5>lK<IKE"!6G[/=OP!)K]mIYCL_T*U;BmBtV3[1j%_t"OI"c@`#Ib2mim6e*#KG t3Xpsq\MlB>L45A?.jr0B.]XRc(?7?6MB0P1VWEc1n!'/N!75,.=!D>92_FPLHmPDB"qrJ'BK978B3g.6(Nh/-#\"SsokOb>DcfJ^eEa &.ccAH2_bdA"")'I)7Y$3o%@l]RPrAogDj;60"LXpE/VtkjV[%4rYh0NAs\a'_0/Uc(iVb_i%<A$qs>?>[GTP\5@9%iiiB6r91qf0At[t$D-_:5^M_7g?M_ZQX][6OMK8"S,Um8@S[Z3M&;ZYT)N&_LA.=c PAl5A@(\5jB(8O!t% c$s?+Ga?,JjP.,#B_DI8,PPjK+!e"^dqNKdd[jHL'\/_eaPifs[2CiG^nm:.gjV`&qak@BJ0SRVSQhtQQ2[A]?]k)o`lln\^4I>6*SfJ#tc-'aqt7+?h-.Xsn!B*AKV25a'NH,j&YQ[?)@PK8L'PZDPtK>n)+F6^Nnj,ZrfpjWg:H+_*>/6K_]a?#mn^dAa:8tDLa3hi2_bZ@rk?g9%a^s&eW_#k!9Sr(mM0CQ2Ot`qnBfR2Pm`8hq6"g#E9XNF)th%(IH=^FM'bso!)n7Jg3o?\6mQ#jlI0GU5G+#DmC(V;7@(^gs(t\mJ*V&\V\@Ed[b2[[>N^;#SIWj#Af-cF!m,=1Hh$R=VSclKEqnom[0,QV-s%K#!g9G;4o@c^?;D,jRFHaaCUh-L -4\6TX)`\IB4:4(+Adeh9CQf=t0(tO>n;C@Nh__?Fo&Z8]TO:hMf_+B D8?+=PA*bE<M'6@Y!^eS:G`apd(:5)Q>[JP1=Hjn aYs>SRl"ITj4qL)ILm$i\f^Kmg)atqED,]34Mt+IAA,%Y ignFm3&[4rbl6#c9+aW9/R+HSXkAA'.Ij2>1(OJWF24H(SBY^;V1%&Ora?U#(mr]de`@&QJ&(^Zl"9%N"`t_[]E98>c?sGjo#;nd*,kW=>r_Ddt!Q,Q25FgH72eL*fW2f7E+<aAn<gZ"PaYaP'p* OE>[hihR;bqmDooi9`jiLm)PM-(A:i=D2%P/MB)k@'dTBLX@:EKK4`A0"A)`1LmBr U$ql2)AtCmUsDiAVAWb8""#kV=b65,&CX!H(Da7sdd-<=hHHo03,OLCcC6* \?(_T)47RfWfPYc_eZ&%1lj"0W/?.=J?M%orZT5<qA51WSnfroD)`ccg-\K:+HQ'h8E_ALTimoeA1dXFP3 CI/c9_0%J]DE=(Fa''lR4<9B\'5s.2Co580Sri[A85n<1ro/"#)_/-A3*),@mmp4UJF4'j4FM[tc6Kj9&DeB<gH7=1AIN3fB):e@@jo\'-teO;2`M!P_Xga'C]U#mSpV(CedWd6/:\A*k6_3S'ca? $hei3j$_8JB-W_[m8oDjQ++m5lj*moJH$3\hf_<92:eg:^?Jb></is_#l&CL7<&b_U7Eh,c]4B9j*!,_5pH3<+BRc+n2 'AB])MT\eb\-XF5X^+-2DDJ7 FN&ra,T;\97@l>?9C;<TElZRc'VNg._V'Hio+fm]NosF&s(R#$tOfd=LdVt X?8E^W /fMI41;Cj]e9$=^m3<m?O:%11F7P7h$gleBj+0!^0=;BE+4+`Kh8Z[T[6prYkF%]_a5+-pk 4a/$BrLkY>#*N S*4l6*R_70:fP>"mlEA-#DPXVdfF>A5JJ*\Lk&!.@CNtQLn74,gN_NK=h'I`RAc'Kt7^AslCRjMGc'j+[,W6$LbUJ0@GLd3FK)]81&P8b]DT;@^7??c:NA]8ptTrR&,/eX)I]MK&'q%TcPe(TaV-er!'3j.iXGAmdG3$GZ&G$')>/AhbOtm2T@hNq\\sfps -L248n$^ALP]ho[@1/.ZZq3IWG!*2WXPs%[S-$**YGC?($A-;.G-NOa>B&)A0_.`Cr'QlM_=>GA(Q%Crtn_6Oi+pj*iq@eX_As'nS U[LJtt4p3Dn6FHIY(1I%D4\>r78crA)<OVqpHbm9k!Miiis $I[O5\HVS6"Tm0L$Z;k6AJR':(]^c&C2)_cALI:8^P: GD+]r7Qm<mf*?3@Gq8 fP%YFr=JB#3j"[I7FM+A?Nl2qV((8N!ARRZEFm.Ha_C-"l]fTJU'-eD/+().mkYJj G/":CE2NM_ngf=(frO3NW4KfN@<%"ltQ;6`MMD9YUL?YdKE86Wr-3@WP->E4aD#\hU!][mh3)ME5bCo(OlVLEU35q (fjKUlBq^qCn[%N"WAV_8Tb-EA3IM]4S'-5\phTYY3SFsCn'( F<TWXKhQ&!Q,Nj*!o"],M5_YfG6*EHcZ=P(SiAY%1CZmnIfeA;Fb(hIdH3WA#$?mHK@OFcrF<.pBUQC46T2'?qr5`>l<(cLB<p:*jo5FDVd=6+NB1>=XG#rVjK5P"b9%bJee_/_AL>D_Oa;XZs\ JFHRP"n+.#AY^.$a1p'j+;3@Ho4^)W(C<;J+PfKr'DW(qKn/L^lB@X`8[9\.$#i^,)RCE).`gMXC?p_jh`.d5$<VE<n`!f&b-J2VHDmgXs_2T3c<84Q`r("Ua"om1.F8OWPc8f.CJ=^n9MC8P-50PhA"P2Ibm_EWGs*HNR)+'Se-;#X9OC)B3DPjO%dabK]:^VVEmM*6_jG)P\IJ"gpKm4 tp[^N6;6!FR!nVFT^<gL3%$FM>Vb4^h\b;Q5LY&&7"BKkn ]$^-`+S9M'=!f:Vh643P-OraoJQnn*@AE3n3%kcMt"dh'CRBK',l@6`?Z)M7_1<DOZ`[K3h1<.FH?lc9-_:Io&d2Ta#SDr"_tRBjI8<co`QL/Aid)lOYW-Sk%*eNch3K8`<N-]X0)(Q!`HVm $^%LB9paS;qK Ad2t9c<:BsC!g#NA)V2IFnr0kAZN/..P0 $B=moOAaJM*<sqLUPpnHK/E5-f 7YM=[F$>*3gg)].<hAk\,72dH`_2'eP'36F5%pQ8+:FH'Q:;2ZXXGIApr]q[s65"? XJ g&r^=7K;G+?2s&->:Vad("+gft$T3aW]q+3o(d/WcSW:_B2#e@n&mq7N7W09],V[Hio8!6OZ%nP=LjAl"]h1@&T`8XDF-3F,%MD=.Y[j8#Wj6>=8;2nLO`93V8HiB3GYjW4CBdeI<)W(SZ8cm;SCGgC`ZK!$)Z\CM>W!Na/:VK`MA[-YdoS->HZ5Nm+^R[W^NrOI-(c)J6HCC7e'M=-DaNcPf]4r;rTdl\0[>6"\1)kHV,IoaP2\F!PJ2jL1G-4Y?)ML"a:G^^/EkX`>)@_#r$TZJg6;A7YWf+rJ5hec<&FJ@?3%;]GGmB9DmInjAY@^AE24MZ2Sb#(:!ke1J3mU0'q;AM8XHLgrj3<&Z-]l!M%2A5.a<RYhIK[!9n@8QDnJ6=]^OVR:6->f>ZRh!qLr)MJn>>0bbDLRR<[hq$8oi'2h.blNaY .N'L/'h[&3*\Onjl/LUoMjA= FQj<2l4[>JGsCM:`Q:#[QL9/U9V>LZrfl%=9OAtLg3.'eLrH75.:Nm,i>Bd7 3n<2-q8p=?`FM"Em6g_ngd*WND4PtcgT)ecQe%d1"8A_(qPr*iW9N#="aBd8N3bKONV* -p[^^h`/C$Oc[b':)#W3>rBBtQ<;giCQ?/kSK'j.gMK8i>6`c<B'gC2D?tQdAFOHra3TSQ#qX]a8!3GC)j!35KLV,j#]OYJ,c*E-^&OFM[0,9j)sf&ORm@3*2tUcW8T5%c"OI#-tZS;=+5j#0#4GPAN[,E.ptI+g/BX_GVN`/)OAA&phEaYAT*UJ:9Q%BA``b7q8A $?CaTPNVXj8R"#kE.22A`Ch#,stA^Or8i02;<qm+kF!Cm16 V'Or& )KQ-L.o>^h$6rX>,2t#^r$6Ai)Z8q^=8tr]BdP!WAb*5=[J]Fl $c#Q*JPX\^PnSB8BBSZQ2aTH5qT;:\$en7K737i'C.14gE\/ FK$.`6Ps>k@6+l0G^7fAmgEb\siM4rVF?]2X=Y'(4]O)jBFdVQ#ER0=.BZ,scQ \;l`>Sc3Sej^,YRk+ka%l,eRoANq5+E*$=edWYdJo<#j,8]YIK+t/&6<5.WW2& 6J$i4l[gj.^R&KtPq:+\:AR:cpX4M30_fl77Q*j 196-t9i>PfNLh$/#&+-:tIq__jbj@fj@:.>e?Ysd?=WF`Nf:mSM.0he25-Gbb3s<&#9&Df :$OJ9X%gMm"=`p,(otl8II&M(kn$3M!UI(M\Y'/Cmrl$@AE9 _;cip2JS_e4plaNP)S(9;76Mj]deeSaT.[2b+ZJ1A<<n,>oh_/t!XWI\Ac0#@_m^aT6Ng@0Vl3AscN,ib65]4QoCLg58d)g<O87SsN_-eUS6#nccYZrI<K<P-+QX>dO<?&k?M@JspW8GM2hG=Tg2q83k@ld'+:#(pfRr#09qc3Ue&!PWg9"hYb^>(&&qJQ=J!T^2;9)d+0WXp@E9/n188"eMrV4`Dt06]dY`pX;hE)!PlT(CAa+.MNF3C@CCG<71rkh;PN]Co0VcY%biWbOt]tLB"__IU:L 0? 'CS5ZlWbAlG#$"Y[7rZs=4UiCPKiHQO[ai`Ocl-/R@a?FSFaEJ>%>:qhrPK7O!qS;#EI\,Z(A.nl>r:LY2N47la4e]obrh@0k->>sTFQ6L6T*$AKBJ43DHNtij?HMh r#d.WLOCC"@LPX`-_q1Y3bUHA0<\K^k0nS0O,?f[lM'Y(tBM$2A4Hq-F!3X+,X\"MH?M/6G *NTRg\T[ol5"V+(T@tf=a5'g1(iDWr?9b^D12@6PX1a!C3B.M%PmMNXI:1k9NegL(#9D,T]c;ZhqWj;:[CVs-nflL+A\:7L:1Wk=1e+%4`J9go(4ap9h(trBJaP+3!]LJA-e-lWMp42AfV",>7<S;04qKHDNAFrk3<ATKbfBdKr.;(X/UFa]<h%-"IK!t55i369VY_f?@=#">(5$M58/_UAs'9m$:,J@Uc8jefpVg@PNXiF/b^bV+],1];Um31DAqk"nE"OR)VR/^nN `giO%X 2ZX/S`&rr5\6Wo7ZN3^!SN'nq+P!$7S]H`.(&gAs!?V[6:GptG1Z(Der*Rb]1^D--jX(gPGZ4Le<C&.N2/no<TT"lV9O`*WfRq%oBJ2dKVhHq"f$tPUCI0;BYZJiK"^A^KW,D]^3Z:Af&+6L1A43J%I0YCkAZ^7Tf1Z<[H/?4o7eWFCKEX8n(/FHTpPg]%D,]T%d=rD\9-$sY\O[qKGVL]^A-VVD(__5%t<H.6mlHXGX;!jg<#/p!_bLmP[dV%Rh\ha(US> ZMP*IcX_A^rOeOC$To5YKg"%r/+-%h%iQ>^0Xl$\dX@I` ]T2h$kFhcQsb/VjV<rF]D$!-Q9BWfQt6V<R4V;2B?$LC4?G#[YS3rt)0IdT7*]b/Y6;)pCD,r!lMFcnng_+hVMtjD_VURmL3=jh1C=[<U+Oo!^U"'PO;f)spBB(@tgi4fSQl.%]*pM-^5F.ddTN(*nS<9G1(=mr^b'b0Zh+B*IDW#SF;NS;#F'q/FDV2^qsA1cWZA< bVr?s2Q4@=0!,XXt%/Q>&g s^O,."(KI4h+ARfselg[`Z;WIeV=A1c-jfNF$s6$/3\ek;Jb PHk-X9WpV/"JMT1r4/iV%]"UDg7%f/k#N\!ioc2M;CN1:4!@+XY4d`K*&/Cdjh)KO5@YDm?8l3*2 cnSV2KYg+-S,?NEAF'7o8gE]iVnYNXG9mPb]g [j]1(>!(l1]j5`7E)D.th\X 8?G/dOP.)@)GRSn(EW,,<<E; ]p^+6%sP%jFm8W(aiPTNnPhT%YAfEk_dkTYt<Y9 CdY2%+HA1+3A,G;A8UmPYDa8A74.'=t&B4ns]lo6[g#[UnH9#phl!^;(ClNtRppFs)f7B+@IoNNNSLpj)";cNF"liZp5^gch6#9:03,:"BMC/bJD6LJVho,.^Blr0l$#]#oA0f!-8;?iK0ngCPdtjc8RDUfa9Ql'CC-O>JAl,,"PthC@,<H=2#t@1G$5*.'#0f1m@+M R7/Vii`sIJs+7gp%f#;*I'ZgW7$.^-J1^L/a+P C1E66fA;CAZCoSaR$%q>(Ttl3]S+2e&%>.j:)0#[1*kD$]!+[SA8T@jt/^iA,AE@YQ*a/[BPH+HQ5 FSG*S:,BiW@H_MdBK76.<-k75-AR.;6"PD(%0INhS7ePls57q;J1`.aK-E<pjdAsd'[noGf\N5*gd`Q58n`VddhUJ8!B!AlK3_aT)[=Q9O@Z-c#scjPlR0sN.A_HL-YZR]8O#SigH"f#`mdFR(je> 7_W.mK"[VZlAEPkb7kI45ibQA5LonVs7Ds2_!&;r%G"(!o'FPDT)NAbg/.R7FR[ll.f]#!1eC<@YqiCf1q9YsRA5@`^%EfYcdCjA!Y,6 IK=VOm&sLmA1kkC6eC!*0&e+L"^)pdKQgXAaXk3$mnG(43KDI$Y-pD+h>oC9F`RITFR!D'oX)=OE^eO1IOQ>%Q[5QY9O#ETf!\dc;Z85KXhpALN#4g*.Y q`O5I#XUh*AUb]`<b2#)%OP:Le*<>R-+TP[@Y+bm6n,N?5`#-hoDn']>A[]Ar?[r6tAA*1;9q/EVV<3*>Br_)kk#n2HP9j.8#c+B8\38($=M+';<6e4SL4"1Nd&.O4eVkT@;8;fMXBrj%bWCr[Qcj110"pWRck<pJL9V5\0<b;Etke6AJ5/SR"jpL*=bY/%>p^>qnB.X*cm`S27'f]\0 "l";j(Ah.CA +$R%%6.lk3BPTK;T'aKeY28eQg;2%:bi;5EjP^PlDUZEDQ9 Y%s/'AO?s&+4=&ddn24D&0Z$D>%W#[>&-nAgX;78`-5hj?^GktMm%W=,>KjVV3/a;ik.[@=BoF\+fHtBd3Vc'Rrpm&+PN+sR31AAj@kf*mp[IieK9OqS\=1NgFG5d?/G4`Da&k#!dr3n7jM[NQC>jk8g!5Ie__3"7)/Brqmk1tFUhXKi&q5[9UPdt];$tiMWa'l8mNDZ?Z(SDUH\7N4$F5Wejo]_^J7AngphnD)O7Kk:$;jKVE1\aCRL5aJDW%agA*les"Vk3$0pq?dLfi#2*'S97(Zg5PW*?8m5rjkA<p';]m\r'^[8P-M\Wjrc04Uck&&d'Vh2jDmR$=dj)Ej%8";TE!an2FdC$98F:;kW[(:e)#DFcYkVY*I[jkCH8T$D#%X<V05;C'O_$e3k3 n1m.b!P@3sj0@s19?GA\)b?6&WYl!P,lT7%#)L59:&+J!TO#;qR^rS P^U!+oo+,:%NYRMs<9siUDXP16Ao[Xa^.47@JbkaqD,"G8@_t=ZkerqEj(d(`dhR)<<b3`C*%dGF>hhjd9hk(AS\mB(K?i#AYS)?P[9(bj:jEG' 272%!"*r;tD>"X$/i0A?NJfp`n?dIA9>nb\1TOhZ:2@l1Td?M>H#Q*)>1$@nb[7XhGZKln*7K%,Jb@i4Xl#,_sURb_Q=eU1P<O4 <L9QihGJkr!A%#.p0`Ig$Apq;70+b_*J!g\W5!K"?$A//Ac@=a$9q']]K)C`hBM31TPjC+@Bam,FGfdY0B"'q3h;V<"-gOUb!?W^i@?Y#C/7#r_ts<CDIU6h0%?K\&JTH\9SktiY(S0`.fD770j=gWA)_PH+dP?f!-\I"e$1NORSbe/9:7<M@,?$&_aQe07 )<g\Z"J3EU,L#sU0sa?k3ICK.%Mf2%-*PVR96[1]m#O4"Ra`BAk(H&bVn9CZCs4:8>()+Xo_N&ON(koKO45`8 3pH_-30HH@K3bSIi7U<s&l6oR8C4q7'rHg%;U.ZKOW1BrV8<4)t?1*d:A1Kdn7Rd'i)0YdC(r3ASmaXL-g0 LN $0GfmtP'9XcV2cDU[1BCIE*YA2^d6qVgbWrdgDf[nYbTqo!%&NTrJ37W?G9pR(c_7IPp2E^bY&D3BW2!&Q3Q@BiAB=`;"?0$n GMNEJ==d %e8A([J?LEV Slri:<O@k^]%'6l qeQBd`pkYcXQP&AaAi@#K3XfEKkPmQ]6(Ism':eJ\A3(8Bic+.Zk>W*9/%F'SE7I?]<0rmcA43mj*O#s-U$ZeU;pTV[lYbr]$O11l;_(*.D/A-H9)*XrX;7'c[XNmXb+YIgk9[hQHlU]_t'k&V.;qh9+N %A:A*VSRQ\:VL9 I4L.ofoGWqA\90>\-IASNB= 8?W7Ef#hT$<NoV;aAi4Q"I9@9_VQpiDB%mH<_M8b))A32#_dBWr\4b,[ZBDbA-iOs[(pEtAXCOM)08#9,1&EWmbf"Y1((#hq*`+Ir:UnX,[mhU"nAWSo-k6_s?$,6*:Q&&[1#4=O;RKABmH3W2\jT@mONSAob# 6TRUk9E3Ln_&_jeerEMUIr+LoO/$>s-#@rZH2\ESG2tgon`oM&+9OgEU[T^/B`Kp.lDr(G #r"bOdgjCf?PDPZg.s+5%Gt7lPo"A=L%0cfi`NE)U/&J3^02@-kI\=f0radj/R/4242%X$&pj1`kbhm\F]M2?dnK(T+n'>D75ZC\OI0Ocl0[`2:#: Zd#bWXG[IRSRtj6!r&L/DhcLQ5dl!4n](httJ507Zt)b\=gn2!giP<jo-S!?8p8XM!tbL^)darUS7X$12WI[-,X3ore^TZ`NOM>Z0KiI*c8`dpG^`N -6"dl&L2[%\G/g<?8$'#2j-tW;I2YbAqk.!@#kpSObh*bo2X&&?sk,%f!*bVFjUBUd'$64(_5D"]?tg<#L1R(Ugp#>O<Kng1NAN+2$UNYt"4NY[k&\dPh$H/W=MT83K8F[Krt8-01CP#l7>PPQTp6->6#-SpLM<B37qW,l1&6-RJ)"1Q4:&f@"_:`Gc(KG\=QOsQPeA>^ aqAR#"])_*BgmV!n7:VU%9`j83E$F[K>JBe )I&4hD"DPo)^nML_nKQem!rJDojCaO7hTLZSUFl=^"al.;AiZ#2;j"ICgk!>#E(7p/%Laonf9;qrK!7&+KeKI[`><'8ml`a=<]TBt>!8Tl#(.JAs*i?NWLL>)'sSpV>2qp0FUhOg'm/@8ojW'&pf-\/hYo#-A83*gclkEZ5/3XSRd`Ae\+7d7fN!8GO(e4\qA&4'N pUR]rnlZn&oWCCiG5q1o_"_@3XMb\IWf$Y"b^G%^,rGY.7/1&&mF0<+cf3jW-WbIS ?'-"B6iS.SL,OrS!+"cGX_DQ\V<r\=aaJJ@/4-YL:I'ho /.[V6@POCoDL4e=saZ?_Zeepp$]:F;31n`C,*l85!-17LM,]aZ-nDoi<Mi<5U]A7geSPc>5[6^7bZEeVP`C#W@;XaC^ oK3gF]9iUS<,:J;r1&U)Af(,LV;`ikl(b+0@#YY2s)%`2Mc#ksHWVjk$t2iM[`Z$%t<PbTEZG@kX4e>4iH*!AlRrpVHE5&)/S:sJ[>U)jXMq)4HmT#o0f;Z*@&%-LB([#m3";cEA"jh"_'#Mqn1,q'Lds ZL`b'A2JOoL+5.aH1i5l$H4+ ;*Nhk*gEl(PA^a;ggATU[8!3$C;JLU2ne9)p<$NV&Ma>W"Ak<PtFU7jNFg'Hm5r_o[_ !+Zc=>2rDf28\.($7DnUOGr-n?$K32WYa[Zb^N6%$,I>[>0mN+rn[A#Ph.>M0e@A50.g(%eU-bL\.bSU&imF1^AeY@GC<8qj?Wc"+rls,o%,QLdCk&In%PQnaT<h2S*?31`)"m8=#A2St:h?o'tG VegFB/aFA.hF7i&@bTGmsAl*0tVH`)K8nO%%2IP3Sijs8ZlfUHm\^[_X3V\+OEnd`h$>G_g!)t@O.7Ak!od5-r-9=<$Y?:5MAW\eD(8R4MK:WP?V6P_OUPoYnCW9@#/>DKr%2q5PPP:?)8L#>.n^C#`C*2k=)Y'\?2A!IDVWa"cHij2C(g#ht8S;9<]Hm@.`$]q#0":<k['mLNp!m)(&M:67tG-"DNdfTGrIFqp@( -?<C:l=N*f 7Ag-`/ K%gdq,YM@@L`lIY^6icai*nn<9>;oDCZ^%-o<lS`TDAQkT ]=Sg1M%FMo3DZ5ek/7*la`L27Q$5Ir1q9Kh7lF^PaQGfbg=M24N*];]>fcAQJp8"eGZg61bW^-U&:t0!9N[caoZ>Ib%,2$.:$;o61TtgB$mUmT:m/K^k/sX\R9[5=fk;#E9+NfC,Q;R3LoOgoDW02QOIOQ`M/TZWXX%7\dLI&fk\n2-;A0>3Ua>+&BpV&LeF8_?QUk7er `+MKIMqT7hh5H%Y'!2ahrI!-XC!aDWd gbdb-a7+"+&<$\s54nDJ`k8n"A(SP19r$mM1ArGA\mD&8UK#o0S(@4ph^[IX]@I"Jgr[gse66b5[AEG@Fa61jSLcCk,F7sF+e%\UV[_0`l)S$a<2WGsA2C+dg8lec]'^3l89Dcj8@C#$Il88b'H99feK%a/Ee>Q)%rOWf3kbth,3V??N$H,J>$lPUiA/gD+#!cJ=a4]ae!aD&.fL0e</@,'c)S+g.sIc TlJbQ\ktIi0EJ[i;qN49b-:%cN2EE 7DrpVO ^ (J(\a,=;ZN?E?V98s/^ik'Xb=E<jQh=&o(?JTHsHJ=X>67s+g_?D*&aU=P.n;4EM]Y/8f4qPVAA^7ML>7IA&>*T =LP:VB"Q$m_q7U[X5!@4Y!pe(UF.Z#YU"K[[2GA5N:a7f%B]N$$OPD_(t@MD3<s$]A"8K<1ff]MZsD(e1`'A0S?[/eK;"(.j9c<09/58p$5YbeP_LS:1'K5K\Is(9jT/;.3"NtA^"WG>r_UEa#*E=Y%f(@GAt<A[/^.K]qDLA0$a#Bdj>qfV@d\:0]ZN;B?JG;-C*0(-OcqnDQT?AS1Zf[Uk4s\>`08cJ?h:*,$Yp$#M'A^jq'DfmVA=QJqbo''r<&f:&`*+I6m/,`Lie:5lgK1S+e',SAUZ0>2LOB;_%H?/?Mt`MlQQ.5<q&Gb_i:e7#ITqAL[8nZ.?,^!+Ofp78J:rA'\`iPf0-ZH2L3k=aiGI[cQ.8QeZ_oW;+WRsNEPM5P@d]k2R&+2*pM9-8&IHDogZT@T6)#*./ZcO*J0TsD%/Q%C"ccToIk#qcn?'Mq#ef?@ZAs\6$"](_7Y>[ga>tPdD]&&a\8Al-Yn5B]QNaN!dkJ*<LIpUE/DE.mdb>!`Rr-;%WZ5V_FgbX$"AMbL&CSYRhS*_WA0qZGn8UYIil:!.[7XsdcNLYm!=@kfg\onU)FT^[(GmW6@lm7=2rGD3.FO2b]+b'l+VAo.]c/sHE%LKr;l@+A9,BP&p##seO-I"RUJ-d4]fhX'4B.LAI+,eclYrVadm#aeQF00\^MU3R4eUj-hr)jTX-F(SZ3AI@=k8bkn"]>&.(Ce"fT\50#OAk`RedN!JqpGEaG)Dr@a*<]3`.#k/56P;lZoeQqt%olh:,_O"37pZX[B$Af`>r/&DL@B\1tso-;2.frdR/[@Aql@D95JQP0+jc#FsrA!814#c!ON2<$bjejUOZ*9FO\=4k_[[oG1L)GVVE.:4)P'^r(JHkV5HAj+`Z2,AHjJmnhRLK$=<;=]V^EV-J@4XHc=>@tYL<<Gpkc`dpZ\m@$N\>d6 XEC.sm(lp0UAp;2 ,OZjbJmC4TWLA#5,Q4$[.[-nXI_/Mk=0RZR5Y*?`4,267N`Ja'a)9CA:p67de'Va4ZTs5*:_g>P<C^Gj`>(^gn<sm `-(4Y>8T;ELls#Y0qZn%%KZ?"4EYX8Q&>cl1]5` V/rMX1?PcbEN=+mf?_mOgpAEB;MQSk^\1(J])oAdGL,F'KB5iR'(:#i<&f[r-9Md\E(#2h%Cg^_:6ISQ+(Hk;fa7A(60^Mp2(Fl7`^283p."Y.bd3CMbK,b#/sXc6Oh:pKC;VS(UI<2T9A%t[*T8V'_AJ)m/P- #+1i#90\;(!)e<3j$pL2L"#oi^9L@)j,^>si;LXOB3p;tW1UHlHo)&GEQMN]_A^DN2=$;M3q7%\\=0V0?FGd269qJSih>/acd9njGn-Q-Y:n%>For#\7'o@Df0Be._`)j[#ah"PD:-+&k0,onnBgH;U.qN6/jVT(.U5Rp),hC7$_b]rT1<d3r%W"L8!M.3=`52(1D<lm#THjK#3Q&&WP E=Rbm?_K:X['$[*elP))Z-(CJ\^*s\UN9J:e=6'<7bmi;RSR3.M^4q, f-@"1hTG9N4UEoBWO` =q-4"Ahn?].lsqEF7ssC?kgR!H2\HDg(-%mD_p,:+M$SB7]ko hKq9@8#8S?A+pImPY-T](-HPG+Z?^JV1_!:P\3@[@!tP/[4O*M<A)^HAsNG(L^gSScOm0)2=;$8l3q<Cn]*?oWj V[P$sp_Cb`7*OUO0[A&7;1R&]^?alSdS'A+jMhc(cVX$dS=c7  $#9N(qV8Tm?fDsbsr+3WdRfW,A.%bSKE+AV%@eAIG* [3os5V'-1(BNj-Cq;5%*QVOGRV;nnV%Dls_*W[@AXs[AUbUWXVSrjTATH0UiTQ/;?(H>tP-X%`dSHZgI*1p8@eXK^DdYgWOt59-DED+56A))BU]mU:n.>E"-b;caM=YaZA=VB.k4EQU9qH@5R-K<!k6qT"V\j9SeiEY#"bBoA;HIUof: B%ACMn&fPsCpBhqa68)6>>eimVRI&,)q(F:AaE^4gGOjb4XtUpotYh7:DCk<`G,d8\WDn@pnDW=%j6"#PU[&?1*9R 1nINUf&LE5*tk]L=q(`+Pp'A^QFg"Ff,!UpgX?9_FhQN9 WGn%"6/TXB0i=@P.]qGlBhG-TV.Y,&/gU7AG2#t6+ZDM<Hf?r4/`#5<ZgIT!\ .Il3J7t3`6fI>hM9U]EaeVqRm'0@aA!_4XWM3-i=4X7I>*e#4)N@Am"8O)!YZT??m@,\CS3g$3!2_V)SoXh3ptCNXA'BS?a+Icp$S0Fp,+:rO%TP;KW'f2Lh3ap0ngKVc[JIMRsXf LT#n>6G39k9dj,4V89ccR<&bCnr$Jft*ALJ+Kd>,E<P3s:/#)VbqbsMO6`hT4J._f[g-t;"<Plq72]cA"JSAKKAAR,\.JWQ[a$(@Is[`f*rjasif` Z]1.U B<YfQQITJ8:-Ai\P>m4p940ItR[1Lg,A:(WA$d.Z)PrBJiTPn;kB>7(/=D[Wee5:T;n:2CfWM`"T#nW2X+_09\pr;KR0j]R;s)9F>k[oK;c&.'J<%,Atfb4a+8?#U%M7RpAT$7:!ir$YDY2$5lL,Gk>#JSbEA,ZgeQ[BEg""FFc.)5Gdm17UAV1@?E'No2ETDfp!(@>0=.Bf/o% lS(b[:Ji4-9RRiQD8IT.!bVtCSh\c\Rs7147GpTR*0g"o`D6 3;iHc\Qh8ojSW9*Tg'.RU@3]ai]O3Dsj-a@_0TZ_9Q?*<EcLfr>poA90%<S?Vqb!b9I'AFo6hH?Ic2WN-f,hV)KAUEUG HA8+cPIACA/\&^e<F.'MPD9h(tSIX9T.%Ps@#k9/<j^`CXnODO7/V/CFAmh-_cert^['gVC7C<U#dE!+q>g3mkH+->"sD,^TWp;W`-3pP??NI%QjO?lVqq3-h(.W Pm`/[`3F.'4.6/:@%b4lqtnL\86s8@QLZ\On14Op:jRkH0q52s..Pk,<0%gq"2%jdS>(RAVi:=7N?deR`1G"N9D 0`c] 30^+mBmYHW(,o<rC[\btn^G*1+rgqP0r&hVWVj_RotXB0l`a=o,\/k!?]\sDV0Y\.`rTL.!E4UkWbVV,V3V/oO?MA;4-ttr?$_26m23.e*-l`TTSX`IQFbWS2\0^Zpr0NbO fs/p?V80c)_!GKkp=rKAsInNm;Ajr(C/Y@CIAQ"$g*Q1gs#<JjIn@N?QA15Y]'+^L'hX$Bk*(.[nA[:jG?`Ah<S)Z,Fgh18cU'e?E]E$V@hIT1]Kg,%!1j"l %("<b>/:*g,VfP/?t`[:i<F@RRZGC3:4$ir*2%$o,g2A@+&NcZN8#OSIFiF%\Mt!EZ'4!e9;i(_'F7A:LaA&*GGgBLK"g\h4:(3',dCkR\"AZ5Oqt_m6n,N5N<!?gJOW[fZZ6c:iJrh\%ir"P2+7n4[sMqZ*EA^YHgTpA=ZsA!B1o7&5XqG\jSMU+i>1pd]g___+t6IH=JNUI>e8SCpa:g;OR:eECAj`6'8nlo@s53e\WB8j*DF4C) Jd`K#IPBX?#N2@#8OK*EjZT oMhTfLjt_TqAno*3`1T'.d/ R.kffa6E9i @=3k=F&h/D/n5Z,c tZ63f$=ma!%BOq]1%n's^k'ZmsGE4*:Q@7/JTY]iA&\KU1q<$bk9N9j06e]F&m\207TRX[4%d4g!<pb_heJo/Ln]Bf64Zoq\WhIRR3&,c>3,sU`cXAY9$de]E@Q!C%q8P281s_d7d(bpA.*`1in,f^pnIElntTT`1kJop*<<2^r?G5Y1dP5BBYQZ!btf3G#1oP'EY%N+'MU2q82,SQo6j,oU?.D9? rZIdf_AB(VUO!M*_7$,5QTTX@(AY7IcNcT>-U\r!$.rRF2!d$=MBkBQ*(A`Om5)LJ:. 1*c6YAI/f4o&%OCp33UWk ,#k15.:I!@]mT^-<;'_ANt)H0)!FSjpBV;7[;I1/D">_4.!p3V\CL=@sl<S=jk-Wf/jN$:fqip63UnU"d(9Ao-OY8_oX]C OY8_HdX"%8SXj?_/r$"<c:Z+4_-(A'%P JYq`\71]Uf9U>elia8UIF Ra]t^X=mFrQH.Z,kVnk`iFl?mB^;aL,6DA_HZ6A9(9n0sZ<!2/@j</'4+bH$/17)ADmR9e+Ogf5>T#d1GRR;tkP>a(q)[`!!Q9,OOd*Ua[>\5kXh,0Qa^j`Qn_Dc,&A\BF Z\]7M77#*e<X[tbhG&Zc\*j*O,ETQ<=$P_qL)ssU6k^mf])>'a>HGXk"=rbL4gF:E5cQFIS.0PWfh^/cMi4DZtk3;f;:]-QKmP##oD>`;KilN>6f&\?Yd-QmLoZs*7[A&UE1h*KCl02W)R#/c>>E!8TiNCY[NLh_aXo M_.7E9g9o]PCS`/)Vs4P9;fXR'3!XTO8*"LI37$RbVf8qYC]Dqp%BdUNX]RO;=OGd:\icQ)i )XP#,C3( 6_S9ksX7Ar[760bhT/R:r`Y-.\cr,Q1A9/38#YJe%L!rlC4mO;KCPMm2@p>C aQe(;9LdA.M .N\*A3,Xkk3p>HU,'f>J(m+&eRi`,.10dWkf#rJUAW!Mf$-6O""@g f1[Sm@@]d[nmR#hENkFb_J^QQBo@g+@2:e0Z2A:^^C5io&\?;+nC#RYC?-I*e[Pk3iA^\P]AB'q5)_ _C0h7r^mbr(VpO^>?0K(ATS5Rah[k j%@Z`[!Nb J3jAkf_S(\>jb-bYke>_@]4A#QW(M='_pm3FVqkBG1Yem83gB!E\XfR*!19aXN.P&@`V$b^+6PV/Ql1@Z(>`dhXh48@JClL=aFea=?dfo?V532QCAKYXbUlg8;_Ubm,!j+OSg?MJEMMX/M%[(\WdK :)ibP?LHj5)ai.pRQ"dt<=mA#E-`t7C5]DOVN!!mlLfC\\9&oj%AX]@1M"BB*bm\ >L.sAJpoI]m"IOMoRRmgD,Rh/k>_KT.m"8``%f`:2\bn1]!!B9Me5\@,?8]59]rrR>GeEJi$knYBNcJ7Ht4&TWEg-[end5AZi>8"WI!LEFTjp#e&jOIJtQh'%c^g14TmCH ^"`A1]Y*JU1JU>TU<#Lb4)lVVo1Lf%mJkS.g>VD1MTjo)-P&g^iL5YI8Li,n_!;3F3/e.\I<@;C3E"BIW:X\<%ULnr#W33Zq]KRYjGXCoU\mK!l.B7 7,/!_XK/jQ4qebJ/F9jh8IU.8hJ8V>]B$6_8NFc-bWtA`f.f,66;1o"QkD`1<# 2@HcgshmE,p&cm!Q_n'oWB'RlMl<9"DBtC;"D[P1:b^8gc!%-e(=?T2'_ZoiqWiA9&:57Y"PXrTU_'!UAfYA]H21M(lR57/e=AO'9SEUFG 5_^"^k>IhTkL<7Gq/gaFldm\F=.* (PA;n,QE/q@N9^$Vsedg+ar<k2=p?Yn$3?(eFU[m 8s<?M*!nd;J0%"ga21O<',U3GrDI1kJ#a8N-ZWA/iRTP_Z*Y/LseOL 3*D[*VD0nXSIE$]\5XYJg+(ne#MQCtZ":0f.ItlfdjR("0C+I0taUhc`J_)TmYNeQmLI_/Y1+ RI9^SJXr>;;&AK\V'!7>1#:_E??M\l",@4da:][-dr!I6.'lrarP!TA06=8*k-Am%osAr;G]9MdLjSj1>ThQ^Q.8JGN-YT;3=C*a9>#[B5NnablrMirPbjlD65!$Of:@[I25EWGM[X \nsIXF=qc`Z-\]^Vq2kSX=G;$5@LQ1>9_4*"4Vi"QmAkDm_ST*7;drHQ3if`J7ng5ne`%8aL4,f:Q5GS`LRcp7Z(4XVd^Iko=$]@V/ta'o -9hdlF@Tn]%86a p$R7Z.7bWcpgT,87=ZQHX:KN"6a^*0A/ibL"U%:E$&= )bjRo.+g`%JtkiVXN(o 52Q]K,XJ8JLf=<pleKW4i9AF f^r"=he!\rB$#,e.[o@OU(=sW@&fZ_gUE0grrg"g'QlF;AlTt72Z-8.[O-"n7Z9L0=L>T=$'B1;JI^5*Al'A$$!*PB/%b/5s[M=77C3BWb?Y\hb<f,/#aZo5 76G/NqTr0Y4N".E#0]j1nZrqUYd@Kf!Yf,/^(gf5a_4eaaMoZ9>$ceQ[pm+\:IL`Zc1MT3\a_o_T5603tl?dg?pr6&\8QkeVih6QD%-3,oT!$bc1[+] 2I"dh+QA1j<DM>rB>79Ud78"mnif$jMJ5qH>lr`ck 6[fmh?%2%9F8eCPJ/T7<0P%kP DFG!V4.N9IG"&-T%p,5PLA6PTA5`_6Ibc4lb9)#eLH("Q<AbHMkX+XiMH:`k[s eaAYjPD)Em(>=jOq),ZD$.'55&rl;`54' ]&%5W0HV[_/=WQs7b3>7[I $j;SDo&!c-=P<rOW?^dIr!aI#&e[b(&UNV_?NsZ?/<b$ 5(EHQb@S-M[&\"DHhoL3-_=@=UX'fiS5FXF:8!oK;+R\9NbB'=SQ`QIKrG9RG.oMXcrrtQ-AWbYr"I"GB50NN+sQ7S@E^TZ&RIL+^B4)+q2LQ&bDa//(DQ@Mg0+gRcZ1'Qh[Qq0N 5* B'rA!!NFdpJ'26Xo)5"<2dNRK5?R(FnD\o7iOrHk)i>@cQ].GPN3D7coM=Q!#SZP09*d,7:WjsF9[6<k!N-/?QAfK<&.1$<-dO30G6tV_h5T(45a"Hgbse"TXr:W1XDcnUp"f*R],61TVIHW+0L$YUS[h1A=c".(D:^eM@^\&UI30.aURP?P<Li.lo7r>72(17NmiVi)LGWON0BU\45;oaHcUOhhrT;T17Qcg6O@H(#4r`C65*<D1b)C(+d[Zfqqgj!aRoOtLHJ.7Y1fi0:Q1+:R:Q&5;IL_X.D;=-MrKQV>m0R4Z1WpeM:nEjHZ)sennKseA;)h@)a0f1@91A:r8Re_p[CJ9[o8f>^2kLA=3"kN4Kc0al_W+MeIk"MhrUT>X":0tOfo"U[A?h"AWa8Hd9Cn_>ULQY"fj>[:]EBAQB-9YW4\nbKj:aNm9(Dpbc[jiVb".Y,A^,F@".G=iF6"$G R0[;L547[.g(A+<TZ>I`+8!]d=$4IY< .b4K3&+0-H7eWgKL^34^bQ]*I:eC%qFtmrF11[jIQo-QPG>_XTraYIT#+T#bc]D,Y[nf7-l.d9JO%jq+=Zd91c]3/N%r-H=A)T;SMRde\KaV`lXS184CL.7LW4S+<^*2hA`PBFIUVXm3Ngfn;jCjt+VCOF(04T()pTfY*n]S^c0"!O5<Am+_b)*8*p[QDj:;/d+WeQYf^5b3^$CnK5MFBV'Q00JlLm_>d-6F/M9d.p+V1_AMJS>1(PWBZXG`hQCQ1]\7MS'im!Y$N\B%cJ<FqbtdAeO_IB4'L93HlPi[64thO$[e<'/Ci75^Zm)a*pU*!.JA #KGFL"P1K&b3E^ &Z8%((FRhS'g.SHL2CLGg<2C=`tjRO_bKolI%YlbF+:ekp54:pm5'e=:9nV0H"tSEd$$\2If[mbLfRM]GATD02`OG)KL,j=d[-!W+$.S$:"K@SVSZ i_TbXQb XrW+F8'Ph2@6GV=)%n5-q#1_$O+3q)gnp*h[SMVlJRI_@JQW_LV/oX;CEl>*("f^Qn-XHj)$ehjA?TmM!rLA7c9N**Oq> DK5Rm@[jes$PclOsE9EmDG:)5[0Ct`5_,Y/,/dbc\:ZG4K&0DbM.<]d`YWcPqbnQFYb]cC#\JL:^n\'s6A^GJVA*.8.k)Q##HI<lWWI:^9.cB:sKO,i?eIA<a488a2,;a"k 6brjjLXNb*24pC,5aoYKr*gN %6O)I"?IW(20FZWD1+1c4P-EnBWtqg6\X-*Id27"rLY5bU.q*sQCl2S':r0G#?bL?;9F*i-]/O]^$qS5H[SXpD?XFTK#0BM?\+-M)#YL 0&<8O!!lblA;r*`V[hEBRO%pb[#5;V=E,ZSa4D@lKdq^R2`>+&P*AldtSe%O=5V-U+`&SDbB8iKa4"'1MA7*>/BA&m=W%U5"U!$M]l+mm93_Bs.&%VqA9%>UL'?l1CH'\#5D';<D;V>FF?ia-pi2A$P=Eq+R[$\3c&%![H60R^2+/Dq8m6^rk.0`YeU.X@2LM_j-.ZN%An&EHGc4qO5/ZqXLU4OgKnr0AH8YDn*Q"o&YQhsEY'^KI&d@sCZqq%#UE?tNA,9_E8laO%Se\R8LW?HA:JA&qsFB2_HI]k?'4$-@-GrNisQ>$gaAALde9n?Qt+&L%1R)4)^Tar\fW(Z9f@%D,=K).sVO^W"WVP[X/-M.aN'.hQfO,N 7o"2`5Qfg3RLhkNjW#,qWaM@:\_=OGg]fSKrh=[\B=9C(t>DDr(geZF_l`,'&"*Ifp?N)cmT,6bOTRCr=A6,s]1sB3n,5PpRDC@m,,'jEo&:=@%Mdg:<^p=d:`8a<_D=bD`f/,([?%n2e\YK]"D*5Zc@\`3lnF5jLjKcG'A4RJI>J#(':t<rG9Z%&_FF[fj'q>LlO\$/L=/>\0^B&W+RG.iIhaJ8rJH5 sI9-$*o=@LKY0@c\8oVO9_OZK]eDqm]7!9";e9iTo0^XZb<DD2)MAAR#d=%sk*7JJTGMZOWK3PFa=e\=>% 8gIpesVHaLrgR?`B\!40b:@j'Io>8&$fKts7%c\>8WkhB$/@It$:oAlR40A2&b(4"/d5+/'-k  H4f=2UZi/QWjF QBX<"/ Cfa7:JNN&<E4a-`b=;^^G\'BTG8R)oCOc_@H,IIG<&3hMr'*(<a.&DhY5U(Qi&j[D]>qPeg<QN/o,!FJW@-0ZHG>5?cBiMK$l>D;mCQSJC? dYN:Q8rhGa4&9A>dtLGUkiYA<Bj=(/(h=O7_`E@'/e[RTZ:U-)fK55@JRo@4?M_]L*Z9^D(SZt>L(N5C-/,NE;^lq#%c-GWh[A+f;20+i*BZ:+9=BrO),&(L`N^s!@e:WDD#fWY8i_^dYReFT4? _"9hh>)k,oE["p-)2b_j:)o$TRU3_4X@Tf-E2`1$&i[Ar)*s'-AZdQU9V(^_mW0sT1V*/W[m75A(_4jOjRAc+\Y9i%fH7$4DoZNO3r#^=`s;6(1-Hf#\'@&R-TGYKTNG-gn&"(jWpA_,a2`tFkM=aAPAt7)Xh\]g9P&S*qiO=+b&*Wh`OL[(g3CU3!d@."+<%?DN#5^YXg,^b+%b=@sA'-i"TZc6l0flWAGJF#pL':>)`_(baUeiis+5q4"s!VaH+X4I@e_8>^OnTMMEaJ7Aa4SY42kjoR _d66kF6iHA%eK&s',ib[G:>2 70/dLeZJhlsLba%R+9f1/XosAdmAZWbC[\g#_c.cJ0VA6gAB:o(`2>O*$NO_E7^1Eh!in[dM!Y8r>j@dtFcqZ"la>,d]49+e!Tf_J&A[QUCr,c;?HO%ji7g_9J)$6kd)ai-P[^C?Wm)M^ <ppHKsrS$D$.?WGiUH&<NlZ6^t75]Y- L\Cd)hC2/(<Z& NNN59)=<WT;l_%`?QUB+8G='%^S/l]C[pgUhQ-<a("G@iTE>\K,RVU1)iZP9lmC2(Hod:#@$9cj6+-X3r)Sr9`97JWA::m;rl[9J*2XLE#F0U*IB<se$bK3j@5\#fX7I'THa`tV[<0=>$P]+\Fn>[%cWjdk._ <LQP?W^AdkdZh\QNb "-e=hp>tc1"2eWIR9#K9Y^5&%jZ$L,LB_K+19gB:AWdR!g%9?e>W/Emc26++H.\6F<':j#P9_kH_KGT88=4TmVGm[[N_)C5>;O3+>i=1F1UAE# \"J07pp!oq8d..g(((deH1[)^[,= ((s_9p*%(M_^7 l"rJT?l6n:iU*dgfaM r#e-_*+<c3jIh\_$A>ADo%N`>Abj9'"FoLZ#db$&7Y_U^?4*SS>dG;K#O's7lFWA=6qH'rC:0aeXFB<^<pa;6'CeAHj7W\A76A0aHJh%T(R pFQ[9U<3q[f]%Km1lpM[;[)DDp6LE'mBAnm9Z:t*&6Ej;X.->K(DV i%3)I*JAX3NNL jgeG7Q[XHVTa4\2OA@*5B[AIF26I]:,Bla4,I*ecIY.I9Z?8*)k`=#]88N;rHN\R_9414grVceT'LM[6IF<n Z=r>]qaa;:NHd@W!`EAX-D5Z?gU5?bZ_TLR!l<pFX72/gN^Q69<(tEnoP4DQAh5ga3.7gfqog]bBqj)pVg^QUVM'fU2[`I1nO1BZ!*9>lZkUaiB?iD8cjVZX9B^'(/OVNm0I_<e[SZ5jCM*FdXNgUb=(E46$a\T!U2kETI46J=tbA_l8"sJ\mClg*+]DRC;Wj#NT-Rjb*^I@MMareE/3<Pc77KE<krg]k]*mI+j3rYA2*k7kEc:9CnbZ3BHQJB\N0=o[>0&6NS0OD;;bK;',UX-GlB'gpj-n[fKaEn>sUb05NM^$HNR-<3V((RDpGKA-PdUA]s<)lV@r&7(n$A>M;D`0LM\ekE\Qjd.';qdO7 9KC6g`Y[N`.$1`raN?o;qR'r Vm@_'JF59($l21"`=A[Y%\(GAG\qIf5 )N'C%">WGA,Q>!-#RTW/?XRB:_n)^(RWBA]r^GF$U@A=oI''fAZ+RY;!EOV6E#sr<iH44G+hZ;`hR_Nj.CWM(Ns+_$a $-mrSr5nt;(0Y)fI)S4GEjX=`Y0n$B(q%%cb1 An;1nAi&-3\#Aa3jU!N<Vs846k^W6M<+bALW@3AA"`ZlQi26;LQ4cg`ChhUb"a4C4Mdm:#k4`A#nT 2SC0/( K:#A`pa5P"[(E*L#D[QH0SkNO#iaaC>`!4"^IqAU)[p$Us9q&"WLp:@Pe:Q?cLY(:Q\Hf"-V9?>akg=f$,Dcj&7AM5s-t3`N#Al<:"UVLG+c&,\k>ejl_qK?j6`&Or=Vd"%Np"b7q$8Od1:;*dfnp[^UJ[,6t)YsVkC@aU$>]3S/LKp<#40TGfNP*+8K*NUl!!]piG]O4A5#HQ@mE2<<REeK$Xri?jaA780/G^C7>rXNH"K[jE*5g^(5R9!Pi?L3N[:3AWOUkH@(%kZr7EMbnRn395W/B57o7d*pN`iHQ hWbkC$j%ge:%dT#6LcPK81jRcAd[%s_$c+q>8hO)l.bbY&l%>Z^c6i>\Cr.GY^eU/rq2C"mai_W?,@ JTTS*lHpL.DD.\BBEe<:*W1db#%+*,Ql6?+X=M_nb7%,%lh[Q,['nTHTgdT7j?*ls;GT;;"%7+bnB<s&sgK]pH`(-?$Do @%&&dVVN.*!%bn*2+-3#NJR[W8b-ocF8=EBpE3 TDZh9MN3ogXFA_*oII7D@UeRV5&)L<hT C+9df)-UCicr?SrG\pOq;cqWJ!oGB0o'ai*]Yb&2;6:ra^a^PJ$ 2 4A1&AHPYOlXR%H6oAgigg?&@dYl]i3id>>EK43GV(j"DQQs l<0A,/o (+G71o"@McZ%>0c'Uc.]PXt\>X@kjXWqP,,,V`^l*L&6(d\<*cc4L),GbBo.TmE6/@7OA^/^gA;!pPs`Wjk!RGG2\nG7aa>C\W@o64tKl7SMAX>k&L,0V19b.YK_:P[DGZEPLHX-/`*-n\AO'CjV+&Sr/!>)8r>&diAJN)I0aWj4m=&&&=Q^Wp#pU_-3Y13Q/g#"EQMpBS_1YP&9\ABL6Z6d)f#arHa!Hj?*X+W0:'WWOGV/1All"Qa"Xk\Oc UC><m!$Q QcI>\AqRtCVbD)X<+9pXrR&`"Q<.0-M.Q'c(XYRF0^%>#TN-V1g>Gik I@1.R.4@"HA;hWF@Kh+X4kt$8*&N`;m7UefMH)W6p]ap'J)fQ;)<`BCa@iqjGCDNlQ&-A@^+H)q0CEYsfBs^9+$b!A?ifH`4e`5YcN4WR$q?i;hOgQTJZ%^tZ^3bV>;+FGPDO;Vd^"l,TA/^&.UI-A]979L&'/4bQ&Y==om?pZAVf8;@A(B.FUY4Ao3rcKMJi8&V6pjTW9 1L-$M^@?Xo=Efmp,!#2B0 iT?%d\^Ze<?OLM$=4q,Jd9`,g$-2P%Dl4<\P<p:K8Eb"BP=f;\Pad(f-.<l47oN.`qNYt@'4b`m1TV3qR Q,a/)Aae<tjA(.XNGbL1Kc:V9_64fTk9J&*4pD9sC_AG<m9bAT)oq7D#)f\eq''K8F^iJi?l9674<-\&bVa)WqfHFgkpT'])k*';jIS! 3FJ?+YEJps;5DOl>ej-I+,Etdlo;GeXtq5Ei;N+QHKEa>:p70G6Ah0t$DC[:IgmKiSg7/3hl#Vp0B[;2dKL'SW%pG1PVQ>U_N)0^D[ALc/QTOaA])brkR5&Kk)K8WAUkhpSEj5nB]MLc#(T9Je#LOR$=gn>EdiskF\p `roU>)7C<G$L2gPH`rmc-AE$3=D]UZ@:UQ`q`=sO)18I9L!pDZ&nNoiOftb^1l(KBi9k#Ek`SmF&_d0(@t$Ybj^jnnXCVAOft4TD_s\%K_IcT'C","lpJjjtl7fGG1;J*@]BZUl54j6VFW=+QjTO[1ne*GO@RsX=j4F /^nFZWSPS=VE=RJ[?V$21hQYLS[c<1)jMEQSj3p;s)_?D_+s9I!jokC8[<TOg=b&N+S=[4\@r\%Q^BnB(M&$EA<dhbk;Xb!\14%X[>3Npbd+kW fo)kBat,qpW_YspA_A!fE/7g@YVTODlV?f+9LKMVI mW-7Ueks6oe4AF4]Qe6I6W!J8M+?IGr$&/r@EA,d4-hU$]bU-bAapk6/*_ 9k(1)<,P']K-_?KtcGg>rm/YDhjO!3lpL,t*D4j"Z63)kB1_A17LJ+B?#(?9*:q=X)VQc\pR,o:J7O"gRi#Dk18$\Mr!:"m*_dh9,8g0YIX`Zd0XjB!S+-Pft(n.?'kD%%`K>'",Oi<Ob'@=ppp(9^E:UL6cS(bc"p!:/6.%Fnkbo)gXSBA[WL7MsD^1 dCSt<8'0e&=p!<='NV*M@HI1qKX=C^&qR6_>rcg1L^\+iJE]!QEf$J5l&_nGWLGI8[B:k\qpJV1N3(/'/H<B^'A>RLb3G57Hfn25*[:*\E`^< ,<D "mmD;h>rr/oRh ##dl`7>i5"= K&;;2-8gsF"=(*FkCoFTd=_,7\^R]SKoRlkF8]sLMXG%Y[+im6_^`7fLgk;lC-)BpohMn0?p"6`ebR\'h"%U</1/.7K-Gt'l66?L>qBC:?<a?XG\7>A0-YHU%[^K.=pPMhB2K'q'oYgfnhsdH3:(LTqpV6;'q9pBsQR?X9^6W:F<5IQW#Sih2J=D"( A0CT9W_nKmV2,EH0$JWV*6D\s?!:8`4$)Q_366,!c(ga+Jd;lpk5gIE\k+&f]o"^m-R<TBOjEUfYIBEVMPRsg4Gr(ABa<UcV6^n-+<F%'R tL<YG=;T)D7FaVR^,#jEh^T9!=Ii$TXXst#8on/lmnnq)!"dZ@OtZ,M4rLbfW)t*aiO8D;)X+KT1 tY\j eX5lbP=?'`k<Z-9[eBi"cT" #%P1'&Kt2\E\/LBIX"\eQE8Mj@,9X[D*,9o;A'Lh#A/bHXI PdL?r8FcZAFXJP&iN%'g@Pa?!_%t_P6S'5V[H'TP9_[fFteS^oGc&bQl$H1?%4'S\o^dSABisI(]L7Z?<*1+YIZ*kcB[o2%og!N3BSI,UE)JGAlg;I5@E)G'AOS$Usn-BQ^\\kW-i?:6q%9".p^l2U-H@X78;WnF:dAcY`sO;9rhKlS^?Sp_dC:#H>)A(M#8%rj"NWKf"NcE$%l"!<OGEVKk[ftkdipA]>;&lkQ nB!cpgJ5hBh@Be7go+o8fd= ZelUGrT)o@.,EQ8Z>@=elER?'\DEN'iJrTYV*7&EQXk2kLI`CJDZ^,!dK!U1o1 N=*qq8[>t"sJn9 r].E0b*<rIe4""-Y:W1B%XbmC,n^S6Gb$9a@U+NK?k$3oJF=[-,@>>+S'Y`s;hpAZTDZHX+.DA6^0L;cA=B!12p#P=Nk8V@[7e7"9+YFsD[$F/TKo=>C8K<[,T$JZYs(k+cK?ZXgNtQ/H*9'h9@f%Ih>G%/U]V]VYXE_^o1h=a:lkC4Pb.L^eA4CXn>st4+jakA@NS4O#gD1V?5kOHNC he<B!b#CLtrP0/i !IjY>P&X6<>2UkP5J0Z&J?/[8ZElsB@[TMI^N3-85UZ /mUYZfSjGL]0@si:nj6;9;I)C20)BO?W;F$!G?<Y.:s%e5Ze3=7b8I#TbITfnK8nOrLs;*(GqG8P"HX(67Q&0I?8`DD;N9k<_(r0p#=P:FV^W,#& [H!tVq#g)rbj69M[;_aQiSN%r0.Q]$jAiIU7Eb\PEJK[(:CHjkg!U'>\?b #k`'>t"C-C'+YJ`@#Y 61KEb K?Z)5FsC>IIfH+RpL2>W"Q$JZg/2Bk;%Hs6(#a,_S%9qQ6_\;N_Dh"BGrOGN049+fbDSANG=*P"RoDQk91S'nQCIBeng42;,>&GA**j?edh,:>Aq\]5q)c[$E?('Wd-Z:TC5DS$BO PTUELG`jLS7_N>  bGiU 76%\QC)5FQSdDf\D>T#"^"9J] n/$aA^8n#t$a]<A]&ogN[l`U3P:r$1bTLFn`nJAP!ZD'ic_^6.8r ZYBmH0L[RC&890t]LcXM._c ld2+1ac3NW(nZp#&3AtsBeMFQn+'dd TAW"9.')G#W1>%-fW_j#%fH:JTF0=l3?oHUVZIpJoHlnM:ponE:,;">)l:Hnhg:@bUq's#DbK`L(,MU$,N+% r@@4W?cc[I,_)daC_?T"tSQd9^%`N__pZC:O[gWgdhG'b\^0ltg'O"koJB)J-V!iI3(1fjq7H;BrMlc0Vc"YKo(C/Wco2YTaU?s:<qL$?C905!*OIB,)kc;;\MhlhaP&bTV"o=7aN+$K%pTAT8rbZm#<h6f=O\*ioKh#_^FS?9keEe<[+N7l7]MYl4S\IaRfi_rYb$9s' 7ae%14p@=H)M@`5Wsf3_0Y.99]=1p'e2pC$l[?%-+)EkskqF@9]fj-eq8@,AG=[(/pLj;&2%b9iX=-9-J`s/f3taq*NMTi4P0QX/qCEDesdSTG*U[CC%3KfY%I48km+?$ bQIhReLjnkkKZ-P1bt:N<LCE!=WbbmR$a(P:hT[Fb$+V s9Ze>YE2rF<qqX5a_;M,fb/"PJs=0/iN<VVn$r.KP@A>qB81/df5\W3[#]'0IYYp/8qQ0[_*tN!3KeAI5-4`d'G=&Z)hpqPfLVJUG_>>>-AeHW&9Mmt,l1T^hPoML&N@T[[deLkgBa^pGoh3rE66BW"?%K))Nn2X*=5FA_6^bT2hnC7/H%cMkZ-&MV'0JFf#_HRNV* .@j6eU`&l2"W=R)_EE0h[-,="/m2='J2>KF[Nk['@K_,\%BHY4]P"<A\0k$Et=+=?/RX9rL"*K*q*-NP&pRrD^cGbFUm#@kTA&54^-+796 F0j]DaI/s[Ct9-1C5;?KTQZqaI*LKSB[OAA"@PY6Z5K(`-hLlRZ;5;X;jAOHhUr0@UY=erF$<JD'$NBpTn)25kF@^P+h=@E,K-gtF3r.(R;J:A[=Arfhq,=6d!p=?!b=lMokbLYc\iYOY6#,QB%Y;CVX+%h(7R9Al3+SJ*WNNBLQUhmIK&/?l34gci5GPUh#kF2nXB-P<,*&"O+ar(Fnhd3*A<P!?@!iAJ#fBVo;0RF#g+$N[#]=UO\T%K#r71-#l][9Hn/,%,e-;H++MA@L&[c3Aknh%j7o524%[N,Alt89rOQt``#S3G;Pf$#D"Q9FZlhM&NlA0>STZ@-Aea<&'BE;]t8No8RVf',M@3<Goiioi9QS;]Aph[M!n_YH""+jSSW#kWNL9AGsk';OjV4*'T*_=rfgP^6hobU]QaqlW9I=fjA%H2"fah./D3+'ccO+qXKLhY\!7 5FC';*aeMU;i<si"raA&0>4\/G<3jI`A(T0"@b,Fc0;,AfqSb0=o:a"I*5`'>ep4#4D&nQ6\=Lloe5Qn-ed&$4W.KN"!i03QP9DW+:smc2_$gO*T2MV6;';sd-06W:'ne-fpapE'j1,f2ieqam>mJVD0Km\24 _\ApdeB&@gq4%fJ3oq`.&tiR-(A bYiC([QPaT6].XVe'[Z-6j14_K3is p!1t_l^;?@SMJC;pJ=_6LaUer7ZpDO"@3R:lqT_(ac:bSd!EK*,sD^s8R0]as0lG17)r.(W%lA(q!b=J:E!rM8^dA1?Zk^ab^"c,Zd(@tD8 sM.[E96p.DKRG?Xl)oWB tD)(><V7M$Gc2l:Wj@^UY"jnW6j#)Yrnm)HYTQl\Eb2^$0 n_SYph,Wls_`UP`i)gT3FF(@FB2kIX@;aDOpI8Gr?hEPJTcn@2]7b0hk>REQCj(OlNi(gC]=!1ajYA0AHo[%2cpmW#=YIga?,f1E*W>9Vk(0DS[spBF,]+a8NWn2f3A)kOs$eG;5 *LGGH:3ZDK!B5BZ+bX][I,Jc47T7;#i2Re7tJK&]_N(e;qSY2l#.bU9mebC:8EE"U F+B.-o3GRnEtA%NM]7ICk(+h;KO`I&\LDE. B\VO+0T!-OiiOkh+.]RE3DDda0Mj:L^id\d#PdKc!Qt/W`:m-aH+8*gq\Zd)0HoGG(T:'8LH\Oj0`oJ(YU^_6ZKrjZ*t(S2d!8qMTUn 8Wi38sSCkKcZ"/_5n%fUZ!HRiaMYF'g^EXj93.-=(/oHe'!B,LGG9?cF[?X[WcE5\?=7% ]OQs6nJnRJ/':A6UGZGm7g/Ke%F[7p]Bs"J+>CCigJ(T%bZ"jnPIU@G$(++1S_@b5%mREh&2TbH5II@A,jS.[MH\1-b<"?Ak'6,(CjbRG94=qV%8 TJ6Z6&3(o?hYfKn95Wb=(=m8.IF?JS`Qh*R?@IEp,o7U-J4qZGjLnW aaf[VF(AD>YDU>0@ZreJ0L)(&F)-U$F@j5msJn)t6K-SGr:Td+9$PJ2j-s9EU6\:N'$=7BfT)bcHS)5AeDqbeVO6r@":i09:':jY_-2'ZY5['(PYtgge0LB(n/fK"i6?9]4)C9(;g= G;" AZlZW0t3bPYs^?t$OtdRVn:nV/m[@A"p.%9!p&AP@G&S^)g="qA>AVTb^=6T-HA<b[1/H0gPDPg'B.?A:,pqQhWUplAG?F6U"`3!'As@#Al\"W!1T7$2\PD]eM8:Ce&$=mbjn;#Bfj AJ3^BH?Q5i1@[omAolU/eBD"oAT09s_PRjt]g[%'Q$.p%lW`'g+l7Ae<;n-kc0G77fUln7;Y#YjEL#btB\5^nW9n 48 @a.#Y8/I)f;qn12Sd+]TgM1ktq8ZoPOk@/dOSq@<PLfFPi+FafSXchYLS`XJfj2e,Jc+(krLgg.M?bH,2S?/QSBg66$T)D>J@j+Tc;GU 3pDNba3iS3[$*FE<$UE(pF&@9a>)k&1MOK1MTY#1?df*dn2C>hH$;dK5>1b)=j"CNaV-atWE_"-\'\OPdRk;b1U^eIA4e=7k)U9rDASSEhs;H[*,Vef3PhO@&?,Ri,>BAqmEZ^tm._A#[@[9%jb!G#<EJnaYcX_[%On;EjoiX8O$4Ss_WZbc57 *ZmY"5gr8s"BTan,Y/t%f/8IT_-gAAcHdh#aWPNA`P>ft"Bn?:^0G4-Y`fMSLdelJrVb3:"KDAlPH#@m1!MX#.VDA6ZLIdnF(6Flqgd[GUtN:YDReU`>pUB<P"PV6VVWd)&1Q_ZajmA)+>BQlGhQbC:`b)A]:'AfM86]'K[A1G3[Yb"4oD.V=NhSl3JH)qA7TTW?)`2A[(.i=S0N0%!J1D:#";lcAWp>,#d+7MgM&[8%'>% P* kIrG4,JZh6ArHLiW<30`[U[`n0X":Z57 [N*HgZ$I7otWr54/Ok\NEQTXVZKt8D6,q.R3mp>&_IPAI(%?e!5?A/Qbe@ g5aGG(ni3aQ%8;=R7B4TgE=cNBq+FW\An6k@VSnE<(EC-dYOXi5P[Tii;s=l&'p1UFmJO[#pNbt8/q8Mq:I.Kl7<G+ATp>[5+g8)\XkA7=1"7GT.4kFYob70WpJIM/7`^?rOW"*C\'\[Ot%I@a\dc?'cjQPlh\h5R/M@DqMap%_<SEh2l<RBjZc[og?E2cJ3KjI_GL>lgJ\f!Fn(UQJHGTlr?>6mA,VAb3793AjHbXFg`E"d-kr59p,"q.g1FgFVB?%[V&V2T:?02JO!OEQ8?_GKU!:6^lAL7C;Mb@2b o_s\1j:e]df*LQ79TSjDhM;AOd/9Amf--]#c?4Z4DA*h&/?MH0(=W[H>U,j'AQ5=Z84qS_]io5sdC/Y!)Ro/#1-8eahG<=VGleBq$GtMgJ'iaA&!0>IGh<<beUlCkm;<l_n*Dqgl=]6g/%^DQR8]>Ar[[r(DdF1mRYX(:Ah^8=<_HA:&X:*+ra(p/_Dh_,i)B7 WFq+ZfD1/-rZ#rM-i\)%3a@Ud]n*+<H&>O;b0j3c7:&A,T=<273+Ib2EmD[`=N&`99S8??o&/@qoP?$"H#EL ER[h^aK(iFGP%TAeefT$Eib^ "eH`n!A5\Tl.DjW:'CC!8/rt;Xi`S_Cj$Z=H490!0#9:$A!52\G@WG =]X`K9CI4)gYNKW0]=OP;HJ/%pakp c>":0rPlQsSSUKaEQY2iD/7.]oCP"omV(OO5WnrAI[&&A`EL>R_/"r8.O/6cV Z$JsGlfKOZ:6t!G\[[;\Yjb42^6ROJ[TA=jbf9AG>t9_6pnNXioVqA=2<]-;[t7LX58k`<*K?\p8IQ0At;LEW0+H6+*fd3SaI'$<mmh5JkDm\`3-p2\Xo[?JbcO"Q8ZtmF4UY(A\'hD;>abi7rAfNh/,V!@M^H@_i&]O,^,hNt"(mg!7jji^R\ 5WC=]M[q_[Mb9.nl!"BTOBj&Zkp:0<kG4mm]&>X],&nJ$\]]S1?Ra^#V#X3](Q9qUlM2F<sTP^AAr+3@30*3lm:_'2#>qQefOt`oLUd=2`-ILq'kl';P-$m&dbNq4_Xmcam,pA6ZI^Z&eX3jLk'W0^hf('1^&b:oT=nOhOTQA!oh'^#R>P?3+L:XM@anPUHL8pEW+.d*,t`Q423Ea'3*,\8?[_7i8SQ,Z8-EeA(or+LtA^)r,Qdf!13HT>+l>jp'qK'!5\S+\1R[T(lAWG@*@WXWjiJ(-C,:$Q*g;ZAs$K+Hf3f,l'(.`2+Ltg=LlUj]A)h_.D4AVThb_:o"E,Ac[$r=`6CM WM85D/Sa&]RgDY7Q%1/8AP\-`Lla-5N?aXpkcrB7VV`E!E8ClT8gsmJb'3W`?C9rUF<AJ2d?P^P2,Nn@*_Q1]e5mKAA_r[WH#S/p#t$nf9A$YOS-qc2,qT[,8FnN7';lCZ(8Gd+p*V"Jt)$Q^JX q+O$+@fhHVdDal#5?h0&cI2<pmRW/g$/gePX)WObhkE[S@j>ac[X^gUQ9TDjZ"(jmU54^H*-E?/q?8cIS:dL0@ b]9#DoU)^p5b8X$*I51q^WsA'd%2O*N$0gEfr(ZTj5]CgAC2n@"p0tBEHN1mYX"?InEGR7A0T>VMD`$`9?cmc+SA!/^SHKc6PB@7-/P'NLQ)s%@ (7\Eh$-;DE*hDtr/PG[]J69FRXG2K(MJRMkOrO(Z`KnNC<)o[<;`1hDl#((g:W$CrPUn(FVC =a9A-p&SQ-.Z9I o(1,pIadRJHa3ZLTVh].bH;#MkK<-en/H^=(/"fsg&B*b<lI$;X8AHo]-HB&fP0Bt0MmD1,&Q1&9XU"? d^M.:^e&!t*9KTC++i)p=_=!)"`6Kb_T_F22tg,AW?8Q"E[DAK]%'(58-$+<?(.#__QLLP&+SVEmF@Jkft'"^L`O:a4TT3e!A6F)5g%>OAQE_X[??,*N/ ,7=',iAYKN OnML3[P^e;$Xq/Y-%i@[)P9cim"-8t<=^bh!srU3cB\&^^>O8IjQm5HNC/dnKsYf:Bj0dN_)i26qR\k8k@Q0]_tO[dGBL4Prgl'n@/>Uq32\"I/pFTG&X`QZDM/,O t]LC\nSP'mjQ:'NA=&ln^;D\nlQL&M;kAniTD](c28,8,18:6!M7n$&RVZce8TeHW#o\G^F%2_XM-/U5UZ9q4lg"St_'MSKisb"#e#NfZ,Ce(=nU] h/$U.Spq*hc+e[@1ZC^=2J\P3bp8$c58j3_O:0k6WC##3=jW!& .f!B,H^\e0S;adAUOo;6ekIP$>Rh[\-nN+,ph ]3C1"AntH(F?`s_SB6CLBsh7D@7 ]SAJd$j'.-aoYTsN)r:=>*Gf:U/! -03/6n&B$JBQ'70?@&G8eDUk:-tPpsa=-<W?3bf%d&Koh4A,@GN_<?4W^k`RGggM&'QM>lYS'G6,^t+WNDdb06]"EpeqtZ"fq=P'"pUgVY*r#D"JNmJXs1t$;P0;%$ORIhWYeAbL@ZSB&G'n4QD*L/nS/^GS_9?9>N]3fFnAGr!neR5=_cYH7$)Pcf<Vf[rh+C"(2A?.m,SQ+:A-I-BU-Kk6prA&+><'ls^\6#l5#gEl0o5l784M_U3.=W_qGAmQ*%%^^]6j$/S,O0"1e5/YmQMqj?<-TR!*0lOrtSkQA99kNQh.%r"dOm+eGSXYY8- )FeVXEH:P@Sa##kM\2&7EY$<s5^KhQmnQG,DrF^G,=/OC%2_K%0OL3=-eV/5>WsDC30'l"h>%Ar#"]CrI`Y2\8o#-\A+qnB[3Nqq!a+'Cab&_3WC@]2<t&.4h L<;A+'+s$<'rKGDI6KJZe]Yh^QZP4!4]NEjN/n9hb#kW#XXpnS2-dn=1gm/N`c6#02TWYWfT`/>?kr66f$mXoJHVQb1L;/"E/[_i"2A#O_@8!_onZ:KfIm25I;qhK"A3L@W2?$7>_J%UAKVto3lMX$-(b7s#nZRWJ C8^J.dqq^X+f;:nS.j'7',)boQ07P:be3Jja&_SjlSF/K<nWp'@7Z)=SVg/!4.7eTVUSKEJSNqCjY5=7sYiN6r"O1$L<O#M^$cd$0chZ.Z8CDp\qUP6q)9RpR&A,o,^jtm/N0n=9'pB6M1ao?B9\mC_6^i.ms ?+tqPJLB/XT6*(AYbq6*OOW"R+<:*A;"?$$!&::e&_Uc[%3.]iNY-B 4GU W\WB9*hW4>Cf]MlAj\q8MYh@X?E9PZEAhdOI9`bB0)DN3M[)i!`5iE&/6cP,K8fd$Z;6g0ZR&MA+m"ikA`$A2.0e5!2g==^N`#'j#rqt:\ _q.1dcbKhVo5QdUjl=<^Q%pF.J[KsmE/p<.0(?j=(@bU7 V`Q%*Q-\pdr%W@>etp(Y+?H+WbnN;JBNA)3Vh91?M<9/f7_j,B =E28rLFmb9C64o?NB1Tf]a4#GU:!(3o?;79.Ij^jkY+e7Q^4?[</gYgBriqr/`)CAY4'*/%9Q0HP#:ORK@s33FkJlCgb9<U?GTBL%jA8O=_5('CMLTA70&UYpMmT6`9!^%=) -[\Ap,eC?"[KcTVZo*^aj#8lV?csMNeXQOL@W<X(KW-78GS(-=r[2G@UH$_Kt0'4!L^;Kf\WjSATX-3>f:@sFiqGiP%`n/f*IHLa0CepA>VB3hJgZe32-'2hf$1) BHM#5PtgK<M4V-ZLLn6<?G;r*RP(7HA8MJWAr<g_.G=D8TO]UqHBsC/[eX"2;6oI N!0KiD&sD'n%a#VC:KS&_S^[m-Ni)F6n-`=,6;e\pi^cPFA,dY8ASA5$qK`dX/`1_[NcGQ<fmGR2X%\GL7%A kY.m<PYmWa-2t%el)X1pfFBI9Qa]MrLGA`)M,C\:G1X"_=._#D(p!q r'j=A;S?Rpii[4m?(kWsVD gTfDUoqdMRAS6LhENjl_;)]E?c8C:ijTNm.1GE'ia#X%5HI.)F^odh467(9]^j+aG7RqZMV)nHM" ogC)aZE*_T%< AcoZcCb^7eNZ5A4m!_SoA(.0-!cp^^X>/B'5D_/qY1=%*GQ40 `k-S D!DtVCL"a9kLRr;^Z\S5?4S4abC^_Ji.9=:kR\r=)D7H=.-1r.OZa.N"T7(U\snk_BLVsX%0AJ0_%V'jK_.e;o,A=ercfJTZRlB:js__+O%m9/`Z]`[CSU4%e<4T=F3<NHZ%MpF.Y.6g V*5/%!JNXEf=4H@B"ST9XQo4DQ?(4^B-g=e7?);3%=(ha)D$5+7WeN]Q@p,D;J9+#&l=>NGa83EIc^MZtk;J[Yt=&hJ'$PTA#8 F?B]XWF(CAKpLX_Iq5FWSe5._?it'%Bh7EAbZA"95NAo;_[WE/Z/0bGIP'FkIK*/Ie&la!C\nR&'>'c'n2C(t-ZcodJ" %s04ZBVLT1<F*q+D9L)qCWLC95Cn-AHn(W&Z&1<lAA3^faA Z7ae `\-$3LJ0464>OpehGq-lKmTD1(1"Ds^"^Oq(P?^66F9X\HT/&MUTcM 0OA;\<[A=d\TRPmia>:qdh@qi.IOBj]HO#"0.h%nSlXOGY[$mrSVp[Y0NICa8RL-.!ClD,90Hk^'k6a6cin/Zb!&je^@+[00bfcGFG(LY81#7tpAeR6Lb=qT_H("eb:YOiiI6hV*SF3:9iQ\d qs2h->dl6OT#PDQEbJX66i)]FtpBF -g/J^S\sl6n=G'Jr2:#B8)KM./9:S]Br[&7qh*'hl6L;"4f'[e8njR^#S@J6]4DAJST!XpW>?UcZp.d64.E#fAR#AQ"CFqY2BZc+AOK2VqA6I'YgjrfqW1rL?F[BD.fRm6+@2nsc3/liS%:$83NB]RUFI5I; M14H'Nik4^<'eaTB(=6L E*d$(CG@ >mUikAR:"3Pqd7$'<r\pUTi_76GD_e>'eK1^GU`>aMY*;?gnmc_E_1ct+b6LWJpR_AJG$b&?iCaD.R"S7VkB*<VpFcgg!`Lb-dCkgMC+iM`2Ope$l=55& Bq@niS9@ _2Ap!ok9A"(@#7]2DXWN_6Xr`$E7Kh!+"maYk>8&"h`YciIiHg_3%54DpD51IWl=V:5@t\EJ5I^8K3%8#@l85N#[C#<7]!*1MpRCS44&TfRhG_?BH 5;)CoIJsT&m9KBB;C<;WK$?9r(h$W0X5=W:_B+@W>O@dJL cU' fH,8;M<qL1>!O(08I?W8S [oN8c\,Cc&'bP.;Bh&(+$P*Xq,DmW)Tt t/(Q(EtlLC:fCY&XD0d[BZO0^ht[APo#Egl^c<\Z"FUY_A!K=j8?9#/N30Kc)n78ib8?b^7cU^(fT@q:%(W-k-FdA4Q\_8r9VB]%SP]?(:>DYF2H@);(A:!2$'QhpD:B40!K.BBlUk-,W5T;#QD7=Q;<jf!MrDGJ=K<n6<VY1Y.8tHj2Bbbg]Ht>k5,$:!,OF>XA/N#+ia]dUIF:!i"9tl:a]$e2=CE&KdWFBC0mA/(%d$qgD#5=e?R=S]\$M5jm)EJE4McR!Y`olVI#D%AAe[?*KXS,b":;275`hGb7QpHA5/'sqb,m@pXtWq#WC",L35mH[FD`P@mTP8-m=nQ5lOpVobKa##,I^iK=Wj8SN@^^sK(]2\<@W8oKs:<Ur8%E?i(4?H5(,5GiqX]A4:"rD*\cg!*$*(DN[2IaG:l7S+(K@%G%XGLW`5ld VRXkrEIJXk@,6RB4RBbrm%i9rYsE`]&^' $FpBbgjj8[a*F/,7*_Q0"3V"e2_&NW_Q2nM?E@(hjd1lm4O94'_6 IAJeXbp;m,!<rdWe1P>(J?H6I$k;(n]H1a*p@P:1+hdYQbTi.8>:j.H]q*N'cZ1a,a.IsC@c.rl"*q[s8K,kg:3PM?:t #s81l&,"5]]Q%N1H`D\WUS+AA!'\2;4@Xt*2b:JI2F@ERF@rem +O2.!&L#sAsZ[U]B\O$p^=;_WUPcp $-W/#_@jmh-kiq*5-LC*i>Q1)>7N;k[_jqJ!p^%sYC^*h)k tMUVh7E%P&TgZP\B_^1/SS](B=e7C3?%C=f$$?D+R-R2W)[ln`(Zn?\/k\;%j*+_;/AK9iJ <Oi%Z0 ?V6rHts7(MK<+ZPCpSA-t=1pS1!'YP)K5 jOt[G;.*.c.[[jGh03B<f0+^`f8rL oVGHDla<Cd^4rn8/VCQl.?m^AAoBY844K[nqc$JdKjAKfhFY<+n\sbEI%2b!n"h@,]*=G0Z6".b4qM%& \C5Lp\$t(nsNLq+*]^&M6=->Zb&Ic7UW&GU"b"*sU_@D 3Q"oHbX5;P3`UAAqF,keZ`8 "j6_fld7YUI94*YMRE*K99rnd$o78=?O>:Zh_ LpQ9F_L#^A3QCQ$Pmt8>N^W.)QBB#b/fefCTOO\/C[DbqdJN;iQc)_2K)i>tEN!t#Eo7EFcDQM*/Q$DVq73A>3q"?rs,DC^<@Xa*UNT)3eJ`p,0@eB-^MdL]-+AW?+k'TT"=*QA_6N#0QOFGW\J +CDa"d]!*[O+l[\"D)aLG*\Uqo /lpZS'`25':Se#*7@QG@>i1.@tN\l0)48QCp,Be"c7Vd8C!NOj7,,GA03+k\JAPm6'EkqMBeqlI`0o=jW2AD#Jr"eLF#K#DMXTA?)p\WG.+)@aT5$rEkal[sh#f)7D1:N<Wo2Kk\#&<^p+L1&rl<7:c[A/VTdH0H$OqA?CSCUB,$Ih%9r@$sScs!?q?k+r5p=<A\o0H*]5*+8S[?_2\5?_.-q0chiLg@j!bc-C5>@J.hLlbZ5gld*A%!]Nj+93+Mdh;e8oRR@(OQdp$:KHVG"_>S+"/0$AKK"iET>q4-g$g`'GQA#O`iA Qa AP+lgoob, QXf&Bm!5/(8N (/Ht#*%2/dPin7^G+<VL"?`6]PG0/[\I!$#;r7AI*Wo-4.d;g^4Z<UV9OA$+<6Gkiq%?OacGhT%F"\L0@eq>o0+$6<8RAVppX4`\eo>*RtAe7)'dO9B[GH:)cl<Aic(Z-4gZeOn1Bf]<GN>g 9epr`)8M;m#ftY:ZEMI_8UJdaqj)q ,h\piI:L:%#+*+7o.GkgkrmKBU"`WMJ8$XMWK=hU/AR ZC4IUaT'24[l.XLM,/.K,qtV(2cf:]Y#G0O_92(ALUY:.'q79aqZ4CV%P? VF8qc#^Ss3fGdSA>8SQdK?;MTW_UK"kj2,F#_OA/objAB^k_BZ%re/blK+3Rt lrAJ#ZeACaIA(jh \(Ne]R_`BNQ>b8A\P-"/ABZ[KA38!pWd00d"FSX/]S=CB=,)FO0QioNX76k`K:9,YD5HX(arVUq_-Y0c<oBV:]!(R-Uk%n;P[%:X>o*V)Z?h`C+Tt1o0e"@m7SVai']@hMG\*)P9M7S">c+bEkkCS>Hlot<dEmi4$KCat_n#)QhYAUUKX-ZU*4O;D=/4-OkOYdbVm)Ng S:Ia5MJ),E33_<^dHQ%j,t*#?M6SZNUT#CH<\a82m22`@NpdTH>(1[6)^ZVlAKE5i2o(s)rskb3MfU6lYlss3&96[M, .fSc`*OrF'.Y#MpkH/pde%<7m:LtYY&V)miFbqegR7Q ACrslZO^J@J*#V.H"r5m]5j.A.U7#82lN*]3'<!G]\lU7okDNnGeD3YRjJ1.YIi+W)nW:5-i--MgT9A]`p4b,.t_? ;_a>4mC2fQ]*n*`M>JZYCoAr6m[s7=V9Jfb3U3o77(9XYT;A!MY>ke"ni<TYVJ$6k.#. PMphNC_J*bi:DS"BTb[CZc92qjomnC;Xd*iHA3@F*C^Yp?Fa6>S2[0 r*ch2+bA U@j\VAZrA<6[4b08g*:-c&ke ?fU9+5$ bkkDB#9?FP_C5aTLiHaY%D7#empaDa4W%`KV$<"tD,H>GSLPNO'TEj./\m,jt6TWP:*hT'eP[<W)cT-K"#@2O@.C#dEaV!A\h\@(LU5iJLWjgk"!1inL]^]7%k;s3HGl$bs-Mk)q&ImPWb1\p7jGWH-6al08 67ZKC9`jDpABZ:F?nP-KfGjt@@\<m.HMP"(k7$2,3e+q,IaQR-Tm\*nqPkoSZ%64aR5s%Q7!3c/7[5`]pq;!q17Hl7@tJi-VeHT5XatX-9CAIf\Do#rG#UpnNVrQp#.=LA!#W6N=?RIB\fL6,b1O19VkE0_U.SI.OI*:m=De4TA9"jm^`3-6hs8&XPK/#WN*\T/s5_l#A7b18^Z`?@r`kP=VJAG< ;7!O>?V]-Sr_AbFZhABkt1n?t0*Es"WQI1i',F#/=?Cd<.?!LhStaQbW0,1DS"<A:Y]5rIq'R<[j<!tYP8^mf=,n[J"]>V<@dCam7\A-[<&3qo:RSSHB8\8qVEAlG8n#$fbnV$5RHEtbD<lq I1CBc)ifh@CpL#$[$AVq%7I"YfVV+^K:it@'t@^5PhD5lq`A<1T61d_i)2TgJb0RCE2BEZqKOn:oB3 Z6[HSY/ b(eA/nt.W^Om<-r/h`Xf^dL<SLaoJ%tK^WLVFCjAO0oU0J]]!Y6sr%]A00)e.9kB*Yj<6 bZI#G&eR#Vi]*2T#TM%VHj8+qt\f9AbH_7s,e[=Tp<iRPNO-B7*iG#U`jpj;,PSO<(.Qs.t+a8X,1hTI5%r?MrpZp#g+j70.j@Tlc1$1nP0&LEYlbCUP/NIW:PG;M<fP&B_rL0,h*S.Z=)0D:!!a(RMQ4'6W%E6E3T1'n@ /XF8L#NI0 AFK(g=AQrfq^?2BCV@O`OG)#lh9+;` `9+"7I2koGTpm`iaL=k!A9tDY"d8WsCPDdpNgU<9P+OFS1cgZH*:2q6[3( -[\HMJX$X*W0g::t@A/$-KGm-rc7=q)-sOVgn[^AWp(r0<C.Oh"iRpn5,kGV*_n9Y\hoAokJ>J-6QA%J,OQ47n@#mO1'2Xt)>_^oc<S!2ZnV6"%$PHL7PM)"]'Ng_5UHp PV,qf N(D1E)RW%Ilacc,MGe:b?aZp9^(mdb>foAT>Q`>GkdZ$<J!gShtU\>$aM-Y"6ac<j(hL[_\c((h@%5nT]V^,]M*JAblrMZF^3^S#''^s![ehKE,E?]mY4+ql<F(iFD#G,6XdK.1ZM%j(1hns<R!%".-XqgS<Kf%Boq;^Gg&d@sq` 5i_o`;LQB82D+VEn=1\,(, t<1I1@W`$a$"Gd08n).hU)2jB<!Mj6?.NZ7^a/TXR$jBM:>opBLJI!N`qA96bBoap9c5FR&(T;as,B9.D)"6n6A#-Ikf8YJML?$N?eT@_]@Y!R*B!J&`0!P#IW6I`eUO>qm-NA/W#hJjN!M\>=%iXX)Ik6;G`Rl.BJF7b4+Sd7;q-Etb0Smtp`7/02B^]@7>GHJn9XdWE1LL'bon0j)f7=9-I9'5gi)-RHhV?Y+gWL .W2*XAT-qg6VW,)3>(86YA\cIc6%s(/M8FM`/3>#ak<Ua4C#WL+-6bfKIl#0jl`,+I(=Q7B1=^rF@(_q-n$P`Z.a3E'?c X7WNH?I\&f2ip/bK,9XN=W;T(N2j<QVCHfO(4n2:-[ht! U7p1aVBs8e42:djpo0;b-?*DZCl1E7i5p^pfK8h"lW?9VJ&+^c`MRtGYZb5GN*aJ?I`6;9!ni+?EW6cLM[t2!=P.Jel)#;_)5N5ThTGQ6I?a;$H>aIC>"I__#?ls`7PJ*Q@RZK/.-%%9to<BXI!ADAdKFqc&0AE1GX!^PI5EYG`ZG4;E+[!2=&JWhc!l]<&hpZ%QL69.p8Wj<M>T/m/V'"YQaV1kf-Pg+$;\*grK1KD2aQM1tLp`T -V+qXm%=$@/%'k(!f?'HY"9")?KZ]<13,lPL A.CXOJN_h5$m`%a[S)fi,2j"C(aAsK#?db:m2EG\ Bhq>Yn:VVQB`VMLIK'P&n$- Scm&j=ilONY6qSNS?@j)'s,(K;K%\1m\A$Y'GHCPG_sJ U?+S`cXCrDAM0_jq3.q#R/FMf2JekA0bWY%UPQF>E3g&TmJZPY1 8bj\Gj^`q@#!DMA+`1rhm:]n!D!V#.\kA485=ACZNRP]m"]fhcJA.@&14C25=Iq]FdO7+XWe+ )S*qre%GN[ 9=$t8,g! $l.1$[MO+FUXqq8o$[dpAA()4[8^> 5p-9i]L(Y=g:M%.EM:nCF6[O&"B4;MQQq;\E@t'/1,NZ>:iXc6 *QXIbbU<Oc+V-,O(E9]%g \kH *AS5Htsg<M'pX3A%\&H%r\=:?Bn*[iFAY6Y&,sd,t+EVJVR\4AfB$0c@X,N]B?<d3^sZ=rLA/HEhJ8!sM4;Rb9AYGtfRk^'R<,<Wb)QW)K!nS,+Ie'VhJ@N9$.0B>MA"[jV`iAVA4i%HC<i*. &qa&MQ5;GiAkM[Vg\]`eA'Uks_7mFc$T6/(-Ma_8X:p1S+L@!91Yk,MOm@l,k(HdtUM<XS.BI(/+/^7)gh^7f3>StaApU?fs(_(&c-`?C6W(TD:QAABR;-=p1VhDKoQC=Gj_DQg@j?;_"Vm,8Bk#OZG8sCYkii2AHa7'-Eet/>Z`(hFCN ]Sa';LE>#qn5:!a#-WGAQt!r'BAFI:B'r>6nqn<E?rk!0-/@>gBVHlNK5Zf>9VQ9o\*Xi(1t4lJT  p#YQ]<TG,Ci*=SF,A,qSR?S.Ki`]W"RAMPeWBj0Bn>1c37h`mP-8J ?qRg['1UY2!KB./E,`BP#Ca-RNbR5+#o,npPUNdCp]@0Yk\D1*X/+cog&LS9?O12P-:.9gk`)K#=SWI0]RV\H<r#VC#F/=5+(i?"@mIT)a2>i]-b\^N&F;tUQWBTY3"[94O!8mc`?__6,[ATkf-X"-h?Qs1hs\1&AP:d9R\!Q]Ul&r-NgC;&D'_ gdX%j hX[hk:p6khM#7'8s'/AfS1.;FFji7):shg-1?LcP\*0cVT^/g.4WU45eMOms'FX8+ihJ!\ip/>)Frb$pXtIYY;U.]q`XC8'->lm2?0l/_9d$1R#Q "MCPLgc9t M/hASnmMmK[nMXJ5-Usj5^I?Ut$1:O@FYsRm*V<@2W8EhOA,g_Cto"2b#p_"m[_^`Yr%O?g);KE,/C4+\;drM)$*$UZ)7_.:DCA+k2eAk!sB5[I@5m$Or_+:#^`M#L%M<N-pt<Pb12Fg9[i/pFF<YP+R!(P(2^.JsoUF;5fOb),s^X*j.J*RXD0ei*5&U:tW+DQEP7RE^d>lj&P$XtBA1Z>4S[rf) o;'?;E>+$k38#JNNke[RO*!XBKMq$RaMB%a#]FgtKLWndl3d"OF;/OTY'2a56Q.TpOnBT'c#52Po"N jpRV YaZd6\4/R0E/ZY8@G*epS7ja&_M4W&OI=UjQFmR:]kma"f_3CrNdepp6O_-k&+Vg4-A)H/d,@ZZ;41X]XB`;3))Af12R8d%nqj"9g"%XJiKUWM3'l`:-9<(cc8/OAUK,G[f^iOMoI>t.At&n[(+Q0@pq; l4ket*a10XhApT`(0H@Mtp:UP=5M<$SJFm%r!/J+2h4?:e36P[]54Ajm^#+*R*=eW19S[$&(psd<P*&C`"/$QTi$qhqjKf@,(6sQLg@)OhNOmMU\^q+nfZhESb*&7(B1bOMtI`AgYXJ$[>MZqX.P5:'G5'@\-&NEk+(Ptk/t;b7O"'H<+Mg4*Kh7(<MTi_Gb<A6TL,=NC E"s]eEnolA0-cKcFiqH^\K/pDn^UM[`$;7)X7-=eWXa&l$<5_dI@(,UZ&,-/Q2K+ObSYS(&4C<p]/f2NBa H>c!nZNQ=;i_)3iE:gDgIl;a^f/l/Z!7j$;p16Z4rqp5]8<K6T`5PN:>8j[[>1\?psffh;Yq6DBt7joW#+T0E$b:i]L?&"LR7`(N1cS^a57>O-!LOG^M'bH3VqY];-:dCetc4UIM`ciab,_Ek18dYU"g';'"HKbF ;>fLTPi7@sQ-&er``/-X5C/A.G%q:e/I(I]dWTV/BAj\HjVtZ>aO,gi#o=(;1D%tds3@\T;ZDC^qLV:Wl[N9i'=VWD!j9P0hBZmE>1dDqS][[ABO)H(%E:'R][551":,UD$*U^`lU&9WD=@eD!]R74X#qo']*FEO3tkId2eEb"=cea?@04l ME%QZ7oji'B/l`r+.F>9@/c@dh:W]E9T?e2S<Yo,Gp%U$2CM=.>?W"i>l/F;f9jF9/do%]S1-9Y:sn[8B.!ss^bHB7[9>TQt_n7W]2f&IK3KZBLAR5M`-:SQG=Nm!^2O=oXjQmN**Bbg82=,?%1 ZRb;4:-tt1RM5T`%)5X6Yd'3`0c"UT$-$$ ipE;cs9ng;KA&- 2 p\0#/YI/D2S=p7qF%W8kD9.T&E>4[d_;s=(*H>p,ReVW<d[h#+*4&'<fdN/HdeK`ji'?#D@jRI*dG;m&"=]3H&EJ;*^i O9:s!CO_*!IaZ]n$7ZB_1jI(s!oEacM2KkIj:oP.Ben]O8Gan,JDmr"c;<p-^0phslSp"8lFX%XOrYN\1>nLW-U)X!.A.pI'=Zf*SapAW5/$+fak%QqgRL`_U"CA!@LAAfjE-Cj>A,`<?m+,,W3XOVQr[kTQHY>@1$PE:<hYtW[p$`M#r*Oe2U1p"h 3j;Sp9"p3gY3D-Nr$GEk('G5_Rf,V>LSf!'FjLjR;;g%j?P0?LiC!fU[AY>TQnp6[*!Pf60],b_%DI/%`CqMgDp[?3;P`M#8U2BRAm_^PQ_8,cFB!O8*ng9o#^::F^AU_JTUH(IiNs3]a9V;01;<7Bf-WaN`)F^"Be0RQ7<nM8f`WeW7OlK9,LFD?A)jr7Ji_G_R5DCbgAP(JHf[c>LX)oAFlTL9krLkY`V;_8qOj>k#1;Qg=@sNr)I&/gAgX lVbhF.FCEGo2ChEgGH0:&@TBik&Tb7[``d7T>L7-_%:Xf2n.ldtlj>@Bd= j&N[<HNAi1gI]OgCY!+MblZ_mI&98MP-E'0ToVf(NZ[2m+.<SN[LUsQS8bXcA;8%TA\I,:`k,&1LVA6dTCE<AVesCQp`dF8$ ) 7q5(`K>s[R@5cQA*o^WAB:%A=kbN?pS14eFM#Y3Ls[b](spXdn>7[1"(8XY91\g"8jdkQ_)P[FE`O9A?,!ZGs&l8>%1%6EMTA_qEqsEZcH!ic:.=[IP^7/q0"JX<n-A5nZdH0gr(`sTAQli!se0CJ,EY/,0=3a5q<PKSoe8Nl%HfarS(8LJC9@RgcAf];$7l0jD<Vn#VNH?tE"[_B =7S9e-0 Wc\#MJi,8Ose^;i<EQ`-qA>Id2 8Hs+2AtK5l5ZW^%h8([?A38LIPT`PAshLUs,''dC.6i0j^l.'U%9Z!"YEal*$6s2(N$nM21&T')KNc];JP,K1AZ&HgQ5g0i<H*&1UYcE2%M(".phj%9E3sgKQj'A0lU5i1@4>;@Alof@02jOWXa(mdOktRImheaBTF"+_G9S$6RSn';FoDmm?QeSKHkA7.DfA]b.Fi1k<YM&OA/(pOL3AK&<natm2/qhjT@D""tnT!+S&^eI#74tY_6ASAaIN-fMR[e#7SP1icW5_/MmKZ'2?.S4U&'EmM^qn5K;&+tA:SX.m6K(Ts6jEn4[YNB7,IN44'tVRH4ATc0/cUch;:4RIIZ"t$jRq7"[@mSkpqC,^E0pDC^8`%Phc6@)<+C`dVtPA,j*Kf\QeY"(BYU`%^]5"LpL].bZ5j2&gT_Tp2MB.q%aV$PRl5eH9eon9S[3%+E,,o.Y:,g1C oQe_.tqJH:T,"VL6=WTKB0 \)C>1LBMXk'>K&Al..qA1daLmIQAgD =bl(WW rKQ^kg!0_HL08,_&coL3"L)8Zp(cm;K#J5-)#V*._78W_AR($ZKHP4-:fPm0@/k1!8^[BXSoQD!o:Yrn2"2T^"Jb9s=UDLX5W@Nr@'SmXd'1c'VspfP#7b4@btdUBJN3!^Ye@n\;)Sf#HeATK9mrVQ;='!-::"IJk[^1n2Akm>Gi,e,aIAZ783dI&Ns93`,i)Ml@%l^Z J-sqj"b*a$$9Wj?h)>a6(0a4@^a`NoF>EA2Z"%6<RnnkG*bZpe^^Kmon;e?a9sWl$O1_)AKS0t_c=Ye$TYTM8HHQD<&O>O@'9%.2PaXIDk-MB^h`RTrFG"Ki-]4k,[2kB63/da"r,g)*cH;HC-daTZ_,Bk] W:? ?`,e2`=TCLJ@knRUkoM*i`_Ah9PKTTIatn#:pp0;T_kfn+$c?Mq\S$_^Yj/?fOK^&Q$-94\0iF%'8D/C*3@@Xf<aQ?:f \JKB8lb(1mk/tCA$UK@mZiIL%OMg[6fD5UTM\3KXYTI3hV+%[AheA=3DP j-)h7qo7 0.P;\)p1DE95)r"`@M\&/^lS<Q"NEn>cGZ;K]E*)T%llg]b^SLSt Vrdt4)Q>?k0SQQ6:Xeg@pm0]1>,TnkC s&LKP5n:EHp2")g='d@s)2;-Y(Ud!A-'AE4R dVZL>MT)q4<'9Ymfs*9?Q`d)b2H]Om:]r+Kn`gt"_>:)t7!GA;&6'h'-.\lr'erd(b?#9?9Yk?T%;AXE?=09Y[DSUh4)8HltINi0J#b]Bdt"k,Fb ]NBR2/8_AtKDN06M,(Q*0IVE:pG[%)2l@A`(R$%8frtGF^i!6c*[)*Mc%?+6q[0@Zq=V^]`#/U&BT_'6FD*mS,AHh["]`N(QVo'7Z-f,1_^s&)nG!,A4j53m`k,%Yl0i]A2S<lVjH_)@P*l4Drso-5,1HPtCnP7L<:1-\M>6"DHDUN_,kR.66#dN];A$\_ggOGpVsS"p9]cN)rL#C511GK*j9H(K(0dqSJ]Gdb5A!Gmn+hFB2]jA>'@8iscCUTqIJ@^Sk-GT'pR9<P_Wql2^,(O&'An3Qid<k,/PQA@ 2nUm9,%OOK=?TT 6Ei4 KsKVI[H4t\0 cs+IqfMO)U/PAJc<A>Ahi-0VS=^@dbe%;!On(OYba(j[*dJ>5b16&<;>3DZ2G L0,]6V$0)Q(fK9o6g&439WHT?C/W&Mkc&&&7g2V/Kq"_LqJeGEJA,U%Z`^$eT reZ34p^FaPAKF>]3RJZ_,)>=r\E1 I-K)$b+ -@[&ZT,mc0b;C4A@T3,]Q97>AC% ZHN b"f8D *a(! YCXb+^Q8j4V6+*:<]j+De"ZeR(fL(/@Njn5'&<Um%&YssN+Z@_\K:cBZoh%.pLKn0Ho>JG`?@f.$AL%Ht-:iLUCa*hl17k([ZY\MB kDRh#JS]J.jt@S?LBh0SVG`AN.?!gqAH,4DjnOmK&iG#[P2X"H!fb(35A[cr$HLcY`cp^Sd_7N[]@o2i9,N9Z7:STafZ@E>,"oXL>W""!IsW`n'9%>O9 .]!-O``>qCK02AHnPOA</-Ql`?=`e>YDK:f][ZX;^E.mF-#JpSNM45q;7Npc;JsgQVtD@dnT9n,SN4Z_8V3ML .Bd1brK:0]9[-'!?gqOl^$g9#<IWS_Ftih4UP1S:e3D`&2*KVC=ae#m5qe>he@F/#0AFi44-GFOmX;1Y:ot=40rm%G)rZAp*;A#$]bXcR)FL.ot!/ HGcOY6eboK>T;c`Q@YZ2)E95k0(Q]Qk2mG!lA;3=?"f+s>Z9gOJe:`%EA]IsP^bL%a0'Qns/V/oqN*X\A*SWV1 7H.;U)V,f?6l26J)'r9%S8DHKYBSA'6>d#Y5bHErPHIH)h ; dcmLG9=WNP^dV2+N;./c>/.'Yg,G!Z ^"c6S3H+AJWf =i\^<knMeM?pB_D;qdh5fq^[ ?H-5Rk[OE6XOZJIFDW_bsc$d+(fGb&32K],qn3L,WIrs?9=/*tX*A8)t @$(OZ1=.g'PoJ4$h!jLi$8qjgG&TO*:TJn2(IqcWXjaY@LYbT*Bi#s&.\$^XgkpdF+o3<N%X+6T!WEn.s_Hnb_bo_>@CX$IFJnC(,AkAGfY;jttXd;0K+,#j 74DomGDbk'5OeaYs;*0R0b]$N4L+#f"s?8$`t9;OG%Ya@kQfAANhdLr=qRH:2e"T)/b`Bjg(gD( 6Pc+^[&VdH@`B>"qJ8NAa]8A@t%qd>[l]RHQ]pZp2\In6]5?]l%j`&A)5r2IQM:;Y9rN+PP*lL`ZCP_@tq:r%T?B_$39l r\hehLm38iF,_7?jQ"=.\Hs^+nEs0Jp3[d.3mjc1]OH#`oM#1ikiAL`]8p&>Y>.AKBB4KGA2r%(Z0K1\QW7!X- =.BLhN=d3as/*B^#MY7W>5hH,55H1,tMY9]Cs?H4/6da 2JSJa/t.(Ms+LPPirD0MXP0!NF6 =`!+`A`RfU,&d3Q+lK`,e)6$IcpA]r0mMfncKc[1WetLAXiV7]U0AHB3/"nBr'kYZU_/3:joQ-*(OE.2,@L`K cM;WT3sF>(s3=-i`o!-XdtHROf@RQK</!?qD&n$-jMR,\lSTen a]8`GT_jX!+Ed+Dol3L=!A^&ef',Z]pm1`t'<5J!0UP0BehNE_0Xi@qjBF$#on10Z2cW?JW]EC b?QZVHjIbs>dIh<+\b,GY!d$r.8ho5%KDtFok?`?bP6:T+D?(qj_=htP0r<Do$ Zk8%:.!0QRS9c%co@b$"\dEYhQms7,>*[6B'WEt"m',f^<\`noMW!_e!c3Gq")i?spm/#Yp BAQ2jmc9G "]FA`L@8h<aRV/se"2iUcA<?e).bMNmnQQUR9?bAc5>2aSZ9X!Ym`fKQg%ViTALaF&-3%q/BE(s/%`A7q_lf8DJrfgT,'o_(dKBR7j=o'G2Y6"O`<-OCWTGRV/=f8HPB:d_/tg)@'" DjV?mI%[4fE^MtHE8eeH"h2pS./3#@Rt0%T"-"X'aLPgmk&1WC7^$e,Sq%Zm;%.+=c)2MMg2@k1JfBNFJO20-$D=@abC+kKf5`\-g9L:tl<SI"+ZGIH$\D_`2%jb=\G9#L@"LtTjSP5%t>l4(mq\6X9jH(?dUVK#t>9J]H0?EtAO&:BW_pV(mCX1qoP1&ArT[oU_NWphc14NNs60UO9]gbTH` >n!IH%IO*(FaeHm-ePb(>t<i1$,V*-/DnjWTK50\H\g.:ZCnLI4e[j8&AOd$2N:W(ejK5^9#q3EF8@5Yr#*jIV/T=#n*iDS2at#GX]hrpNYi+d RpXW30Z%":PKTG,4%Oe"tp1(LmY#>'beip%>6(FHP-)+JGN`C>D4ffmfcYsWcmJXBpOVON4``0Q SHQG?@!cW/hoZ ']MH'^0T!5"(i)h]Y\(9FTfJV:4Q&ac[Z*f:,@(pL'T@0:ooO73t*S.S R?@3gc+=bcCM%M[$P:K<;o$J='rX9Sr h(fI^<TnMj6)h +1ph7O_jnp?sn!5OoLBUT(f`ICL0jFGm7LOhSRecX[UU?B3Zjl'K$?,V2Mn?2`[X!4n6Z/1st^F*\G,Y5:SNHYpGcJA(#'RB_$gW5gV-\c2F$I4P/+< [$j=j1o=r#'i#!RgPKn<W>fR\'E/#][^@Y$OZBe;-88NUnS._L,N\$5cs atk#T3A$ffIU;''(A$%rrsBGD;)f.Ar(>3/\BQr\Tp@LX^_71-\)@q"5U+dG\m45Z[RWI,RY]=UE=nSh4\4*(F4K?&Y-XSFAP-irK]<">lYQ-?o.j_N5>#L:^aaA?%Vn8VQ3'@m*sF#2Cr^CNV!f"S_WMCICaMih:_?p]%MLTPB6C3o^&L!<13?gm_qY)o9;2hGRSJoD;Dt-#Yn#e;<1=OL7LD74Srmp5&UAq(t2;"bQ/\5n.@$kZ5VR*<d\hC3%kp^M]JHpV3Q@,QCs$Wn!bo%d&H@!eY\e%pIlAi+J$tPeo4"M5hT/:NVP @nkMY9n  E[Nl^"p6P*R&VU&AOtBA66ohb4\f(9jj\fI0MUm? i%\ZJ-$Ea"W0X,lm>(Pd -Uq%T`9j[S4J@*g14fA-LLted[D.m7f?"#0olA3Q8%m4KIoI("&Ks,.d@5.m%7S.D*M"XSC<iUQRKUHa%e%8LWNS#]I6]](9""8pJL'd'ba\l%9Rcq%n^hZ6'=pF7^rYsoBnGcg_T+MFV<k0-h'*YjT[-#DfD/L`6g<e#;Y,9mb>qp<4M^M?<`Dt9NU^!=UXV*Y7'P=jA.:-^ _hP5oYKAgO/-VA];+43=cTaOg"(G`@$6M-J*C2.jPo9)Z%IOq7K'5",U#XK(WTc:D*s0oSK%(pEl.Do3Qof+P9A"Gs &o-20FR_;G3Ab:KV!q>'JBX,2'^>->L`,,8odNI"\<&PEk%E99kZB'#\R:.bgbgUj5**>=NE ok7F-:0.&DXk1Y_h(3SI4ki"GTe@%(rc=t4>jk#o!@rTC97+bJtVnc^[*tVpW*6NIZC* ;kAf*))ghWh+T`47Y^6h?s<P*0ds(h*"8Cd$ ()W&_95S)U9>t\MZHTgTBZ01;3;TQIMbjC\PA]r0$D8Oj3>n=O ?N\)E e>a@\+AS77?%N1K[qjLVAgob#IUGIFa8lQ%tCBIYXCjf?iH.5]j5+*!k&DsG_E_H+Z"(PJ$+l'PRmA XO>5BpmN(MqiNP*A,@?9Wi44tbi4'0'W55LNmM2AZfU;DGU^l,g-XENS,rh"ZU$E3\=S&DAEm9r;i<FbX]ZVKNDr!`l703Cpq=jl^0;"8CIPp>K^N-]cF?I>n*ZLbA`2<5[7KBDLZlA1r1%ls9R;oNZJ.9R,]eQCnhBnF)bUL&L.?RYSbFONNqAka]OVF*#biD75m(&]@k6d5%dNiCs#NN=e\=^itmKL*UX )q\j=hb'J=.s`QV2hFD1K r(oZ(lmdXR7kK9`j?MN7,ghZ`<YQ,TtB7r7Xa:JYSbiCrXN8\iL a@gA[*!aE-e6pQ3o_ef2&g^Sk7'QH5cs<ae2%L8-`g:t^sG_B+g!92W*DBZ\:@1/47O]Sqk:kORW0F%A^<;W^/A%bkjW \&:kEh#7)=+b\kcCf\=(JII#_JN:=K r<N'^g0a_rc)B'F1B2%1OdkoF; TbAF]18 UK#TW>r0N:_>A Z#kS(V*C Y7bAeYGTpK%;tl6P!>Q1W!SKT\FS8hq4MV*:leK^H;N>pFkI0)F9K7MZ1Jpi8Mp2T\_(sjO!b-Eq2r1:[4%3V%gC)pmecS,cs0GP(/(l?X260AgGL9:&)hbAUX0q7Wl!Vk9$D3.X8#,COLJ^a"B.KbmT.*%eJLl'HM'i81@)>>qfq"HJ4IZ*e[&CF_FgnM]WT%;Y.H2br/ir><arAedo2\$3HdJ9I]8T8jm(88W9HPRp?rG4cs]g(*50e;0ZX?HdU] r.+TAAPXo,3DCZ)VsRB*>G-]="3TJ]/Z9&1i5a_DArr$d6ST?+ 606gF.trN;AQg?2TXfUmfNE0P*Tt&AGpK"*,,]\k':dVcTY:GPXXW=6\cf>C$F@-KJ$B6n2ZR6U tYkl-'1D\A<l=2E9TBINsjp1(&tsc>Z $"%O+e(QUcGiXAO8JtZ8 !K-O]NEbc&R*G)_:D^nfU7p->OA(Td05<Sj/%;M!dn sBZ=NFGQ8*'M#7]@&gG?sZ[j@m>*?\`A#D1&$Z,L7 3Qh9i)b=L737;!*a8$%j?Snd3\tr>gd\5tXUWs$!aB*-67+&l*TL/`G;c:^\L j=pV5:[,pE`tKNIm:"r%`b&^61IJ)$2Af86;=AFkQ'4H<`L/S'X.3[?VXa7@WiOQl'oV?Eg"j;m4Zj@$][-.4Ak+3DqADc8+<9rZ+h/%:6+OQ=4-(^Om*s"6hnAW_3tb=?H5>"f5k$bD]a1ULOWdf7I$/j6YeaFq+5rrJXWkAGL!;Cq.P&KD@IJR1 ah[nI- kM"l5=bj 3O4F%P8s\M4T:#aZB 0"dgA.V3*9L[n s>F+RW35/TO<.5iX!P;X@OVeZC=p&]LO1P!aGRn\!MiYF>n`ORkFbOenKAD!FKg.RNAl2jiE t;,;,i#k]n;SD$c+1b9'j471C!/0I RFm?:h,Ac_Pl8orLp4&A@oUX65JFZ7,;?$ZF$c)!Li9Lh/bLr]gCRKA#U)ZiE>g?jIrAR-d^Jom7ON9Y?^kaokCpR'QhF8M86-4g<TF8\clNT <WI3-Hd(;VkLg\V^AM;>=K?Y',qiqE&3F4,T VU8f`K57\j@!sO(Lbrm$c`GYK%Q$fn0P/,telXc->@[Bn!UB+l')=]A54'PjY3$-4870FO^0+/8_BDHd.2^4.`(/I.dOY98T0NA>)t^h;5*:+KJ-6#@`=B/t@hHR#p^m&k!;4K9B^4FMr &70R(ErANQ^7U 7E123;pZtT+72f69F>4;HDg`kAg<Pp0IBJU1]+cpM9Pl,Ae8X5Fo[Z9[r(hEd(>hLH@: slgm+_4Q@. =qXge<."NP!0A5]frD]s%/;TTUDfZ]*\p\c"HW$=&-#,MA_VE".&+o%3*P+O?E$oE>2o/&R.ce-ST6kE<U.G^PP<pHF?@OXAa&\4'.+%!%4G/?"IYF<@JM+WBRS1$"f;tLdK"c;a@,pAX[bc^p915SX a8,'ksR3:m'k9CE<1ltZ*"]4gmg]`ZFQkF,6CV7(-Q3%:==$$Md>ZG#;,8:E?b<`3QWMa>!X6NOT5CtIc9D9\h&YbD%0WAPh@#3KK;UgB'XOp0SP9/6T"mA`>CaBeebX4eCKBWtOc"'HjS6[.*YMZ5'm'R)_88g?P.cEnRBb+C7q>Q@TVX]a-DfE,;Z4n[0ZV:TGQF4>cc\IeJAlhNJ3`m4A.4;fOtMI]E/1C,<s+n.)bGHMoFpA^BZ/Q[L_@(2ddD2<Z9!Y*K@&_L0N9icXqW:ZK`RPEo2TM-14I&)d%)DJdpF3kFGgP[isS/glO7>%>UrO,spXDX^7pZe/B5@='S7ChLD1DiY]U6"VJ3"pUPJC!`A"2Whb4]c:.]4B3"#O+Z*4*%aJ8BkP+7E/jDcH!naD+iDmS`3QS%OBM>Q'cZAaZ!a#Hh?A(=H%k!;]/:AnH5o&JrV8.sZ%c=S0)oA-lG[4_Y2TT/KW@:^gtt$eq?q]R?)ZEC`Y!^O&/k,I?A3:]<`2:As186Y0PPBfDm34gtctp$8@F;BVd(,4h4[QAY-tH!TA*nY []?mQMIe^R"jrNMqs*?KF$q*00tT.l7t0M9;S>]MOf=]62.RG`arrBH.`(ZP5&3POn%=,aSEW >Cb&Zq51r/^MqQeX!a4U`H2]$$4OhKag8jdpk-JALjcp8M^J7*ga7J0!jTBPa AfR1_1aD"4@CUe9) k#T(*3WG?j2%-m8$3>.A02XQ$(P3>IC7AL:kO$7kJ'pdWi]A-)tlA&3 9dh@ L-!oa0r%7fg4i<\TejfAKt?FVHV9b&3Kc;fmBi`TF9f'\Sqo-J%`F8,;-&i3=B+F+>qWglV;!\T52SeM0X^D7nYjm<@1i4]j/X2Sj[L[5-8]r*^h2_Ega6##!<mVqc*E,g_RkN%ZjAJ(i]4:n4A>9Jpr`a%>+1RDg/9"G"@><RfJPUaE5^jsW+ds'QIDSaiYPc@mn><97=!nW>cg,r=HP2j:8Z%bM,3)&^R+=dqhRmLgL*p%Qd4cDnTJA_\kT@E=_^t<3 TbBON/N4p+ohs=)8d0AT&[[GU6rQ)U=@AS3!O.:ae%$^a:eF$E-B*)NC+I]RMb(OP:DcGh$/kmKC^Fa*(aQUa%<m.*8<;Rj3r:,t5e:\ghMEa-c)o DZ\fsc\/#Ue/Q pO]j?A=BILDDJ,]>aIhe@fTj`SO3p2hf^cXp],Pr+?^N?qi7.+PdZ.Mc7gKP".^,^M^>)Tkg,15F*OZebWqLVtmjP_'tX "dJgUs^=('a99?t%3is^Xc=b?$+R.TVfX7LQ_4ZsSs* V<E%#6d69WI>:bQRrr<="DSFR;h[*=Aj4j:3:3:&n$LA'="tGLIqr>Ho4k0[/k;$_abW0=ne4`NlXo1!VN.sA'5'eZ&;%9kq)#s!IAfo(KD+?ds*nYSVcOrhn%PFM%hQ*Zh&ArDNHq3p7TS&Ans>Z:;<OeJeGf+HmI69$,)(e_-TEbl$-,>@:a3:8-T#rQfUdad/nX&B/1%4SK\2H[]k(42sTnPa-om6ofNB52NMl('Wf\R;G!h^WjmtRS%`R's ?A^KUf<>E)aHs)mUo/U_-,1A(MS]C,0,3Hkk6QKWYOCBhMp"o.T/mi]3Xd8e9%296>X3>Kd):Fr41"T::Fg&<ht[WAFrshW4"bL+TmSsj."XRSW9gV:hBk&/'c.K_&G8tf.$o(W^'EjdR=m>k#S'JBX4p`d+5[V'T!rHTV!fbSRST$kr8^*s_4,n_HRXCOUb:Qh<:f.^A*6T@nb!eiPa$77Q;:-2lE=FC9"Qg<9>8API'1:-B=\_X=)8'UrRg<?mj%fRb7aE/'Q_TmNBEdX"G)KE3&(4C:]_$c (\83qc]!V\j`(B:]3LfAD!nq(0"YfM$i'(l:4tWSane@,_9V<1Ld">U"'4>V7Jr9k+lPGT*tZ((i.OfYj_N\PPQHXA23G5pC6NgFAYJs0#+'Ha`1hVf/>td- ]8T[c:qm^IkKp1*!c1)m1lYmKj@V"GcI?^ss;ZJAk%SnNfbPPI^>t:Bh-BaWK.l>W!ChHrtKEZ>ee_\MC^\C6]<:C$]Aa=PnMq(l%LsV`b&A/?iCoX;<jamM-"`(.*&;8'Ub0pM6Nc.Ua_F)ic9FIE,,1F1X-Fha"i#'@kO9P"X[I!oAXIDj)Z5Y0?T]PBb?HhAWgon;\ep1P]kO70_:C-6@%`)9N&2iF"Y>oXsj2Eh-NEX_'"$p`1SsA+Y;@/U3R"4TmTtRS1PX2-N(p(tE%E[!f54H X:=RX]04.tMH>kd"_qmXao4"PhQN [)2E3X5^KFGUs^*6nbXPPB>`*m_X"bPRr_j09<9&MUXsHee&m=pR[d4; GIhr<dM2n_H.@0eemZa*)amJ-tf7fY#ce/^ZiMOYQaI9q4`fHd\5ANs_,qsG<#`+l";l<1B*<"AC*SiJ`ljgt#T*_GXk)&(5FTY9`XLZ`p:h_hYhH-2YaIl A_fN+aBekG<`,nXK.9Z_WB!A&.7SjG`9@,`A7^d`9p'eFU8[H!9eHk;$#Vc1Fm&!DegN(W^FY4k(.mL;sFAZ4n%50%5SQgto935ehGtr=8@&e*W7Xb:2@ZZ!rV*34+YSMDFf8=>[^A-m5:MN 0BfKb"V.72m`$R[rbZAk)o r%KqQXP;kG6AS9oUk`rt#i\T4@'EhXWqDk)s2%VVKYrf]>lZf;4CrH&LMT-4_(AX"amL?UeerlB<NofC!2m4A5It^qM2.Obr7FQX ahmRtsr[gh[ c=knp)htn]=!B(q>:f&+"ko?:K e4m2!=LI55i;jg,-;NXPU3gAhbO_7Ga$,1FG<)lKK27]2468]I9NKi>c"&B4E%Ga!qWcc>A0Rl\EtN!dkfkBM@.+dS^`+nEAiaE jP^7"k5do[g*R"eZ!NM1_oeq+?E95+SRZbZW#mq/-p#jL65sA[TfB+V_+8YpG%CjS/R=eX]F@hf-H8cARJP-s2/A'A[s%+% _d_roE_7!J] qm>F1&7,=@0c%0o6NGP%BA*Fc9@jmKL_"Y9PSG"'FJs#Ki+T'cSb2 8ZA?:kYUQ[UTY_Cl)%9.'YjB c%[-c0/h!S>fOFV`7pFcXEo$/.k^JA:XAPqg@\ ?tl A(;C,llcO%HbKGJiM7);(PK#*6"df'QK@7>%_ils n(J=\(=2mLPK4#@.k_RRKX8qAeoR%-'4(#cF!Aa9^kiF8gInAM@1J#cHN)D]eUSh%.U=4K#<:R;]ApDS!N/UAA[@KPPQG?j'-5HoMK"a"P+=6E\#a)\/'$XH:f9AK6lAPk=HH6)&a=,[<c_('E$,f5CL2kVGUYD<;/V_l>L\[00iK8Jbgj-lqA2jX#fp^Vn+D"'fWg%pGM0L;eLW-]]k5a/fhh,#7`75hhR/a*L0;3pQ7P8$+le8YQ0$lGoObrc=N@fA`_m`^S-C-:e"!/GZ@"g2;(+*7AJ*K8E''4_Bh(K0;,)3, g't>enZq/"VbTGnJ.r`9Z<eViH-Y91GeV^n0VmM 5,NL -ZHCAEAilhWW9W\e])(#r:W<A.4rh6kgMj`9cI<@lp')TmB*Q% `L8%^!bc&W#@#*-iT5</f?nmFWLVAciR"Zd44T'E12K2J\$5*LSUoP-ch9PbP;1 X@=4>m\P@MV2Pg6b82'$X5%C*ccs,o8>G'2Vnmrf%7- Y<^>TL#be(V*ALae<3r30r\^=a#^o!OA"@F9=CAgO^nUC+*_%b:VZ<0ka>XB#,t;4]S'Lf[3j)7,Yl=TrK KmJ1@%QebB.J7 ^F=g)"QP,LH>45bAF*l @Jh<g4+[7M.G1SPE/nTA6PfmA'GWU?XXkL0)pMo5Z<Ap=Oc@`A;5:)^_M`#"gi=@sN2o(:L&6<=)iLhrp1[E_=1=tf^-Mm^?>!ObUpj;;eH](mN#gAiYNW5VrcfCc6GV*aGnPh'S@0@0;K\it@r`lsn`hWXa!mQ"Km gtp-:^;>O-4kHE`*MrSq)F^0RI<8mBbo$=0e%;)YT&2+?(!jjaT=2Qh+nr=#078':9DA9m7 jH3gh5YM\]XBls%gibpM;bm(T)ResJ$LGs;W`!GNs7R387UL3@CoMX^,BaUT-Xaj'6$,30i/VlT08Ftl^R M>`ltK`/?.N,MLGN]?T:<Hl):)U/dG@X<UYae!:lB`4X3S'U:4]ZUDYK\aFQh0jH)1fj>:Ap'k16(AM-KPd3]KQ%/=eGFLi`UUr\:?>A+JMa=C^?&(5GchU!AG]GlO<`(qinQg/2t7;E[Q4>8^(A[>$MNj4=/K;S53Kj1_[(7%aL$.t^XltDja#<0,.#b0lYG%$9SAALMIcSoa7Gl:`G#W)4\mH5"MH+WL7FF0EtR6K'.^0Qbbb6pkdB<bC87nI-"1?QKmA>>]6/Fk#`MPG5BC,V6BfQA`gpEEs(*M?rl>-RI"'b=jEAtl9J5Fhr,BS?EN5#83F<").-s^i<G(pF/=BbrD.o;hgGmbSC"0Yog9B8i,??ddI#/FD(WZkI^?(G6,$2[nE?QF+THAUsc*SRE2QaA;Z&'d5QFW/F/K*HB]%VeNK6_'XQ>">GXVQC] 0cAL$p01/sK\ !gR23"/_nA g5\"'Q,(<?VG_`@;k5$6-Zd/'99ilnA6nrN=!O$]X>mW@hMd`<n09-A?-?HTmGjP`trdSt`>;-S^A\d_d=PP2AP'VC48n=&[(jA\Y0DRiID>6$hAN@ M9=;=Do7=MipjH\DMefN/7Yt/h/e]AZr'6XQhPVL5b/.?Y;S6h-cMK`-Znal'^>.E>BSW"<*!)h]TgMVSBeV<-0X&olt*fk^3T1otA@N>Gb,Hm*"MY/%e5[j6g5PFUo+.qO$i_1=s8mf]I4dRSW:4da'CG%"H@m$<_cC>*#@V\k<CUit>TW6+6i1&Fqa5Kmd0LQH7[EV``MZnlDDoTjQfU[eXQ3RN=SF+pVc5o1Q:EH4gojn2$Eo&Mf3D._j(`fcM;'gQI>6Ec&qO%55jKt^'5AF=]$a".(A_Q(p_KhMeD<f;/Mm;s4kmsXN\Jk"h["%DKX5g'N=k$,IkK+B)`c[VUrmUM C%$82XHqG& f]D'"T#<8qch#mNZ%"JB@r-((;!HJ!YBjZs29?0g[;U+WUn`LE^r1YY& /?U7i _.(>(mJ2H<pKn=kDM]_Ya\lY8.cH,5<V^6]b[&+tp_Tgn!+MZY,]EEo(k%(gX 1\bV*,U.&>)=gm$L"`ED1hb.FY`kR2>FcS6Wl4(7*=F9l,4`TKEB=(5Rr5<A5?;KC2Dd\]K!rY1)jtA3<$T)!N#;g\fh%.BisR3AhUHfpO52X(t3fMthhYd,br9O[E<EF*I?U/)T/Aj\"/dC2BQl;3XW+k(Xs]N1be',?T c=XCf s`09F2&Rh)*.4bm+-&-GiNnn+e&ed9X=jC`MSA3j<5_ec?Hd)!cP=f/9`]B@9c)N`imVYZe(pT`4/3Q))UG4%t$&+n(F>"P ?h4$f.@p"gQO[C>n(gPR&l>gU/I;.PU1dF4DO?%^m?AM,aUCGaP@8_>ABJ>/jW)m4,'jUWTFga=LA9A6GnIr[*r9NDRPd,8\S%JV:b?8J"Af8(tf*6LS3^`_sh86/FZD0h'.OXjmoOOipn_5@6EhHgg3Em/k9Z>C< <tl#0:CQi:)8Ld&@XA6LfKJ%E,Y19X>jP;[EN4iLRPa$\="`RLH/7NS?OA /kCX/:Kl6A[qZUrl]dgBfYB^WjFj[Ho&`9:s8a8ik/ ]d-=[6F[*>30 )c0"JQ&!n1pde8*2Ug?0"E>S_1+lL,eV_>16D%8iWW%?^\cbN<Jne<a8:oZ97nO>C?hQ/mNla l;fbt_!NqG!!2rO\=pH  fs`.=XdqGr!AA)H7H0lsAhj;O[I*F^[T"Nj <,8'1F?U\': ;JB=E @L0B&&4E>k^=oC;<jBb9-A5 >(ARWB>RM<J#Kj#"_X?por7Gb@D#hlmUmllT?E%3CJ:6-/$&[j &rc:1%_aM'DTZ;LE&qR6\sr5s2^1.q&hJn#D7?S4rHR,^p9hGbKr*Ga=!QbN;1_7V&ht[PsU1:o?2R9\-emDL,0PR4t?,bH8Btb62>E.iU,nrF G_U-IM!MjZC:5h4?tfT_GFe??DS07>U0RJ(r6&RtPR]GSi ` L!aebX\<#;-L<Z<"_-%tq^sN9]7koQ!c+qT]j* /8l2msVpt:3`q8n+JB9"f*:?YY`1EOO+sFVA:YWaZ.'67e#nMk!mQ;@Q^iV1Rg1nf:N<clPqrQg?/jVTFkQH^1lc/CI`2?5gL16R]b!hna0V"'*EQB#F0$9pX &jS_^E=8can_`DZrl)0J*okpR8j,n1fD="W]4e:?UT33oBSQjO"ga*kO]+dB2=N0#mBRY.%`GR@!?$k4D'6knbs$@4rHKRU2aI6<@O]D$rWEh Z?Z1[3j`g'jH@FR=5S3`.,ejFG!aoIm*?*FYnYs@j/VB_r\h:K)Q'0cRi?JOFtL$("ol[+0E*YMF1_G$E#9QCSP;@*:P8m.'r7O[+EB<MkS>9ZbAR3f\cs0aXj=/I(57(P27:)?i,%[9WC##2I@l/MNB Tq4g^@PX"f1R3`)c(G?AWG9]UUE\G9&s&05dOAJt"nmF7I0rTe\U"eUm;H&]Nb*J ;k2?fLYAetX7.FH;qhPO34e;dq?_6 4W\pQ[-b0]q]f@8rSkAhb,[0)N3t\CM$%I]T@J&1McJ*QQbK_%:tH`2AAGo/nAN_Jms5N<P>f2Y0Qs3k`<9p5Lm<R47O)^$EMj`B=WXIIe"U^qU[83`ACkidXHs?Ci=(Hj,5jl(NM$lXD7W-P\ /"I&J9AEo$!,;YndRW.Qp ]:YCk+RAL_&p4]Mc-?_k^6 Y^`gYe_3S4*q/pq>/C1[N#OGK?42e(7Zg>J%"jT<J7YQ)$f$5f)^!8-1P.cc1E,Jk*"?TQF4HV"i?%aEc/aFk"*.s]^?)]tbC)`iI]R%s")1\j<0Nd)%SanE`(p5QNlg)B#eZ$pSs(GYmJNU-R%Id8W0_.M9dWC!8JE8crR7*U]e&ZTfQs+O4]?p&il6)qA[?G=6iHd;DAm"K&9V!QEJ(/JZp+1G]lX *rla-K#Ji@B1UnaPs/#Fa19 _["Y0K>"LE]pJ&fMAA,Up+Jogd#?A+HI[8m75=C5/g.SpQC3bkVMlA-ne\9Z%^Mb:G_*P>s9*?l'NU_OTLIQ3lgp$`T-AhF?Q8W,]t;j?m^1"C0%L`]9l`WA%A?AEhEqagE]l*c6;AK7HBsZ!O ]!BSebksPB,p7T@Q>5CIsRh[:1Z-*(g,s\I8o;ZFbE[R)QO>&.1fXW;XUG#7,ibDMQh$QA#,cO\pa&G]c*"2!rZ//k<WVRCk)t,9Z1e((-;5r)Spe _"#Af?#9+!X#q0OF-%C;qZ1tB=0LioQ+&W6I.tJH^[]<jUOh(PK$ql=dNAt-Bl<-e=oYcQXi[l4sC4Q,lF`,@)*9&2EpD""Um hh$b9qFYURhlre\2&eYe)LH%F#1$j3d84^!ImdBA%/ccf/<#Y4&eGs\\d9PD%_9gdJ>0Z':#"mt&!)[(./8VSA\X8%teD@itpI6 8lQ/1^_]a cKtH6o%*C=AOC*G+Zh,7K,);9iVc?bm:VAHT?/_*U\mAfAm)oGOA2q!6!QJi4"`hsjR36p4K+LA'pt[J;1tEZTs!h\V>G<,pVpA0B0"D&ckk,QCRX]K2]*BU>8![4U:o7K#F3$H4mI"t?r=%3rj7_I._+CBYa]V_"% n%9cN\)+FH2^cl3mE\=`)OLeEKs0AFIFBlGtd> kT`s4Ql9A@m54)'DpL5J:Qc3:gK/`>1AfWHcA(+6e>P&]9'/<Kib&\h2Cmrh4sA<;&Uk!G'..MVl`DB.808ZiPk_Rab@HcYoJ&Y:or\gXkDl(9d)UA?0%R31"V`qX*?OH$N\KkYGrBU*b.2#lGYRK)g!B(-U3WeS#EM50 aI<XiG4*p6<ANTG4,d2U6'l@ScS-e_%Rq#Yt!T3% @4b0\pE"X37N<FO4ONP[C=$C8RO%%nR]Pcsj!AX>0U`(NpFd)A$MIFPM'ansaARG*TH$dHp@@j$&T+]A75M7)+gbBDI]ACmr"E8kDqA$JqXpEtH3Va?QOY&!A_=/=7p.&c<pLfKgIMNg3L.$i$Q9V68Z6Z&S(P/CDEr^Z)*7jUrk<LU+EVqNG"KJP ^A*bI:4PW<bkBF_dg:#4,I"E@9#Xbn7piL8-[T?GmW/9MSI6/^OZ7h>G5_K8Z?+H$rdV5p?3ATY+.ea+k[8-Q;]!V2\AAc5g24:,^MW?hc= 7tAeqM='\hjSp.?p:O2BF8$TkH>#=6:Ddd9,RDqm61SIQ(+_d4">YB9et:P[4s>6>ZYeL*E415.\=PJ;eWJ+kJ3':`s^H,<t<=gRp$DiS\A$"?*i:3\r/'^b@Aa9%"BY6p1:AMj(EO\0BjrmJg[U$637drO:=m\U/Q+_G \Y@nV]Dth+<[& d`[<5;,Omfo"D*]USf&R[q_bW#W2Gpp3/!AtbL8J5)Mo(7MjTB-<e,git^8m;oA$1/SkGI$#I8ss+1OFKglHp#"FS9Kt/cUq^r?7sA$9/jZZdT0lR*']D#@1=/&k-ASk\mm*bSL\"@PW+M@'gt5qs_@?HW/V%%D=T=bO9OR9aT#*_D4h;5fgGY6&t-sD^]sne/9d0j7+[YIgA4kDUBXM0\C0jC&:Mml'<6h%UA8"2^mCsPWWPn/=jqpX,HK,4Nnq7lHNUeg;bZ^q&"8CV):pf\\tRh;7qa;dh'46Mr7hSJ1.6d/`_9`CrBL;N]Q8QAWk@"\'R8EtF(W)$D:]:h*t)lcXBY#8"M/8'\g9ARNM sA2L-\8JAkAtAYji8Y^7SHNg@aJ]ZqlN'sBa(ANIilhM=sc+2YDZ[q`Ab`08Qbe9C)Fh6V&aD.PWs$hAK4!'I-k'Nc:jAEaEUsU:nPC9t08=Z(9MDJ:`1oG+>/7:iY1=Ek5UK^8<jN\t`-R,ZAb+q(L9f_Q^H2&k-;iB'\:'BV7'TkL9]Zl %)E5s(J\>CnXV[@^ dEACT^^;0^H\GUFTa@oRb-LEcKo33\Zl]0*`lWW4:"SbaDkO5)"+3X_,_!J5c*Qfb%X#Va^6oV_/V^[%IVlYI>r)@,*D%dY;U+B[`\L&J/XBhMg9CrTl7FrJBJ_$sE**8i2ae:E68aGQVX+Om^q\GM6q2F[m[[B6'h"lQ<H>.Xejf,5`H%[Rh Dhg59IPkQg[@UG6l->.YJ0PchkF.jU69ia*L]NBA^MLliPJO*UI&AZNDf%qX?5UXW_1:AOFkC$I$Q6/"RMZ?' K;#b[7IZA:;)'mn9oAc'1"'QM?#!IfT!tq+<\A-51sS^s97deem-.JT]q)7S`(N]6,,j#8G8TCC/M6'tjhLIs!N?7k`F5jsXQ/^YV<1l,#![c`mT6F',B4 ZRb:=m>!<Ff\LnA)'-&4sjK+;;JK:5.,Ip^,PT<?o#,AO'":.q!<kZ_mq0BbmgNr\6&C%P=n?A&EQ;MEH6E O5]A5H5n0M3,T.@Ll]rPZbq]1$mn7MAmLXT!4Rch^Le%G.3WU5dg>Fq;jfLX:;9%tQI]&NDA7U1a8k=)"AY5I-tPH#$tCOEC,->'se."W%R"\hAiVcnMr[[;,RP8#+g;.1TYIEK`&NRt^MoF7f+?>8`k 4Vckq,7.AJ*%U5nZ&1<8B6d 7U#aK^NeRQbBDWDhSD!?q ;AH0#[b/M$0Stjd?p[*rM-PR8I=rT,U(/E;g<I6:)F?N <hCd9BGX,6FA;?GZ Uq M^/2k%iW"FjJ4@\ja`g-2a)H3f`#ZSN) O?9Fccj(3TXS%O'+D1a+TAj_=cd+K6jH38)?cZ[Ftg?<Zn20RQ+*a=L 0PDJ_HZiDR8imqX>P/\@Q$ZO.ec:)bfK^189OANN'iYO=PEe!99Gek=2BAq\ctHAfK"A9B/Qr#"=YSY$N$;OE"Q*Hs<;N_OkJ>U:(BSS[NALge&RO5^]XqCJqGoq5MX)b,eBV,6i]Q)a.GcMpK#E8ZEALQj`VT"nA_VCjINfki8V1#KOMYVs@6*$nt". s^KA<ENce=1.Y,aC8!oMU`,It+ch!r7iNEiFC)pe3,0tVBWbD7q63]Q,TI,-K;\t!]g%:_i\o#_a`<.2Kl.e3+*\@;]AQ[jq,]d-Xdf\Wa[I9Hd\?g6*6m4aJZ: _UII lHOY3%+b&_I]6[%q1Z%daj&^Hcr1Y-mE<X1`& $R!NYjt.CdZXi=fra:MJpSRU;B`LA*\Gp=cA*]cGp^=JS/cUe2'b`-B/i"/cZlC^PmB^d4Df`ID7XmAN@M#%BWJ9[k3-^c+,n.PW.m )OnT*Z7WjTb'q7sJ4*/F!qA7A%:([<nWsR&%4_tFJ<ikBJ%&')Qnb`I/TMD%*+M;eB(`!N?<]6X>(4B-A%>H]`[Z732#CRNFEZX0*XmWcr`V$/#DNc(a. N 9NY&-i!D&]ET:/pB1<o,#!UY+<9jFkq'-Ma"JR]L!HY["<Z8#W*ot*WQ XW`t8''`$9VT>AFsBQZ<s67ITFhYE`m2H1V_V5Pf:IM5o;=8Zf=U,:r:`tU4p'MA?QRnZM"nPj,24).Pf'Y1;3jicjP#9ehm!MiGGbHVajc1A[Y<i8=/+8?WVJ#l/KG:7H*PoXN/BI=S:!U?6_ob,A$tmQ=6to_GX@?7P'JdKBB&CO9V(Bq4<ZL/'d_J+"#CW'b@>0>.U!7f4pAn_rgO8VDWY7ThT)H&3C5:T%@AqIK50Bn2:f' oG]8^$Q7VQ^N=TQPrEm)^IIbDB\oA;AXk&F<Ic7^kj(UaT0E5NX_A!iEYb1'?[TJ=Z`9^!+=Kb)TSIZ`fab>;*rPl=CM6-5fB(ZJ>#l[+(=0[HXjC='iaOHfO"^BFjN7YB'o[,p:Ei%HM7&kZp9"403BHU#?GPN m+r\2j`,T*XL-*d<n/5gnN0).DnQo#ceG,s,6[J@R\1:!d?$=TYKjW;j`Sf0 BX(D\!F e:$U09;k['6d=R HCZ5s8)JHc!3SDSUc5ABSBO6QRQ#:enFr2*jXoc[Zn=H"%Aa,M1+LE"S:4TL(5EV==C_j$pj$`+b6i2+sX12'-qo&K]!^.^US"Y R[t#3r8Wm0g^WndCcle.:6e-2t4=jZ-eKS&CKsU?]@a5U/9W> LabS7 Ke. AtPe+9h5A:rBbLDU&MYk,Qg.V;l30V@jM(ZsZ1.Ic2A[oYE/Hl`8'1s.AOC$* 0q(^1At6LA.7Pb1*'ElHDN"CZknM&pK@+MG;2r8SCWF3g'YRb"!CcY!+$rc]Fs3W,jO'dFE_7Bs;W2`SK&qLYo=?N<A%<VD!nAo[Hj?bAf_A*Af*PpIfE4Qo*9RH)RKTI-gdD6/Rl:G&gGG.\t"DeGGm`.7oJ?#?3>8q8<`CE$>p0h0pk&E8!17`N7?XmSEZ4jA[5]&99$PaNUH(-biCJc.IGrEP*0"Y;J%/Vm*A`mmT2KN)iS%BG 64Qk?@P/a-Oa6f5@0W4*I>"eM`q>X)_-L[\mmm9Zqbd+#rYi&%@\doT:s^nMTa5]].d?< _,r"D(E5HYdk4GdYYbN]h%QZDi7]oc+l&b`Ld>o;]40]V"V.FtPF`(E`nE.]c)=NfAN0<&+cRhi?>[e1/i9m4=RM&<;GW:VYO,$8gb.M;4>_7<+DM+.9/C_[F`DC8iQ<qL#7+sVV[kt$mTKXCNYK5pb'LL)n?r09Ch".]j:A^"=sFOcNA*;d<`K<j,CQpXHLqTUS+?SC(A (CHbJdIl71 -L2)JSJ]8)`*)jZD2apUJAgS@CqF10K=A"d'k^=BYU_rR8DR_H+Q8R`8:I6AD &F@V$ZZMY'KSldU4F[%lL7BagH 1`\,A:BnAMsJq:,Xb9I&Ls #GR":fPSG6)gmj@BU&amZh6Z\q'(]aPDq>@p;:ji-n94iBF-D8o'pO%9%ANb>4($nEgT@k2bGKXUNp=V"Y!ZKfPr3BjT&cOLLA!/Ne`o^+W02Hl3J]_9q)AEqE)MdYf;1tQoA#N`jb"*A2FiY!-E#Y(OArJI+8?#$?Jre6gmP=R#bc>m"/[U0N+l# k.5IN%FrnJ`qIerjU(:D/\ZF5l4`3qYppHj?q9A9M rVrM5M!ng9>Z .$^2Fs Y:tr/AgR_]^6^FRi+8#kss[PBAcW#KGe@m8?PVRq1A#nkFNiT`_QfJtM'M-sBDdDS*D9b57SBX/e4hR+b45<5<+X6i22k3LP`.X1:gOVH>#m<k5'Y2g0010lM%"Cb=]CV70mEA@qCE'ImY:.$JEn=pn`m@CsI8K<KVp 80GVqkLeCNeBE[>jAcq-jU&f$30$II3Jpl76qKf42O7t,s_%NRVQhmQ2Zfh/?bX!S+f6:A2O1OLM4-o+KJrA1d>2B*\F<Jgh24C4*b8P&)[aIZWCo5,%<W)T>@o2g25^LYfP>r,!gB.DbCs>dfAn?p:LZ2V2o+&$XaGhB&MBZhZUH)oXgD6:pn*(0j6K=rH;6??\Qn7Qd-XmqlA.$YE]`54cOA3(["9-*\#t&jd,6eaDA6"D,\2D8"mCM9$S*!YB8A! \<1P9MVXgVjp$V*ELGEY*>2%EXTrDO]^.9m:mmh^nV#,o5)$2.!["@N5PF`:(ljL[^ES^"1V5g,*%\UfYJAlssgLlT-+b%kqJ hifHU<e(8nVIaH1Je4MZh,Ie5lhm7Q=3PcX`q3395hmU;X<<f5An^TseI[C4bZ@g(!a!dcBl<d!+,-2[i*Obo4Xk2b_]sg\">KKTc1`hB&3@Xf/Sj;((5HM%j hd-i>k\4(d\@8t1gY!Q2SF>t*O&Z[?QYdo<mNp.om6&rT>I_K%NG3"-dLTco&-,A\LY9s8SX(K_S86Q[I E0*;!HU-)Nr* d1Dhll_G_O[c6^"3U_6^`O#]8.6lF[1AZ=8&lF-TSp9N^9Cm'rR_dfblH%KZlFl!Q1ZM]`oBi*YA>"dJSO2AU[5/R+`-QI+cl(08btkfVY^$)TL'7W`#,[*Xg%.=sgDW:D-$!97NarD.k"Ya@XWOA:Bjb<B%6I4p7cb6q(*D]0+\Fk%g-2Jfif1pkcs(!ahc.+EQE_e"?=H<`[Tk<ts^=K4bX;5lMB.D%jIGc6AHBc\gUP#:f!89g-%ato` h>TT;Ne>bo=?cSkQ/ n^lSUMn6k^+;@]n`0&"V9tqlOi>9ZCjNr#bof6(12\^@fEqP?F3U!W;6D%WUd[>.SQN@,*j:g;g.hL==7YMI4$[g\8 cW<.:8gQgI$n$=+kT F 0`"e+-mp9Nk52!"srFN-hh9ft2 =[q7YDdknBcb(_??0o] K\+35LFQ+SKUl*f^8G`b1 R4NKb\4Rfj4HN8V7>"Fp-9t`<R*H-*O^2QTEh6ScZ#o<!/D`C>B AnS(7Y/40ohoYI`+!Q[2(s5aSOOQ;0gA5-M_SEF=0O/4FE\!C")m:SC"]@^6=%6,BPGNM2mc'Qf\8<=.sKAM)Cqp="[(7`U(QL*+JjMnVo-d-J"'0,gWsff6[3/<;=j@^Sp? 47p3P<&HU;2G0;G[QhJV.(m8Bi!DA&GXQdZ4>kr9$Q?+%4ho=WMFE&B4Q5=AT6Yr9%?[4]&6<elV0,,p<?H]f5MQ+gkTIDhq$^5PnMgb>[GMo.1o(gj#>W>]m6g:`_DC`B3!kD\-/FO_5/iI+5Ls[p2A_b,8g_aXt^g7ST!"U\<kJ1CS.c*XUDphPBonh4>a&AfN=UF CG^X7I^5/VL&T7pD]A:E0PQg;0R\Hg m&jW:= ;tQ.A6=F=<D-A\V-6Q$\17LMJ6mi<Zb_3btq%QOR>%:02SI"9 ^EZg11\e0=2eF^/ZSZ#h&bje9%.H4q@'p4*YrB4+ .ZbA-CdN\30^(JNk6cKJ\Y"EKH+STS;Z:UVSA1mtd M<Dk@:T<%flQ.\I:2He=A[p'I"?tSSO9.*ded%I]>Xd>*hfa'(A]?p3'?ZNC4p82 fn*eZLC8Kp:)0@mIj2)";9SeqtBB^+42=Nd3Gr^Vns3<-"+WF%7$ge94WS"+%[;^#8Ug%R&spIBgUX/HJ(^K@BJTeFYGI:jdSNX1Qo&a.OgOt70s])D ?S`\<#-[S[W"aQkA0m,FaN+4:_%F +m)a%BHkXB@Y61/0 YsS2>.NlnYZm3&n:rQEVZ'h<4^/M[@$qaXM#X(O7j/_iekr,*7M#><$o:f-3D:mUO2gTK82A5,a.IP&ScI+tIdM$)E%T]WnEooPL&$JqoPY fb^D^&.?\.c:_tm0AE+MB_B.'pnltbInSb[.o8!2)I(XA3_+a?#DA4o[k7]2%,B]I['0eoZ]t,,sXd?D+AGN@-9c/2Q9'p(e:,hh=5JZjZMg6\_.n$#mr9f[-A^kY%@s(@Z [8m24'C!,q)=9*Wk$,,,W:#\?HmrlG];sRATTY!29P`MR3B0Di&b+_h_,jrA0:E54>js>bs%8).Al9_(?6Zn)JLa]S9JIApaomLeo0$sDEe0V0,WVe(WR>Gb5#^J$n+7_c=V$:l([4G*eX=2b3pJ<*j.l<gA2kc.Ai-#A8?.A'\cSZ#&WbG+-l\qPg8m#@CT(dLiHD?P?ONMt8G/P W.V'J:$J/B-4MOL<_eq]r9(/05Pbrmg*,X[KX!\U$600]RTq0Lc8!"f*h7C?[l_q)b2>='>A5OhP\;D1nY%91q)!>*^J0G&1&k#*3Spm^]3r.rHZEki),`@4CI,2>mJ"QXYP&k^nI4K8:G/2Lc!36TC$%:0 AAgP_D']j.)sQ =80_XNqYt?E<K:e`]L6im%"8O6,*RkW?F`U?1(9?'smBAW=5mE( &AA5*V+>#S59#CR`B]rG';Q#tj^LJi'SQ&od9WnN]CrNf&h?n1lMD[nHA>3FV%=J<e8,IY1SfB59^%qcqe`]#@>rh\kj'$&$"YrQ0k$2I:8#.!07cL1#Y8a)K[r:eAXSOJK/aW8WAd8Xd>hWLfrDk_BPN XW4<D/F]R5:Bo2A[X<$(Bf>4E]h:#ai*4)k%*638_nj^;grgpV&H%"4Wti8lG"J@>J+M)#hdtZ0E7<SZ6BWe.^G7Q#mm&l/l2Xm^6F2I2C#<i!pg @Jt+XbXj*l%_h<sT]fm-RTM.Q!%(pI`[5ZV%bbR))5"h!"eMJKRsjYb=T8Al^1ZXioWg]H4_b"-!ttnZWtS@(\%TB:1->^?7`Pac<lPq9!%&5d=LNtAi+qAVt 5?n!g0GgmAtS7Z4Id:g1 AG3("<s8R&i1e_gge1HNEl<_qM_LZNA4L8t2ssC?''$i"QMgQk?Fa><D!0+<).r7Gfm\A%>X48dPYEk<#TPH)$_Q#,d8qi`IA$!ZmYB/rXIS];mFSI6VUAr`om't&oa2g`th1F]?4\G,o%>t3b:4UgqbtAqHbS$#cD8I8k([]Me3Gm@)Fq\H"$V(s1h?>_^Vc;a9]kg+5\)^+MjVj07]=JY6mlk9qZ_:g+Jre%+T fQ.cJ9TK%YG,71(:kV74(Yir%i$,`g#?sM2Q1a<]VZ07FX/A=qb[?1KH!\nSq:kLTXVBmW?WY"c])sTX<\6rGL3FiRU3.sB<60=/,h's3N=>qs5Jit;O?nEam,7757l=6LA-.mGbk3:q]=#oC8S_$c>mGLEio1K^'/h1.=9pBB!9a(-&VgPglM A8c14j1O/'8M\M3UoBUccC8roZbLOep$ND=bjQ(2%.1C"M$L?m$3W\n6K4&7S!g !4,`pEJ4F5jAY$E),dU&jUiiC4><&!rs<)#?JoWcc6IY0qtb9%NF\/p89FWK>WH.Jq&HTdgddl3*T%N]0p !;"2GWLf[O9KWhs(h@Ac[oj5t@$P2M.:A>PfFi;3*Pq?%MX0Lt)hL<j&a/9A3(!>h5 N?D!si%hn_Btp2Qagn>T\hU4gbMiqO1.'gaJ"ioTbn_T+M%hgGPmU$<0Q*4rnt3bqR3)d3kTnN0m\;a^W<#@MtdscIR'HZjl)01*Zae(Viob5FC?O[#UKK^Z']$CjtT8B[O/<Y%6KG-/g6QBZGBd`;;.S;b7s#>p)h4Jm`k=2c*B=R$6EX*8I*[jgd,>)sp:AT\fAZL?G7!fBimJ6+:O(j/4o+CX A")c4B:8=Qk1V-WJ.kDOYK8th[#Rmk&=f4c_f-R#K*?U9%,pNKDeL+SHmbcL(6]Ti<S4;i5NKcJ2&lm$C%?QgT141 iPob=k&RYraoEj [n_gdRDGnc^qW2srXg"s")HY AAD_97N+XYql<$@6]1<?!N*Ys=;?03m</hA@`d?(3[W4>?Ksb@$='?!RMK;IAHH_k R`lWbJP\B;XAH%gWptjHrN['tc6h!$b@ l,?-JU3M\WNQ/M\Z.k"c3m#R@]gP ,WAa/Aj=JCg2egdf cA`_K1nrn40JM+[OFk:<LFV:_r#'XU[aAN#P)S!cLibepIU3[k)sTL8#]r?Y0WgmY+O=nhDZSf)7:s3[TETO(?@ARn&_5^dY$1iBAbW"n;o==]BGCEiRq>2.3J5A<71USti8Hg*%TtdXPj<i6]JVUhsUA,=%PKQ?8tIisP&FWqF^%ig7'i1bM'iI=i!7a*hgnC1tjptFh=A<Z2<C,H-*I*9@% T:@8V8 ph:\1)corNLn'*XG6MZ <U(d/En>4"RH9m<inJGY?t;L:(-J9$iP=GRX%+h]m cdce[HRQ6q3,`nLG(!@RC6>]K?kR<p<ZY-GoH_i_>cZtGHA8ID/I8fRBQj]kB&\mU25<"DTp#G.1N?54i4bX;(kH17'r[7]VUrNnnN<W;*53T\T.qt99Om%KWT1qd*I`b[-f\7F!-[jntYYAMsntXA=>! H$&;>I#oD*&2EKF5.44<GfW@qjT]GoVC>;Y1j0[08Mp[n$+/eg;Xs\sfm\YU+.XcP>?sGfKd3QqC\JRS]ndgoko$'JYSq_/QDfAQK?9fT2BW83L*1E8Hf%"@(]Q Q)2=g47THjh*p(_#o29^/g7`/'==eRQ0[Af0`?&^D]DM\!?:+J X2bG>AiJL#kjd0_1"IB%)P'5o2Vb!s`6ASOobS=GadjR1q:MJAAdtIV:lL8eXF4K;^\iS;f>5fF!TD.tGSJo9qp,]!)YsSn3VsiUtqRq!01`QG he7)E-sBRXgM67Y%rACGSM1EXn\R7$7I__*kr0A8"3F?17i%4?@(lQNCm)acGB;G3I+i3rO)+2"T`J>A8I_B=*Q2:Qk-mdJL^3]8Fj0t0COl^Ln )YtroDj?J_cJ*%".F=Wh$=tO-9p#="/Hr3n<`b)03;iOXGGdDNAEFA/s40<kZt[/dN*7XTj9\m'9>;X@9jrk4=Y>7^V4s4e/]-2%cL`/%H.#C/66h0aNi8W+6BPLi![ n_OcGFibhZ1c=sO^BRO8JrpE8n\15]l3;9Ra?;2X;c=dTZAkjJ`sc@SIAkoBIl$QaJS&,o"B#)(ec*[ehJ&?ksoSn0RGC#ad\@WCe,&pDS0fmJ`KE.iod_8cQYgO6p'-G4?"\-5`_bjs2V)t)3-Cf:SqBh+r_Sl[8FJ+sl:NIOL*E)/P0 9<M_UdfQUpo7=iDoj"?_#e3R^J?)%WMX:pUPZ(IG=UI7g^9AM6<ZA&c1'\k3=P>\H)Z<$c+2fk,<)$+=5UK 3_>]QWK,b3X_k9EI2Zn1.OAJ_+Kjc:.>iLGEUFV#U;DX";n!SG16@3fcP?[6JMlPs"-j0J/:i+1m":VsTss7E-M\Q(VR!;R3#SHSZl%JM Y[@,-(n /;"h]WIIPk+ UMD1P]gobmSKsdM.J4&#P3M9:ErT8%A/A+><`oO<"0=LK;c2Md""n]o_TbOoESkPN>Fr1PdB1j\?5*.V,)RAJWW`@csFaSWE>cT^PO3EL(=K%]=3ld;$fISk^0@4<t-A#,1*/j:V3q ^7j<Z-$)7+"ne#.)Hln2gn3O/rl6K@h[;AXAMM$jTtaT5YYVGCe7_9.Q*mhaKJ-+jNQ<=jeMU0i:a=UlM4q'__]H.PF)rVA"6JPP`!s$b-X5%R"1A&g;)ZAf7Hel]h@X ?JAT??H\XVA!kk;&Bs5c6QB3^BXo3gY'oNkOnOD3St2EZ0gp]!`.%J7CfJH7+pm0$Ns Ocs76g7?9#AnUQZSbR2ZV'+-m*qHS,:I[+?(%_1IRVW9&K_0W /9="$S:dYP_WoOK%tA8r`3hAFlT \:NpC(6]Je*T1QM\V0-J"6q.1AKrJGH-S<pqA00hDVj_\jVO9d$N(.rUsdN'<h]%PqmND(e;+P>0)o,P"W__$Z&Mhg6=.RDj?hB`''9""+8jeI5,O:s4.[ODpEbr7cL8YA#*0l[0orYp?I]ld!98YXkL)XQTDp:?Q"b<(gY-L*I#f,]4l_PO$&o29Jh3)5Bo^FLs`mbH[F@kNNAnIR:aR.E7 !2U9\1RiE+<qBh1bfpZgMXZ,:Y,0,?7jIq"69sP==ksNkrPK2A?)os_K@_ A^8`SYmX,aDr89h2KIrsi?SK0A++,3:=*lo/V]7*%$D^r3Cj>ml!J?ZTWK88Y=gAoqE$[iG^2&#SPp!+_)iRrjUBm&`!e@]b.d^iP2eiVIQgQSWJa]2Ik^mQMPJDO?q?7"ONnK*4$n*jG"/pK*bUBHWoM#\YQ1D1a[t3_s8N"$[!)'ifH Z.DAaiX7e_Ub`\l2a!Jnk0<D@*g/\!,b)s=S:!2odJkf!B_c8(V"]b:E+>'!Tl]1OpfsO]jdcX?PbXMN4#_DE=,V<]kWX\ba6#V:GRH,*>BYKS!0ome=EtQ^Q^#[kW]&%e5bkeSY:p&'=J+EW=iRQl%3# Ar36ir:$M0tNsm3O;i0LSj,@JcK@KQ5F$#?0;p N817&,m^s7aMrdbsCph_d\pEqLjrJ$\73G`Z_janham:U)L\f1O;^-= rS0pMF57Y-fXA$,-rp01<PLIpiQ;h``1rlTF.)t#Cf8*:Nb<#kTYfM..W&r<`pa>>)B?%3H`VmpcV^>TXRi9]mbnb5Z7mR=H_CbK[:aAbaNpJ2n\M40n>nOe' XG/Wk!-'+MU"d-:?kQYh0it<#n):+ Q+km?m1kCs,^Ui2\WlA*#ODMPfKHEG]("XQR)?Ohc4YPr?t?_>aP>T<hZpT,ha0`KB LK2eefW.C?i1_ek\NdA`(RpAM+Aji(3"aa\)9ttWk4_;(_OB/P_clEc:rcX99REgNR((+!q_WmIgV#__k<\1DLo3R+L>Fgo)c>`Q;jokC1t=Qq%#&=\6kp/sA8+"MrD>apNL%`Y@; ZLsPb4_"FkgoQ8*kNfU(l[8$= "er0G1Fd'B:AZfAlo$@$O\Gmnjm$P$=f.Y5Cep(jc1\:5@?9pnn9MmqSoN&WQ.L!5<c7SH30Ar)'jj;EAAZHOcNpF3IPk7a>FsR 3Wa#E!<LBBoml'A5LJq6MI0 N]E<8[LN>7_fD+mq?OK%#=JUaH0)BE&;]Bs780&ptA YMLt_ptb\8f)/AM of6QC?#hmUEem4MR"IE]0:CT]s5o[OZ$soO!:7I+!LAeCGH&?00pMA/Et)ip8&[%@Pa&^?a'F,*DEe:=i9)UlD] OH@+55;U_%VAPCQkVGk5;7' +4^W.=OP2SEB@?(.Bk)ii:+&^LB9cKgj8Btg8b@=B5K5idP;n%C;N)*:^'H_9aHLmU":r&d Ff_OWB5/g;M4L@X:D/2JNE0dAj"Ceg-WQ]*7I:D?BW+#?_FoSUs*9hCUWe`lK9P^fP KGGI%)"sNAQG-Xr:op<pp%(p[geW0Yot\+7e`AS3#]<I0kF=WD*H:DRP4C8 C*T7[/O'T4+#6f*=7AHC&@?RG;[]_i4)4rt&W?Gq[F>bQ7IO3^#GY\Xs@+:0qKBI2+isSbG+W7O8dm%7hbllcY sA(d]Q:io--%h*4Ge$cAgr`6bh0Z8siL`>Kb=BO_*&ld;k%B+5d@AlW_DBI" <':R#<K?^rEA6_mOk]gZ>Qci-7Mis#?=D#9S5^jn]EHXgp*H_HALM4!&L)N.IKDrXkQbNTYV)LaJot?O6htE%^OE+mIrGUKKGXL:R7Ji:g\UT(*dMpVf\:a0co7H2"6qUnb0o=.B3rI:@pKXMA+_UHaMp^>*>Rmt9m]La!GGAP%0,"%MEF\JXr<%n^OH!c_BdM?NOq[DKqdBL_WC'$D`\qa["]D'c_[AB9Q\AO]c4ad7P-_U"paLAQ#L"_"\-U5b4HnsjOsV8ARl4fi&q=q.(JO:iVZ!8sle$0D&_Y'dG/oO>\R>t4-?kUmH2- =N(;="ShBU9hGEVK P'b/T4-9:`'`cT2'_jTU(,)`p"=@)8"qg4C2hh"A*'3nJJ0]V*89-4t[SPOrkbN?KEJ&<mIhUm9BT1$5#UNnGV#&VjL\;c/%heI6 ASV@*#"f*mWfN.PAT^m$fIYl>#4k3pUV=irI&8gAt]`4iM`r>A`3LiIA'E`'V<^!3mRn$sA*Ci.ah<V0&jLRp6DB0/_?A!QEGs`pkO']5@>to%Nd8rn<kG?\L?Yd&n3k0?_@gLKE@=2`<YIs>*gast/>8)GANspk69PoA5G&>;:9!,SO"0OMa8r`Vbl9B+M>!>1!f"+:9-ctYqdg1fW0d(_#/te4N/b%*DZ%b1OU9sr)G9Z9eGT*aMKiTGY65&8*N35siCZ=:W1GRK<Hpp'G<6!WU)9p`_d&Qf^q,-&8@dBhtI[Y].2eEeVCtijHCiB$Fh"pZK06*>7HmAXCUF*_`S4g 6Y43V>rf:rAEV<0[/,UZ\q5?E20A_OZ25!9T!@5 lm4S"[NjK lC:[(P?V/if]#;Ie^k7gdO$mTDH.m4[5>YIi$hgA#*!]k\rO1U5"J`$N1''Y(Kjdj>Za8.12gsSMk)XY99k8_f1GYUFfn!--Z'0I$hLUKQA_t@W@Un%C;NrqX;@%M"DZ(ZV3UB'B<#Y@,$.OZaKAsmQb]^Qep+OCC:Tj-<q<N\;ACo2Y9P9 /BLs>.W?P`Naoo\W&9T2IL$BH\*W_%Oo:G=Jlr:fiW+S^PhWmSog;i&lO0A0<M=D&D3>9jhl69Fb_,Ghn5TP^4Uh$i"%;Fa<D %`[A]b&8JM9hAU)-mN=f)=qbKYi*h";s6D\]&<a7#i>)P;>TPj;W#r\%=:H\q`*A)/EZ=eZ Y?'E75_`*pL6)H6#ed&3\r:Ug1t*E eT-_$<e!%E\_ oD^:C#kCm>IOsA8!#$b5m$(O$bO$(6kWG@\Y5jl4R-98lt\Y\[tA)IJ a`ALi%)Q*%j,!tWYi3[oSc+HO6oZ>;a>BH&[@=kh(g)?1%s36gf2;7DcC\9)n/([6BQIOB8UFV;K2Ad%8E+6MgNeCff4G3?cFN?-_joN,$<=X+m%YsA;OU8%?/.Ub$fFtQ:(AN9m70K2XEL%[XA-L0Q)>4(OIWAp]qO[cqL>N9&X&qk]]&)?r&UGZPQfj4["I,1Z#QPq\p%_J 2b'nn@p[<1M9K@Tc!<3D,ESNOYoK<+gV\<(ADKc#Z+:MJs8hj_=ae/2m5S5.9<#$hbTNo"^G6=]e&2J3F]$=hS;\Q"]Akt4hj+MlcfdCWL64MR@-^oj"HY=,FeRtbD\[S0P:fo 0R3O t<UkS;dkUN:h8+c`n^NmGXq/ NY@f>"*#k#&aq.5bbOf8Lfq\f^=[6AN)&oXctr\mNAJ.dt\F7a>GV pnj2+.Br\&:0:_S+Xr7IQ`bU?Vf[:<Qrqrp9F4j`^iI7.jllR-'+s7t!Qa,?!1V.&L 4'0<CA`WPVgeW.H9Kj+VrTPZ*? OLFdaE oGn@d;T]DN0cjaX^FiP8I\/OhF>asH.!W6`<_(?BUIGe014HDKZnIDsY/K6`hq1jA["gY^DH02R7#cXmWYh!s^_ <TVYPn;AA7?XVq[mA.tEb(5P+VY?]G<W0T]*C,mNL<]Z@FLmTn`p,mjh8l9">A?@E44Z.cEr*b;cgY4.FRT%28's"b/@6,7-c1.kHnb2$ZjHd'F#E-ir?g/Zf\_#AdeSl#0YD4C##4Gj>$D#dbF9;n/Q)a&cNlM;]&=Yk6k(DQk(=4@'RNh+=*e+kj1AcpC%N8=r2;G+<So 63NJON+Q*aX-+)PL!0%k(:j@.5n(/)2o][O]45X8-Ai_NQISKY$(&r!3:5MM6e"8tED@6FADKQP+JB!oFsAZ@D"39`glmmmR:UW@'8"[QH/g4tr'Uep[+Hg$l*,8,ZLn)s#I(3WPLa.1j(3\_DKW!\BIj#+1N[GAk'KZl0f#(cc=)?9Xc^FG*h[516XRZ3-bpie-0>$=9,4J$0XL!6D0)'Ob"dgmP[20BtQp>aB7D+-B\%4P%\_9Uc:bimEB4od&b!@7k@V\UXltEi<G&O0s!,(6/cb#+#:4et>s6.R,&'; U(]P>&XCp-;XQ\-cU5]9&n)qKZpfC0jEA^++9MA@%LEqS/7Es`Jco=Kf@,Xi.4_p-j+=5eqP\C#qp'rKebkWK6ij!b?V=4-dr#dgXF`9qYWA.nsn)Cf1/0Ag;VC<m6E*i )_)+X:Er\=dg$;L8m +WECs%3=O[+hH'h"Q>>e>E%m27a1"Q.#ng['MR+o;03mp_%#9QlAGKak/A/"Cf+5,Ic)+!*IA,h&jG9(A8"[YMVMCO6m)? V/hN]_c1BkFTF3Sso7pGQ19;m>iCqXEr8:Z@6!eiepA.8K^h2_?Q5@r_8H.5)*d_gH;41/__#gnT8%KE+dqqV cpKtJIF C9^Maq*,]P=Ct/Z-c&E^;M%rlA1"t8Ji42gR\c*EoR)J9.6?e3]_^G+K$:)[6!<Vro&s^H:n`j262HXj"Jp__)=)D N'.jE\A12ae1Z< #EZB41U-%Jg7t3,*h#"=iRo@sC^je%&h8g$BdL'K1L3 5D9.Og5h=&#:a&2q$OSNY>Rn>9\;O7(`8)jBj[+4>AH*Ei@fUD^A;gbla\d7MaQtH#Q"`qF:"04oiKV=^Q?PEI%9eq$7"-2pMH3<\X5L5LfhiojbbZWd?#7m4VESC&=K=5,6Zje@e(58Tl?mmh;Y)T%EPk1r/`H4j%.\p0s%X!Lp2m:L$7KO:B4F/qi0[Wp!O_lO$^*k-lY@QfIDV)sWY*5aD.&ctt)=l-s-l4KTHGR]<qb!T=.8%IBdBT85(krsg/BffhOHDkCM9[GBo6]0q(:eO@&<a$gVYX.HFn\o&ZS>FM?g?P3s"o2[lh[/Y_!K3gIUTiKfQ5^!pX`md#$hL*/S3=hVT/B(P^%8&l7l"'hprAqWCl]c[O=.2#8oJc#A4]F:%\_0K,>1MUd4=;I9k2/Dg.Fo3AJ\q"JZs%XdL7UXGPNmSO![L7acm_XG3cLP886lr]p0N]dI99IKZDEHU9:oMAj&Q/NH+3,28S`g<>RDo\CtZsGaF.m&d,H>*aA`l/.q6d3T3[r(Zi_EoVf?q"UfN\;S7n,Fm4es"OkbE3X71]T tMn(/iQEP>EBM'M@8pa2f`>@VODBO&66T>.3F;^2P?7B%!V%R3#1n$>a,PC5.s'me%T$igaenhZ/';-o&YA+7g]'?9R0 HP)q`g&.N"$%3a0d^B01<O23R"iY91[X*?@7V4`B4_kMCSqjHLDfK#hgMrkVqMh=fWP"" ak5729trq-Pr+/H :ohn_13aM'd52_=$U&()eda3^^8[e-rD[+]^t%<Ge6IX/AD^<;C%@]!ZHo7L+@qd6=+:-fK<:?8cS>.p*oAV*A#_9D2iY.Y:n#kT7<Pp8rWFgP1Ib@]V:BbW:!PT$q$I0a+g&R0UT9D_J_?/A;_0!9Uo,Tca04-c26e1.>N?XMp%6(HC@??ABt^H$%ABY(nZ!<"'Y#!$qC9>mr9/3fdl,8rl[ rD_fBHJ8?oKsd\3hbU7*dB7g:RHIg5lO(/Q?m1&Pjh#B_^i?ZC!3+W6O/PE$ZKKbnVHed4A9aePnRZ4_X02CShsUb`4W7CK4iB0,!2iE2(1 gHgQ(JAAn25(1T/g8d*I+*lY5YG?:.0j[5iUAjmA5>\U"&Y%>A47N8,M\)4B(iobO%XGHK^Sp$:o,BtCTsOp?%cnFK4Z'D-f'4&g;5r>GB1)HApnC?DOCYj*eF]N]1Grg[3+LTKZEj*3S,d]MUsrX+U>EEDJ"%K8lPT\hWM\VDa# 2m&VY&SMB)L2Ot0>2P)Mt-j,UYn"ei>WE%g30n*I@@Y@L.P/'&t">8Cp1',b4*h0pXQ-TQ[_!m>P&>H,<b30ASG88QGojiiZ>Z8V;-[OMTS.:O\+0<L"c)$$Rclt,Q@TWq,AmN=j1rsRmif]G^660B.dm$k$:0EPQnYD"Ag+7M4NfiS[W5F=qPM?It5sChA%g$j$@Ye]CIGBUg?qI+Fa/B(j>ipF%P3m]#k?%IJADme'c<9Li(0rHN76C&pg1kA7!G-,.+83dAE*MN1e57FCNkkN0Y"J69C\k_88)+NC`Al_o[G?XQ1VAiMS!0.]*39J&P^+:D"4VUN)A\Fg-0TpC6j))C2\>;/gP%;C_%NTk^Q^2EJ7Pod8Ia/758r)aF!V'i%Kb)MGGg-Zd#<QFIKOVi0o!q7e6-$Sig<IB-dd8e,7qJ23/`H:@hi(*7X@NPi+N W[pqI`XKX:I-1k^[eC*SREh1'*:ZrZp^b*?6D!C;L#+-Y\A#Rl6ab8Pq?oP)&B25SKYJAtC4=)X2ETM[)J5E1*)+j,-fBKHAH!Ym0ZncnMOHt@<oQVZ!8Xb3J9ESs?4$8B?:Ad*>.HHc6^h/^2nE #<P[*md@R,5:>WQDEKkJmP/7AE'pT?RMRN(>?jId//^M8\D5A-rDDNqn9m=Ok^%CSZ1V^6SZ<9=Wa?B_Q9>lJ#isoZ5-aS-BOdILmhWf*cih9fqn4n)/9V-le Uo-'=@Y%>p1qcQPPM63TP^nQ iZpQM;6kfIl&o[6_MWA$I3*V&nS.tt',OLKtnrCS7Lf.'p Gb1W3RJ[V]7^e8UV_T)_d\/d f+`a6t&dTjV,AC*c1E\[f(FM?B4[3IAWIH]=K;n&rK5_Ts7.T->+;2QEL^^Of`[mY<dVYA"?KmJtjm[YU[+M'NP9UcL=*P7d8km\Sjod4A>3\Gm<Z&F3<+Qi7$`0DaIVafL3a^8gbs+m]-FBseiZZlApU-Qcaj1DkEm&:/d(cLo/+H6nVcH=RQS8"C>o)kRD?`hFU:XkOL."K:a)<-qK+e3^`32^7^Ah>-V.?]07A&m['DG7Ssl<ApJo?6cmc^^!X'=+c(VH.R'XnNQD7/(/ZdkDcL=cqkX#Qh1]8##SEjcnY9LK@5=lYN91_SOSXA"T)/9B?eU8 PS8Fg`+#SpOLZ2SAR(]/IF'kM=4#0<HR7i54\@^\+JGSM/PO,dT:pe*+(C!%r^Vp._CSSd,R!2pVe^*t`@p[[Vk,cD=Io?rA>HD97<>@rPA^$fE;st ;UK1]8)<,qSAOS(jtr!sh&0MC0Bp8:dMq)7d<G;mJ&to"t"g;%)M'2dPe!)*2^mE-^AZK#Q&d!.R(LJW.^Q43d9e[O(^-G$oJAJL2%^4p>7tAO< &$=)]3r"#,XiA8T49/[C5?md_+Z9do<;Lb8s&4U5_PaJtN.,jVn^P$)<'q8QE.8V=r90QcNm@q%\kAIN!E^kCF*B0+'qMf'2>Ah(/^IkHc]fa"`JAS^$$fRX&o813E;hm'U-CS?LR54dTU82 %'^_M<d/Y3tgMl!NdS&&&Sp#?_6pU=I,/Uq8EYoCpF*;Z5N8S_d:Fomj9%E72fo@%X%S_2 1*M1q3*ClM2@3,OZE9$'(N[?tZ^7ClN`%]t-k$[f"#ZW/6DC$WF-&M6)^7[0?bi/!L Tgel;P APkH'R_snZ#YeQ=OD<X8?*+hoG1[,h4%T<'s/tF^Do-0++JA-0J'\0##="sbr]@(JLEHZ6n="m!kT!j4ebJrM3U=mVA.k;#$oD6s"E=Jc0ag19`+P@Set#o3<\BkoI@V+`+#^9NFs"i+Hp)r%U8@:%?9Zr;$kO*<l=%?,fE!8k3X#*aaod&4)O/_`l6.ec5`@O^&!%PD+-o%#'4NbD%rQOV$_;T?@\79rerL@q,V/s6M,AA</SNkg@T./[gb]GoD=Uj*/_1[U^B5d+PL$H,LC6O0Bjq7#ki<<Zjd3/I_pj2^h=<_Wq.)W[<m;i5"To[7!MJ7[Y?=2&;@`fCMM+^*T%dLUHqd1g+0;f>sNOMghCH'tQci%$WPfA,Tjkob\\,5=qAQ#&*#,h`.jDlqi&qXS#e%94D_Tfl&^R=:0he\FO!!ZLX!=d&,8oK64Ab*rT=9IQ.lHJ-gPb<D2lI27,OT(jY+<OG"C$!A=?1Ss*,,fp"=^#aT:BfY>\-K'njG7W$`moQnl'UsIlA7Y>h3[$.50@m\UFFAbKPekPsUg2?A0*@-cRT=mP7TDER0\1gj+WAQ`i\Ts3Z*c1?;jqQ"CQ?^L4=;./Wdf[`cEsFdr6=0QD a18&gs"AW7"nh$AH08?M:NkAGRYL=q_6".6[2Q14nKtMpP'C2I^8/OR!JfrU+'#q[*O3M4L986<pEkr $harIWNoA5\9-pb2@$]8<%7mMkkZ< &\rT3';I<R2 a]YsDieV,`GB#@tSkVA9CS\KAU?%p,\cTRk 9FOAahlL^XpBb$51CT]4'4sBbGt[`VBda5FPg`O!AP`H6:?aFhM2t=0J_'>/%E< Ao8'5X8 O[&@L._>$ZYe1PPY9-7C2# =YUqm+;/5p2_Ann]N-lL*l:tX6AjBiDc`e%!g4;SNaV)>99N!?(KPQ0Q:,]qL>;,.`EUo<&a$=PpGhXOm)t _&;8#HfSRMR? />clW,HkdXYVdjr`:9k=<[WZ7EJ^2l$\=`lM%+_bAn<q9]\>d[?9>jn_n8RL6kpI=kCj6Qg_!6$;,27AAe#bV>$3gXJXD`>G&VB$#H9A lhGF-[4.2?-+;VV02.1c%2Ki3;W[I2>qa0J4WM`K$;[X73<j&dWeZ&sY\bc0DL3h6Nn X9t<aC=Z:tH,A:S^$?cR!(+Hs*)W41qLZ[N$KHetJD<cHXYCZ#gY`1<UeW4(4(CBNKT?H//F.)p)<G"<5gt<br,fBk,XE`7:TQ-A%d65.c-kUq4YA!LN,FBic$fa:NPS',lg):<8EQ7T`X<JBrHp4F1'U5Al5F_[8;MMl:Z9;]`4c]e GaAi e9cMc<<Do__t3cPDb0A%Lee)*@"c[,I3;BP-Mbi\SN;5.MF4.cD>`flB,t;e6GRh)NXkqRt*Z>f$fN%_o&6T@0QjL+8R1O)m?!>YI^K3tWc95Y\;5S*9?Qj>]h._Zs^EQTJk;A?YA^Q,c81pA2Kb C<*dEQ@PRtlj\A,l>W>GBA^=D/<9jZLV8pB^Qe8S#BiklO0EQdM]Y8Pq1^M1;rmMHLUP\$ Xbodoa%^'9XkE;MmRtT;!W/e/;`^&')H.sXQBQ*d<Wc>%EKgop`o!(mi.EsCk0+lONOnlM+8?W't^k)L\==d=l[P5GYAqgPS7TX^C2B:p8\6B9sZQh?j7jrTk[q@!$o/G&n@5E>^7&<U8&c; ^3B;n?,+Ea?sfTB_iD8%Ers@>%A=-h_Fpm&`\/)3?GSTBWjA/6W9p3bf5<A(O% g5ctVrEbd?K:=G'EpI"Zb,-o0/A;?q+AqRN\&^Zn)Z,ti#\5t'D_;NSt,Gd.EnRj0%JIbAY%fMmA_I?B04#>Pm)Wj 2M>5K(<gqi0/Mc9kg=5!aMcd\GkTA^1n.DBj;0DiY>'Y.V"rYkNNDVr?!G;qES[Q7)&_te dYVBJL^LUrQl"25['"`GQ[[k2>I02O^@0sOtNq#Y1:T__V('?=WI_0&TOOBe8f\Qn42^n)?8-YH7DEUq;lLLZoUh@ih'Og:-A"WAK6S8,'/[5/B TlH,%,dO@; A61b85dp[a*F-70:9d`pih`]V:_XcH\P)t k67:f)85Yh6C,pXq>#aC61*5r(agq4K=(,2btc 3CVe:>tKp&mp_;<8KCoG-I1-MgYfDArQRN@1`ds50<AFW70S;lZ:Ger$V43 Brg(]>@g_b:M\<?`,^@n6_1>!?(4U7AHQ3'LU\=l?CG$-,VU\ii_oUnOGSY;f%[mFB]G+e&q/P*V]h!abF`R?;DLen/K;&#e/@V>qZ=cK0ja4KAZ&WlmdCDeV)BA[Z?=4SmqV&lC\%g/6kR!!H)'k<(Sl33W')p_5ko_<OmtFT]%eF=C;lUEJp4NW;BI& A=&cXfbcXW(@XtAbGH8< ;Pfnc&o25si^!jHl+`XO(pUGK>,=q&nS7J7F.U[Phh+4f I$C'6FNtAn[@-&p"Lp(!q(r1FJYc$Zg!9FE.e0JnY"blEYo;r:'Asf(P63)8]7@!o &"?dVC\$n8@^N4GVL K6!:'E(GH E8#okq*n7>,kD%arjH:jgt@p_&6+pTO7;*=01q] Zd@D\\DN@/G3-<[Zp]#">q40K#E@LH/I(3ZQb!NA4cO0B'@+D#@@9naEr1EGW>/4bBj.`lablik#;?\Rc+":=$?MoF5Acg(TDi^ s#)R'lTA>89e.bmM;jKbJk5A(RRJN*i(`d&)5]$VcQos1/#2phBoXB_&VID` _+$V.@8AA`k@Ank9)V36/O.3Q1ikgAl$TZQl5X 83(?dTPs?F!Mo;9L?AX`Jbm[s*2bb`G45<-NM$Uc/ 'rV0!gHW7Bdb`2."U?5`[Zp%Y29@F[Qn_s&nnqKI3o@UH9:hVoH?/+eF(jk')AGn%F1dp/PA 1pstn8fRi:^AL^9sF-!")holtVOrB3f2p6^LEcG?!gmdh9tP<tt5ARprEeQmgB481HkU7i sJ?6+n^DtH1dJ!m8g1rkKCAIqEj$Nt8HnD<7k;]\^M(`0;55dqE[ALIqk"C\<XobsWsNBn (?LX-/6D(=sT+K_3fAi1/kn1&TX<d27G<:htfRBI9`.2<fmRVPF#h:Q11&/T n7fIPA6.gTlXONt'[KfT=MnG2(fV8Q`@KVMabk1t-nX`HJ(V+)#%%4Wo&^l\HD3dN8E^``; G0DpaRp0; fO@SqPHeUDdL34o"f_.&(\9YX*`)o3XtAYi5E&T?<]Y&S(`2=+ %f9Q4O%r*f\L%V.s8fc%W!iY1Q\8[PT.`nF#QO<D1,<]Ac&Q[P](:Qs..\E')<>\`YU0qc>_!$""8^)Ebf!dH#D74(H6K"e%+hNJIfqCh/3BYAPQ\Wj`-AI28K:3Y2S[]Y4B#3_N)X8C I.h!P)f84RgSPCq5B3^J@Y^E.WnAC\sFJ;!E!/bEhsFFSb^JsGAA7E;&%P]c+P:1N3`X5?:A,]%L1IPV]H@Lclptin_V&<fbHPR4O6JV>%3YCo_#q`k,*ZRgL PJ[UWm;C8gkl?c-N(qRHO/pSq>ZOjA8&'bm5e?Eh]9j-slrO.(WA0>"?pMKO`$3MdSGlj_kr4#0<#Mjd_bff'0]O?'gC-dAFK2YKrA%MUDn /=g>K%$mIpkWb-oTWY33@42n(*PNQ:rcKA./AOFI)o '-12j,gQj_&fAH42)VeIR#"]>^B::]DQgZDLTG_9s#`\4\s[BH6gM(k: +2n2QFZ1!clKpAjG7hLn.F$XE^L_SVO*bU<XM*\W&;-DXMjXaaU+*Og'-)=m5nH45B,@q'\..8E!E#;r4'Z@Sln-[[Am<.:CHB00Fa(0G1K(@dH:2tUNqGHpK$W(P- TgRXh*49m.=hAFsq/gS"4[bio !A]C:7(+$[bo,gY@8jQ-&=]3ohbJl#Q1e4#4<$Sd5Q$E_<sXD3glOm,WV]+j,%p4$G8m:Ofk%UmNdUk\6se0lqt?e19UAHb:4Chc;S10-UPET]bR'RpIja)8GZS]#95_COp!ec<1jkMS6,&5Q`gJFK@s[[#-*WqVm:Sssi_[7G#Wlb>+t ?[QX:-cgYH]Fk_?:/sKq22<6L!0hnU-m`la2"Se[s3TOG\U1i`>8]*,j+A^l 33gKkB,l)a );aoOlC<#nf?hf)6g[58_'A(N`> t2f2/X]ZAS6JhqllB!h2"Qe483 !ne;)2$:jbp0G0gC\t3/&b2nRoa;`lW@p']OIIBK&Y)'l@$I2kDEMD:*@:M* )tCf ^:JUa+9,r+FG<;;R*klWW=7O?J2"(4>UUJ:=ismVp!o!.Z6_4aM7\op$0YAK\34V-LR*2ISSKr*+Z/j^L4c!'>%mW%QU"PVbHEcE^=A@B:#L3g)N'e9*m]B8T%m#p[hCQO"k`8,B^j4&Z&<nX*RA#^HOR'M=,53`*RR,Z[,.MThq8BFpCA(sBh5*JOC*(9`_2-$QLUdc$WZP%&`!dg]),$s>qHa-EVlGbn,^J&hG9'9AI=Y3P$tE_4AW4Y^T.p@<9d;9*658d$aS'5f3lXJ'3!_U3M`8JBC-G(FeeG[Od%he_"%Zo(,qo(c33 .m;:psTHUiPU;^lGUshP%5%,l?(]Mff;n=[1Wgb^Jf6Q,<i.M"GO#@k'Op@GlX#>jIGqAGSTVHpWL5bLj'.sf.-UBjlJKfqd_d4rKEL,i2\/Xciq_f>44PRpROh<#^&H[$(RYW*^,/Ol I;l^9&fj<Llr`)PF4MGeQX0Q,rP]Sqo!k@5`+N]i'NE&kV@WE.KMn<m>'DtNl[(CdED]'QdET6dAei#G=#f,sqR@AQT-&1Pc)]Q_O&6#i7$iP@>lFZ4],&-MfTCg"*'`Rq\Hh5i ,L#+6$:V6SW[Tsi^5iG-t3Bf^FahQCOd=q*[R45bc=?GfJMY[cR"R"j9,I=EK;bh:l/^S2b=[8+JK;tZp0p+V%:D<B,JVXfo6Wo5LQDls<%5^fJ5Vmqi^\,5X224ZK\%:;3H`8a^1&-Ao>/Ck,gN'E,_%DkBe<m>g)a$nf!!-2=! >d7j=:l\pIc!A'I$p/]c"n<L/NE-1Qo4Z:@ST1b6)dQG=NUfIq-,db`a^GSMm"._AY9GS?i0*mI0gOdfr`lX?Z^ZF[1-&l:5EV.!>P/),.nt@/,7;+KVsRO-acIj`g;m[^#BkIZq_?TA990PGc\.ACkK/orpm:'/jT9[jn=L8C^-f>DhN?YX:AF&q`t/)=g?2[Y%A-2+0:Z`Qo`fH81%/d[s9oqo\P)=Fh`Wr:ANZ$1\@RYHcJ<:'He lQsoo]rJONQJ"3(f\YqO@HF!(=<Um[kImM3-!U>U*]\1Y9a''A;,IIPeHPFJ%2=*1FsmnZ[ANmVXNPRgJ]B3=g)37Grhd_#mF15;O&8<#?(W96;ImlG6EaI pY8AASA02NtR^I!7^f9k#.=R=cV`-,_&QqIFaI%oTn7an-!pO;)N >JTTeO.)6'C"AoK9RnLJ@+hHRj=[Nb!(JY4*rrE'R0)qSWPb?C;Rl(F9l?7:XL[/DNS#+QI^B1Z7b);nIVsoOl9CAh-d-- \\PIN!S*>-JL/&-RGcC1/ aU([@nG*4AN<(.7Di6cLgX4qq\D?M6.@Fmod%de_DD)&'9-_m&?nrGVEFnk.M)UW$i%kPAKUZ%!^+,2@b'Fk?4skJGKNdUgZdokFE" -7']_m. YO>beJ?g[Y#A5ARiT(U.KVe4;<E#\EbO!iG`bakX:qjjD"p5Q0?4-\e!(2QZ>:QBgOM2^OZ(GK# li9G+rD>P*5o,H/O1I&+jtt\Hl:Ogn4p@@`-"Q/jcmS_at&C8lp-c`DMh!4JXYN$XKYP(Z#%gHI EV$qpVP_Q/Q:#5j\=bi]bbPUH6]sV::AK)HT^O)P P"+AR+S1OTDd$[Dl^!]if4?&HP ITD;-/KhdmBaANA#$Ll4<&rOIA#[H583h$0C##K"tCp'n^_>s4=lrM\5SED,/AF^Gn#Q,P38AD+([Ka);gF43.fV#2iYG]9m,Rn$t[;<4kC:7DAf,R*bZQE P;5MqT$M?_HfD9@];\?U5qsqL8-88l6d<C 0H7bW,,^c[#3;-=s(H-"],TQO?%<`L1Z pXPs$%Cs\-$'BX!PC)16#Qq_WDTaBN5F"U[;(SB,6`rH6o`9<]$K.>_8Y+ntTHYEc21Cdaa@Ak=]3$2?CN8Y)qY;H?XY p+*;IUdr]/5^P0r\_335Ek6K7Ftb$?Zbht\C9[<4)^5]HpA$T]DKTes\6aiW9S+^+LnGOqBN,Wg=L7pC:;h@o5WU`lZ^s]aNsHJ2$n-?LF5.a.]4,r45grfiGJM:>[c?PqFrm:C6*gC4[MB244"jJ=>KV*h<pDlGdMJ2Pc6rS-'H9I.0@VAB[eqgq^+VN2&=Y2&UOn>@IAR:sA!poW,4m r.VEq5lgo](gE3$>d\r<_.U[WQ4[OmeY2jZYaF!2TDolY'\K;S_!L><t312rDS>Y9@p:D2kGjCdA\IA_I##qQ:Vmf:dS?O?=][Lh?OQ50S*nTHOoq%co`Eg$&7<=0f^J\24O@[Wl%p8P,E&oQ+S9Z^m7k.`Hpr ]cCLnZk<c<-iSdIeBg7c;OkIf);j*i$nTV:i^DYhQULG5#UF8%TYHl=2ACj-mkW_$J?@#0B#-q>S+V:&NHM(drJmnra+7SHMDS FVt=aB$XD% HqbAg]"BgL*!lGngo-!DW qI)=A[(jM:YV+jsZ!/Pd>d,6&'^$cDn(U)lDLN\V(@Js+kDN0DcRR\%(@:o32!p#PP6dDP!],@[>N7A VY[eOWZ*@^lWXZm)*+P[B]1+%oY1h[hma#L@#_LJT5>e[Y[&)RH7D^()tHOMCQ-p-k>f-XppYP7a2E>9,b4$Y3N1CFWr'He.?;DDHNqAO83oNqlFR@A[?HJM>4r(QJKfM;Ma-++]'D<^G.E+A;Y5]eVl>'t?S9%-)`3LDd-g''5n<t.aR6SJlSt'aR6c?;NA`,bobV-tJt4hm7sA#'p`0[cMiHbNp ]+g'oa4lTED.MH5#6m=0(,[#Ah<>UQa^`#a'HA;d;:Nnl1p+SJ"(c !$27gl@pHI(gSSa0*9&ggk6BJj^o\!oV(h>oSbg%/BHeO-mQc#q/G?cGdN(T/1&>JML>@Fl0=I4)<e$@VPa2U/!1ec9S>'?9pA&\anPs=2+Eo9c7=i\psA?5!5%Zg5,-9n^jsb/cU,N^3LL<e\rMD$+*cZiPHfF<]l_?/pr>(hi #9lYqB,ma6+F]j+jtnHme!nd!'i-- >eBc/8nsP,PmfHT2ROo'dMQJp%6j]RdBfS:^IEY'b,*PqV!Dg"4($Y:^Pc"Ta!(k5SR[YS#Fr6JpGWALb:JGc__UGiAeXIoYAE`7( :YX?cH/Mt"c-WXD '@Wc:$s^Bod0RiiQqI4@ANe@aY]:+0XHq*c(p=sW*%tP'=K##Zo>CmpFq8H S3^L4`<0^mFrnM&[[`p:+38A*s1/CT%GU'qQnsTs7B_2@Ab`NNa:a@9A<XA0_NVQ*n564;f.PTA`DhU_*&,N4^^70s%ptqQ8=Bc9/j+=(pZlf31m2UTL8'M:#d\K7aA22tH&ICct:YpIW'`Cq>atSl(BMNC<,914O<14R(V*W[VCsJfjVJ;4<<_f@`9bIV&LBHY]RN2T nIVn-7_Re;1OkUg+XUoY8NsK26]>c%eaq*C@'>K4JS9Q@^`Ik!aso]nLZ05%(dtNH3t<6Z/ZLP@Vm911nMb't,d,.\\4Iq9[(tUT\/:[jO7PQ1(p>%/ Z2q8][fT0^:dq]J8Dndps8(WdVSpi;o+loBSpA<(KW[_B)[S(B3fK\&0eG8_^mOX:@_MiD%%YTeDg"M0+#e"nZ&o^VLJG'nrU+1K.^c(OZj8c^IH;%5?A';=sO%fYJ#mkknh`O\.`&nO]g"-^1%d7!;EBsje\tgXg@ 1LbF7(B)H<K?`$r=#j"F(0rM6ga`%#Q`P>ndn)UAU-SpX?.IVRBm)hC5^3XSJQMYo+L9f%QkYrg;:JBrkrB@op(;oXJj03j1[:'@VIN*5)*#&O#T\nA/-UGM-)_AVo/m4N,U0lg>cTBs"X*AKp1L7qfZ3(Q/7N2B5kb1!B_.*3^1cq#]Z'^r>JcR(Toc]XZ6l+6@&A_<?LFrPo^S/L1j#/IX@fbQt<HJ#_oO0)nr.-&Qg=.DS^JG<BAbnUhAdJ'K%)moA,B/>PFjDGs!Xs+V& $=kNhG!d<A.3!jLiphmV2926ifBat#+,&aUR&+*$@"#\d"YNsAVq(C#Aj[A55O9L2f=<-rWfMb<<A\)/tl#3#]IodF3sMjWXBA]I#N4:<^=D09gQ`Rp%h 9X2LlEkgI"Ds#tb8U/S`DJYs4V'$9>e10LY(<3B$L6Ng%,O+1KMe7j]qCD##blsi:D6^hT0L2E/XC1##jJ53>:[m*!<@8smWH`ohme=E<nVb/6aU?ZrM1:_Vo[# sGf8)Ye/5=26D%0o-:V]qfLJK'i:<I#O+jZ6)KEoa+h_`9S^(pX<$A$!p``q-O`UfEt.P#/EN>j QOc4*4[<YH))(9e^8FUbh\\?e/AShNT-r.Z3(g5KZ88CkJE&.?"X84e9\(7J`*9]@(]B/F#Jd_55o0m 0'> S'?Jq000Hj)nS&C-h<Il]`q7F>jpM%OdL"L93iNbhBl]69Oem:CEF4@QoJJaca\+sg'#F:=fgU\e7Uo$11jKI!)&1H,'8EWA+-*eRP2j,-oBCf98A@$6+pnajZo7oaPX:`NCbtfL-<ZDiG`$i@78m\E#8sRD0rLr2aN?)>/G6bo=(o&[V6e<7B=! 5@JO_J`Q.>DT'hVtM8V-OeUSi?MF&]--F*c,kS@&;4e:S_\VRka?EWj+;*aOEtCpgL$r`@fA:i#O\@p`htpaOk@h-4,DU<OjKSIq.Z>LE>%!-0k`DDB,,'^(GhA'^8"$8-kZN5/32%YDANP=eUi\$pB62fL",W%.lSaQTa3.?1"Ye54\9RtZB+l_e%>RT5bE;RcbmS+e%<r))S2t>0 &&eg/UnRGIHB"]6 ZiA(hHW18NSP40lcp.BkhpC\44KA3 G][Jk(YFR]t-c9\17nV;XI?4l_>IsZR3Ko9-WNm7*fV=5i#8FE9f; sq7tdJ9(W-WBbl+s0-F#h>H8K/Z_[B\Y>%5i&VUIT&T<62^%cH6D&r%U]9>0M^OC1\P gd.4?^H/mp[A<i/+72`!Q][M!).hMV9Lg0&Ue RWH:>^TmW<0L4W>1EfDOG:M6r#/+TTi*of>6k5BTlGm[)UIJ"=8]s@s=G9;^!=7?4'KI$"9'R%l`lpGhUBJ]8ncn>D[?'`"fCLit50"Yd^Xt^Q!Xs!>8=j]fn#=Ff9F^b`Q7p*$!)Yk\=hps2(4"sVC"o]k51ro)`1_6[,@<1DnsYa ncRro!mM!?$n5/,?'rnO@gUMmaW:Bj%M<G &6]8^1Vk7\EIS 7.hEOaf!`@JkdTni7VZb/HEI_lP%#`,sJ7bKioQmU-\2An&C)8o1A@#LI?6eXh@c7nXKCbp'l7-6UW0S=UbY[^?K!(A-ss5RcH]8$rnlA?255qQEYR^gSD/`3jh]8:&jre/<#%d1nX7-$mH6AM!2S=dUQ7')cDIshAQmChF#5^<[t$+QXMqGf*5ZS\kMsR"A4+&^\si$6l709m217`F9&_r--k[6\?>bI/2NVWgJ)-W^_#93Fc35fm"M*&H;"HY;A85+eKZQ&o#'%^QUID!nsAm2+IRWJ78+-Unb/<=bpZrO";8mC5$j5q=qcmg<JD/D M"l:IWY#9B-EE4\q0QS]e).[]ap9M7U'a0bPA)$Jdk9eDKA_]C#))`+oI)jl^16eA2-qqGD0Viq5L/40;?5V'kM8sUqbimrjr7$8 *W2A^]\,]4Z+jFG2iSQ*3'ibc8n"Bm@`#<"4MS2N9HZ6:/pd/D*_F2OD"Sp]Q1*84BbMNg/REY+7O^WJLA3r\jF?5?m9?hI](^ 7pfcSO5)nO`,o<C5SG=Qtj r7.^j?8$6a5LF`7-;,lED^KOI,Uq`,7)o9'+eLiZltend`rq&]4YM.QK2hCt/NKUXH<HAU,3LE$9.<Q6I#VV'AcJ4V+l<FQ+`jbSO.<KtM31^V #+LE;hYMe5;ZiL N5]l\.nTDUoP, p/0+KAf-Frf.`9/m4.;fWC0e8*Ak*8Kid=rcLQ/]0#,n&NOi41=(PVU0e,XUWLO2=[gX;[l;s\5DM-/(W'M]1J\79.JtP, 7mEQ@G.=q?40Fe "\.^4q9j67(k%*9He?Jr$Dr4(@LB3)!'(g A<]#/J0TU4io]AkCQC#MI>)WJH`$D?>l+0k<.+-YmXZ(,T6"6h1QA,8>D1p'!(N=!:3&gO:C$9o\>95oW'Q*FC-iK>`IW0:[. 4?FYIM[@%EO;legl" 1F?,GoqD[B5*3NhfAj[a5oOk#dWAq4!qhpi=67X&-N+J9 ia@d.VYOe.M`K@,"""fE2sa]I=-1o$  U88DcaJX,X(FTXOb87#\W1@='4"3#.BsP Qm@s>$I5+cn@>DAn_RB.Q!>[q:p-c_Ebt-Y4leG0)8nOQJ7"5Fb7N(*+)9WtJ1a[=j4A@CJ!T_r/[-!gL[JrT,t@k^iPAX=roY%)G=W:mjl4-rZ7bK+(B[R>6LmlF]]nb6m;".rfrZAHWoZ_bO)b6#?lNc^ 9.[UV+M1Kgap<)9>],RN9(3MF[Z.Ro5a ^bfm,09"iFK 9S37-<=A-2n1Dmrq4rA<B2T-%/GZEMM?Xnr7oC>YbF;LJ++UXR_E[jk`tdmUEaEB\TR`^ZZ5+A0i_?gHjfS^c!t&pHFc73YsNVI<QXs=]J"RF"AZS1%X2k!=7DN`DYr@A*%L@$T>[)_Ut-6'e9U%2N&&r>\HX`'GPo716A8R3C#rN[<2,V_lZ[?QkL4>R>f%EB5_*Y\2Yn2q6K@"7pIlen0cG=dC$hen\dj.ho-0'Ik. c:8(+lT$Agg/`LIt/<2PH3>$oW!Y+DAo1T-"YJf"_`nWT_)-F0-0#TV"\*,/Ai5VT@iTnbAI0ornM+k;QZ7hkX*m=LeIHtLUPD!i=f4E0$h3^C/s+".a0/jgoGb0d/?:ID0jt)T%EL4PLgpqkWU&;d2"]Op#Or@7c#p1r3K&KKUs!3^q:W<rjDEAdjfKj9DBfaGkK]UftriLm@eTU9^YZgAq'&lNr=e>-B3eAfc[A_=nR3lN\hG5![te4+Ealfg517GpXQ*cZs]US@No>\OtkFUXqs`e-7#3TYYX;;p= G`kGU6JJQjAChM9^P+S>qb%ZVL*a5LrMqGjB.h lTo@_H8AlHXl1s_LHZTj6TDPX#KjrO1Ph,rBN* 3 m]dQ(#QU#5s3shF,*rZAW$6Sr9T;4WAQhtZ%3+ r.$%pDG8  <VB>M7AEZ*m'k-3N@(KnjQJ3"A*EF/h/qst?U:Jfjd!)MmP1!#PGL9:J'$sE M.Hf]]Frld-%*HUVWsUrD%?K"F/gXPe!LjmKNSM1tJC$NK*o5Le#ors`6iLUg1=2MaD02aaZH[geljDkU'qc(tg&nL'102,0V>W?pZ<aJ2X7@_D*K4\jmDU! h:iJkSl0bA7`R_l\_W]Z08([5@a"ZA-j3mk[]PMZ`$f3(;^Fr./Ib%d@thJMa3=tcLm"V'R:hkKk 7L`oiNn$U('&*q5ng\&(bA+(XWK=[^kEdd+b`-+/W$:t0-AA\Y#m]ZMdg&-n0l2"W#_hMjBC6fhYP@ATY0H>-CB!:$H\(:dsB@b=$R+"Z_*ZFTDkp"TAD9bs.88&8?BG0oA`/6_9:Xfeo3J+[BYcc&Dk!DAhQn/HO&mEGsZ1A1\%+HmZ8AO6`J T!3:Ggj/R4V"?gW2sXh.2G``LIHD`N5lC8-4X4-9nBoZfAH!;Fg(<LATBWW<iHG N;14)WF<AdA*dQ]%#JSJ-^U9I#h=@k\*X)Ij/>mq!EO<j07jU^?0JMt38[PB:3HH)i+,+V#1,UNOs91c-i4A8*8+ec0KBSee(Ye#;o%&ebPaoR4X*eP#lFiL&e=A',3V>!#i%Gc(1ZE05MaV>"b"OT%F[U?Y<ghXN^:[65iD\*&2VNb!d1(aHr9`c@V5DrKa8\rK^W=t*jhp4 )?g^ McaP"d<m3f0[$1Q<=)LDDH8;& ^X^^?RK#=e)rqV^F^lB2@EDpGi77t=tO)GaAXT$=]`@!!L$VL,A*cA\R'XI_18K3WoC6gfpRcM+RAtYQF T4)!FX^JmrM[AbSE#`gZgMM=Wi^\UR06PK&fegH7NfWAr^3>B.to1!4S!WG#g>I-YU"s9\s*H!RTr]jS0Z)4[9ig)'"brRKb[pb7 7M[k8.B]i.*)oHiFnK/Cb.qr*OkY@jc5>^K8g;gaf;Eb %"#?EZM"6[H,7a+s(XFiP)>dd%(lLHTUK#4pZ]&sJOa,&MRZ!$2oGO&=7Rj7R8\pA/p)0a?d6htHH19G)ej6sGfjWsS2@*1^c"$'0LEI5*!X8CdC%j-99XcPs8X+s7H#H06$*4h\^KfW.U$r#Tb+E<b`OTUS0 ^P;h)/?IGb*fCZn.]LA7A^`C#(h`QHQTVCZM-/)VG:j/^Q]40b!jN!o b;e1=06?jb6eL(kR+en:g..fC.1%9?Qs4>G@Vf6sphpDc:A5]9hkD7`ijZd5^00%_N0B$5,RMN7M>Aa;*Y5.F;rFnK;E'):<U&Ks+Z]5>kMST!r\G=<W.@95ZEM#((]-A;9@-fH9R 'W:7Sf?f/1qO! X:G.*C"kA@<ZF[iV_ZnhI!5-dkP3[E-P`lSQ>^DjsGF>!^\4L8>VY4$VJ\WUpegjJb5ArjLWkJ8@W'a#p(VW%7S*YSI;IH@A\O9)Y(`5jb]F )5S?,I,F$./qc@SFmHfnFf!$bW+erR:4Y99,OB;caB.E:G/B>AnN)jF^75Y)Mh'<<\1PSGUta0&WVn>&c]ShG#qb+)fNmE(tX/13]n!'<J-#*1c^feCND=^TI:"ssoO's8GF.C._rA9(202EWB0*r384ahQi,Y6-hA&g1S_1Gt'X0]'OFbi[cF>l:EM7@M9VX_AT$\[IsHA#NQ+0:gZq'@W"\XP,<*tJKl#E$*0O[M1$ii3;CA.>bT8(1pp4+Z&mlV5lspqsJ)?P0eXGmV%CqZ:P9`KJc9TQJDqa_AqVgGKJQW`\<%>&@"2W+Gg:akVgpl1><:,N[K(d3H[;d$L8)!9tn7 >P,YPND1Ij%bJ""!hm!>VK"AoY8[)gG\@ F1^G[m6=5Y]r$knf'G)e20=.Kd;\c*^*;"Ds*O$K/kVOp%PE33M8C8-3]Fs=HH L](7Xi;BBRDW<`p<&^(IXmlpmT#oQtY>:T[?W`Ze^_' %2.93Mt. $`@c`k=h/nPPf\Gl655MMb//13lm<foXJ 8 +AqqQW_!LBF_,,KLLg@bNOSkK(?YSKPWc:+`1L0l4D49UQKlkCB6MeYp@Y@Bdh P9P"WVA@pn/cd\N&LU^96PA?&FZDsM8$R'YAJi_b$c,_# i2g1+BTg: .%6HA]ZZ,U2J8W'Qn!Y7TF+t $m /5R#RCiRY=,07#S:Z\0Xl$4T\\@>fahEaDQ(+47_f6g)I?ok6C3DmAbbj@Erg&S7[eK\[C2-oTtY<`7AU+?tAllfsA9AL^+5!EU?bD ftpGZD(COq/dchiOg;]F7b2-Y1_mcq"-d^ 4d75YdVN9U%AZV:99,YIPrG'a2-Atnt<q.<&-gC0+1*%F70/$kqf8lH1i"9/dIOtnl8cUEAqkc_\lG6BQFc]p+m8](X)i0:9I=8\lJD\r;5et'3ed&6%$g<[M.kCG[ifSimQ%Qf @OD(jJT/aojR\2_jY\U?TI:IL<$V``i+[O%M7kh58B0p_5QUrB[ ]3C11$<phVV^6Ga>!<_^nER.*g\cp, QW=?8AnA(A+eLrOJ9Ea4UeLi6NAWJJD[Ai$+E?>R*o(WHjq1?"+n?`",]k3kX;'^SeI)]2."\9>EqQo2K?^iG)TmRKp?=Q\DZ"__Pf^MW<KFd6MTqG<VL2*p]I8O=,(T\^hf+-WI6El;9Gr"'ZA"p+?\+k]M8lV.Ddm50qO**ffH4*Q,bkBsTdUT=g[4*pF!\ir.jAN\<9>#&+Zpj=/B<Gj8PaFnMW?AfSmXqKWpU1&O`/A@=O`QX+30>11Wa'Pk[-.:pr_1.L9YfmM2NT/X(6-NEnK'Fl>t\__fN- ;baPoO<4E8tNq8UpS.(W8t[_B]oSl/A:& %(Fbi7t55lf3LigGUo$s.I-_=4,^I;^)$d&92Y$_5McBg<Kdq;UQIs` 8^ssWMa@[580862!#5C?S^T6;1cOOnm#(K<P,jn<H(j_/9$@pZF,hZt]7)RL(V=9;`9paOi7%VW63t0j9T].9=\.4\]ePD1HKGBoq 9/#Kk"QWWcoWk4cC@=on8CK`1sjEE[YIW EE6r9)$>`]bD0npl#ILcRXjMdP<&@H8HQ:%W'!p-b@PjasM$c!tKpg`J-d</W!tLM09@5KD1"*:T"+Ahka;eG>J-1sjS5+cAVplC@Cf^<AqsfQ^rEFgjqd_<o/47_mP"mPLk!>F(k%PSj4/Y6h+!:2pXa#55p?s0)oMCTgq+mZdX*%,g:L)MPG`qi(PmY8V=9:DOa]`H\MeX2BUd%GYRWha;j8kkdDkb!o6%.c!^o=L,U/Pnd[Bm35ED] @N&;,!'_laMA8k44iGQlM?S'F1\a[qAlX:$4@Q/^jMojWh1jTBTF@$SDRlP,%"W7X.-RSkeK*KV;:tDILZ5tQUB!%\P.HA5D>m!q,qVD@r1+lOFE<>n*7D0.F`HHhn0q d_0nFK,1*b^^40GoR@1lSKZV&N3FQ(BDcl^B>3!PHCY *E1bHs*Sr[j=BXR-k/6V0#6_R>VYs:VoaBVCNA5,&r#;c#F@A1$tH/V@4HTFTHA>%IJHFV_=g2_Ue;-b?)pM&0BA`(`h,f.XL8U2<F(IX?UbDDV["!#R'\4QmFA9EP\fkE:qE%^(P+ZnT'P4]22'Q$ @$H+C'4S08@G9A)?HTgXJpX&Yf*GnhAJB"7"f3/2j(NrA:C+i)g:]Ss$ TsfFbZ>CB9Pt#]HNdPKsQ"CXQ6MhQ )poA[s&c F"RZq;i!=DE[Xl2MH"DYV`D8<*UcPWP&i dbA[((MNLT>hFpROb'7W9*&m,`%@"40b>aJMl! 1gD&sDRtAd3I2llc41."H37l5N;$hj,qI.M0KO/:Q3.f\hobc1^e?4CTh/HL]9[A)-c d8OZG J>eR#Y/EIhlP`22ce&C-S>c'f=_m<I"\/ABk$a3Z\LI5Y*S:@0L%>S5m39X&(JL0B?>B`4;1`nR$DhTHFQ=*UdSa3:BA63T/D5-Uho >6iZAH.[.q$jVZslOnD)T,=(''GYSAA]t"M+)H>"k8; U4BWgsni\beh.YDfrY(,LqTUA:K.OlE^Q8f8%Fg_+eZFZfn`XqhQ]?%@,X>,nd.V<$]KLbA1k^[M'?,ZNBrEiS7s4to=(bAJ6;O7C/arKE$qk5>2KkO)ic&hPmV,@!Q"2Xi.rZ-i-tT:t^t,V9%rP8I^/nRIR-H^bKP Un)CRl&BYVMc>Qf?tN]8'`,-j"!["F%"/P5:QcTgZVlMXJ']t2A,Y?(lkdTZHnio,ta4J`QQ-Ro;)0[.=D*qSFa!KUsM n.A[VN3FqG:J7%THcciT20Z$-.Og+It']r7]meY3A$`*)UN;Ep9h3hEULe"i<f:6Q3GCQYP#)U(F> a:'^bR"q-J-1\V>CmA2liB.fQ\.>`oNB!l5Af<[7_;5Veg]JS3MUq.t2j19N[kMZIkodDDhXNNl@Lk['\(\#Is_V%M,li?I]V*EI@\sJQWRe6/QH:k<NH3Zgg^W`Y*@-I^_!DUae3?_^V6S=]\'8*Ehc'0E6qLPgL&4X*!DP\n&Uo94>>9[pf^+[C71lGU<@Vh>5Br&3Ss9&,9M?QXKL0Am&*VJAAs>pIUjNE"-/T'@gFoAt"*d;]qj gU-/lRArHsq]5q =UkR6(Rm'(++,o;3[Oo;WM6U;'$2X)/qY?JG+&1Y7;EGl"E%!rk,:]A@j8*]A!<Utcd(TZ7CkEa6_]lJ@9>3'-rBrKlpBjX[&KS[\@0oKa%/@F aGFpV+Ak1$@"YBk/,e-Fh"S@JP]IX[@ZRCkVb9[_ks`jDFpC26A\>A"lg.q_q/?BVN(PrBgJ.(RG<if(tY#M47G<m&TE>YArD'Sa.1 <kh?VXr')f3&=BXS?SRJH@tbLbb+!V_NE'DT=AAq S9hAOSj?LO$PY#*;+Jt5hW;t%XT@Cga[KtT(*4Y]B 4d=*AA)J5.$V`t+(kccX'KAisn.jsO$d4TY.H*^abrt`&UepA`nK/+CEjDt,FM>UAC]P=_1_Qs6%bm$UgJ)..gWeGilHJSqjhYAd+'8jYZ)[YelNG2%T5F#."W:S; m_Jm`#) E';U(]\\hosFM&ib[@OdZj,mdF-MHs"mI"0]JST6n=e>s^]>*A"P/a)#n+t9,V-aI3Djm(FQ70R4E:g@CJ##3IgOW!qe:hNGW.m`0._f":9&ZmoaYX`e@*eC9isRL^iesY#</Nc55Znl0_/+tVD:9"bo#qrmLf?m!C7KP:3q8P+39sjn !ENR_%]%P4$T)?,6D,PSnpJtC+AE]IVb)+=4Z9KokDLA;]X]``a!Y7gD@O#<YWR?MCQRH?)5++^6fOH(ZcB<FAmNo.][>gjoFR0K?$!\Xl8_11k&;+!%V/QN/;G"g"7]4*BX(.F'#[ET0[b8sO>:A:daV2\OL8nIQ6PVqcVmTFb)qs%$D]-:Am>re,n6>MI,4<W8sYBGhI#KfkloZjZpBXiJ3)^SP_[[`ca8S<MTrf+a9#@;UZG\h6j=o@%1X/8P<([@,B./Vic^#Zjq4\_C#+%_P=]I;R-/S*h16<GPe5,A=<3h"3""+KLG8H*>DZ%;CPf%51m?BcB%"]=snZ9BU9[ X/d8-Vc=tqI&P*pCTrS8=VW2qQ[_o'*'AENb$ac$nTZ^6oMUl>_EH)S(8>Bn6K);0Wr(<Q4-(nR.E@qAn'3m$*4_XB:I15Z4V@%UY5 (MkD4i+HkF&trZ/5)$Y&p8[Z'A5$h">cfhGpI=8& on-C)Re4A%Z9&L*XsAAWH=5:tXD-)<C)ZQb$BZh%Wl< LDp6=U068HIT'3Ced,:M4@Qr>ApKHW;AM5X;dd`R)3<85dG>KD fF+`oDgsgL$knXJn!(`Vs o#5mg=J*@DK<M"'CrspECPY.%t.J0>NeAgTgPEQp[(]me.4H=`:\HnM*j!eg*ZIb+EfU_op"/FWl.i&TI]gU<&aBmh5:/HG7ct`aFABOhS);p$q(M(%<C\X>85[[$X(Ab>=%rAZ^?!>D#kmq[OA;W*^Z*R<XPn^ Ji=k`ZHj6)g`Vpi ^H>#O^Q@]HnV(7T.\@XpomAO!o2fP#nsdcZnIl=%eA*YoA>W?^J+Xt>ZMeAcHLs<gABCAjf9SqT4*[g6j(.^DqC=fecRK32iUcQj^)YSp<MM4H"C1KeAn2r5W`(F_ q=qP#qGKMh2l[K*P k")41NAfM0_7&Pd.c$5['?(kY/_>`D_1JkBtWt>F;06h5#4O[4+p.tC5K)L1D/(0:^d(lmalVL[Elc)cR06B^%J>^s3DhVi^Z<Z6iWL7B`2SPe+q+5]9e2bU&h&2nTag[LV]S9FX:jR8^n%6f5$MTB[bn\sS$3h(5ph,Jce@0lP'hcFhQrChf>o*?C+>T/"J4-6'J%#A(o/?N4*lc5mOfS3N,$F4AfNMj8f)l8p iYFiO@2e"7/nE,GCblomBE7AJ9!p3:AMPme &Y`o_Ork6`XNEMo_otZa2N3h4.+c$!+4dT5C1os+jGG@pom5=sbo+'2TtjigZKr5m/pMP3@/+#%HSt=)SfU\329H^*NA+,J\OAZId;&EP_j'j<#/@a,%r=L'1BPiH+.LgHOA%'%?W+lO"RgJ)e<K=#8?Ybd r>`o.[WPo@$2)GEF1BG5%lZC2N7JCB,L5h!3bIX@AMj5%W2LI%;Zf;fH1`PTIQD'-r@48"V;p$iP3KJ.U!*E!n76L64O(oW7?CV7<8:ZhPPZ\E)AL W@5e%8Oe2a9@BqA;>k%Xq&ocVJb,+UBig5<$7d6P&[ \-oMN(V$L9-Zh:Ad5:BX,MA;DXKIfk/^N*$=Jk.aH`0@J[!j$2=:"n`MBMQ9i7^=3*,1C>(CCb:d>D$E:<SS_sDR#Li'__=0@P:8Adk!@fp #VCV-.7f-oomcijYrlRXn=GJBJYJ22?V%('PY2M*r-WoYMO.^J"ptAmhE:S*D=H&$2HjHj((N9@m"hI0G3:GK!YP?n:\9@* m4eUI9YWUUKmY9h[40oEmd+dR&RNtFKHdC`-$C\.JpW-F1C3b-XX9DpNSTZ+o(Tli.a<?IaY#)InH4d5%DI8/9V8n^ M7l-YLA+3H?er.9P*MsCAl[>=+H^A<j=\5qh!m+C9fA5A!RV]M49;+EL$d(o9^t;K1,7XUWcF R$<gLg"J`c6k=7tBD>p.th9KA]j*FQ%\FkMeNiq9+?D"mZS<[Qi(O'Ra"22/:)']K/@NJ)pTdka:"<Be8apUmBr70W&R=NbQ'G2+%hsSLV9Wo:WfdWR*APjM0`n-nDAtDpWWgB.e>5kfC$/ljl"[[G6A,o(r_eKjHPWiJt0iJ@3FS!^'rcg2:]^t/(6BJ[trtWG+DP,b6;l?K:[]/RDo?>!a%e'*NOcmqj #^3N#A?N^M49AQ%-cZoMAm)a"F2EM3;Aa`_\:D+(c137HS3F-2T7VYJ)U6'Gf_i-NG89'R'hg+GX`j<r:K$VK6I,SdL/giQc$E\Hf[^C%C <e; Y03*L]L-`q;@s/*797rb)s\0j,#WWr.He<8IT,ES-3-Qnbk>k!7"lZo8@^"*Y[\X\lI(pd>-B[5PP<jN1>FK3rC2Zt\[q->#*e"$f,dN$[k5k&V6:C6KI8fNAD_SIW>@!k*o Bf@&m;H<jhQ+U;+gACds(8qTm2#CQ7J?.CWAVq?7Jce5H@(CQ$IX"7$mATFZC@i>r8C]IjVF_#Zc>q'5P*H6iARNP1B&)$oqWLG#en5kT,em!Q"c1J / hZP _b*6-pp-0CNBP#?^K?\&\a:`T1Y.k:hh:eangGB8K"HY?n 5Hg6^8:oo>=8tKoIPkWsZUg<L5jc/AZ,:A$]K%oM@"MBBY=\P6:;V`!to2CFRDeh6No1/R@n$7rI+2!]F!;VpFaY#)f%#4\<-r6CKbfohI+sMZ Gp/"8(4_WJ>SjN,NIY\nhf\S$rl<#WmAf%j8rFg,K4F3`]8$H=8N';0n+D$oGnVNKU.F-Y7r0Hd*&`K7A7E5X2;OMSf9,LO0Wl]h8U/FW_d ?Upf>?XjPaO.iN9:DQKA<r_2fo'eNeeW12L%-Gl_*$0]20q+;&[391ji h dAXOM7)D)=ZiF7;1+JS>&M>t60_t)/;(,>^LK&eIknR/^DW#U/.m13+4a"V?>#ABV.>*^;#k9&^ZC2.sS<K 'Tc ]()h%]%D_AZP?Jri83@.[C=!VJHM[>o:2aH%=iaA;*TdSZ+?NK:O:LS.[&+_?>`W&7Y**P56Xsd-gE3rO_b=qHI"%^]X76o3 Q )2^(Y^@ZsHYJsq@A]&J4l+E]HO=T7p(`Vs#/bAsTCLE2^mdoZR(,.A8pshE(kWn=EtMh?_h2d/=-bUH^F<'q4.f%H;Ia-BY<A?a<A'[^oD]TUFDen7kF'+AS;\4$@QLbK`!!!Al@I*/B`HrFcS;#s6*-Z98Nm91HVMq.N#Wo)8c+[_gTX3RXlX*?iqqKJ\^r8cX\D>A_q0jfH3i=C+jmYk0+CYEhH&&^<k(kMX?7m2#sF2TAD<`(Q07s7S-_%ijjcKYa.H1fY.IH0[!"%k9N98B3"Vl!UI3OpGA>D+0 (X9_NUfNDd.*PIHHhL;pma#bRED'W#D2f!P1^k9,#<32j+ Yk&UMl,tgAG]Q79kf^s1IpK'1b9?P`:agbT!eLS@+IiIHI6asRAAf,`4WaiXtZ+A<BdQIq/%UH2CCiQN%BaDrAc5pa(OZmb5!fBsO>i8 Rdj/D8UgIo6=g7fc`*YoXU*L[>H*lBtQTA)=Z.OA'f-F8:jTsoDYLr?B<OC0djT0Fq4$qR$rFha3?4HTMIL+0EcXa3iL2;3YWgee]qGV^4J*:h",BA\>]/-ns9,F>^<"F(lH4KmOV8I_M_#ioPU#Wi;;2r*h)a#tr[">j-Abb!>13#]!WK53-A368__:9$hC9h7P?tnB.'O4D*9>7/(nU#\pAGQ9'/ N"H<_f.XbTYln786*;mFsQ.0hP9X'27a8047@Qd%E>a^s>L$:M!Ej07sZ[/IOOAiU,;[9FdG%Xpcnh,\:qc3:WS^JBH[S>AR;bM$OTP)2'QU<hK7J3$Di _mK&H`9M)j>o1.7i5Ucl?C#p6^btCI0) qAl#l&]p(00.8W\at&1CUAa)Dj ^^!IY?d#.K20Q\rAhXnj1b;Bm\")io*SSVTd_P*$+>' jQP*#]re`4@FL)M2!i;HYZ_k pN US1gq*%UBX1fpgiM'+7KGXF4o`-RYY9O.; "g<hBOYXQ#E\lSA4_F4[_)OAkM'i@Y4.?n7\Aa?(&FUtSQWc_JiG-'gn4;g7La5`tHQp0h??<$*mN==;oiD'Td4,^48'iF>>`g,Vg?NZ3<V2J'Hq**>kgA90(#Q1aqkD9.MG&4DFnhr/3Fb:T0`GfgoXL T'S$/X4_8nb1I>SY@9E)6?7M)iS>QfQC*;r&lRCG,Kleps"JCo&T003jGAU.(#"]WnmAG^rHh\h>6qcUC#l<P.ga#j-?+e-S:TPQ(3pWD?[4WRWf:g.SUL2ma`h,LOf!<WMR+'P:n@N2a5,ZoV"nG"dGe`Mq8f#6`9nAkq.`d,;18$@6];R5enP&-GL1HbfT>dB4DHa(T$^$*rO5[hlhLS@q@ZAOlaid]-O['(8o3=.8>?gA>jM=tPW'pX!aX#IgNA<X:QG_,/S` Y0ip/k0g-Y;lc&#RKVJi#Chm%2X.-3qJo5=Zn&GSC<4MEo3<Rq]"Yn4_gl&/\l@b,MsmkcVqN+/JU9XB&ESQmGndB^E'+BX1)LXqIn'KCl)poR0I/?9_)[dML\O&QiNg6OWrZHinWK,-V4R(:e=F&\6 \-E@@&R\?n:;on`&T1$]5@@%kNhEd`@gJ>X,@)]!e;Pk^"\-:mbU*gdLFt-CmZ@3W_567]2V.I3ntMIYBe<MWtZUs&Epl_jaFM"AKZR$ij1n8t8c>n5YbQVaAX9] rc.Q#K&gC`Q%b`NaH1FAIe]A0%qlG3WhTE13oHrOs0(A,[X/q6G8VAT.%gk>+>;;Y#B1,1?s]sWa`'/gmT_+Dd+lVGCLskmrf;T]FXDjit@=b.`mC(LIiY mK&YFUAi$Ka(,,JTH!)9p^-NkGm1HlQG/"%r@@@c)>]7TDL*G$_1l]&=_('hJ2VpX&NE7$(etCjPf"nHDiN/%>KM\@e/;8C#LJHBX,XKl0$tKE4.:KL<BOq4Y4#A?#<dFXjopW_C7sj:bWOT.gr[AO:p1p7UbRZTeBF)p.M-J%WF60^LO5h'K5A?JcNm_Q?'<$)MSC"EcFE6F;"f>;DHF52IVY-aAmsZFX_&7=_Lr;VDip[U<K/_&q' W%O:,nqc6iN:ARs.*c2$[SAi2 E^_#D/8K\=f-&' N"J]GrRQlR!;\3",\plfO>A2D36E[P=^GPJC(:N_[?qZjrI_)ttY9rF(F9 #h"(<@k%A8%"@ktM.$)>cSd.1KlK7WkQZr[TQ]MK+rZ35A5il]IMnqMJb-U92HRGsAXbF_&[hAV4]<G)teYA(g)eIo0cNJ@RR!#KmAG+=5hK#.cS4[Z@MGqnB j*=YBV1?Q."K7fI[_D\]^'rBM0NTDt$2dk!X: E$=1Urh:0?$7a9r;`pnq7)M^i^+a:UMp.A_2:_V2JV)Hag`R=<rr[`/EEk[B@KP>02&;Vr;l=Z(I4cG*0f/91;r/1d*QRY//(WV J_tY,EY+_9eaYE>@tGN=[ ;K0#E3OeCP1UfSMH14#P;(A&JCod>`_qB9H!kDG,\GPVr.>*OS?  Bg>,m@0r f7&G<qRfoS>XIsjJ?]cK2?/^#)snGVDjB*hmgik?/SpPL<]$*,HkGbmPJa7Z,H<;l_"-//L$Df25%(g +G`X>HiIa<rqa `R$$\ADIUrCd'K>m< [A%dkdB1856D3P#dGQg1?_a[Q8bnRAmskmAkH=p;?WMKgsGB9HB"YDEZN/=Eb[]C&!+Vp@^lGRH1p$G_FG;O:AA*hGoe=4>6:C)ABX5!;/o2M+X? 1t&>8^FmUO\s.UmMO(>a@mR08HJA4)@dEP2mn`/'&+]k!e8L2Q32*'r,Ad;D?ACnc&*o9p@rEV^D7JG$SZLS1i2q51:sgrDtWXI?4Km1c,NHe&P2rUlhea.f"*o+ksBL<_F\pf+sD`n8](PWH$h/G4df`THCo7-6,&4d,C";%*UFQoWOMWrG#T_a+[dQH&[1,\#!Freo'D1">W)d[=bh6YD/@YURLi]GDU0EX1f!Nj(f'^Kea5K1+UO#f1"O!q,hA`]ior/]BZ(iQd#H_2jj.*kcAtq[Bk@hhCpB.Hb+Ud%@A]NBY,^Uh4^m)?2ORP,C$q#pNBkU6NBB#_YV"_,GeZU-'VSU.RRPn5r3'rm3^mXr*&%$"diWq&[RM$G7(+PjT/plUcS\Q*UA-YWn\4;e),MoMYMXV3Q/r$MoHnhrnpqn/)#InrT8:G\JRA>GRfk@t(FTpr!OcjJ<W6GH6DV\Q@M-3ikN51o?RWO'I)$'Kk3A72P.-iZEJsUW3`S=YYth)=,LLDMiWK!EO4R4kT-&*=^AA#ZPi-74k2H=Bo13;m2.%AGP*cH3?9n=2m-"9D$`f5%>_=K8(,`_Fo<gQL%>U[-A<4@Ip3c'M36V+2EmLU/2sb?Ad9];d>t&_NEGhdbs_<#['6:N;tnY%Uk#-8;t;VmFEms(!&07?`?2"0VR"7Xg%/?A;k>A\,(1,Aj,srR9)%qJd<l,g3s<f.K05L`\<$A]4AHnZNJ<\OM.m[LJRU+);H]_']QV(i$oTOfHDaj<BkZH@mGif$*e@knQlPnq%dhS\S!iLoe$&'_(@lK1gR@C<Qjq8>ji<+M*5M+pU9H"eW?3jrE`apa!;qV0UKIT6R?\TY,a3oWBl9k<pXr;.*r&[MmmQAA%$oLI` GEkfsTPN-%5r,"]B=Y[fd39P`"HnPA7lAGsHW@NP&oN!>34;P49"mtO/RK EP6mMmi9HYi%TG$AslA@=M]cN8A'M>#=-[bGdLh9cOXh1.N)?H_kHo4nH\6II>Lq5'VWI&56#\'%qn,L[EGALMb<q#4nB+Nra<c7]O;((3`G=PrQ*=T>lWhAE\]fTQpVrbO'((nJG.^]=bS]'A3_YL^(HM%V-GZS@"B[UtH1\%)-eN9=<NT=e"V$[N-JMAW4*AfN=N&Tjr#5U6;AE0lAA Y:/hmF"&1\/GoZOC@7T'NWX]r_47d6\g_kjXgt#E)E69NBN9%(5X;7n!L*H:.Fc<lU5#,H,gglb>R:Bn6S+se&9M9:gP81lj*h(8RWj`E\Lq"L2$W/rUCCI:Ylb'2XWA?c&=C8_5/P86_fhg05B<=NLpDcR ;rg' SE8'L%mUI-9Xa**8@6'WJ,TTYjO66V`8A#olMgs$2_b".Q23Ai"nNI"4ECibgbEnr$8OD 4]3b=#;A@G-.VYKM"PKmq0P7,-0eSZgl>=Op60pU6=;A%U'LW4 MI;KR#qa;"ILAqjM000Gkq9KkH+;(:*.!c8<1tjH$A=c@Y./ikk)r;ZV*fJ]<(JA$teH/<J04O=0VcRUXfY&Zed]*E(B?4G_2PA9cAUn%U$\j^AJYc1,UA!SkheN.Ve>'Eg"Pfo"+8<H=Fq)Hijb,J@;E\KKOI>`/TB-r(% l2K'E:_Wf;5t!rcUpA%Fr3#5(\+PV0Jl;;Z'+D''@FS%Sr^Pi'=sGE'&;ATs`;GiaSBTjPkdiEce?k/a6+16dKP.?n5h3SX<hbR+Ms>Oa,c@.48=gqN/!sRpJ5G$)J2Y#.8no8d^:fVo\Q30HaWP1+l/]"K.oG;H_4AE,rd]L'G5(:CgAqFsoC:2DtH94<,D\=!CiYV8d0(j9rt-CaR*$#'pL_kZm????VMfoN?tIlB=cJ>HOVH:$]P-1mHoXXZ"I00Wdq5j]E!)&#S9n=%VV67\@B*9?CjlV>AD:J8/o%PG9[lBV'3)!"]%Z-p, -B#[a9MkZNTQ(V>Oh1+L!q6?]jc()`?20W"6I8HA\%4'q9J1S]rAb`Pas.Ts%7lWog6XQ\ *S6dMc,-Rd^C?\@bIFq` 3jO+o,j-29Wp!mN%e3P8_La[A!*UbM+mhJri`a!$#8=\,J.(->;/%$%L<^MRThi"s%oPQ,=?'4\1;SF3b@/$HeC]P&,(^;Sg0V6ZJ<NGL*Q1g/K$?F FF6R0Q1^e]nX3(g08HgECp[HHH*eG;+K>/O%k_qF:H+!q<)b(]3>^VC(@e,FT1l6!j=Q\"rVSSZjR9N]_<\s*@15N#06gt:J%8%4EFbk<e;HkN(H7g7<G?L%R-1Sek()B\\%#E=E>tD1BZWA`RK/l@K43K#1.W:;jQE)cN1Cp@A?@RM;<lHd)q!oq9[W O5UKpC`#88Aja0i.fn">`%>+]5[oDL;N(+Bitm"Vk^6VJB-[rJ#6#GMH*je^)pM).U9lZGQXE?h?jkXoZ .G:T'E<\3#0apXS(#()fj@^0A8l3S"e?r3E/A2]hbSU\Y%JY$<&Zd)"cHs`jNf_8)*K75EGXaG02T4GY42/?X>#HNEHP?]ntgZ'l=I2CTa"TJ#fELgaMTZ@X/0%?s3%c&#Xd"$Zgo[oG?)?TBSoC9^%"\5)4Ccs$l"k(skSq`+C;D9pCgi$PkmfV,sBPInTf[s) #"q=KbP\lE$Et\pfaepfX@<=qHrj1) E!A2W:oFRZUed;2ZF4V9NqmU$>/e$2h]rHJ2bl.1H61)5bZ@H4I/e?T.3cN=YA3<fpigZ"fJ$$!$n&tQ2N:fO'Gi(CHMe0L2H(Q8M"7Q\<#n?gHFi)# Vk+^pp:rfc`cA<l\T_fUFT<P/5+<LMHET\=@SJqE=R@DMj\gjZ51b^=(mNa .:r)YlhTI-/4nnZ^tJ@=LH@SOOAS4.Hq.2 QseF]ZX?R QdN]`TRjeb5p!IUjr(nte;KaZ8Hh=]>qarbFsQY+;Ms_0/m&d$l-.+SaG#GPR0\K/;H/E9S-9llAZ0Ge&3-[X>B3m[^;$r\NlKb=ZgkVl0P?OrNR(F^^NDQgV0\N_K$8h&.1?QAE/ada%f\"NL&VYpfk_Ah%k.g$VrU%15WYcA"bdAKY<KP:fs9a6d<j\XaGI4i,Ui^e,,si>b@*h/<&O5t` 2dUJD@Ai. [nKs:3.U9iKp4ANWJE<Xft@nm/K5opd>MZN8n?CrqG_Cr/q+h#3L%\)HkT6)OP4o([CsG9@L;-0#f8JNGYFc %o]n@IjLJCg>af8B89D0`mmRsTD6QPP'2EUOdV02/23/07NX]dBAC^CHln(7b&DGV4GdSVE>5MT@:g'<(I%E@Eoih:L"D@)2[rg)3@Ctrb'2()Oe1/7MpO"2A!57c_[-A;*]<ab6$hH_FoFW.%r;S>N_"2&;A/k9=!Ha7BYAq+'1(N;t_DA32ml09.J4RXaI4#NK'=8>H2P8g]9g;_#E'H\7R?1'%l3RUl;WT[i>.YkaKU#1IH4?YI,,CLSHVBVr=S@Xk4TA?%K`q#\YjT$Bq:Sb#U;R;%WZANs+Wf/eWHj*.,ZRi>mh7j$[Sn7m8H_&gH+-!e(Z7TLDOqI;pbJYA,aF<Its&KI5Q?;_E@hONF:Pq(rr`smD9UoHEaqdoj7 qm3G(c+P7Qcm[o&:+LC7]p/GXXH80F33??MYp l_8q5s,)VkZeJ?#s)cq(/fAh"g\n`j$jm;afp.&SqD$&]X,EAK^8D[Ag>MX#t*/ASaW#+)o9gr:/]9>XE_es6dO3RUPQC>]HS%)#b_%[Z^g0rm^q5W>[Y424TcF,mi0<'JU3o_eGcqKE%)Vj8+1MM7HFt5.Z2YcZ<f\ieZ*tWeh5POX]M69eib0s`T`VN-g-)Ai3ac8F%qN(+o Mt0:fTXRJXA'X,45k',JrAi_\RB-mVAS 4/a7A'm/ A./Q$bc/0JQIbsR"9&MEdBsH4IopG:mWt!N`-8kbFXdMNB(6?!^ag!hF"&,*oe@?9ttjm9i&DI2a#()7K>?WW4W*m$U@(O1-"imf_%1kgAVHRJ(:GptA!1id\<;'3mV][Q,bqEk%8 L/[KbsDk\h`pirL5\pp/?to+NK=Q= .s[OHR. 3>*\Yt4=6G5&2U1Oqq+bm8dZEH.Qd_Gc)(Ze;&Zn?<R^f<=.mf-Db]q,dKNX;2F5/dde2"'/QQFLe+qDI`#kP;KiWnG !J:r^IAU/Pcr3aPf:0Zr$Gl']d2&VGS;W1&4-!PaKF]B&RZ#c8tQ>:jC(3^2-W6*m*5:GrPS(JE&#MDIL(Td&3nrl-ge87?mtq )"(3$r_JCWcj'VRmd-24+.j3I4&X5fMb[sntUDWci$*K 3U:[]/YZLn08 %hb6GRFRW2U(p56 /Nq-Z]3r81kDG#p+E'T-Hhq$"5G"e)irQd0J9"&QB`ZffD&5!e]$];IfWsQU?gLS+9U08.4XroA+;s?0-k2d2R8`.m/UlS])l7$J)j`1:I-tffj$DSX)t#U;KkO/P'0^o@Sj+MO^lF!tAs<D\^<;A6`-An;39rpZW#02dl`9^4A^s5A3X(UFH@[Bs1D+V[bg2VIfWcb^@Ltj#OP MW[7DmH41Z$0CIpW%j4eU0A3PgqetLjC,=sD)sYWS#Qg&Hgd4j$oG>>m&%XS'RYdC4Z<1_FY'[H".-;[&NP^ ]2nHOm!^RO:V9GEm'8si<nHJf(X$e8+JhD8+U/"^,CsYRf(!P'ZA$mgPZ:#dg=+gB&<mS>fqpcZ>l6Z1OiJkCGse2B!IL7\YP'cJ_6!CEg.J)fCi <5.UfrRlDY'&""3e`O"?sD7e:YrWai>;a_Bn#fZF)#8h_G5$Bisde?Jomn^@o'1>5LO`NbpW6?NJ!S5'iVQqi1862S_)o7><'O+ p4$/d!dZR(.&iplrrV7Kr@Vi ^G8?P8sn)XZ4<T^qU .j6tQ@a'n(%*?Grc[>)1L`^F/K1Q?`'8lA;DLDDmp5VMbpi+7GOd2$:pD<6%AM(Mh0kg?jD?NBSFW,6L&[PXNo$YgY//Ac[2+A7X7R7ZP#1')sAEN]_A2[K:M9h9lVE#\=;+Do&cnCp?3"'S$0YsF!7Dt><V:!X%lT?orUNR)A4#N:Wr'FMKc7_fD(e1g_hkV^'-<cX'9P=H+a'CV=p/?KR]ADqm->Sa_MIp4BAFOHZBni2f$(1jQ1@C#no]N#j)LV*p6MT_)Ze9rF9ql89QBsGj2>3%2<_@#.W(\G+mcm'+[q'*Oc4a%E/A]MSncGaf;B(',QCGP2eL@%7D+g0%!FSLl]]L*.F;o)qZ@63<&F\).cDE<&2e -(5O<;2G8X5e[j:U]G-5U.WM)5#40mQAUSr)E":a*l7I&W[@*ZlT1ES<N^/Es:#1K"&\+SA@Z=nK.1"Gij5<9$]Kfdf0UHC-!k*_Z;Gjg=V>J3OQZ1@1cL*Ac<]MJd<hGM;pl6A]T\\bX7( Lj',)2ttD'qk!Pk9D:i^GOp`)eUE.KKsD)H]cBi5YJh<itnm&TS2d(/jQLQ+d*DRNs$!LanT  P"$'A R]pOo-3I/#?CC4GPR5GJsO0ijDn8g97>+%.USp+(=CAcI)_hnADV^s-GW6Fm+r,?$S28i^PJ'GsY<>)7<+b$PWq c'jtT#nr#AXVBFX,pcM`%OeGKWT7/!SqaqH9@X57F#JI*FKA_/1:*s&H#XO;-sOOS&G0i`]P"^1jo5W6>$%Bs:HgZ.9,WK3DcQ`W,aP+4:s5AWjM35_1)dks,7`f-VJOsE;D:c)H=7FZ/VC,t'csDfF%/Fp*T<ZFj?a(oN^hn:]s)#:OGSs*$2S$;,>?@ie*VKUWkGTsa<9Ud,l;kR>/7jjs-eH4^j=VF.l@Tl7a,ApLb<HTN>j,?PmL*t37#R)TVNE>9'LjZl^+@ha;WR'X9FjOU*Ot?k+#YE:7G>nW+<AT'8p!TUpZ,+]V>rDPR(L9MJY>ap?'1 A\EZK$bliYn&5&oT<Yl>P!D!K%BS[U!j;b0pY2 L*gBC<m%C\(L=IkV756`'1SsB(H!-k3 *5Cp_??X"'pC+0rtdLQ*BSAV@Bt[tcP?DWT5b9M9X&04:dj]&+9"Z*Y](68fF-,%BL5#V6tDV%:U!+r#q<#KG?*j,nJD\i[d/hM)>lCjlt*&<1Ko`FXB\:*ZbD]9K#`-YKZ&+g5h)F/^=97iE!ApL^rdR?1".l(e)t!h<0lg^;6!4@#1jn\Q<^$LBt\;  8`9V<`g4LC(so`<% sAY*a.P'Y=M>q-C?;k!?knDk!pZ%%$5K`XW,b8H1k9,)sEbWjs4*AC;!&H6fafG:Al,0c,eWQ4>,lDnFSf.DK;*`F7`b$WmhO_ZdOa01Uo#A?,RVD=,@H-%;/\CBD/-Jb")HH!(0XgSnIhK[%b5-/h^?Wq0Q'n!d.NHig]\K`5c"X^b"h&t,Pg- W"[X(gqPQF4W/$GtB;%AJ6[#VaHTgV8HNNV2^rKR%R_"MU:Y+-Ms4nB,1#ArtADMSY=\dYXe<h>Q])g\M!2cJg#SPCHqh711ObJk&HV"qQ^od<LfK@:FV'm;$t^k:qE>*Jh2f/+m9;\Q"@IG$0JE/Sis9XS_2T!;K [nL+VWJG!s0&:@klHsX@(f*4R/`sPYR'>8og.[LK-Bb cq+Zt6JFbdaM\n;o,ohqe<mOA$3@5dfO-)pI,e#[QOo.k"Wl2h[Q'jk0[:4p!LVWA.+l\,1cRTL.oogstQ#6:.1=.4)9q92c1]LcaJ-K'n=W!^^Mpg`5/<(6>1r 2p&'i)&bEGE.ftQfZIsRh\C4H=>3M]d5@c+3?F`]MNZeKh:/[(JWbXNa]q`?F4jl8OJEQFI\>#B-t1r?1m_[I= 5:BHcP@3$d+aG"8;Mg#TL4.lT2A"pmGo@a"&nbID9)DCW_SVJeZBCClsPG/03gddPG7D@!A\Y&j5s93d:6kT'LX$Yt7gEP_L?(p.#r=*b-'sc@SE6F[(>4nn(ZoC<8AJ*k@(Ua(mCNt,N@b>qm,o^LQ9W&V^9A5I%Qh;RJ\E+\BQ%IoG(!3GO>l>CAi(a%mmB*\4V9(lAI2J%?7dS^3/b0--0g25foi="!]`r3B`ist5eWDsqF'GNI9q%#TmbQf.L#ReE<pcfAT,ODsQ[38^4 dQC[NUX3P9ZeL!J]asH>ont*o+oebK/OH=B+;*tiAsbQsnUFeLIQ?j]kr1rjM2TWiEbkmP1]eKPmR9/A]t!Te=W<JgQ4Q0/b`'Z2dTo?)_"hmsS0EXLo; Y98sYA;nh[NAKRd;0gbtB/A43^d6"IoRjt;5&j>>9A57.dQP^mn2Vob'5jY,5orT*p5*`'@'^GEG[C`A-saa<Y)pjZ"O++=,Y?BH_sB-[>a#cQUo^#>i+4H6<B!1QeG]PBn;8jSNcNlROM#Q2VJGS)E\":::,=0,SBCbO6QMNB.6FlAD"Bc!&H]M=f/>tEkHi4@6(]#W.HQT0FQ0IL%=-(!r9^!k2MWXTN-dt^BU/'"0f4tZ>gQ^4/6>3:kb!8h <NN2@l!ke8s,L*i$bemn\bX?h7&Hl(1ZC>gZ#`[kD7QBPK8AH9/loBF`d+&(.72#=JC!egf 95%>9#IF]0.T-&Y%IUD+tLR1:C\&R!rZ9Uf2>LjOMn%Xn; YMQ5C[f(UhZ3nAb,CO7LW7$^!o,bB5VRhSt"i4i::S=7J5X[ .Rp!-E5#FQN;+qI]7,R(:SX1%qCWK,m\9="cesMOMHp$pS1T0 \C^,?Jt;_Mm4]=i1X<C/\!][_>CD!spSN?1KInk`qiFiWF.]NS(HN]_bh:VgO7'\etNMBrm,/4>&o`W+tf4 -FUmm5\r3[ALm9[dUJ').^8);Y^`3P'A^iVS<t ^r_.4hA5Gb3L"oK2-X0CK?l0&@(O\_RZ+@__a_MCgFHIh>jaXGN/sQhOITrQaU"p&6?$4!q6CE)>Glm2pGe-)AX@4V,XDT $`)7npm8=e%*!>2FF^aXQYV_[2d5C7I_-[j]DE^\J#Q&AMW!$W]G3+N,.\?h>%o0s0o\gqVHL:%N]iL=]9,j(m/Ap5moYVK^T"Sc(\^qk1pe33N=`j(<*V:b,(#h;6rS8iq1A)RBW@!G7O&V]l9?B;Mm+8<-fWe]Zo5d%VXW\h9a4%4o`NKq0B/n<Qqg>]i1@%9GQ^2^Q5k*.$=LJQ8kXREg(8RK8c#.^FYVT@_$.N,j'sOiLfPX4ePXH;)c3jd-[9Te2f;dqhqs=S1Xcl&KmS%I(;Nrp,*7Z58NA/4OXlQ?[%3.2co(`#KCT;3SJejOR')!?]^^1^-UYY/.8 823gU]>h=#BjfAn=*&mDcSKpPsL(G4KgA.5%@acdimWp?ef:eiQ*@X)Z)MZ-pe72V)P]e l-A!=/Z<%80KA5*$0F@:Tt%qDNs4^e.Z]CFA^S"JhaB7r?A-n=otK*Vi#)<58lo/R4l).aDAeLSFsno`1Z#P3t2GC3FAal78/hoK,>'/'Z>h`:8[-`^7G-#Q7d.Vp.O^b-\#E:q86[UP@32gn-R4$-dN'48YiPh=Wj/H.K[^>0e],)7j6tnNq=G9(lHZd=*24"@WP!\.rC_R3V>W f0CF;SKZTE1ZgZc?$p&`.eE]:5^?<`]T")RtQJiXFI%U$Y]+cc[ 33SM^_RGC<;&B^XnoL>"4g)6RaHjX:)!P%EA_91FCViV<?f`Mp+$9Q'@=01Ct*#SLa.Nm3aJ#E/iHq1+[%F0!VN91T[02@_*^D^ng:#qUmANIgE7S)_,@0RGs^n$asRjL"/[_dQ;WB(D@i]m0lDbUF4HEd4pkdbEO-I@W&S0#J-G;R%`S-!BSR3'MP*H(Y]#kOg_4<>7)"lR3HYXWpet\#r>+f`X&g[tAHI9iZ+RB*!4/jP:Wn?`*A5Y$b!eWe_[Z$M\<`@OQm4&(RWRNg4<Q-K5Xk67/??eG+CsL^`(#GWOqedc:](f HK9J\R>@k^D(KhZ.*?K#=On8L5sGd?::5C67$Aa[.t)9S\1"(id(R)-O5 GIcCO;05;l4;MQ4)K^-i;UHS ^Y2]!ac8r=K9#i0(YVENL_>WO`dk'?[m0AQOSqX_UDGWBkhS,.@W)J6s0aAdj3Tk>I' $ghFc!V[+,SS!:sAIg*lao;?1Ule(YLR*M5hgS0sRY-ULD%8"6"Y*CFA(V6hW%KE\=V2D%:,63r^g08WZV:OD'?-pdNq7Xs i$aSa^,'saNZ.?M+g!YO(Qs]>N?IUY?TSA)=5QmS!@%U6W!MQ#Q3rS[tnb._ab&BM,OnhAE$QlJXT*H3MH$jKa.1sV+aEY5p:[5LgFE[+n01)l/B6iA'4kB6NV!#.,^LAK]r9Yi?mG?VoM9RkW6j96cnWCLG`4EGS+b)'_!4tAfYJN)H,'[:^'7G02\eEZVFkL^b1C5V<N/QILA0JP4N5e7[lRZ!jLY4#!>W5%-HC5 Rb8"E%5!fJ#@l51_4a+j>&\36@h;AW;GpNcg)QVBS:SJn.CE*(5p'FqT_fe$8=ILSaA]KqU-'S-51i*AQU5d\m<5'VZt_nJFYYPa$h1N<aOY7$A=DAQ`pQ>WY^[2Pn8rm[^A$K5!86p8g@_m@i6oAIE4ScABg2^@1#5c&V$G%b6qXMEWFP=hZ1I4@2,Z9OE6AjkPDrgAWXS!Qk]M<*%H0ck/5Q\[B/%)R`\]%?/8K-\VM3NF$W1s@Dp=6+bk#H2KV`b989I@RUiQ2[\5LJkcA#MD/ah$-g4GFC2&/>F][OmO0nT'ATVfl+JtK?5OeOlmXOsmW_]2:a-*#!EDefH(RA&d3hBVH51b`JNNcZjFmZW8LhhCfRdsX_;[LPk0^Amr'Y]MaFM>&"Ah@5oag&U>0sgOh4mqCk96t-5CDAAIrtBjMt6!'K(j/!Y (h/'9m3N8:?B".D<&37kX3Vd?kdMId!r2N VO :#/M9pebF+)s8_`k-jZ KhD<2Qi; ]"&.X8Yh=`_iN84L^>.,okJOs#e\:V9)_As;W7&fsW\9M9A?bpeq4[BAJj)^GanF;dRBATt!MoskAbDbjmkS7)(,J#<3n-$hfAM lP\F0Go-'khS`KU^>%d>-ROR%t?Jst90nsR3`9OO+mE6X\japPR"54,(bhMjc$";$h-e_H5=tp,[YicH^1Y`<AXO_"0M`/Mda?f4A2.oYt0CKf]+2D$h@C<>#K5%o%)D>QD:  scf`r2dgX">cHlTH:>O@ZHq=r1MS^$gGN'Q'_MHD5n%7m9At6WGIAXS'%V*C%I(Hc@=aKUe]sWo LZG9-<nfnSKC.$E-4H RAi9N)C]jMJ]]n713<10-g^4@GNOiKK'M;3dM%Zgns9dALe!S_;b-N7\_V6-b ]Z:=+idPs8X.[G/6NRd/i$760^(&)m8U:sq/4TX#[Xf(<Oc[[%aip8`-\7$[o[(]V]AKF[4"T*h#4KapX^t(X(<?A./%YC)@F66Q&R<U7kl"G;"OCU:G;5bYh(Y31:N=F\]eaJBW0&'U3t3N+=b$$4Q*i`%Q?GA6Q qf0#0,: blqbON(T+J0$D<aD?;-%#`'Qc+bh.7ppWMO@a#^$l^+#Jq[B7"kYcrpXURd#0tV!KA^@bn@'!nEW=i&o .-Hm[.B:Y&q:dT+Jd)4!/:Hqa1R;P"q- s/a8#:BWc$^ VO2_\aXPY/p[<@oIPZ.m_&A+>?USAg,kG:bZNZ\<GShNa<t)&ROnCA1S )RZ4@VQ<`6'(RA>Q2Z@-aM^l5CFCQKa%(M=APehR>Q;-8-0P/!-'q 3#apC":a*D'E*a9[*!Q^"l-Bf=@@Llb6AtdX@D]E)T@rUe^+CUqm:o'']Tc>hSVnI0*mTmJ@r5`k9@Fk`R)2 ?`!FIV[Km(<W:a`+GdRnS^/q]o<>Ps)aAdN?*,Qk!,[^72@"0Fc!?'pr2jVr;W,Sc6>C*Ttp33,+@[p,/0^N]>b")p*3^c:p1UULHW'`Be"Q]%:>>!lJb:/f`j-Gisba?UA#G)FA^tE[=KQFMt-s-NVI\03s>h;`@E-D6t_6L @ Hq(Yf[.O(@;"<em,i[#LGKDo>R2i)7l/>4_`_NaT19i26)Jr_+d_$s X:\&;O%@[( :%Z-,$!9Ee@r5MHL6G8&?^!Adb]e@oD+9ghjPrk8-A&1KfVNA+1Yf1;04dqhb-<>5[#LJU#;t1K/!e;]$c_eMG0s+F%Y'6$A/5GJ;U])jA/JK4Si03G$`^7<RL&jVLMFT<-ZXTDbDX3ld1)J1Cbhh^/B\_ErP#'X)h#l2f4M6tND7o2H I1,[N6(Tp3Z=eZOL(CjFp$:kqAnLJ9,LGG>A0J@g10a;Z*B3IjG4@@R$G&oYI0W=!m6CaZ96WZSC7"=QM=FKpoGA)m`Md7:.amAMa5BToXgk@PAYXElF[]A@U\>AAU]t>MALHRkqRZ<(*o8coNQks[i(rlXl1>/#Nn2`GSaAE=ab>6Rt_` +=p'e9f#9QVU[#UgLV7IM*&6lRf8(.'-DNK>ZTA;/hkV`1&k+A8n9!6JO(3fb_;O3.[ QX4+o^09RMK0-'bi']\J\g+#04UmYei)g]%=#-ZG&PYQbY34(8D$6Q!PKT$+U2CrpR"[K6,\XAL'El-h&TJ%VJ'-qsL=qVdGNJo`V0bn[)oeX7S"qqLl50T=h*(d]Y<Y8VSSdiF5RH('QbC$Bf=O"D67NT7305XY\ h:D3X,]a0/V\MCg7T)g1dsbWM0GtOtk,;$3+aorA_K?1fY$qajObBWn#$1s?ht@SKDj"mt5niIY 3Y-o/CU)9sWM]_G.8pk?P"3S:B<@$PdEFpqD;#,+:T[K7"'ABO%bFMoe)8H!AK]$$)ljk)'pMCI=)J'mo!5>o@@C)+)(6QDJ_[O&I=[:(O6ABIPAg"jFg+gm0=kl,GMtT<#L@<Q]7Dr\'SEZo> !sjU%S85O.iG`1SptR!Bks[AQ':h,\FM_#p69ZCI:VR6M1M/?ASYkm \ng;kEZ"<+31"U@(`*ar^?jd&M5Aie`T.RNs2$H;0BZqep.33K $CsM-4)9Af16*)TE>rZ+5b0;-"' &edIKN(`N7A8)8qsrW>)_s%d4f3o)lsG9jMBG ;1nS^#QE#YkA?,R6R>JfK=%&j]0*(&6p3icNN$h.:P1_t=!00#0l!SXlAPP?>03)\99)GUBkPlAWf`6&?@!l.BZqq8D n6sCeXg%M:EK2`%m1C$_kF+PW%IS@.%9s/CF(Og_:hT5 MJR6W<-:S99' d!:PgHA=.RG6-bUAcd1.5eY7&g]Ca1,;U?XLD]J)\l\rkG=Q4ML#9;HD$> i:;On'i:k4G:%F_6i[FG'2V<>k?^b6.lF;leO!G<Z-8O#6C._b409et0Kj5+R'>N>`T]$\mH.J9*mdF^0kNC:24 !5(S<Yp-EAT\_FUF(H n0ZD*M#Z' /.kCt)0V7Z/c]O3Uc&s:3r9hrb;Z,1@i]1SXUBH31IG0TC*=j!LiqoAPG;seVIL,qk`!TUl6f`n=R]YGQA>@X[AJ7 Q2h[K:1^Ab*J"56tm<F/d)&@'B/5l_TWcaVrsH@:fBV ?@,k*A[A$;=.%cI/LjP`%q2ERL,Y&"MX&tP"PP]H7M]Sq92W1r4A>B%7$Rln"q&[h&=,BYh_At:?asAr#-fM)n]lK@%lA)h=%.%-X+LM8b=K9`6&<oH-4n=2MKM.GK,2-<i:#U3cl$9`$j?go'q<H1PirCsT]NA"&O!@./N\S71$T?<Gg@Z[pLsh6fn/46s?PZGT&  sVC/ln3O'Y@ Cq3jnT,3RP^+UQVLUWcL,mQhb2CMk?X3dHB$W4$0:,e89_Ith/_BH!!e_+BZVLE_CaN(%+#)2TTG'XgiVDP78AX*qS]'XFs"_Cs.lJp%J.7)dI?MIQHhBI#!]`cW-*bXoR[Z%d^/;3p! Rkhk:h70^!LF>;$0<iZm8b@KX)5^%hN2fC6'"Hs+e2ij=`;RHdXch*aMf*;;X-Fs$_)C$+*Gbb5rYOtpcOX0("e=j[O$D4P[Z=) q?4;)&l]I; B,=gj=/DlS(7tBs(a\dlM6E=[" A&/G^`")L*M^Gt=m"/CSJkht5$eY4I/(Ar+-gAqSD9Er<o8r;hYj#@rA:H*W@SAi-ApE-;K.V&Sc;LC?1Tq[0%@Aagb11@</ lQ0_2aaXcQf?0aT,;Y$iqdWe`>D,5X$QHS`hNP3m9tZN=s#:5kd6!Tc=&LW7br/$?6YN@L0E4h/Y&:DeAB64,D!osg%\Ij0A W(0A:QVGh*ne^n$m%K0tPW969Gqf85jH[*=2;8V%gpHV3KH'bqZj#i]QImc!'!rKVP5AP6l1K9^T:&DmQla*='?X1SgmA>;@'>K!n7mL%]]L+L_)NE*c36S6pRk.&P,#AFhISXq1d:(E@)ltEIq2Ik&KN[.<r%g]Q\-FiNh/1'$/EfYT1P5n=#9[AEJZK;pMZ$D<gj;F[!q^MOT\MIjM9JWkR8Qt0(4flaaE.t\Or^!pR*hS?AP(IG-H--$XOm?TE<H7V_UWJA@aEX`I3'H)@b!#obCq`4b!8_XIMlshUMAW*R'+,M9mfI)jF[1H"dA^AJM]#fXN$Af3F6"a9]`.!FW8h<gk;nliho6mfgYmBs`(r=@9Bl%&/STZhMnNkqA4jX=LjB5aN;a:(pU[@e>Ln(AH\qqX/[87\(P]rM3Q[F 8hE:![%M/*2V3U.Ncn$8eT20-@NA*RNt%p_-"W]/fsC(Nop\Am"f.VW[0,jQfLCPm#XBBE2U^sV]<H9&NTO0^gG8 M$'Lb2XLO,+Lc7+pgAVV\NO/=@:$5ACqg3$_krG^q:(KJ;bRD-[`/`$%P,ipR*5Ns+f@SdO?o41O6gPbKd33[NQH%;0S;d(-R@ P<_;.> GasoT^9Q (HDl.MMKbU,fNR>.[N28U;d>Q<NcS*c!1Aka&Y@rX0abd\tHKDEVgKo5dBfS#qgsSll_;)EFE.c(/0s+?<0,m^76Keqie5]oH(KXX6NsbAlBUleIO?J6?a,$:j$!j6"HNP&$K\o\AfDK1\F@Ie,"AdK7=Jg16bo*#^KIm$`A],19K@*J3_b.j:Db 1 QAn<Lg-ADSI12S;,7F,EX#/b/D(',e8=sCVAP)nVQX2(Z2o5K<g"Kj1]I4A6[d7M+!*_gP@gog$X7e*3:2h'gMc3K;0>Heeg?RrMJ5diRlXW4OdOO'Y<sO33AnBs2ldD1]`67W _`^/#+5(aC4YCA@lh?& ^``Ab<kk=apN&1l!:1YgajhalDN)Ek>SL[Tj0KE2k1A;g,+3da@N>X&iR*DVB$hgOrB.0q%iA[/LU!#f-s.1gh/nd,8cK<B0p-.p')jE[X`VR6-2V9*0":](e<g6fHl76l[9+TFDN5P=t;Qk?(tl^XccUe)QT'4^51$*NRh#iW@OC>*6!p7sFhgmi0a*q-g(t]^eOQCrO"-[SH0#0o0Z^pJZXOO`Z9EaV`C?^m#Iog#sYVgm-hfNIBGUR3tebZtKE'aN#Mr<QcE@'<M_<Q/Lr"oCL&>Qo6<1k,s(8#k-p4spe`o#\eUG?<n0!i@$F]M#.N.AVCZ.],UR--X-C`,@C"PUjhK(Q0N[T3k]79*lSX;DFl >- .;tNl>H9tlP)mr3Z$!'o+jX95fDM[t2"1G?ADrG9j7EM0<l/R1G]jl!>,;WB-FpEm$sE[&"::Pnqq3/@H(,bW,f/KJZimq<PPgt_AK\bmbD&DVao2:fV$Bdk3t.K5N\&h:?=sh33e\R2b=9lFS.P10#K.k(VeKncUo%/:m[L3f+)&8,fcf_k<9R[*K=[Q<nX,^UYSeUOG1dTB2,)-ne.LXMrB9#N<smqQ),mFIpR`gC6ct73F)hpY8N.bhVGhfXb&DJR9b-[" \sg`Dqf4a`mH7c1em3m<1Pl4KX9_`cg)b8jcVAXDIQ]dtH<`3^n\?M?,e)]P+RV4`A*CAN*tdEE2^ffnrZgAKXb"'@K'J dX?)Ka 2.>(WYlJ"eRMO`TXOpSYM6-Ob&d6S+Sf&+!Yg]4+A=qH5S)3d7*\mdiP?Amt?[ANU>OW#L8teRfSZ[^67<[f: _tX'AEHnAE[W.oCg8a$Pt_g`'hUe9L]R)93.*,M<X0R&t@#q\qkOhcn23?on@ZHTU-;\qS@%<;P:?h>W!-2]Z`.hh(;BT)2V/2m(LY&)<Kr;3*d5[DL&?fV[n-OCocEE;@Gs'd_.%,sI__2VpRl*CpYCnVl0l7O4V["'L><[1I">#]<<LW]%L?,[pOC<!` JKt*S65UOW;AVD#.KbR[<q!D&>[nSVMi+"9Nf1>_(KKoG<m^A[ATiW!kZ)F+$1Hoj`EBRBOaE;T>9mT&s&_k\g7%o,qZJDOtRAl[#@\AI&^*<VAE49^JjXON0(7pqP%`,!Pbo>fm!No$e7*4r+i^E^T<k>s/=osO'Q.<t')"5*1/D3Ng+c!^PeoFI?PIX'k1!?]NeMC#AGT"GqEZBf'HB2U)?#j<$%WZcl389349(Rin)]>`OSr_Y,L0TdQO!Gt#A)+2t^X?Li6\p+PB-4A(eI4$G<G2KGQCFMGB`8ae;T.@a?S>BrC47;&FdG2AB.#Mf-_fP#W@ro;\jcEr0/ct12[+N%<TWbK ,n &m!ZBKtjXU]f?C7\lVc[Q/PRQD#jDUU6<\@9Do%9S'n1cC3E#<*&^lW:VMc7%mA>="D"UF\qhD3nJCm ptMaZ!-bS2:;0P>&[T]k]a$b-3XT\-'P=KL]A%Xh70nX:Uaff`i#Pgf,edW'_GKg<gcCaiTOTpt/Te5T81ALM\++"$7jOIBZ@GZ@J1@d_UKg0o?[&'U:Y@4D")CUMik)6'Ob="2E@5\8mOs;$4SB/49L+hD)J;m_dSZl0.JB`=tM^bg4m?VN.n5o&bh@hR1&.2LP$Lb?gRk "c?"[gQ/f(d+tJO9O flH_$\84^ +T&5TFSD9B#ae>7)g5gYt_,9\L]>go,jr!tgjAOlRTI"3DnSX(mtXKlKgA9bD35!>>*1_6/"@)NkVS%mKFfHmqZ7`.LBR;,p=_Q^D63lt\Z("HjpNb\4^0<m%JoPS:ST9?D9YciCmG2iS5Zg<02U*Ai?nLJ76">-<L9\PU Pk?V7NZ'd]t-AZ'dlO+>U0cth)+ZG"<2g;Xc.n]L$btADVq.e"VWSL1rV>=4C=0;o8:9to5FBNO,nAm^Dh3fR1j,!M2*\*;0e(C_i,km\PAn/fJ_^5nfOMk<WIBXL);:7L3SGnnT5S]U%jo"U-,@kPHO$HN]/q:QQ:2X\Y[VBACe&4[=*FT+)Q,Vsb`6obVQ*$r$[@t-p?"I !6g6aJ% `Z@4Goep^#q!_]F?P%>8=>,d;!ZB(#TKmVTo>;U\Ckq5Y>[/b-JPf7L@tL#d6'&NBV)f],\5I-S:#ASCGF!XI3BH^=breg"m8lAAbV0k_BSC2BZQ:U5"C0Jo1GGd`1gTH&N,IhHff.UnfZTB_WfS2Zn.Gqlnj7sZS?L%R_S8m+P)f#BZ,.]jj9;Al#9I";l:4Z2-IMIZl\]4KFmiq=(t1N&BA8L[H0r[Wl; ++?AU3o.A6T)cjD()7_99M"mVd.S#"LIoicsog^EW&k?V*X_Y?j-)4AT?Jr^58IJ:!p2G/q;iNrQXTMOF=JOBfL:ZBlh"L0"PTK5Q`1p\sK0Ne9Jn[I@ P&/e<:,>J<j%XEU<-@Xbc:f(qMJ 1BQFad,.,p44t5/5r)Vq=c5(>!0k0iVd( -oVhY$&PS(>6#6D<Lr(322AeR`1Z*?O7WNHJW&_CHKa<5*h9@tn$GWmW1 F*:'A`,%sni`_trc;RL-M0soZs9N1oo7X%'D;G$;AeTt(5dm96<24-35clAp1</D+DBm6`#n>0R?@"/G;cdJJZ'kpIYjE0^W;XF)@6)ebFR5 D$<WN,Fch3(1j? <0DW?a674XLcm/TTJkg(ScO[?2nlkA6iin !4D"iL!/W.>i_h?4'XgH)kK9].eX,I+<KN?b#7CWVi/8a4R/a(4n>d 5@IUTA#m/_>^LdkKsCGg:6%?`CO-*2AhY=cAfQE:jq/LUfKS%Oe_%Ac2571+OS^:q\+JMM#DTiK$?qs2qAD?fp6Q'!4H*<07)Q`Qq/1++o)VCNW ";j<S&+-[ois:kC)MW,Ba'35Yoh1hR#"JlLPpPTXZ@Mr:fW:<S[T)tin[%D6V*KYcI=!;Y]AKQ&o]%Hl(s(E*6A#q@%S8Wdt]Ff\q9p6FEa\^GSZQ dSk`aRn!` :,\='EGl/n[+,6BK3J9OZWbV'q9&1'3;FmW`QK'?%mGGOIkX]F6\jDnTN!n=:2WnA%$?J]#P(@M97go#PRJI<sj3/aQqmt$Hi!!qKr6;?`3XP0bek6AK=q\$I,&^sNafelHaHCA]U?rX8)'P2qYUC:#I7>PMcajPaiR,"+a_3$A%YA]j5SdVR**sM9K!(V/G!#>0_l/:*MEAiXIPP&bs6%ea@Z=[;l`TqM1!o+<ca09%AQA dOF:LBY.8W=lki`rAUP0!<bk[LLFREC9P!dq`(=$lVl=Ct\Z$'lHT`EADl)FZDG('S/NZ4J#+<W5t3' VakY/I9^0;R?cc`qQdq*?C9R+3YfPmG_3;O.3QSPA2'q-8HL(m"RgelV)RW@H2!3ZrmX3h0d$<*Yq_P(sD:i,NftXn^C90g9BR!P\)&qNYte7U^BNWS;D6/15o&qtTG-H&bfsc2[oDAV\5N5RKA&[[>7mHg-YD?3m%1GS00r<P5t_Y3+jVHRR-*RLOCFA:="StiBqqsoI0fGl!CV]PeACc.%SA"gn%jmS/Fmiqq&3=X!NUBc]E%k!5nZaJ)VVX;9B+pI2fO7Fk!"Afkr05Bg&-_A<J9DYp'o8`oHdc;>;IIc<NalI7=M'^EXK Dc&\Q"P \29;7n1G`QS6=n].\*o1t(,">QW1EAK83'=;% a.Q8sA.fk2.Qcdm`,g=$CbdABJ)[&F*n')mgl`Hst,f?QW"`rU(a9([[\2Ikeb&,_"i_"r!E5\rhS6>^EK@J'=L"Lk\"A,VSWrSAki;r<'_nj>'B4%O*TQo<CR6.RE .0IUP_ngW5TZoJ]1dIAFPpgq.m)3Sm,T/j)kVtaIA7DDeF09<\^g1HsjB3jQ!3o+M$:I#"$Y)mBBNJo#Ks#],Yo4AW,l4F1rIegpDd,R<Dd<+R]d.^aApA^WoV,H(DCGGIU$II,4(A5fP;VVbG$C(Yr4$/3ic,QRIZQV`ak,"Rf_N0r))A0T)nAVr#`t$U7l&RdH,pG8g+$L#q_ 'bjF!j<s%^s$_6sII<2)F*`C=LJUsAq"rZC8%'?$DnS%Uj@Q!T*N60URM'o"ZGssBF\@aiQJpc)CM5cgc)O6Sih<!:g<7:gFgTA2bS .')se-8*&EA_ r.l&[0S/XJ\as=/KfV60Ai%,2!O@S5dF@*>1D<"\8 A J;Db)5VXGp.JEDoU&cCGK8:DqAh'DJ-@Q@9QmL9"3Vb6-P!IVl_aXc<WJ@K?a$.4=;K]6t5sE&ePgVc"+6(Wa?1W]]Q?,0/,l\AAA'$XK2,FZ(;ORP5jJ`<I+c9#A`RAKi\Y W9&Z&Ck[XP:[pf3'1Ls]#ALd.C7c nQG" >_Y`6,d<g2L/2j9ZCN@3Rg?UXpDCot0O$Dhnc6P.RX(e.#4_c>4W1#9P-[O^$-$XpP3a5TP9QapQA.3Y,>S\9VE-s%!'-:J3[>@E&RU!B^l`5[/]5NF#E)KN3iJDVli&(^APc=W;C\ts_-A DQI1G&DRaQ["gUk'[.-qf<_?7:DTEOcsA"WZVI!1DA?6jC*3"KF1dik<9ZsM!*!sIW9A]?1A3H<dr8t,XqXSo$;"tT2btf;pV#F $mi@U_#S!/F*)k1_.j090<s2%C gW+THP=kikhtj*?4nO(^_,-jl :[lbl_SlAHn]Xe[A*bGOM>`Ggn."5\R"m^cEO0nP`UXAT^:r@A=GtfQsYK QCrXn=HkrAMhY24e-qFNG/N(E?tFiAS>++fFKXh_MKkGI$_#BhA]fm7W7nL4b-3>dsLfceR=.-644QJa@%SREh[fB%lQ L2203F:Z[re0bL*j_M<nstP<:#;\VKQGLs'U:K]h&N[Vb4kQ&UYN,-D.[0S_cUkC4G1f70%nI%T&[rTG`WL'E`j:Tk.>qpjB.=$=)1F6rVgEehOOA?,8Q/AL@^'f.=D&;AFKtF1!qa38E_e4EY.Ul/.qMA-^'-L;nZ2+k<Pt&-M8'1HpRR De9',k/MIA?q;n:qXk!5bNdlG;"YX@G20Q.(djFLeZR@F)_\9*_BCp.i6smQsIXE>_!s-*Z\f?P&D9e`+T?U;X%EpP)+m_e`WaKK*S:f%.L[9Fsng43neJVmSA5VhlEhYV<4Qk/0$?7?!OIH7/%T+k;h.d?e;,Hp,FMVjL*]ZBAjbHL8e<:)#m HZC<]:3D\!gsl P%%k+#`ep.P@V8@FE;89DnX/oW*/Qleh*]5O=#eQ,h)6^XMds1%Sc?s*DXTj/F" cJ=\WI%pj;dpFa2Dbs0!g-JcCql!(t61`Lgg s3U-4*:f)@SG&dS.P5i$9[T/^ATKIBllJS$Z9-_!Y7[/`<Ao\GJT>QWbd]X9K274$"[1K.<(j;7 h=::Sm_hEn>l;kaZAnVtEV/C*f^n&At1FDY4nqJ=f=( Jnro]cA&UqH`M+Id@9h7ABJ)2&6%@#bbRJG5reK9l3ndDB]KoBnB;)/t 7QPTpk@6g(?q,eF'"rBXXI_-LqfA/cYARq0Ot?ANt95D3*f>1e'#2o*D^->`HJ(@q5E ZE%&hM'okp0R\*\MAAMoAMje-0SAU)%$\&bJ]49!njTfPEA*?AS`%2ecd)A>j'@S(Sl<W?$G-\e>8:@@?!]`;6o,$k#J,LI`T?.; DaUU9)#^nCkr,-I'/*g>QJ:O<!$Mp0#,ZU6jADjA+_#&8AT'nH pZ,:c`nBrO\QC+E4qCkZ.QgY530>l% [<1KRqcj"TD\'O&Y2<%X0(Am=7o#VXg[h9Y"@1tV5&#@--Sr.(QU.0nf]P,4MRAl7\_H7-f0 \M/l.UUg\t/jI:'Zs!r'a%^o[k8*/hA0g&Ht6L(^A6Z*l2HK$1*PAZCN5fM(G^nT\V^O";<Rt404c #tp_FVs^LleG+8!(Cn=qX<_Uk0"UClC%'`m@PrpI6jjGbBcrj9qN!#\"TWdoI-S83tjGV7B7?G8l<M:eId1JITBn\o9`$K!#/iAFG4GA/?a$`Ai'G,<7_C_fRWq`CK0S1;8IZ2OsS(?L%dABGaJ4-H'gOAB%OiiD,?0RT,cH%!tRnL2RULg(ab^X^Lg'LYXXo-'I":3*\L38B;BZH4D.Kjb`T,1$!(.3nD&geq>oobZb>;#1WeTQdB;9%t%E9PtXBsN'QkjAi_CK<1*do1HS$lVpatOaAWH4<pgIt]>`.*)7mP%gFIAo:A37TFF?Deh)B-PF)QP<'8p>A-D)\GLG+o_>+O*YepW=P[b]n++Sbn)0J?@ehKoD?VSmHiK++E\;$,#?,j#Ks2a!c3_R=K-DJ7.N,8aJ(gIfsX3c2)r]W)=@e:!-CDW`AEM-UBa7/MCc\GVGa"C+pN=B6Tc)b-jcR)?`?ljG1'4XU/7j#qFqg8><qtKJnQ0f%JsU=-b)&P>@MmXD;,%mni&W6U-9%.#A#J1)j6S:qe:7HNrN9f00@"=@g+o'=bA(LB(#M2Q0#(15*,#hI=0ei7nsbYW?rl0Jh2_'m9.CLpb2f^DLI4'h;kDoen2D%[njMd*]Brq',GS%4Ti'&lri]L[^1,llHKBI#LA_]"5F,^ .G&,@/ATTj67<&QA;A\[C5bKT>p$*d"-I?X+RFd=Pcm8WOk-O(+j[0inG64`nWU)>UX2K+8r9]8s)NXL'5L)Tkn/i>P\UKVb H-#/$Rk`J%S<Psi0%O-NnsM1Oji&rEJ AH8Ie*Anj;:/?aPA?,q+"rGam:f^@#Yb>ma#PO/=H+gBY"1PWQ]-$?O/Xn"k09lk-i+t$&aEV!:tgY?5>k?Q"f9#HmnZK!Tt$5Yck7V3c?ngJ7sn4L8'kW[U7CVAjhCb`F/Q<RU*3?kSQO83c!G]=76=C6OENoL"J>q/6rP6-eIQ[RNfOihrr%[ta3RXVhh2Nj4A2Wd&<;sYQZXpo+4Qgaocf]b 34B;59\?%Zp_8TBbO/`4g2lAm'H/2%9/;eP<peJ]:)M'fXA(+Eg^cAU/Js6CN_!+1a'\8nW=XQ6T%"^)&U >-0.U`[,SOYJ:SVE][itH,RW"PbZ!MgHV4%[&-9LQS^O\C?B_YL%W r1/\2l`r5r-eTKc7:jRFI[3k(Bdbk5$3E'NGeg#!Y),<%'`Q+$Zh>N! ?K0:2:H`P`H1mq9kG+',b]^`-TJ6!VDE kXq7ODPC'db<HTc8Y \?'3<nWDGj46c%C[=8_PPcC:H@aUJQ@jc,/e5i)MRWBH) 0] jf3\+UfB'Ks#WP"QB0i6g0Upn(Q-a:n)^^o\sh<eGA^24 "`@[8;.F6FtXr\N=5bKpt!>?CLLWB<58:Aa3G$!YP9>FaE6>YRi08]PTC*GQgeXpnS9djJ\/8B6\i^40"ZC=e[O:-^5'F#3B^MlD(j,SCA\OLt0@bK:_6]i^3/QrapY0OcsfO4F-h(n\FqE5JT[?s?qF._HG JiHBZ`;*b#m]=(2%96l#.!rYe4((6K>DN;40gp@=iV_4=@33s=!+%_Q"N.7W)Hb[_/Kfh_gAKBL*NtJ-_!U(ms5KnL`.37@`C"sO-R#rNf25)WKiB`CM'7FJ,!b9#&+:J-6pb52+F[XBQN4WZG1fJS!Z*s,JmA6[KV`g+q6pq4EAc*5!WA80f_Q[>0]2*[tA<G$Aci\tYO%Z?37[Xl-8)9(<'F7r'lO"^*"rf#h1Vi#6=TtDmi0@#5D<ebV8SZE/S9Tc*,b4e"ODGFVLO8G=bO((lg##k$-8A<9-VYbi6Ai"OJ/Ec9qc!(_P2So@aOB=/jOML8m!:;+\/;LDeA&:JRrA'h/0:$)`grlU5^7#[4)Cl1H3'k/Cs-+dDQ<i'(/9(320V0:NpUH;)Uh0>3?=^Am`GiK"R:N7*]<"c4# ;gZsp:3<69dbiHc7CG=Gr1Kgr(rt$,e7;.(oA3C1AfXY`q6pO0%rB!M+a_AD4Pj46.O2mI@7n/Q<[@,n@t5C':,T?AN:^[P57m(nl+Ud4el*[,M2jn5!(?2'M\S*7n(EK$TqA?THdj*g"?.YM3F'\atVAkckL:E;CKEA0_!dMc3n)h\Or^A'YiLPW&I3=NL.Y+B@tATD6MJV]=j[F8N'W*nA'hWpm(^(,*p.[BYnF84Bk??ZfX7(/i3_Aj=fKl/N&#kIi8dIAM8Q5Z%.Q2A"KfX/or\San76C0)s&Dlc!MY_R+-f4A.H;'$H>os4rf+#>f;'9)t7KAqc4nj+cB9)%]UrV6P\pS abT$k>HB YaIYN]j3r[RM;I&#`T-ADV52bqOo->D'X,3R3:=f/$Le%Q#g7qb)2[]^mJ<7+%N%%!`#A'L!tQ-s?Ri??bX:etWR_)R:."<%g2VUQEe(&'H%/4k0eD,Q%g9+ %O9\0Jam:+d5.aE+<Z-D<9F9`_HI<hK$B9r<]&CT,odGn,&_;2sAL\^CniFnAEn*&8FG9'87D" I0OPOhWIHT<GB%N"An(M6OUjJ>):XrnrDCZ)J1MO&=)5G@<iNYD%8@<GlIoM>`bQS[Hn#E)N_Y$j'^N[&!^N.KL!^YXKH6=JRr?)Qk$_c+N(38A=_BrTSJLh;s].,D^-)U]H!*80l@_XA]<'iCPF$#ZGM'2,JWo=MP'&Y?HlMKd;Q7L<1#U(3f%8"iSNFfh.iFXTSAJQFgYp6\B)[TI)]N\ZNti]8+$OKoF=eI"AhS.VcC?E+7I1IoFV+R`]dJqfrF#@?01]/QVYk!n2aiq3,RWOJ.d!VR&h.RRm5"C1-#hSAI1NdXhq'b.MAP#YF"Zs`R+Uq8tV[KQs!bOlAG35odc0aHh=3qirWA<ON^=YW:_T6+CG;qT(<HF>d"?Z6I^.4lb^XHM"'X4E=[YDbS%I9pR[.J"kY6H,)2^Gk-K9SiUN"o/S-;0_sgoNSsh+kp.GAX=J5,E>\l'$. LGU$=Q$Q..^_Y%gf<X<cAI`=IC+,aGb*3U4Mc3k@gh58D<DZdm(+Doc1<UYo.2a7XCP^0=7Y+=F2s>5ft@6)hX;6SSVD(<tbBW8`MVq:;(/-A91'9P4<Q6ss`87+P$@7]V8ff-kaY!*ib'9>2ES,cA,i9;&9p;U`sirQZ[_n_QP/,lBIKpaEs9=#l+*n=cJ&3bto9DC9UN%ZWiW?l>TE26L`D%lcqQ:U_Cf*5d+3%Il0k9>Y7D[r`#pPm[8,.]EiKIIVY:jI*@tNioeS-plYcaZ3YKc^3rUr8kS$a1:Ulll&Kbcs8a)cCXO.n_/?DKneYMB_AlA"giW'AkkjhA$5#Fqo%4khT_2ABAA^QI 0JT>b/E`r!bNVVXXNG!.*]i!PVfh]MT q@rt@:%d3mG8*qq b<17hcTcU+Rk ]d#.Aj0:Sgh)R^:MN6o[R&2i,+GdVdj-0-QIngWG;N`$DBX]l)K0%n;3C)A6$N:Uqp^=2(XBb!]&AS;Y1-;)IAY(o*3,"JEAmOX O/R`(q>=0P(3`rSP?:`mR3N-#En].K6e/h>Qf6[>WT"*pK0=6cMAUgL/hR=e(%Gg"nED KptIn1S_8P(ab9M?RY#^]G\3s(^qcq-6E_K.]hRDiM"sEU\ UWV\4Q7h;[2V9Z+dj!(E+W/Fl//UFb\`QLN%>YdO90@4O96K;_:M/4)W*Kj2e,QZXo!Xq(l@6<'+L=c_?,B3VA2AS?AfU<CkU%`V8&r'fnT  o4;XCg3cRmNp&XF`B/3F&(kD!Q)b.bi qO+=B8G,d1j@Gq&f9NOA60V4'm1_A!?Q4AXINT%di=,ih8D0Ts/i(!'g4/[/c/hN+d.+aUOOKGDD_\lA%-C8e%OO`91bt=gb<`2U'^K,Ujco)rreIN&b`HHJJ*],A$ 9d'VUI5gSTJmoMaidJlfq$3?+/1N> R`X js9,kLt3$GCS%21rQ9seO!e&@;3AVdl)&3s@HCfAj:H8l,UUE^*b!0Q-AL8l\:^#2+ $KLAh&@C[(Sit(tV27A*6r<X=`>lR=>7>6dM5hHA8AXh](F(==jB"mT&mA],Z#nU(50e\=8lQj[Y3d\N/XQFsHs<bNM/_:Yd+-iY2O_$QG=EBqmg,[LGP[d0cAhd_aXZ]0+TY<K]oVr1+@<?FQ8cjK<b3 ZaTEn8A./T>T4&`tY'*H)m!ZR[$T<V99:HA[%h_>?^Vdp,RI;oJVfKp::cpH:\POOh>7Ye^I1aW_BoEl'B@cj'pk]]3EcShAoPXg7jqHI6!KlVl(kb1"]6W?7c>Gg!,;<l2Z=&@QQ2CACig"q!/F`=8_)*e&Lo(4f%7la3F=trN7i95L2$q.@5t !dO@1adiG7"h:7VA7j5m3R+6_k-6hBOgIi0st[<9b4O1q=HOfJk7"TPdB:0NnUf5hg?HUhOO*[9j\=QH6J!fe/f1F/G=O;A*qHa4\%A6B*oFLtVLhNZ,=k'opTa`ao0,]onfJC"`K,CSp6K50ID$C2'A#,)rQi" `bdXVd^7L@5GZf\['!kXp'Zt$9nfEi6$=&C?/7g2$gr58BRQ=*#j8W+J!*,GO`\`Bh<3gP>m4<]'.XQ[DcUA.9/UnWfWBf`-%DTS&g*O#NsfW9P#Ags_HW'$%0RpUZG&kK45VaCW@;7TSA4,[Zt,,-@b18*@BY< ,1.Z_nlhV;:SXo&TpqJGWb99j^lX^,qY>%dSGtf)M'FgMW,*c27@0]ACL4fH4HH4rejDXr_T@0IA+LW K2nA^0ZTG:[B.s5J`0 ih'!10=[:OtA*W>8Qin#'1K,OrS-,1GT!,5,+2EM("!k9RAD=M`+p";q!S76o79;Ii7g"WD^DOT$k4X7E&-mZj&GfkZa sl:G;(05#jSq1Fm"Ym9q 5K!U.G%_@Eh]=,M(c5G[+:l-/)U,)Sl*%A\$3rW$X;AOXhAX'sf*7DBTi>9skJ%GQiYSk');4L"tMK<\(HVF%E&,coajVoUP^V_T5?-!MIkCnGC-m(2`<f  :ZE/XX1XY0A4U^c,f9qs.m`cpdkX!fH*:og;q@KEW(*enVX&$/Cl^' /\EU+NHe!t+I1#"(-h1$!* Nrg/^XG%AWrVIM]]5AW0i$n.r=#OS:E;gk@>mBGWj7(5T?(9AQ )0tYgAo?&:U=Bm"7ia[?PC>0)_qWWUU>/jP(q)+OWn6LTW \gfa>^kXsO^qQlD33@qAUseAl> "FdoEpAY7jtf1mJNj0=!/sSpBU[Ghs\q4j0abhL,A"f,4U:]21a*5!N$p$&9<Q1Z-8$jrGkd6dK+aY`T8V> ]0A;EOf67e\04b.-+3d].\mAkfdhC=@.ZUgng!9dqF$7R;l7)&lE&mjN$/"E,<GiEZd?i61=hFVp<qPGX(j%-5*,3&g=&A@/m=9Ai,RaZB/R>MAsGAQY<4&AF'[s:lG JT&lO=[ck6$$TQl*B@ViB#gPRaNF:oKs?GHXm$91<\D+J#AScG\fPC_!D:5iHm0QoU3aUL? 3WB>`C]7QB]pQE,B#!]CGCK66p%EG6[8AW@"*Dm<8H2#(:Fgtae4#<t,!W'TBsO,"ns&9&'(a0%.jNX@92"p[_l=r6*A>!&CAV*?!A,>/5j<k@nW9CL 2dD!!.#VUC&X&+Q@&+KMm.#oSInWX/I@`g)4Mh[f P+X4sL,#=rG BAaPKtP)`Tao!aE^_Neqd^_@P1[%haI*`)<.sid4>()QJid19Wap'025k,sB(-1NVt\KAlm;/6lnQ'=$EoDl(A!I^6?0JVOO@t5Xj6a]glpg`Kb$pAVC`$Z`%*t4Sr^+3%CT?H'Q8:_C9q$qeDB2G@&NAN?3"2ct2!R`J`_Rdk<[2?#'4I-&eWNbEcH5O^A<,45kbAJTng5cjY3a$@#"7D>DgbL_oY[>2N<37$)A1o52B\fR mdT>'igh2Ij)VtGBU\6;<?g$APIHf EQd)f%VgQ0 &cdkjm\W@4KrXW09na.=?s?6\fF8f#<A5dDVV:peYQf+2i`FH2l+5VNKe+JM2i>d6C"t`L5eqC[KAaP4XPLQKYB?Dhmo?,Ul3(f]AdVF6E,#4?N;@+d[fAH`GcpAl j %m>5q\/=_HrDnj(S=l)gqNXXt5i3tO<G++Yp&["Ds2GdOLaD%Y2sBA*CF599bLj4b))R(*Z8_Q'4A.AQH0RCA3*(;3i"Rb_.QK&$mp56-qQftE;!`5[P"Kgen1K9$;MKLiqCn]Gqf2r5]OUOsM3krBF2=)d5-*1AWrcB.=cQ1W;g+C@RNYI6k6e3Y&rW6XnlOp\OeD:-Kf1:;2HiN`_97?S(,@I6saUZOCbQ,K!5MY!>l$/3P!5&dINtg7XbOR)ngTV^`f1!#/<A86kXZ,?pIg#5>[-;Jp<RTNAm<5KdL)UHC'0)QMpcX631'k($pk^g?nX3\]GMF\g!:C7Hq\="A61_\obIP)fn@S6LR"SiA//eIY%2on`7*ER_3&nS6\[+?a8i7RC 'nACe9sCGZ0\r+A="S<W,!PAd-AABAk'KW@qrm%FtB.R1hibc*@\W=DqaRY?Hp:(PX[*`N8NBGr! 7T\(:Yc(A5\FN+S$(\7'=Z^_^m;L04$/r1D.*%C`&4.Djr<AU<.0FoGF*+<`Jfqlc%4Y?;=$3T*.Lt%F+J;BR%LD1g[\%"F:Ao7A='QA41,ArGXHZ#9 Yr]DnmUGYqH;Z*A5(n0M&o[@"(hC*Y;H AD_J4"lNU*DbhD^*(M11@4bY\)$G]Nt\FYG;>P?kH;W-QAb*iqI'Zcp@Q\P?$%*qX,Lnj4/YT@1Am[Q':WYY[s-Wm;Y`*n ]cmojAboKS"20Coaf1"(Q08XsBeVUMLN`B]so<]%1n_H]9l\j%4)-A;0%4o7H/:W,^`T.YXmMHjQ64\]M#_NG9q<=Kf;(,=f`l%Fi4YL)/D[Q1lCJ1Vq6kpFhBq$4TAVY%<Y^-53WF9hM9bpa.b p*O4odJkj<!lj_E\^gAq"95Rpb>%Jf$@9VtfOQbhA%%AbJ-$@/Tgf#p9ndpjVhjT:L0e`lJABr5<-&Mo/+m9:.)>SZ*%LXfiJLOT2g)HM,+D[U=7hAO:oLej8=eg7#`TK/@FFm8/l M"oXQAgoEK(]IfTt16t]=Cc9t1RKc+1B9ZHU9B+Xi:j^Mdh;3QkL42'MUp$ke?IdFVP@'>-W[PqLNLQ>P<Tm0gJL0NN2dE3]WANDlOI]IK]R?Z0MA7E_`n!UR<d*>[P8Y-,ZtJ.2rlLo:pb1AXoKt^Q<k/o p"m\I2'A[20^#8Zc%]6hj@_AEY^S2:qA`Y`[g1NCYfh.Qd\(b.6.j(/k2;` _3"c_:?H%CE :Z#< .>l]OTo/5DMrp_DDiAi#Aj0];_#:9LB]2%Fd4ni(*BrD=7D*MfeX"aF*0o]Tb<4mN;!J"N#g.Z<CR$@HhB=/HP'T>'8p>8AAqrY0< d*PTA_9JA6<^^cW(E2g_,.O]B8XR<cQ]fAXEb6=-"W^IKSRoL!I5A?ZYh))#FZoa(ir.?JaCrCl;SQ`5alDo:jO<0Xj[o0^=YhC))"GeL-I.c.0>Hc9 g_1A)f(*o^=.TQqIGp1>6[Hhbk"I"rJ'D3Gs2*IA*['9aiT%<#+UB@_Y!IL/`k: GSk7YW[">kK=YP[aj8^X<`&?;*189@+<op[&I@3[)%dH> 5A!';)=k!n@&>K 99BErIqF^-HYH(tsdRoAD,-B>2K]@SkUBhFWd7/7L>ABL-6[Ai_!!X9khq_IRcMM<_$/Y]rBa@t+ab/`maX2JBXqApH<N!\6%Krd=DW]&Tr#r@ItH_3P5d+f[rBa:!S0Y)<]<X)A3WT#Km`-9]%sePdTAeY'[H)@#MkfcG4/j#aV^t;G_$e=Kps8\pSA%s2^1@3\V.qp:U\N<CYZW>G[0>sq@o]A-"EY7f&\VPn)A(%H65WEo.?d>CJBMnB/sEDOU&6_OtY,.)QE?j-`;qF[MQN?[%l<W;,YP0BjF/V4Oj$#VYP.e6kpTB[:hNYeNa8D<VG6@J=o?d2A8rt4^O)LR3mnUWGH:OYCP9)e7;gjLKJKN`2a!M5jS5_!b3/JKcHZm8TJkeLA(OQg+M_&SeI:h5+rM3&cHs[#AZm'C(Hk.73t3!@bhUjUj*b%g6k:d\2K*b5EC^-6FkF $3,<h;-lZMs;d:\2<DD<pX&@+<s1ai L]]LM8N[E>(8M6)6(50.^^!8!GPGer__c-dA:TU]Jd)K\ oC+,0tIjPR9:Y&jMEk+E'p<W%IQJ=2g?/tK'0f.fIsHECsBOttGn1VIjb*LUh^h4J4^KiK0';thTCtSt:L8ke(?cO7AH3^\G,4*Kr)aOR;SE1ECNp2W"E$m(/BQr1(^kmZ<X%hLKID.XQ05DT&&?RN./Q"!HHs^N/ `F=09o'*i]o<J,Xbr3$`n&XC[tt0C3Z*9$SPo:NnSBqb4W[/E6:lKc[lK<pMr> Z?-S?>Mb6eb3(j[+8^-Il=2<#/OH2hT0k>Z0[[ssS% jc&jJDqIj05q 2H)_4:tIeX,9O#k<@3j_kI(\mG`MJRJ&lq6Rlbn(Z(iXCLs3W=D`7O=%qE/a3L@rF,2 LHMlOd/+O85Kf%FH:Z5th-l%DNoKcPk6qHA0 SR`ng%p*^tf^hl;pQaHdRsaNiPIa%H$Fj['!_2IARV6nks2EqA$2Fg)]/dGf?,7HMD)#;=[es(W=gOOrQc%Afp+'Mh<1#3mV71a0a`R(b0BEm%<ITiA8Q:$rl"^ QM_0(\Lf_X6AnUU$*:JH)p-cAf`,-<+k@YnA`6HR8DZi$1o=h<gVr?=26Om?E=KWiN1R-9+clIIYmac58&3)(78U?U4#hKm!l-/OWFWVH>H1H-j-YNWd338:"\d khVYX$npa2m\'p,$/C/,iPi<dfr[b0o%M<2`22AbjVB!SC6dJ.m]"159!!nroqoeTOcQ).snY%++HmPN#:9,Wb`@ds+R5#V<VFS0qrRh>jo\,'$+)$VA>fX(BI=5L$Aq9U3j6gQ#&A1,V]="AX["74tC$$h:@12L8BIYH#2`h>#p)8,PeYJR%Ji?f,8aH!N<j)5NT/k)!^[2mPGL_P9t%+RYM)K6[clBeL:mbt6f]]e\,J+_@s7+@-]3YF JY2hM2UW`!Mh\Hs# 1DU#VgAa'iFIh.&5.7;]3AG^fmD k;A9*?aS20KsbA+GL29'5A ZB=iAkm%i.dN90(ifXAdf,WF*Kechl>6oQ)I%_d[+0aE$a--fXo"o?P-J/5T4&& Q]@ZH<1hindE]&N?!fBjUs Nt6>.(*Il"`3bH2M;,X[_-tGAY-or<3<e[>jPBii^BRB6e\_]%/='Qm?YO=BmQ;\o>6CX<n8r_B7AC@:]k6$ GrWW6iVAMRTPLh`%S-PcHpe:lYHME/F<g-J^!DOFNeZj%b5$To^!)6(5LbImkHQQiK&PIc^biOj,l1(KT`dl!:A*D*V@&g.e9sJGkL%MZb-:+;=TqSllktIft,^X]W7)#4eirn Er?DQ^kBH:*l@LG6O,sI-:s!XZE\B%HfM]r`65f"#U^" &q/VYkjtAL,,=`;>b _jV-p9Gi32@">$<__8(mV-2onU;SI4D1 @+7H%d<Xn&4(>3Na;"0MRd( Ip'GR;Y9-U+%tN;VZVe!C ;DKo"FH69j$OM:8![&VrKWlmb`m )W_hT7m1Ki"lERR )P 7Roe/E5T+Yr6 aF/*4\VFg?),8H'0<19moRd.P:>;:37Eq)PLcE(m+c2_i`L9Et+a[%QA#dhT20^;fq4Pi.b+dYh.fnaQ`K&_s$;7+2DK=G2sBY=Q]D05AOSgkW;gMpJk]/^e_8Y'HTa@hQ_4 F4k[Q.X.gH9,Z]MBh:@O,%m1<&&%q87meWipq8<R?WeZ$;XV!A$\(`Bs?a'Eb-XM_t7h.Xc`;;*r(#4S$n&DX^9::W&m6ZU"&$=cq=?t:U5`VA"noeH2]01.mh2"@;Ahd7f8<rJ;jA.mhBYQ&ARR)0Y/W#(+X CDpTAmf)-\+qTo*X+i8:YP[tC#4%0S5jnpGl20<,1)o3Cg0\honDGkW#th^_a?cJ`1]$A2'dis/rfTk?LeHHnqh!^AZY>,BTSRh1jn2Tg]tJPjU4(J]$PGCb!jCYjt(=e51DQ:%4ce_e#61K!brrMtO0K^)Uc+qA:"bj:P0d-9HL2oj%72HJGJ^@Q)m7A(eMC"AM3CHg-@6plUUiJ-$M]0V!>^E?\M`Apcf&@YKq33(Xm]O`:ARIe@QAfsF!.QnrZ1"11A;ioWci%j3rETcn.?8[-b!^Am39b''D _kt,;D&^\moFpEbaFQk.iL0gsh!7`g=!=<aHm`0!SC=p\k;sX6Qhr)?]4U5j>Z2mIS/Xi%A,sJQnE^o"642#0$%?"&5of9d<..7 $![*BQ#DhFerH@#oL*K2[oPr=8.pr>,Y%l=Aqar\;<V.n(['6@5QItd[Xrn"k=E4jr_)A+N=[#Z`T[FALCVZXqm0C;DqSm),[F1/EV?kQ7U;M?8&]/ALe.3_ABnA22V%g?\p24; TQpW/e$Q;r<[0_6]d)8m,ZWo1sk36>_UVZ]YBDO[IjF*M^YB;>ec<Fl5J6r]dY?38)75?9eA?(^ZVM186JKCpO&gg,oX3C9OrB'?lR40s\97q+kpUMd&(=q3,L&b0)\FQ*A`r85d4AJ@.Ih#*VSXa%2D)/]Q4S-t.gN_!D&CdF)M]U'O!5eVR@(7Qt1jA:5e(QQ*Cp56"jIXl*U"8eA5&47p6[ZE58*c9VN$9+'n_2P<m[n@M"qFII*C !b6UM$G49sAs6&R,8%iR,9(PZl;L_+hXd<[?6T,:'r,P'Gp Z9 0/[D.((-Zbd7^fAAK"'5A=A<=V!dUic$<IGaXIjNJhCC`]O'A10Xpml68Z2L`fUk"Y;A[iTM$W\n$*[Jj((A12]cZ-0W$%gO,5Sbie4L-pmn4b:fn.bI)KhkO]&Lf3$UiPm;'^(LeLW(EAh\m/"LH0*]9#bk rpeJ(,L<q4/H&'LiBY&4B HL]@/dr#+!2@J"$2q?3sG4`,L+0\K.NC-JpU9VIs'.'';r<3skO&Vn;>Z@OO`!t#!jV7C%;bAtf%:gnfgDhkb"B=_pYmF6%WE@_2gV9-+<$cCNL]oAaM&5)m.GrSno/+>Q:^f&POh#KblmSf`3WtZo8.\TS[.6GLB+a6"%m3m38>n@KU\K90Aqn5j+,`"\F9Ya%\@qpK=Sa<<G"cLADD(a@]3Lr6g:EXR5AL4@QVB0a=3*oH6U+haOdOd/rANcqBd,AecrR8s$Hpq(^K(RlcjT,(T`>T!33fYi=[2jmA,/$ r0a.C".=aZK@q$$ Ecg_kl.5^Q'Se;=/UT.age >g3km P9- 2,^RpC[q?9r[:m GcQJ/.M$OO&b.r! /X b.[_\moe/C-kSpon'7eK.g\Apt]612!=B7BS+)h*MY.9Y5Nq'5l\?%6[Np&!o\7!B)6]O#nDP,MJ-/F4PKCL46[EXg->I`nje*+1EJQ4_Z!W?98AD0t">@J1S4" 6DnV-?T*r"MH`!$Ec6VU)2gH##7P !/.Z';K8R1Ns/$0A10KQ9RTd/nel7AndJRfEAf24+#[C/c,WeEn4/Ws ALN+QJ!Q5;ib-Ucl5>O\%0//.fFi\S,c)%,K!,Y_6n0^nD5k\;nmbSLf_l <Yf.cs"o#gAZhK'SBW1-'&q:@-p65<UJneQmSnJ E`Kpe>!GQ_&Uo!mN:kRl\=8_8HQLX1TaOANa/?(8NtU#i<^T!&ABOS9:^:PULc"ghLa6<9ms-QL'E0UWUbYIQ<.hIbP]JA8qgb17+l)shX(Lt8D.8?d+tq$Ym3bGk9Ng(Jq nOlf=C#O9+Q:k^cE=,]+c^T2UY$GmPqRK:1qdH<aT]JNrO'"d/ )b+:<1q0pfm(5OVCT^nZ@IRl!VErQGt\WPB\):iCc/%5so!/-VtIs3\#ab(6lr'h8nQ&.qX],[iCNCa. jU*F,^Z5O&tB.ISo8eAPDW121PX!5k0/:qc-d44p&W2B(0-N1=HPA[AF,8 @.]>&eH\b%N#0d#%P=%5Y@pUa(m3J=^.OU97naP_H^Q6=X5VgnEB\Rc\R]_rPPF +CjPJNLVfJ(^M9:L>C:RaAblU+[7UAfQHWP+q.`rT,PLWD)<8PB LH@<*lanqM=l/.\OkXJEFFV0tA#2'o,Bt7#PZ:bb3q0To=)S%N&rL30f.Id4o,3Ie1Vt= '^'3'^i<t"L6@j(E[['tK""llm2MR?0j[#c>9psXE\M"MS\,?S-Z nG8[C&V5TMabH4XVi9Gb.GMCP"D*ma7(#;nIn(WfG*hp;_2HsUF#GUd#<XMq97(.YXN*1rE*][VJWqlFb-0KSd!09$U09:/D4!Ft%O$Z5SPU;kAXL8qLhn$_3XJW6%%r8_rg"U+jf2!/mriPrh\a:jHC[2+NT&[<m:]Wj.ESA2Eal!GRDOS5N_K*<"lrt :5mk4!]@^thj3&Uq)qKf#tQN$=cY[p`=.cs+3ti+iEAl qgi; Xn7_>=&7XL`[sVMi%j2)/-:->AUAHiQE"GXQfp5Z^@TKQ)YJ3E,)!AFb\IW#ETD$NZ(<;)L4D#Lofa=)(G7QR MNZ'[)?*"K f3teIh<pD;<"p#IVEMj>HA&A+Z;gN(2Db^A,M9Ak7 92o5EOtEhe%H4AC">Bob^kO_ o2)`2'1Y81je?]k_Pn]cY&sg\pb?c]"_ERiNa(5Ih$?aj`>or.b 9ef3`lX+^WpEDP"sAK7E`R?t*R]""hf\a.5ch9@FNE/k`-d$lO4,S"PLKkFo6pmpNX?-!.fN,?rMeIA5;^:m5AKA3h=<m6>XqIRgrkS!XW/W]RtKDUVtY?/Hg% ^A_#tU`%HI7`O;:=fi;CO]t&+=cWkkO= qW<&>Gn4DbX%WG^@LMiOA:DM?F_noP<t,j[ci`IS"?)HYV1_7b=BKZ\Escm41 LQdjItR?ssdT.2)$5i0RD2TVbC:WXR+hi*ACQk_'L:nb.k^<E^#""<C(SJED(p'[lkI@SXIs<=LPV#7' 1SgT=k#:QKgVs-aZ?=Qe+1AUFt\Lj9tdW8qWfBU6WHQsicOFOPVf.JDpnQER\4CA&D"]mt?3E"*'#M0sZN?s$TXXmsA]W0(`Qdnm,r5`73\UY&_qkm7>0[ti4p=eb=jUlQr-%?=tI_*h;j,FGg6n'[1+/YL2e%XQ%5Za?H1 FijKT=bQnh)Y,L5jJ'i(CiWe@k V3I(3\..UG^D,1c$8'^E"d1&OPb3+b;9'"4XIGCYW"3rc@7dn!lHr2NVI#-@GlePX,B^-/%GM_?AWi>=UO42JZtbN[=hB:__5lCt+\W_,4ABdQ,*aU V]ZJ8>7g\=L>KWe>'!C?6+Z)-0jRE&CA-Rps5K(70Sl1roE&LBrla.XhSmI\UtL1mcQ8be+cl4S+-aTsWbdr#fJIVl37Ap$.$"jJ;B'nQGQWIXlTh:(\9L1\kq'h3B9nm5h?D0F6"mHe:8WfR,:FZ`?B:Ls;/A *\FIk_&W!4'B[q=eqCG O74/*A)T;>1s$\fnot$3M/YYiY]U*S2808n3Qfk!F=@lZ=D(\N6ZeFj+6"g!$.Q,J*0,IO@Xc0m+/P )6J-K_8@A,(]XdT]DQ5NdUq)2]a ARkg"jCl.Chf?;X+#Pf4UtXtT_%I$L7&;t.4dr3A^eWFCM(l0]BHnG"r<_ ]3+&RcIbb4/sFEg=Jlo  ZO+@;_]qG09Pf/iN+o*njqQ*]V6NkkH=o).iL/N(eaS[;Fm37b]/hhD9e)Akf;iWg:Y@#=RI`ke$N(M8/Vh[ih9YeB/kE/]6ISo:h>t4PVNP#d/I0jN]q0-]U0)5RK/B8E\ D6.O$J"^tm">HrScj`3pl/G<h+mG%\Ki<IEE/JV4TQ'`mhlkVfaC<QR4N^RSm4gmll`k(!a<TLI^asG2@/jAlO^/YkP k#mSZi7%9]#lrDF""F=qMYIA3jq+mIH-jcd0Pos2U^.kTlHEd#DQ:I0G3=:Ae"C$9-N4UJ&7<+X?QbRl[Fa1@50hoPFmXdG>2JHQ[&VaN/R2qUiXES^'\*L5AIV9;I/Kj>@m[_tl7LZ"K_V*9_:toSt`Jb&HKZ59Jd)M.U=2L*MK#RK]D+k_1O \rN$SjGgbPH6c4q&9<i!ih]RItn$p"i$>40efHh`_6pfr<`;mZ!+'%QF #Z"NL;b2tObIKb,oX_<]5?L:4H@.:^?Yr1N0XKrflHFe08O8iAoC&%_]5 rGLQ:;+];W-d5Xd\m@cMfo]n$$nbFR$D=!*sFI9g=t:UA9pGhX;Z_"G-j[XieTA@N8=8)$VV R#seSQ/-OO1g@ho:05*ZgY?=F$L$8FZ7isK[`M[P"#r9.8ij22-VnZmCmT;Zkg]fT_D= kCt`_MU#4HfD)7#QWf8 nfI<M>KPKFK$lS=$n!\5YB)*/2<)1iAU2"8;OGU*M*j%A `i?USbJHUGmrenT3\=<k-J23`n `r\71d3Z3qp<;*oA2Vh,rd2A5/0%BM18]8j_!QkDN#6oTX?E9E?bcPpA$A*VO!nd3?Apg60\[o"++YAJEYigSs'(p9adY[0>#]A3NM$AnIAo J9E];p^10fG?g./pNe&$.o>&o>1eI/e &n^0m'Jc8eYdG*AX4lLWg9eAJ/d5;Kh-T'O%I\0)\("66bIG"5+2D@,C*tf#)_]ElQom_j%<o`DK^.B)o;YAKRjCPAkAko>%ndqP2i]esMMcetM<`?5+P>K\?9?A=$*OQ#UA]\b[o+diY#>"0g8S]475sOa,-^)"nRcF+)ALo_FpEA,+/j/5!/4pR l<^g,NCj)eD]OW,-T93p+T<*e++H.#Y=/<GSn%r:Aqgh`.0#8 BOHC8U+\%(:AK%-L1aK?bT-dr7I2]j^Af*tf;=-Yr`qNJ,I'Or\&]G4$A5cs(MR^mL.dtc:69/(grAXFK5QC#_I+#pZQJ[W]VjE5tI9P?&tbRD*90"4UQ_9"Lb@-dTB&0VH"F\8i hB00'plbGFAeEn43<iE'+b-9C,,%#87tB*4.8@aA=Pt!66AEXo`/9n/M_\q4$\25!@_]0b?;VhNCVI$d,fZB jG'N:]+P7&*l3d16IQRhlDaimVYgCER^8"UpmE!9#X:;NJB^Y %16FGrJC8Hd[)EA2?[InP)Y/B/d>HAmhBtKs!7jc`pf6kV1aEA( 5B]9KBeVop.NV(:%GT.b.Fe`RcrX$-]aYZn$m@4t`7n[GVNm=i`0sP_$[;,2q=_4QW @bTWV`dCb8<^hcrBaqNB59ERMDEP[ps"4lRM0R<50k>osK$U0s's3A_n`1]6igsA1W1PiqsF3X'ccZ/9AO,YBP%m]q7N&+Vbcbr8_b7X8&n<3mbD/."]38%>p=Y!s1PhSV5ld+qO2oK/t"D<d"fSaGINFrNBLZ+(hpEA7[:J>2mgS)r="TmFF0^5 49)qG-GBn/k X`[J,nI/.>Wf,Cm'mI7B9\PX=.J<scG*mj/ 'jAY$$E rJ_ DTqPA80t"Tl_b6e[M:%-b)=AT7k`!+;t\+2?k4fge$6R+NXa-ElZr4L1K%%Co-\L)-ZIM2hr+<]qaE(68L[)KRlcf.Zd&elS6l `rPBO= $2Jm]>]00CBkj)I<X<dEaVT66!,Y0P+3qG"9<0>oSG%isn6.K`cS4.rX-c#`.IPfP:I2Zo3'F5Ybo7Q4.24%+:1Z#CiiK(Mf9,>VBh'qphp%]56afof\X;UXnqL5&qT*f?%g2RT5AL R $j!.baUTI57,H7"[m:A0g;KjN,g9X%4bZl,f=nQ6.r;$'2=('\pb5&1hAfB"A1!F2!Ig>M5`Si;dk' Larm2<:[GRk%D6WCL_%K*to=+]RhCCqb(\EZE#.XU\geYpA]Q-S\Z24Pf(.FI9NopAptQ_94Fm#:kFBj;DW'K$a3tAnF3#oY<%EEiskpRq-"q_sPeHPIZ]O7E5E40TMV q3kU MNVRlRYRWI?tLlsb!A&-ZQ2Q0:j'AnA^NC*_N#Knf%+RO6EWS5b&s+hp9n7Jjt`NBHoTa5>*$C=q5=Zt[*jhRQRYX^#NaPfE;WB>NYk'PELnsn5.a N(8QWAa@VpQYUMO."U_U'j7XFVr]T ?Pk[HDbi6$Y8)8Jm8ahPI^3]$lLe<D&NgI!1G.pc,)kDg$2j 7GT:`R?IH$iW!Aaf$m=.@[CCZRhk$aMoISYKIjm]T"(VFbr"pre5>Rte_fA7VA.._H-GcAtMsC%$k&Er5QY>] $eLqENb)rRA&]"L^!0p dUK!l1NUh9N\@1rS1MiGSN4r&B\Y59U38)E+C:[(=bi)ieLR?jTRY;6,f%A#^(qC%j&2:[bDN<mEW&l5Qg'W YR2AX cRi/iA;oMJ!%^Bm%\hBaqE>:o*thZI,HHk7`?o'WbA=$TfE<g?EX"(.Il&HEg+E+3G+/L*>nGj3&^@<MrOK8LZsF/ie %+87>agOQJcpQ-[)W?IgsX<csriB-(A>O4Yl0h;fnKaDU5oI&FdiOeC$S2=p\SPR2C.pdn M[.65Y:b",dsJQ;acF=pP P)Q=OZ3N3@kMp\GdI4a7DUF-\r=^^jJcK.V26Ul#2>=A260Y8P&,g&aYR^fIh(rV5dRt;IcInk8E\Va:++%D<+1ETI>_:#"mjF/k(SYr0 +-@.+mWLM\=p)%XBFN/#Ao5MX7>$BFYkq`<7O9[;nXPLO)Fm$h!)[O6V(/hraN_=1m4o1q6benTM+U-FWJSEtI$&UKQ69cA;Cf5qOaE\A$B$0W'ns/F1<imRFbT"E \NN@_Tq_M?%BAHa%[RQG`X^UkVKsDa$@o<9pb&e$=T.-].[r"Y2K9J&cCpb_`a9THa\YZY0**\CESsX3CK(8Dq l!rnO [rANI#bd\0N#f-S+(R:]&p$7thil[tC!cDJ :*ZJ"a(!A7fAe-rFJo/Ap!G+BN@*&m$KplAA'7qF1bsreDKeahX#nQLs.mANJAMif4OQ>lJ3]sl"q`T#b)o6@CGfs3N+i#R@*dsA;bicGN3I`ABl0pN1[UA0HKOa(RKdS,>o`R>?r-D'hWG]iTIAA&GJ_T)!`0I$Qe9MH[]3Ar33D4nd5(g><^5 H8-U_0 5c')PJdA73oOW?I],hh3C1.m3Z?:AcWU=p&7P!<^>Es_NeEiN-!$S1=r6/4WA@`LamN!o7>Am%Z@"\fn*O8IqFGp3fr6SGN*6BC/`R?> bt\R3+3K`2"C&AbU?>pk4]+MjSTrHs(F-Y.S4[9[ZL\@$IIB[W, 5.AWBXqJ9`,9 /k2)G PXeir$/jEdp<n2G<iitj^R^[W'Pon/.,qnj0&MqBL&N!V0dGO0.(dR3/_iW]BK'4^C:lhUG]7(F;:.,=_JtD;s.`4Q=VBrBCNe-ID#03cmmK"E-0P3Mf 7A-t>^rdN&A JfUa(;<6\4/`_^OkN91CJ*dc<ZRSc\T%,!*ftAMQmb=AZckKA4P?k+&&ZQjM/K8PNsEI'#K5<PrIS$a1sSr*qBl)e'@3UsAf(7M)5YSXVBQG.n-U#8hM#(gO+ciSfo@,^ITW*&[H0D(UAkED2$cg03V&,s8Wnte:tQjR*S]Q2KO&YA-^qXS) WH[D\KUA?)] :T ^+cp'<kS1RDo;cILl K8XeKSCSCA.2e4cH-*j^(B;9$7K3%\s:(#AHR+Y&M@R.qU6a$K@8totIK,SOVgK0Sf<">#bjc^31p*Idd@hkSj3)Ft^P"oI*Rf%OlZI8n):UC`R9M%Yd$>"]25-_,o9"[bNAm7!@4HeP/9@O>rR]HGHhJmqr$Wnh@:Uc6\9.bB7/-QN,3le@Zk.T"#O#;g8[lU&3J>U^G;emN)b7gHi*^i,h(^I6riL0q>V6%ON$[5 VU#k#O&KGXUBAoi":>TKBbOld8Cp7Z*QedV!)qEp;GeRmL#0L1t)Bg*SEp9ZFWDZ!pof[[tfifAtE'[_M2ODcYe8G-QP\%`JimAQM'2=bQhXtt.=]a\17:QZ]>^[KgnAgU=HPk0\Jl2\<fr@H83=6]+;d)J#PN%*`<d#+?E]&Dh;`'Nj<7Qp#b.;8(#19a>L7=c`E.=*?kij%`@&C6fFG73qHg$%KAP6r4CFOi;7G^Y`3i[2Y>Ub&rLr7mp1>Y,F"]_0G!b*/(rC$Lk5F%`'BHD%AU-s%oSq[Ti-#[&^0Hr^j4b^+d@1)J'on<Wr:M:>Fnf"KL5;Ar=E<fd0-<Ii_<%OFfnPYGS$r-`5C\A8r&RA/J[[MtlI ?ir4sO?Gp,U7q\=pcY1h:3=Ajb=kWP19A!P$WX=(+d=h\Z8 ZjWmqq(4R9[=]Q0 #cJ'?Z5&ch4BDlL[=TdUV<JpX<_);ak/+ras;/ 5m4UVp,_l=H8YpZ"F+rAt6q9(h%1J)hXF@"Q[)EDHfZ0YDP,1H2%8?K&ej+.VG33./rEHXA^2PAd;M!/aI.]e;)k6qT?A'>o>,"#>TGm_(Z\/<lW"5Z`CErlS*G0RFP<&^8*7XAqBM'@?4+8;W-B)'rjD*_@tm)'tfoXspP7 X!"6n.]WGW5W(\>M>JXZn!-i,;&[Tg\`TqnFRTTAR[7%@_C^kA_nfNXs's!f*G;-ZW=,/%mfR?p70-Q-iA`"Z4:qM0SX?tB?ao1,O%ZS4aTe4[_(P6*g&7,DPj%DKp]oDtlZn9sgcK&jaFE`TjQ[B]05&\E^n4@e*hA]ZnnhoEA.sX\MJ%aNJ]NQB3WH]`[6d!$[m X ?XZmc41Hj3A`gd\,XKf#X)oCp7pgFt*OtSUEe>SdPD`.X;b)JaNA\^n$Hqq^Mh3_r?+eHn,8$5)cDH)M-!<T3CpqYk@e_i^hR/>eWgOZ(]mlh`AJ^,tDp/$$J&;pH\%^\Y[API<t5D-L[%%W48q<ksCt/.-+l!0iA1s0[ZD%el;G=#iO^tNiH=)s^7mW;FS$pN81DN4QA)hA_/;AV3PFbYYg<Qc6e;T@Q\g%p;;)$.\dEbNA!]B9dmXlpNro%>^i+AHK/i,3?26(PW55Hd0RC0VVPF?@Af?AViM.k brkN5LA3M?g_dD+(b8.tq,2S"F* Xtj.VbXlpKtTmP,mHh`)HLeXP#tpcBeZg-K)tlqbaXl'!E9%Ejo9P?0<=T;,ANC"5Bn#^H]?-d9!Se'+mp&o6YR(m25k2Rf@`CFUD[kdAQtj'I%NmQ/`W,BFdMG;;P%XaZN@D_.TTS5KfG3W]br<.]YjY'k.V+O#[0l1O &#g6C5AM(#_I.*\F.No3^C#s6<qr(Se/;aV,r-FA$40"NL&dhKg./L_#Zb %ipAa:Pr<Nd1j<mme*7J5;35_E+!N.*5A1f=i&!@;2iin<c-@ce%I@$U^?U hG60[Q>][S8\MYs[iG2I2dPPG]W5JAVkl<U2[7?6E<%6YFlr45q"3^:eFbi.;:t($pc6&Kd-:U2\1)WK;dlp4AARd7!]>Qg_EG25j7`I'(jKo'IQ?0D]L#X,pf6=<j^d^F=p1en#"L'rCspF`d1oRQ'4jj7ZSi1Wek9E1X+?j/+c;gCB].IQ*sbj],2RMF`pdJ2e1Xfqs*^FYfZ[BR65^sIci'][RNaEMQXW0pL^)(1g;b:YBW,^$.SUke>-RSB9j),A@6.+@#EM(_esBY)5>PX^L]&F"fgaFS]2TBfVJ*BEc9@>K%D#:>Hk9R#n8Hj;n8F]:;Et8UD)ArC:15Q0+1snt3Dj&\P.<q6r-@S%abjA)K6qe*+\#tIlsb=DQjS=.[[OD;&k;T70#&X$'A,>W/bPTOr&dUS..Z1GQK*KA(X%%$k/md0ZmN+E21iLMiJK'GFdS'@5L5!$j!JD#hJ>9s#UsqU':$(#)!NoWq*k$=hsXj=n`,AA6AAP"]Ak*5_P>0.VRZcP.A?0]$^P.94Xps^Me753/ONH_i*`*7oG)l!g8CGG%=1-fH^BIU_t\#?Fs);Gf('Xbae<<=:l)j#h\e;rY.ZU#F!N-:o.1-<$Qk. /M!rbGAc&r%=Vj&_,i-+M-"G]fX@1Aj#j7J+$/5hfbHUOA>bmb(7]@+jYCNCg>B>9M;0#rCq5oZ]r9@hb$e$R:P"+2D,'J '"ps:gb'TGEc@'t;"4DJ^k6aM-)(E*pScW4dAq%?Yr<T?:2te8*@1Edk1Ef!A'b;^.*O9q82Ps_>^,[!`.FW3q?^6aF40AYUWn,GM$Q3ZN.a2Oi).1P$>s008oRAV$XmF(!X:HeF:EJ`E$tnj,RSAR(`(Z_2"=A,)WE(j65.=r-3t&6b4[>/EQ5Iii1OBA:o;''k6q3W$N"+DnJgN<TAod3_g_IB&sd0-E<-%f/0jL<VPh8]`5Fkln!clZ97BarE(*hA&7DL(DK+1Hj/f\pS.>KN^2%:[Zk="Xpn[f@7#GLKdFi<[>ZO"Y@ 7R#Vn5DNP]kl.6?QX<]JJ>"U(G>6;TV,'>X`N/>^<6e]Y=rEG/maO*SWSH5cMYhpfT:%TC3TAgm[aO&f2R"WSX39mtB)ED:`;-;W*7?*Oa6_I0YY[HPeFAsQ'A"5s_f'H^%BUN]1f\] ?p9LX+lWWreE"PZ].Ef7Qe2P?s6-^$t&'T&[0,EaBKthk\9*AlDW$s)CS[Qlib6-r[q@UshcoJBUc7ndrtbQPM2K#CBm6SI,i&A5:]>C +4_ZC#R%:mKOq0$FmMCUeP!Hg^Jr8P:% ?e%Jq19AG.\OAbFGV*\B9Y.?j98=S=bJQVrOjV&hHGTf+kj6@%%l$El[B-U85[bg""pjC6;r4Ya[dN`#[N/$1\YfI*l:DiL%?#N`9AHh6A2rLr(Vhc$[Z*C^U?SM1I86hto\\Tb6@UsglAIo%L\"lbh>h]G8/s+4)a *4olRYgfXB,!]:BDb=DA)ICp#)6c!BZ\])'K>PAX$,'0]5^E-Z<Oj*(F_SpY4'9e 7$!Y4,)cLF4QN4dX:SBtPG ELLYK^5AtJ$B:Of8"pFg:r?D*5);**#/r="Eg-GlT!+oAINJVC;gXPm(dhblN;EAYE]>I4MEh(!YME9"dkX &Ar]K?`R[o!*knNfEs7,(MsWD-?Wibj_kj`#$KY]X/,AohF1U`tdg#-3F"J4QOrsep<3#g+*'3.T\2,3l$>I>MGac F)J<rZ&n%^'C#n/^;EoWS^'j7?cGhVS4-mY@jZN'UR14NsN\_#"i m]g*5_s!9k_a/HF[0G0*_h#.af3s?q3]U<h31YDM(0Nr>p9mi=rhr"%n[W*BMPIHkU"_:]Y?P*\N]AfdGkR?HEoOn&Ge9)BkUjH ENcm,MV:EP?QB>0B!SCDoBWb%I[A"8A7Ii5A2A)>e;ViJ#bC1XQ.g9jqLAO$nQe'g@ISjnFkg\t\Q^EVg:e(XaU-AT2,Xe.%D-<Ta&s0NQ`?A(s=JK8P)-P3A.Yhf?Zh:kd$88sC0N.C*a`d&j9512Z)@+3NhHg4jMD\?!d&J9!,]Fhl'tm#e4_FA*IJphtmgdZ00*cBAkkAW"t0"S],DoGBf@?l]O$%SF!m57pb1\EOOh%L5-W$LT`4lsb7MP^2"d=&;tW5Af\ ShQ<D"3RLP3b- YWWP5K_HCI\ZL\]1%CM^>g`<fi]qA2qPtJ2:"-Kj;Q,`A;LUqAm<cqA-=X4edXjr^/.D)\`[!U0Gra!^=PbU5<hD3nKi"i#%l& o@XN9k2sg/hXsL2j2G!!DnK_Ik -O_E9d?mAM>W$PFDP7c_C1ln8Ui]pp@U*/2)'lc3Q>J$_5Nl%.a.=1<<46LR:WBdA2ETem5-^'p[6G_n;\gN=)N@E0DP>kfn!_46eMq`2Di4(K;+1G,X*!KZ'&(Gs6IdK_c<4n)p'gP.K!hp%g2+'pAHPdX.kq4.H10aO($ns)&JtK:2?^X=L$T!nd`:oHb$,O/$PM1 hGkFY5mi"^ZHKFN<0*\0rkWB[()Fg.1'^8pd#G`sA!X'r,o0[eiF^CM%G0pmYKKHg%gIWJ I1']6cLlFKg5nW:&:ofb+Ejk&naPs3iQBTG7H`.UDg<P^Oji>;n'<38XtqH6-NX!5<c,K@W#GU$3FB3Q+:&taRkl2'?W/Vp,I?*+ SLp(a6f(*?90(eT0<drjk_':;\*i3WI.2T]%SW&Nn!t%?a? ;^@0af/pB^(c6S+8.N[4:U4e^nq/38NgK)76QK:cor?:lh G0YGJ.gZ9FS/()) -4 2Dhaln(^p,H!T7%&iAa]Gk`:i'UO_e/Z=JR6l[WV"I];WTHU[^l74)cOk1@(Ho!2UM3SW-[-]J@>rG*h`n>r@'`.c9&F"eG+A?3G![`;O%*LiB;koOJt3a,\aG9L??iGc?RF,Y9)FH 19=WQT0W_bU -:J/!3Q(R5f! gD9&5HK,$B=<S<JQ0!qV^-%Q.Jk9CYPsml;>d)1i-#,bT9Me9+PEY4*#Lo#bK6(ADp+_8MLO0!R/esc`#W/,ksGpTGJd1k0Zl8dk"LrEPI;`VfF"&]`bl<$9A`NPBAqEV91:IH4-mH-b$?W7oHKX.07\hlj]G`&QBi 4R@+l16$ T&P7KhnF_LKNG;DtSR&ch&;j$&828OT==(BMt,/WGBil%iW*j,HZ=HRO.TSV7m`>kbWTo9P$;l#2;spkK\j>E3?h-ZpNH!:&50TC]\&0-%hiHeZf4j<39n1e_Bl^+JhkBJA? DAatMI%1rZ(YF C_c!2D+_`t+kAFF=9@S)fjBPD8L]Oj6%J<Ul<`mbNC_bk%?4SE89r#t2J-q"6! mK2c='Gt?%*!VcRp90]RW"q`;B2nXCMf:.^(_=aM&VAIZLo@mm(`oC034mbr6/r; /.T#k%+7!H"/+N92`nfL9sUH(q_bYJlpS,6*1A>s-X!L9 =(m'o;L.:DWGC4TsQrCiL,t_RpDC:#]"lAeIjm:fFc?@=, PdaqWbpis'*NoC_KRFlgiUe=&K+4Zf7V-)MqASmc)6hcfja5WlS4oN=*Zbr?d>"5A S`4(OidbFqk",r-O N^g9j$C7Io9^!]KZk"s:m#90bM]D5E)js"Qa9+lk'Xb+ONY=,(-1 4aA6OgC(qdOV^"N] $AhU-9&2Kd;^UM9K`7$6.W3F1Fc\sp]/%]rG-Fk-(jj1qNr,5 5QqnA]@A[Nt/&0U1?eA?A[r6&Bk3,DjS17B@g4o[6Z3lAT>PXK"MG1fl`U27L<C92i`6A@^\%Ri=F>-7IRk-//*\ k+6OJC1M;X<nX(IgkYR^(%3rJA@E7]8K%7.DbQ'P]P*ef/f&L4M!]9F/TA#]D#+h3J<D\2AIA*X?.!Y7A7Xk#B:%4.'[(AS,a FpW>:XY?s9-VjH*AOQ%QGK#o]bm$,`hQN&$0QF_.-(2`$"cbE0jQrH7pWZ99Z#%]*s&i/ctQ?r\9K%gjYMg!ZB48"q/q+n.fW6'*`0D3]gGFQj-B2X`&e&*Md%lgf-2:>lk1AH7h5>6pL3p"PSO)^)!=/?7(S:5%fpb<.]"!frm;o5/.qtpr4G,=Et+<?\Kr/3h@_m>A"-_VS:Q2Ph&A#?p*FVUi9OPj)sYJK/d#Pj6ZU =gXMCK?h$WTY:#JjN=AA]K.dZY,B;AGO56C(c'g]$P-(\/DF*X"/jl96JA+gJn>l;]RdWp6jH#pNdt'1U7^4qgNl7K#O;PA&\;1a/s*,PmG$BZj6L,5+dO^Hq($;\je4;`5`D<"Y0-[o1_6\r.AF.emOM71,=T])=4RlPMa5g6.)mheX*t6)M7cVKQ8LV!BEd$R<. h2GqHFC0Ns+s?JYeXAt"C=H(apc;]J0pAnML& $Ma55qhEp&k=:9n7mPTOA7P8rS_E%an7;M^(:aY,D`U?3YH*^Zh)^na=bkW@JOo&f?E\qNC+Z(ck7%Z/<asX>r8F]c]M/si't?:2I@;o2?FT8O1,iGhM9Lc/^EB5lUKa-Ilj_f'b?KH6U)A&A:YnG.k8;.gc#iYhU/5PKO*2CkC)A=Wm9hAF[I?7rA=J;Mjb'9n-nQ7c?_Q/$L[VOe^_q;%%t)@\A;G&r3E1-Ce6hG(sYt9<qAtqC/q(#h82JgF[K"s)R\>)qtJhs!gjpPa5H=Y^sj`7M:3l')69]7h/>Oo !E]7oAFhAf]O h<=)V+74ipr4'OWir3bB(rp](X@B9(j>O)&UV29,=r`\E\pgD6aLVO@4]p=QrA^d"48KtpS=JAXLU'U)FVN4mQ2helEl]%kf L/aPr4R57HoT+(JOA?Of>:BQ_fEV==N#Y=D-!jeEcm"U,a7HE!AI#Ap=c=p!?jq8rl("H/m*:3iN*+YI"cm?&!;ESGIao< +`8Uj!FAiL+r+lD(oh(\G\U<-mb>Zso$QRskn#&=QLl+)M\&D,mmcP(G.V@Q&\l6]%WSNUaJ1\EV+-Mo,H)f0c<Z$>@?=/-?hU\8n T8 9o4M.!^]X%i5VV7kL[l$UT4?D!aJH!:Lp`MgXJE_2LYVSA0s%P-a0[p596d%s %V!@0t5O#e(+ `E@" X[B  >tQ>ai%n/D=:Oi&@%,Va'npZ so4N$!)k,_h4mpg ClW+6jrf^rt@\7:L0AUVG6j30g+Dmda`I*AcG[r-J^]S5ER:L ([\ 'Oj^$!PT^/K%qWl&^VLV@'Zq`WcbF+tL`M E#RJfj27.I$rC_hh.W==$s>Wo^8U<`3p'\)>6#:Kmt[IS;/FA1c3MOO;15qR\k%b74fT`^j8NQ]kbs%N<I[E)@jiM\6`4]ni6eppR6KQ`c;cl(jM2U-0a3rMH`/qemm[UW%</)WM>.5k2))<Un)f<Je5:;NZc4M^GA;L6YF(a&Y)p[:+*lA/Hh.H1V3R:0.2JiY[`0_LaW^qNYR:.^lJ07ImZKDCZ%AhjEJ9-gH^Rpl YHX8nCPVO.(P^5.'h GS@\W%\I3"JE]FtA,ZFGo-t)`5$m$80ZY]M\#>oGJ]GVe\gY">Cj+cc^:RgbqaGOG7*aPjU=4I1h8%Ym&)O/^UdMO]s_i4aCp&:Z8C2`R2BDAj['ZE(bY 423me^/KaMH04tC(Q>3 V fiIpUX>EKdp_.bCc2AWW\Tk>?KA-Z&jX$iQ/*iZO#HFd1:SrVX#E[ZkG.3hbt@*r44i4&XC/K]9%?Hs3caUV+&fIqI21*h4nnW4tVD&tVK44p];U,Y;LsLM8&>4<jt1FslI$k)OY@ASS-q;l-sckF)4oR<)5Gi64:"F@j4&?L&JE9:JX RL`>l3r.:'YiW>)q2=K^!3h9O29F_m40jW7Bi##fM1^DnJ5oWrN_O:d;&SX=e=Erqo;JHn\o9CD00qVpT4IjMA`<EhoX&(F4Vs0=cZ^: c:jadc6q%'Yb]](p[7*kk&-;3mjtXf?"H@AN6R*N,f+WpTe9g9 n"%[Ki`"k,I/%;cp9 CIq#fsO/A g9#p(AE6_cTlZ8Kb0M9fesQE1#FpN[L=%ef0UHakB3V^Ifr6dta%pGZ0hqK%WpD)B!1IPsAgc&;.8%Hd1JS[Ra(&;A^ls=d7s?:#3ttAqThEs^k=hMSj-qEAR+a,\hUD./-=XH1Yr`!Nam)rih#.=)5j^_Plm%.Er3F#:;n(,f()%62NEf0,IGbmK9hfc2X1M8Y^`"QW4t'&JQGpp?k&,.\&%S_3XaetpOT'>r1')8JY,(p8d5FAb1ERtAsArdH+)1!>c/As.1Af4q,Ads//k1^V%4q1htP*"KAAU$:8Tl#Xp' SY7!a0h)GrV2.g'JmbYRLO)LRA<4b>"`LY([l!QIeWG; gd,hdog "Y`#g+M:b_O0"\.f9E"1'O*o'eML4nD@:ARo5/G>7[rpTP\i:7 tU!rb#sBA4EEN)o)Ni[ ;2/-_A>F%U)GMj c[_s18UoP6k-A-t@"aN/KX9cA'Bp'hAc3Zp'i.O(iH=o4b5JRt6&`C\RE8D<.*KA_2fRf-IR?<aDo#7oeI+ @cbq@6QnaPeG+q@RXQSS,A2]J:ce.[VMq-8H$dJ2?Y<p<t.g]Pd]06^W.C94"7m?6F]<r&b&4$,FTt;FLt?skeb(&`WCM+Bf@04l.ECA_^je2A/Rr)%X.SVaSj0W;AaJK2^?m`Wo3N;[ eW[TSiFn*e%=h:6KULm*>PGfr,$a6gXYkkZKCoEYMCe*HFbQCgYn$GfFr6ELPGH=QF<Wi%7-T8f[._L>7g%p;aj)dPeUmISchF\"]6P'FAH0f7iDjao-n'[qXI"PT4la?DUfc9k?'m.-N\i_:dC6/'UfH8BSZ!rAAd/+58iD,\I;#"kZ-NoUr$*li&@'0d W'RnmA%&+R^lS]WQABo2P3P^#>;>N;G2K-fTeXB%;%8fn;A,Q%%ns?><8o *QJF]rt7:1#[loX+;0\@"RL&[*9+.d^2Oa+2cc<d?\&kY;#g&CC`ik)@6F&mP/(#7>$(O>kMPCp3&$1aAV&(-aL^I$QM6?5UnJ"@]_Vs dBbJl_681=,g7pNAcVD@6MFFR+p=Na^QKhb5" m)1P&9d](6!0QB;@ZNN"[^RIGq?dteA/H<n"\?Y?Rnm7@kqdK/GqnUlq63"3rEJB>&Wg?!NmJj)n9j?;Xrn<t,8N<<IRL5c*c=_AV-Ddd/"L9Wt[:k]q+D6A+tD=Tcb%Yo>)A.G000"[<X2lh.ADb8ZAJp*JG:XqD0q s^T3)jbPK3aX[)r+Dd`Kg;3YfeVEotW^Q3f:]o1 b[h3#t\T0%V8Z'q#lo ^'Btf6b:(A'j_*J][YQkL]tE<U6^<B(tIX":-[>?bIi982-n6rAf`gnb]Li9_pD_00p\O!VJD#RJ:SM7,.OBk$a+/%ehlgR/`-a,3Dl[6U437I(g-dFm?3a,"0WAS`MSdckj;^91A,DS_jlfSnr'NBPn9An^:<>2,tT%e2IF?MH:%T:om3@b-H's/A8hT+",Ho@<0.:MHts;XK](7P9ro#NaFHsR6n#Sgd#56*RM+t95gWAo6;/RK5Z\\kSam[(9@)/;_!H]eXco]q3+hUF Op8eZt4 `OKe+LDOF]qTMDnY9!M@Fo_i2LFLsTlnM@cqcl(t*a/Sd$Vl@8Jj;a*@diN/...8;bboWLH ";eF<?%>tsQ3!S/U;]UA_n@+n2://?H"OZg!t/8BY18p7HCLq,]h/O$M^XNV[]B$!2mKZ&Dp#0dPk1lc\9`"OC!j^ KqIoc#/s\GAfsW18)-XA8fkOT7W;_BJGar%p`pQGl->3%W;3kb`NBh;jlPKtiT?opK"Z)m#(?2jYIt;c_Gi=m)noCh3nM,MURUo'"-A@Q$E!/YanjTG)F'>lV I!6D:6iX]8;[">h:$aQZt[I8J5b5ha'':)oK';Ah",Zk)mj)$IJ]53kP\9%bPcf2q1>J q;4c/b7U 3]5<Ji*PH&"e!2&i%s,PV&:+mM&gT^osaiZ BA6 jIsjqOJs[*'2pJWZ2?!MPBB[No_QWpD*8=41&0ikriorRAi3[<g(o5WNi-'-J>QaID5ki5@SIKL-P7`a h9FWc./jQndQ3gC&mb&>EHe(m;rHk*JW</1(VW&be!-A$] D@rmnq2ViiH:.C:#7WS@?a (r\C?a:A39Ms<sRc'+[1DNX3,!)q>SC `[`6o'U#MGFW+=#%]>gYQda..\Uai?714@2"n`26b5N]AKfOa"@himgc:Cf-?$K3*Na%'2P$R)OmJ48%&[i6c?+#f4@t?<W!IF0Rq^[V&JqSmAMFB9+7\r=F2MSP^l7]/!RYS.INp?4,sPX!Mt<M[B8.A_)Fo8!kW\f8QEh#&3B3iBXH?X'J P%2i(tAr$AVa5@f:4BT!OGqV=..\jL) 3dEfc%lYY%0_ ,NNhQd=l8SUT.clsJnDsMcT5@i`CZAT?atToZ?([ST+/Yj^t)4Pi.o>A!jBGktEl?gF^"=rbPBle;s0WfFpiWKpOO;#<Wfg&UN%]\Wo*aG$D->/5`\Qnghr'\0&QMbrZYB2nrrB"E?n9@F;/:;!H:/a5`YB4"L%+ Vs)6n^F'R\fA(C^n3f:AM"`+!#Pr*!k='5ZS'<lt8a0qpkHDcUiL')5+0S6>Ka-B!S]7\]W5DnaQZLXfeT0+l:PR6l[ZhB<6p2m#$XUl4K=-00dVAat_b371"\eYVPe+kK'?gFA9T;PAG5SFqN%;Jl.&FP&G?KG?`X,hdZQr"3)D#.ZrP&"eFHP4\>,>A9e_M@,51:Oc6,Z*`m?k]Ej@9B/l1e[/NSA#/PDK`+R^Z0:[$_9=1R,$!PhSOY_#c0\<<n:TWg!J;JJ>;"J$tt:>s.0Vn\L.V07Han]b4!Ti"d,M%5)AC(8JohVLR5qJkkhB 1 4h:t()$A0d4>=k`nS$<^*T`,?-#4Lb/A/HC7<l)I)%)T,!lCZ6JF.sX$>Jfnt$Ys;@p6%%ofb1eg1d*[Ob%,S?DP#"[2Vt3,D[A'')R>XQief!P!GT>PaSE4cD&5d2D B=1b-*9`kAinr6pYq7QA']!%JA\b;QE&-B%76m*3T 1d[lW@nf(o(264V s];P]5A=;Ad#a2BsM1>oF^A+<U%UtGDV%G20PqPATl36MkMK'50G%:d\> 0fTQg]\ofTp`<&_e[A>YYFAo7b%#?\QUVS]l^AQ7@a2>WDBm&T)[CkA)H>h7q(m4)-Ilf6Ah%*rZ&Od!"no"AFLQFg\]ODV+j+_/Y#%c7fLZHD*USnfmKn=W+J%Y><F(Td3NK_(/F=b%;?)Q.mW<c0a_FgK;Qj'Ihd&]RX*?7o(o]5aWM//0r2*ciA`lRBLh2N8!W$#Ha0[T[[U Tpo4oe>\$H]]a&eIRgLgm36@KthJp)6^6r:AcJjicCR+dJZ)8AmNFH^MkSoG9G72Wq"oRn8bM+4Sj0Drg&)b<9s>+SJ:H!+B:.R$rCl%@r*8VGd7lmX[/Bp(\nhtU9No7OG%Z.n%!t40&=RA);(h&2re#QVjaI">Ie+&DpW"%44A@l$_?P*S.q#Kp;-?\1<n0S,C+^h;RfAG;@KdcrCfFcYOl3+DW!+89kD$>`((G9c\?G(O%^A6I1(%j"6_;(h-oS05i*]PVsl!B1bGr+,#F9B"Trdq2\#rXiV>&q8BTf8)ZPl`P[0dd&chG=?GiW-LC80L`6GP8/sf:S\/7CJ_,`sU!VeToliSQ4)oN,E2CjEt96D'A'$Jf_GHlPW05caah,O.?AjL3EcW0 U7,qU-E!pKce(2/0`8"77bgBQ*"q2Gh.+[@.E"tn=X0[h%CU1g?Bk&,>2d7nS5qtU!%?b:3<7O[!Ym;Ws&F.bq$$8V/-@D38X*<\46*T VX7rg$cCG?#W9 =CEi(:AYk38OAHBbo@6gPSM\)FF29a!l6U9A9iFq..l=45o23O-Y"ql1KW?!;O=7TFBdokoT5s(XkbBoRGs7pZ[s]k;;'`i*2olK%K6=]eapN&*G/A30`..,U+_n+;Qai_1\t[4%iXHT''ABsqHAWO4c7(!sY7@DAt>rS^`LJKmC)62:KCh!L>1>M0Zplodd..Kd9 U^c=h)_c0->jP=W+9Ip=c3q]Vo93^ZMQOG:!#ikFbN[dV0*+sK]A"q^V?e2?<C.b+"dUB^3kmf]Fj-3Gk175U^\&A+_aD0G.98eOVRW_e(* k5StMMQiqkA`,tI+mH,3s0>YbA;()aF5od-c;Uj:(.d/$C=\o-lHB)4+0KiAr`>Y%A$A47US3H9Ml!/i1I=&!Gsn4T6qY/N1Qio+m$p9'F:VhR q&B>XDo6'$>e6pdh*WYB7[5`k^"HtY)0?V]2_>BWto!K599ds]mUt,1KOt=3B!lcQ'E,>I"A?O`@9qMec$5$U-5\3pE:TQ7F9+]!"p`K=ek@>,dC#O/$8BpkYbVL\*6Wi8f2o,;VLS<qhbHe%,<,?sMq\%rp`UG, 86V2T)Pkl/(`)=@D&ctDt;TE"eeb+,MQ9nHV\0(KX2_gL1ADp!=#n]`fq)+s'ACJ8d%t57UXV>@RHr(]NkRQnk?8<fj'p(8F`5\d`tN>IL0oKLj'*N\Vrq:AN)aZ!"i;e(D(`*F:_.$f',ZEg]NdGT*S.:A6PkGf0?/@dmLP^A) Jh3rjQ0-kZ@OA^T41[DLG)O0Jtg'A#G+c2^X>l8g]1A\lB*)c&bnG8imS[ocBS.AXL%K^ .*L2`,CUAE.'DkbK4LZ_@)4MZS:Wlk('RHFUO&WsM;tK5fL5dm<-G_tmh><M48CSG#aDd =eP*OC;Sr6-64e74'>aA/"Rn>e-@cKaUr#`D"A%Bp2)>#0 Y-=s-jr:ita j_jD`jN+i(GL@)Cm%o@Afc`c$66HAt[k5gOGJt-<Xl`Q@-J0e@ZMq082A]Vcb+#AhUAG#tSG!8YNLYDPh-ge(BJALNLL]jrT)LcHXf[r^=ZXL:dp'AUr%l"11^rhds/@+M82o&oa@MdCgB$eIX)2`CdR9V^k(L]]C&p:<.^;]XqeVQ&@ F[DAGd3!)q^g1*:2[\A8M@h)][7L"(X;r([rA Hf8rN&*A5=$oTo5s#;GCZX
+Fo`kMsMr*sth,dr2oD]eg<N\U4KGXn2VQ,&'!;AW&I["@nZQJWPG$PpAl;1AZ@R:DZ4;<,C-&1H7ZAjAq7LN`NV[,YDa^JKW_!oW6>=tA9q;%*^5$1[C24!O=7p0LB8c6EQ:bpii++fSJsNl3$mN#K[2eL#%d>c<39pV55VfO? t5a5 >+g-X9Yc=es5sI-ts)A9R5TqE?/<M.C8Zl  ^n"s`BDQp*W@oVW;]I'.h/b1:4!=.W%/01LcYF7=Um1(.GNWiH:Kp?Ch12Bg[5M`,TTE5TN\pba^I;oM2Z<O9%>*KqR@#RqN\;Cb99`H0d5^K*=fJ<]%Sd>i1hpA>313bbb#MCtA</sM^aXko^.Z7+VJ+(EYJgJ;j*\%5@13(Wd^;PcjC44A  I$8,VM>Eg2T*ancMc.8]W(7%'g.#VpQC!2AZ(0oW12mIhnJ-G]D;Q6OF(eon*,UL_H'UE 4Y? 1?_,2ia$K^X?R  hhS3!R5BC,T<ZN5!YZd6fQIR#P5G9=')C%:&VSLdN^\Q=(FarUg3XE_^O&Pgd`)M[,?JMA(tc@C?lCJElM>>@#rs1 gF*lPf8,*cCi:nAaE%*,qP_ofK<pL[$Mk;2G/Yp+/G1pr\l^!M.q<kd)1"Vlkr(fg;1^t-eBC0# -tR@1_oAY#7OSHnE=pt A/h_K[T[d[A-EmPnXA5VV2dAf(\"gAR$FA%$4@ TTG_O?MHmO[);^]F##V68*QQ'&B%p<rfl-LXiD[Oi3s;l6aCfB$UP,?TEArTRhX@<"d8%#K%`]$V=3-:kb%mdJi8CW_5"V/'4\V6cVn(YGRK[4odBH!?#G1^%*8Li_!UI[(4t4WjSQ6>]hZ@>cQ?A;,EH7fU]GR2p25#UA$.oE5/ETshg=9Vk_;RC#<^nK?)PKL(YCWdtBChB*T>[%;/@Rq[Alea)>Ib^QrKHG2KcbE0mD&/'eS*tX&\8+U,Q#Zm_`8?%In$FLme]D% ()6T<AlGK&rH3GdpT73OclHAtINAkXo9otK-O+;eAd>Es4q.E.\S$= 7iO_5W?K\UA2:WSgk?-p@=SQU#E/1!4.@--8IW]kLr"j;$TCUr,R,s7OlD-(o#dlEef9VK?'53Xq]/3-s!3B?Z&#3Ok&d'a*X1TRs$(?O`DTmX3mPX,>=,![AO/gEO^,W^00>Aq\)M=a3:U`AVleR6-Y[4qdj1Nl,gEDi']t&><6n0#)'Z0Ci.pZY$d1A4E?FrX9Blka%LHWMd ilA@#'i'db3# ]+Mf4VRQn6'nXg#E)I(8<5I&(lT5Y$1s.5[0tYd]IbLkgGlt%?^MHq!k!h'FP18>%"oqn+V?WX<FN2Q /=3aW@ri7A8]i.)<pP=;OJ(Z)@(kk2Yt5_?/'hVjq&n'-sU`1& BJfe9*!JgT84l]Po+=(geID#F=d-($??n#64nRW<AAK%Zd$#23 k]M-`N#T9dnAkX-$WAJJ"GjGp($L]#7h9WMkYN3Z:#eW-.0F=5CeT(K$afW!t/NcVDa*SIRV`ASWk#UnIfb8Q.&pG\)7]E\abi^ )"W*e4ab\s"V@D%?Hp`?sB,We. -tdprb$B&>AK,6JP\KYb5jIJZAG 7F"0a<l?+^R6iPro=S`r-VWEcYRA'-*)?Hn;sK<dN;B2ZRZ&EsB20,MGK34ODqIA<^D(#*Ahcm]XRb_7-jtt0AegK\`A+pX5l dcLk(K!!FcE-9CcI.`M5%N(X$)lMOAaX;8Aei1;3MS<c#/eKhS]\\X;7&aoO:S$^efs9po;[JAY2LrVMALKAXAoY)jW2+n6'?#,UrD.3Y);"?JBb_5B7T]o/.dZc\qaF5-] ADXZJM:f%F&bDZ8dBK;"iW]_U_?TeC+[*a.o[MR.$G/7^Q\fRhVa BfIhNA&Z]=;<#mFl<G$/V=#WI\cG0;+g e-*7cAg<UIci"i+If;"PRrU&C;4poA#%*GfQ>'"A"g<61lB:'^;idCr*82Z>MEOCeHqH^Se6;OgKSWR]"Kji7'1:VI)AC"nA7mhWM*okf"4,G7hm:c6B&$3CM.8fIbb[kPX',j^&K6"IoHXPQgY>@E=HE0-$10tpQ mXol_g,-rmo11C4F3b8t;@JINZ.t#TT7eG.+CjQ&NN)IqI3hE6EF'h)!f6spqV,fm4`H<PRgV5N*r3r2%sSB.9g3R,SAqV8XY<n5WR\)2)2GA H)bCIH2iNTJFY_lg%KBX22=lb66^K?_K<FCbElA(IEaX`H',\"!Z9l][*XjKscs(;`\fgDRPrVO1.1N%NnWgl;I^B__B/-Zs%!K(5jV'A!$">irb'7+pr8Y,NqR^eF_23mt@C3@MGAHm0d;3rY&+tsK(BK30:V]"gTpI=$ms8j*+qddro#A(Y64/i!F2PA3<9/WQX?l6QV^V&)m!C]F$@ 468?JD8p``2c.;]3mkp)Bl'X2PpYSi+[t<UF\X)=EGfr K?A/;Dgq)qD4.4c)7Y&PKg>Es^%2h ,)YbjfMA5:dYE'1)rb]]/j1?:Iq37N8f.>+UQ "f5qFFYloKPQ`I#0ZFLrgQ1WQ\:)L-6\$Q1UDgI!d,_#),YE90K^EY0*0saQnl48<1`(@3L%LshoA?:5Gd0,6/b0!pIibT2UW9c()EH0.+>aoE%`]e[:.A!9^rMan?\peDIlNkjaJiX-=gYcFoXXbTYD8+Sp8US^t0cBf3@I?<7&f 2%n9!]t9rF_flN_U)74!ghb.I!'D4n5dim##5j:?GPH_3Q;gB$j'qNk[H,%n6dc0aBl&>PN-X3J.[pNK 2S'oEm_dsA1&+b`$3h32%m)"QNiJIWX9%*49_)I&ARkIm:gM(Vh!$bI1iSC/;/efNr_`sWbT'>T;fNIJ<%NW0%A)]npAdI>\KaA[.G-8An8&VN6)A$o4,@31\];&k4*=*?pasKksN1=1l-ISJEY/_`=U]j[Td-9;(OFh(IHp70H!2kN/9to//b/_ar&/Xe9CmaqX:`X,S\^A+AQes./s'F:2ZMY :m H+3XS)l35Y]AicKV"G?4XERT;gD?+<J[(S*sDO2A:?Dc6?!]qOVRIYF4bMiFBo]LVRGl:L0SGI!&i%Rq<%KXn8l<)B"OVtd?=)5)>)S.0?,8X=414C$hD`@?3"Sc/s>A[bFPR^]CnN8ml`[pD$q%M,aSCC$b$#D!JN=;^9VLl>P$8s).J7tC!^LQ,c4dPAoU,M7NmQk=90>$=:&_J;s?Y$/#I^h_`%2K$[^S[7f=Oa21<Q!o%eb5FXT:E'=\8k,(oaOF#76[i!T,B`i3",0)r[-8]tkf-ZUWdKr+Sf2dM',1-Pkn/V:p1=[ @a@rRgtt79k<Y"HK+;U;l-5*JOGJ: IWH[>sm+aM=G89g8RD:KQ)pRKLf'/>$ciA'Lr7+X'%1D+6hDh@8G#+B:/_"EaEc)VPU$kLC32rR-?HCm_QlA2Qlf[@n^K'OC7CDEFI]`;C5.EQ$V0,V.<E#;<.J8PiYa`M$FYCP[8$3Dif8K'RSc@r@MF XRPUqE?nmRhVE4D<^[%5D(^.>V.t4OQ_mqq37`53H)8rAGPldR>'1DEec?"2IGY,ane;V7C:K/__[:&<dboAG@@WqJZ:3<^.ffSXTgT(X./0T_"B06!]fejtX+?"dGC#nSP\JUSFU'mS22bI#WAp\83A2T(Mah,S`@56_B\r2.1Q9=f(-6K6YZ#Gf\;o,  7.cIAMP_(5X2O("&7fr`;lO2!5=W,8`9`s/6N!+6+A!PJfWK\A< XSr6gdpo=eE!e1jqMR"ptea0A+i[Qf<Y ,)YtQ4qA7e+#E6pcFs\c^_<f0?p9bUt .#?dSj*JeK,#2QE0&9/;dM6iN8/$K%=&i[%pcCmf(;`,.]qK;nG4UM2&k%eI;9$sf-XZBajKVLE==J>-Q(Y3DN39tKGiOML4ZJ/]jY*6K("f?j]d5Q`"(!a6^EnhMXs-4(YR2'J@A!hV_VYI.'P,/ct:aiY%I5X*@<<!f2$Fd[n#8H>Xt!%`[GkeOtZa[( XBpK2#?$1UiL2i!?t8SDQ]UBEW@5SN:$qlSg'CJ>p4G44h[U)U*4s.C'ieWRf:.VF]R(Q.iRPRAi0HUFmR8GAtnR1D&03T):Hpn+RlJa>:[U<*83'R<ZrVPX-mARst:2b;nm:8`R ah-e5GLA0Go'>8Fr%W$]?l)KANM[Ttj gKAfib:.oo,D?jMTW<3DIFMR\io*NBBA$.9'8A6g#(FsamZsV[>Ml`Y&<W"Tq)i8'ROHA9<4@#a56nIM,ME'>LJ18>52+]9pLqoAIWG##HMS2`^SX$'N0dP/)7*DVh;<llE__mo^GAHFXh+,nhg[,\S`oWd!dH+iUA)Cg@qlT jQ?8()W2`0RA9_i Y;!EBdA$_[IX'ERYmL[MkeMnHN0 R"8Nhn7>%)Hh\ e7F@VP61nAQm%^$@;fs\@mrNC5=Or32)c[O6G3#OrFN>k;m0oPe/]0!.i=5Qp+Is@bJ<-cLh_.Ia91f6M+7l;+\mH7V$Ai"4mAp<H ?)6O[-8rE,S6O8'mV??t@ZF^mZ@@"eZhf6M(b3j32;E*13J*rZY9jWB=Zn[(?GU-9>-#Y(jDKCL:4Vr!h#<idLO<paCgYJdN^6rIJk_[]])O!JW%n`EiNq^ZUXL#,))es;M*=%h'#*Mlod2%-Db)MM 0OJMn95,+N]`l#5MM/:hb8V0R/n[)D3WG#@^.(#o%be-5gJH-Fs"`2VH 5"Aj/cV#ZXCH:9ko0jWL:<B+)"J`.l<8K*)-A:QX/($milWkP1L1aQR%"0GU-_".E5"J>k8<CSPU?ieVSFh<(F niAmnHk!l$\sf_=jraa7AK2de2AF2>R"*n88`WB?N)/o9KG\8A]PmSnj,=q=h!%(X+*%Z_/ApSK0`.L;*%@G22NlmG='pP%,JBl$WZ:AS)rlaK/^(J+B^6fW*E C37[ae^A]L@g$;/Ho)o)1:W6q><Q\E7s9(h`c'OTETn:!q`s_K2),-SGXf+!'fgMAqN9/N3,ZS`+`VOd9oT'@B@5ZB<Pk>GbC42!!oDY5#cMQmK3-<)(m#=s%&K37[:CU-hm->V"/AM\ 2BfkNtlILl`fPWRG^+d_9rcNQFckrMM.!3jP2V<b(:QZiAo6XdK KD5-f95M&=Y$'1hV=]F?b6E"^W.I2<7kgnUQlj;YQ'W8NFe?Pc%[Z^BEnel*gUJ:gp`7lGR<sWo*:L^,I@i9KoZ#DK_R/P.QZ(FLN!RO<DH7qY33s88-V/:nIV`_e;!=EW,M.@b!K8$g(:&dKd 1+ghHQ_)#L(]BR=Qg"d1(IaaPU#L=m;U#U;_cR6@A4CTAWnRrdMHjg%2blsYFa!,V9q^;*o"9e]j/-fg.; I@=hri190<\Ld;U^_L"G%ZtjfQor;mA/V<SE%9 DK;JB9^>fg5_YboSY$].O r)#c8_"RFR#WEt(dQCYF8h;ngfPe^Ero9^bWGha"p"J]+f.<>A`G s^Xs9s%I&aF3k(BC@WZ"J9-425-K3884cC_#0Z2 >%o<rip@)O#%A62g?fTsOAa4a36q&D3AJ!JkoSjsXE1#n12,,+n* ,d(o'Z+`;2,RCd]9[%@hTE9r8I-HJOJ$P6':P0,A<mgI%NSe 5tm=.l9eXj9T'I%al,J9A(=rRomPh3n@OVjk>&UIrn.]!F8I#*Th=17cHo>^;_8dB:>NMm'XX<sZM8$3UsY(sJ-An`L0_.!/GhED.&$37=>@beT#@YdX3DFir7"Q'tVgC2$3="Ke9<0Z/i"]":tD-/nfkbdT_X/f)ka]=.l!c?IXTW,9!34IK/'*,/.8OA`8aoXCBI)SGDZdi3b?a`%bI;nNAAfg5KXSC8NdCa(!E:T*fIo2V)8Q;j q<42ACAa.4[Y@<OX&G&JJ[bW[3;Akj&&e!.;;=)abrA2*`5TQlbpi!?P,f_eV#Tt G!rd bi-Rf'-p%U@V7Q\/I?J+mR0m/p6VW4g26;7BUG<N[UJ=U9+@IQ:rA.O&(=O#KK2dj46OP&TFFE+h*8()fLTP[2OW qr=`X;/tCWh905f8f52;D?m-BG4h=I(A]L(K?G&YK'0eI=%:%%>fQscTe-Af]R9Z!B&f@3T2^G+NfGDgHPP!J,Qi5oCC\$B@I3Eg/6D3&MOfs$K9V),ESse*!h_BL_h-mA_19@P&s3i_0iHT+8#"? A)te`srfDN:Qjr =9Q5@m&S8U*eG`k+UC@Op]SVZp7bRqca5TaQ@_g,K"O>Mk8Tkh6K%[TeG=k1P'^k4`43Kp'N+A3+'>e M>-a!M@QEPf>BY.M^D#@!8RAn&" lZp*=gJD#>l.44)c8kJ0EjKn@q4]@Y"mKH\t@=Q!ISeN@[A=q`kl;K32M1r$LV+mb_ni\;IE,6>d$t)B ABH]7&-OK7"('Usf4<rZ=KP(HgBg&TC*^@Z$<'X5<C=+P=iUk1OUaFWGOg<I_Ac$@I-'EcO]6eGc.GF5ZgC8Y jRT@J:3/#*_>U>;ZrgSANg+q7P8tFk0)r%3<-aN*%<p`FYk>`<IX2bS/j42rGs'?VYO0`OQgi8T`, r'(&F7Y<g4oA"(o?:r.*(e6<hBRF( '"$j+Ci Xpr#5Iee>ZUL-14<T&jITd+]Vlgb4/,'YE&ftJ:Qe1+E&F;>2$\*VD79cs,gWm0n+DS7bcA,c14[CZQn]kb/-$nM,K;F";E%4X[R#GGd<f86&...O.Mb+V3jBs5@hK]OH/lW.[;O/J'sa]E4'^eHRV?!l@QpA/];D2c3j\<qo%GhV=[Zb3&I;=(-;)O9m*P7'-k/Kp:NEm\OaD A\ZA[0A5r]:" %S:V%Mk`0rTs8t-U^gGBcn!om 8^-6V&T;$>pX"!h`j=A9_%pt4mZ]LJoOMh#$*nX57JktJ5HI?#ne/qIMd:?F9:q*_UG%ILCdH>fQ\f#>Y7OP(+"C'HD9a&F`'6ir+QkiB`,/EAT'IaBH$'gIAGL>;RtSL"1gO>XeX.L 1SZ+A]31S4W9T>4EJSpPk<4#("#CaOV>>iGftc7?5[?(T^qc:kl2I'#.t^6,`H4W!DfMI9oGt$p0>5f.Z>JO`^Be%q=/\eg]7MaOY:2_,]-,b!A;;_OR A5P.n%Z7YLIe^)1_$N$?&>oA6$59qS8"@VbD8bV:ON"!]`jC@4n:6eDT)3E=(orMJ<ft(p).*n&m(@gO<&[R1jce$dE08i+I=@4P?/E&(bWUdCBsK;OmWDah$02GZfA?,bY7&S=OS1LU>r+U/U-E%h*J> ]QinJS"Z`-9QP2rBF?g#8m PlBDJg^)p'Y4bRk OZ\`0<"p0#`Fq</t8\@flWcEKrMGqD-Y6;3'C<B:6'/BGq9/On3bqOa">LDRa_Md",AR>_7tqgAI6q>F\ rUP2h6P5Lf!WmaGeslT$$:km:"^b98>B@[58%Vk8o[4,3`i<A:q'ZH_pY%"Uo'`nA`#.43cb+C9`m)k1!%m`%&mseOt9o+e2ctA0Xb8dWXkl.0F'&Ws"&JQZjC1QUQf.DqldZ3oGQ+pSCX4l +Al : eAjU?!67ReeTYltifnT*HmKGP&t$Js=8ZnCR/*m-r_j5Ydp3Yr. M0aD?'P4lkVs=?d(*<BdY]jr[SC$jp_YS)j2F=AR*8^m2hgOQOSV_^JjP#sX/\A+-aQhT>-j`:lG Jp3Z@RD+o"K;Oo`cgPBOm:XS[SO/hl\%V"K%rXTaOdA?!`KL0[jil< IE9'PaXf@/tA#eT'SBZ]es'ljk^/f?i^b`k`CeqsgEah1N^_qKFOQ:V,nH;?rWTWAh8@J)AJ-fdM.Ub'>9`Ht>[4A\. HEF2YA9)_X3L^H[B`)dO UYDPi]b&C`-AD`ettad@A#nG>L4c\Wcp"a%d1Bt4"atAn_#%3>VCJq$l$>O^!?$WB17E,NMQI9hqOM,Kl#0QC)5_M%B2E"K7Dt9XK[s@_HW( Xp8-1+,k\hs [i?3?4XCQ9R@I1c,D4?]8FU17BbSEg^J]H'(3&Hist50)n$_k1ZX=$.[:O6<T_<j:`*J"-r,6PMD[9MCs;(Yq<qrK<Kq2 J>R_<AA$0bA>rL`V#&"G<PcUU"nGF[?"W"J%&'nZ3tMD,D?pgc7A[?SXo%+^=?0?FaG6ec"!m0<,H.U\iP;\JS/:dXZGG5nH)-IHaoe&IakR!hcp"nK]q@t7`#Z-1UKD.](XQ4EW%OCAFPfP)%cOW6(#1fA2hleLsX"6qIZI/PkPB,0TlRj+XZg1,g6)<;R6S)`lP]B&`:YB""-A=\O-PW7ZQ5U=IgKgI73V""LsK$)r@T[dQOqtq-7)1MNFR\Rg3hUS*XK"i#A1MPRbhNF),"n!G4AVFnsDl/,!rMD'IHqp@^Aq4TA5'gcKQ>Pi<GU 8>(Zk4\Tk?UAZ@,gt)S#c&n/KSYnFGZjs^cACm;+eP6F^)MAGhoqV4`@1%UMmfNba+"& 0sY!5$N>XYCnoO9^FI6'Y >U,i^S$3>sW3#itq3RnU@rgE1^8\UTrjTcUHbl$CFC%)UY[P:8'M'a6^1O4Y!kgi@n8:%j^P-cslBH*r,-Q"Psn4bKbHHAUVLl%F_fB\P<sD$^O&VU,5Xf';b#cibEC64s c(Wl+T+UE&N,[r6Z`Nk>h*jme`BI1EhI<tPT8'd=nFNSC\#76?:Dg-hVE!L7pL?']SHj@mFc=fH>TO9_gA%]A"i<37)\jY=sD8sYN^9XFA/Ml<+seGea<.6D^$UC[=X-4`tk@fI<aWHN,m37@@E2"LW<b *\l-lL,4OFomrX8JB7`Z<r=tOtOtBdE?[FQ2%g_I.@Ucq$@saZ*AA )qZ,[^(UCZYG*2A $&* (UTA'26U@"_(=Ze]H?i0U3W'K(b$s=&+V+[eBthtG:"E%4^;;jJR2q'1>XG]%M_h:kVC\&C#1j,`E;2[CP_;_,SHb+MHJ][=@?Z\J[!ciZMSC=8T_P^+7+4 #0aMJB#M7+J9Y(TrprMRVhqp%6n6ph[#A1N=8i>Md4<b+GoT'>mPMB$b#AdB5bdamqKn6.so 1O2dscP,`V1#sAjYn-$).Ao3moshGH`Y^-a>1T?/^VeV aR(MfbU*_)lD<ARlksCHYS6i 0q>iE%8OlO?pr$ZfBJj5#^-GX'h(lCVdm<9)q".PI$+*5j!p_'3#>\Il_VpFG6Zjia`Dtp+IWhr@EH#]l0o\`js?_);^=90%PE(m]hA-Vm/r)\W9ENd*Edn+NM,G^,U/n;tA^+<A5Y)VTN+$7=+2ij&=^i_/.T,gT^.CdD1Fs5d+qNl1Z2T*20$cnAc:sB^.?$+m(IlJae \18$h,GVofc!rdX asfdnd4&SOrds;@9][aJ.3h0=t`NnA(fim`UiZ&H '=Ic!`JiOWM-#T6QXPDcec3!J;+/UBa%!onsq92N4A':K7*FnRl=J6H(bRmHG)clO6e2CEd6,GgGO_Q8n!>RQIGfiB9s5o6`RjM[ALmTXqNm@Z:O<6NTbU`)NOr.a:gm^b_XYn-Va0`;P? RCFlYsq/5Pr%$G?r^AZAE&/d*X7AYM\AC,Mes7G -Hb0B\BfX6kcUaJ_5[W1+lp6<;T$WU=C&\hg6A^NeR%bIWE6ZjlN\:k&Kb+<V9boOA3We'Pp+PkF'h5^NrL(PC&SIg%Y$%fDpJA1Ol[+q!_>B7A6N4>?q&C-pLlqE@c)j/Ml\i'J'\/N4((UnMeLVG-?rc?_4]>TAn6!eU_:tUA?OYrAJ[:n>nrn>tOl]L,L3tb%q1"TKD_Ggo :+r<+/L<-QrHM<=)i1La%Yj<M[$U\-a6&PRZ>*#]#`akcXI$cXUbL:=!nNd4$]flE;,Y4(i51saE!5.n97EkgA`IQUb$1s_<[*SpA1j/,IYK=$^.'*J;^U1Aa:r\*[5'BfPm5i\R:Y5N7XT*fJ;m"f<-*_ ePoqPlR7d4nX0[ZP'7CSd8!faj)#/6e[R+!^]L[R:N:TNV!(Kr]OV]a<fSRWGjM;1A!UfQY! C:.jXD2k)AUFH55Z/Te`=;5\Gr'3UgmS0.MhbHXAV;hAcl1a)Zj)t]QG+:J3nm8^\)kSha(@A;OIiY[%%8ieU-cE,_"JR=4l]Lliip./\p7dYXRt\R1@5NG:lQi1nFOXUC4(MW*b+,o\MmaV.BBKf5E5k!+5tih6q+FeghS53%/T*4_R^PLV*EhW0>`% 'I-L hGX.orUtGE^39%Nio,O9MZ;+bHD?BJDBPVAk'SV%5rFKf"?[RX`W\t+Dp$)0NZ_IgY*9I"+GSj3NL[k%HI-fm9A]*9\;\>CTdiC02j0G04t_2C)XN&a6!NCi&_[W*E+K*."oe6R:Oj2/4rU6PtGm9X]s>ho)^1<44a0AT%ELqE/-UKgS#AB$kVBmie4$1Y`0JHGlRa#Xc:]60EN9KE:of(H;ElD[-b]C6hOqKdd#&8/Ct2<^WG->k1N._J]6)TUC2mWRXrPD"Y8'_,rqThCrN+A_oEMMkM5-rY2:3Xl1 @J)D=WVEo)paNT7\MYaD^:\WF6(/m:-oEQ98:]mn#U2rTqm7W07fcC6V&pFWgZ!A^-Ri>AAY?!!sY[:h8OB'o6t?3_]rM4^IfRmA$'mPB<X2,@j62V_BkPrr/6H*4NiF23S%(,EO!Q %$RLjP5X& dHpAUB h>9RjB34sA:CJ(R;lN6,kj1<ao`E3p<h7J&^s-p8+kdahR+Y@q*=<`rl6FFZjEh^OG5d9>[LNKFk4a!+V_Rh;;O><H9'3C`YRV`s4%/?%b_%E3?f0*`?[>&;)P/*^g?AAiJ`@*k?1A%p<4%9L2R:C!fReCA[f#T1C6sYjI_D/H`IV@*N6LX'`m>\qeb %'3.)%;s#s!6/B#8dd`5di,iDPHo7MQ$AV=J+V0:(\<8fZa%E@Z7)"ZlWG4;b.0*S,<"K9#CihF83rBU(&mA&5EDV,'WJ=3NXeAW3@.j2/:!+an"I%3q(9(kqZgY9h]q,VK&![P9;J=D07JI_\6+/:21[RB<D#^-Y-KhIW\TX_dUF=AfD@otfd$h))fGYlq#h\<lEMa!SAs_@+SZ`r;8E0m5UMYmKlI''BkpF:iLERQ,?tXamgrf/;%Hr^Mg0l1ZPn[q4cFoOX'\=>q#4%?Fci'2V,<%6krSb@]jEo:YMGB7P87$W;76_U"nHlgO2 o>'[KdHeIl+n@'5[+Bd.^:\Jt&\Ap\RO2Fn5C&`omaZk:sGJj&_SIO0P-Cd;G3#j(I.Z=NCqc 2%(:[0hN1FV89i'a+ed49r,f\kNa@_KE*@ZZP\GFNRNQ;"+ghd]$LgM%3U05!U-$#I2.6 GM.Cq7P&WDYj$qd`V_755b9$K7,9(Sf=6>@<R(]Q=)V9p>J9pbr+RAf>A74AV_E>Fg]^+-0UtQi_m3+rkfFFEr'<%iHE/4B7N'sRWoRIc*U_qfZ(pFqp,^'0-ja;tcTHL5:+gJPb_qrZl.X(/0TeXTVZ"4AR/'lPAsqA<$@Ej%/0XV$:][.2mhWZ]lgQ?eD8q:t>_himc#`.>6[$mMSG)7CZBZ\e!QI7U=HDoP,3)B5C7Ulm`8l&?97]9bV$) c*11'-:+% f_[-8hncgs>Na[J (jUgspZ80?Ia_'AV;n/VQ0I`\QC$>`:PG6t >1!Z%s\a(FNgB;;HbsFWlOV9<aAs^'\eZZJQfc>3M8[Ut%f/AT2]4a@fo=&HiQ$Kkle-FYl a@C8F)*S;lU"VkdR9\LfU/TT!@.L'+ZhI,!?G3A!#@-h)^!B?)c>:O8cA4gUgeE#kH'\>E:`Rn#i!@2,*)H+HVeRB,cATD8U;RsNOXr*M;O+NTMJGe<Db!OI6eErYAcU4/Z$[Ce_ZE.)Mrc=8:OS%hl.!c[67W8cM1Z4Ge.6/3CFfjm?$6!S<A96Ork]-0/AZn!U)@-0kt%]CT0`F@B.b9`3,8o"sRTPW;sWU'Sl@^FZ$^=RcfT>6$J,BI9'cg'=ei>U`gN41oN#SSV`o[8aOLPjsb0pL^G#MnmAgsb=(`-0T)4mP2A43]F!Uh\hA*V6 9#@Za_'IE2Ai;qk$JQY5>o;L)\]:h7Z)^G7#b'r-KqtTi'dWAC^g,"^i)abIli*HV@7rW#;[H.^HAVDU0)J:8sn2XK+LR._$[Vr,4Eb/7LT^MBL3gcWI7E?sZRn0YPA.\N%UqZT"H:5"Ha +4&mLinhZ%SHpL<hhc.<+2Aihamn$t14&e;M=G6)=c6hP,D:eK>CjG@EpaTt]I+&VgLL6s%+epH56Rq<iMh6<oRS59M$sl:-VHg7r>LE_Js\!*V6EAJ<m@[g2W`/]fs@W3-.LWqIB=:jc1,1YB(:0]qBBrVa;b(D5%kqiYA0p8l<V1oTY<-S&=lmsbAiZ;jFdCEU`lA7O<?aG'W?CH[GC"TB3lPt1#">4"tQerAf'c/]icOeFc]>qJahlBP61.6Zn1e:I5 r78,#,F /3<;SFor=OJLpMlGrc$]/91SAq6(c[(Fle]DE#!/r\CdaCl)$0R$4B-4bm4dX ]0#T,5#9#(`J,Aj?&_%EcpA7_aQJCpFA*F[0r;.q*f0>3$$!_'tRVnR?Q$Q"0XT9?Tq+c_9!_^8eph%AR25K>)6T%F01e/>&b2f]l+nAgmQg8kHb psX3`)5MpE1O.Q!"DT'`;7A-tWqW@P20f$$T/a>PebHtn1!qZT'&JHqr[&'* =52"&7dpe?g.$o%-kKF7q,O0.i?lc698?&86,"NdI3_=M]nkAfAt(7"*tEfQ=-K#I<q67aDF@AD3&RHa4,3Bc[e]FUa>I_0<o0q@cqtbSi'aJ8b6oEkG J=S(Ttr#a2]iN ?&EdQn\N8?m.0f$c2s29AXnfRrD0YYe=h@Q@ZjCe-a08LEl`k96Pm;B-<tbV"TjZ2\.:n<A*IAH*]W6C#lBaq,@epQ^EPI_"<RQ(7m*tZ3gfRVdE2[rolYp (b:G1:C(l@+s2(JL8pEFNE,;km0RU)GA/:St7D"n]JriFr`1*e ]VIpQXV":%co r[GN6H@-:9J5_+['9e5=d,XAB;2fAn.MM5/W!RVm'L?3EHh8/T];)\7jY3Wid<)fCaM=*.kGVRA@W1mb+q&dFAjlpU+nNr=\N@N8j4bA88ZKcfaP7sP%?4@e9)@p`oa2LKVmUKTm%Z 1?4l.rE*WsK5=B&!>q:N.0:K]80%4=JdT[F0n":o%VE& 7;;]E)'rAS_Nc-$P\NppVegCj</=2bL4E>TY>\lcF!%a:rq;9ndd'A:RY&IhG`p5>>Hj^/Wpn)<!^EIH^`@AFS3WL3P>7-f6$8A)=>0+* 7$4o63)&!i-YA,0;t\MkD(AgZah_<[k0o"0]af<(rDd%XfeBU#W/^QS!LTO[PV+8,<A(+P-d42rItI3#eVmFj&F7^as+NJ-RDht  (2FRGbRSQ_R758OHQsFWg`3FHh?jF.r31]^^`[>jY_N*bApB[$!`-QWWA#H->h<CZ`F8p.-B=Z=N-BO!^@@8$A.;" ^/3%Q<]?/b:+VlD`YsUmk":QAh/r;[7d+L/-_*/VN$`h8c"T/[ha@9 );p@U"m<k8[0ejHl^OiCYaZpLE5rnODn':*[M+/RP-GJ3%q8t X9Qp*>AJRlr$UQ<H43#THG3BsI)J0io;C<M:O5*r5SNQ&Z[@ F<G'-VtA?q)I,6hH&b4&g+OJ<\97!`N'/2(3BBpJ!\.&`@q4\^4H)+O=$sHgA#Gc]G='R<Dff"7aF+',VTNeSUi?bbj%FIk_DtiL9cK"DdmW1gr,KX>N(hAmmN\m!Y3R?nY'"`Rr4e))Ys@rQ6(FW9+m(8<6%1roR(^ERjQ>Aoab3a1MR=_]O/h4Irsl=W5+T3ZFSn`X0+r#O*iHD?bGj?I7m8IpjrFoa5J\97IJE66Ob[-4N_o,d-KP#P<rEf@]!AW"4o;D^Goel3A8a5;V^i)cCQ'4sJSm^kAM&`S8Ai!X/Agp3n3?5Ob/K7ojG_+#I&jY%Qr&k@`\`<[mF 0p_(Zi''$a//E?[a<-Wi:7Kl-Sk@N o'eCcBgHJ(ZU,(!e8,ffV6q\[[a0L5bK)\hefXm4A2s#<t6Ed)(<6K0)\7iq>mqB;G=fXB8#]1AL7.HQoXm-[$A\\CQb)f*TfEH1Q()dJ?f&qZlmRo;a%-LnqtW3e&5PgT5d;Has=F2_VI@'FrHm,WN?2 *"=U `K'P$PchrWcdt L92Kj4;kTH=#?H"cf<@iiXjA_QN^rj4qLV";XPD9j:bV01]`34N1\%DX/Ff@#XBI/Lo#c QCoJ\IZ$g(1KG2#(:XDi8A.P"d,A_68DjmdT!hT<G[=Z0H@%j]'jQbkp"q)+)g_:[AYDW,K'LPY:rM4t>.V&m?$9OAM3$5kn+,%0o>W\p<o"Ae_E^)e-oLT@Aa-acg7_9No=J;<@rA`?'!YGG8OG7D(M/H>IXT`^5!6<K>k%@p]Ybdg-7nI"A9V]]2SWb!JA!k)D#W8R2B'ALHClX$++inHhl,8AXH!U j.7%W"Z6tNSf7STULk#,b=c2Y`\M8=j>!L<n>A\i$qn8!`$El*4qXlSbfb3!aDY?2R%[1R5Ah"'$$j?8pp1qtA'Jl$%CW/KX#QcL%9a)['lmKB/(.BG]:TpH6$]M$P3\E,H=El.).V_g'G(SKG/>Z +7Sg  PKXjE]t+.WS^o8?G+9(9o@9@1c?LgS<$&?)tbb^'g(er+C2@fq_->mnAkE5cCn*<>AI/KAoGo>9TcH+h`Wd? FbbjTld6Hm+oYiT&XBq+Tb/Yf9BTIB^Ch`AZldmX'?0WT. @VSl&XcW:#(FW^.IAG(a&UF<A?aHQG"9sAEKhicer@J0`1<UJ5=."s:r-FqL+^:<&;JHr(L3T0ZR,>98DfaUc5>!o9$?$41o7OMdQN 'CCF=3n9,H-GV1:C2fre*/DfeAAgS<E.bQ^&4b7:#ChiO0/(Hq\S%DaH#T+7lYsIUS\"[Q60MRkTZpC29Uam&%?)2LniR"^$@&4Hta5=hQXj*M_EC.4DGJ0,V:>Cp#^OM0Us`WMg\KO4)#5VeCjJY-3Nn8Z+dM8HLr;&bU#`l<.J:+WdI9TALi7"Z.An&t-&SVX`XOY)D:7Cd+Ddfr!Y-0&jr9ie)OCg-)sqid!Q,>ghj*.<4]<aYpe8Z`Vad^(+]OgLt*-%P:?DMA?-;qR_g+>]ft=rY!g>i%M`] kX-bg;:*`c :*FpCB="6Cp?Ksn1E-<iQp4'(EO$[MdUB'LhkB*?DXotl1:)esp1#_CP/O7k@'eH,j5`?lltq,NR?Q3)K,]9^#>$6*nP"]JM1==QSeI5@A"1AJ/Z_F%\AC')E3ZqSM3L2.IfClYbSGOb?aeeqJU!UH_2PI2IVoJ6q7pYVa71dJ%G/foptEZbhC#'i^4tPXI0= KDT Y-TRaHabpCCf="Bi`+t-V#dP>j"+FJN/KL',;Gpj3Q5Vfn6i?8El?H4p'?A"h)A'K%Sm^r%a7-\YgE9pLcSV!=?p%(7TIdC,UJ?]b+L0LJ3PEHeXZTr].8CR?b;,t4!C'>Z&UEGNT$PlIQW6DSsF;WeM2&o=mUA>cAhf-i$qW*KB I)9.1Ae%^ICbAe2h7.Z]$UQ!@G,pCLD1J>:A#U>hg/fathk5@GnFm"/:HW)V\+\*c)m2Jk8DoKPOBc7]fSih46G/\rq0&rm#,G3J;E-*rDh sS= *C%f.NATZooQ.modqS#(%dHm;?a4d&b!XWgOmKTf"q9I -2%%q,8R4,J#$5gBfZTYMm,tq2SA+ifSo/r[#P]T<sPs5P<%KADoLC3t3T5l\d?-pNlf\80T4:jo?sq9f38r_%_-@PQ8+"U!Ab)\ LCp)RsPYNC`D.'j(FQrAA(hW2+LK)TB/#2e@CpI`![q 2=&b;kl8k6FWhGZ`.>^7eX0(.?F6`%@`NXKL=PX\?XR7=GQRsCYK 0Q\S/ZOS`W`[9W)X7V_(iTHfR:`>AF:g>b LA3A@>8dj3,0ned.C9%JHBg&lDPd9#)n\@9&p)jY]=s!9 :qp)mJ3#7,;-Nm`e9lY@:m]"The#>be)i8Ahq]g 7#C_o&cdPH13j;Sp$)0sqL`Z.WA8[L%sSPF@E-(\S\9Y(fRCOm4p#A+/.-O(a11A$tQm_(R)NjCW(2f_' o<TL."!<4`.@SM!<'b%HSI$t&j)#!<Wh ,9Oj91s8X\Cb6M]3nnBlIEnkDQ8ZRbQOc"P<q8n--ZMNV#jA`Z=gKe&t/66IcPh>fHL0$??.r'tB.`X]ZTY-740RoY&iN5STW5I Y>I!rPHtYX"Y/ ]m]QInX!&K`NQRU)A>OG5&En."WC4<;4;\=BB.gia@?>Y0'ASF+mY*2#Lb[9B#JZ%RhJ<>fc!Ae*daYAO6gYGjGl-!/h69M)#jlf86;rh<sq1e06H9`D4a:\QGK68r%_AJApp^r6rn-q$h+8o;^HR@AA:_*O#O2q)6>Hb)i)DV\@*_9T:__^KQ^l @<85s9 M6]?eA!#Cps.,Y$ e<B?lq`ob11&"+0p!0%L'*]25G*f$f_n45Rk_7\3_%Qk.TAGETBtgV3eb-_@XHi*ed>-f$32>G2bhqZA!B1LIA6@arX(5L&:e!eg0X=_bWcP-%",09!bEk^C&Y!irAW36XKqV6/MbI)Ak![%,TPZ/AKX0]*\WPq";OP*pa)Ki!,)$\1N-X$@M$b!8<;O`$8OZh_`N0mh_cs1/7&k3=["]tI-OGV.oYk Y2+.riBdRQ7k\d8GFpG/PVm.]tlq>RU!J_h'fVdeSAbW[^.iXN!f<qMX:0;PEoMR^?NslZ`NHj W/&G&!Z6a4LQp]2]=t"X]6<NEreD:Z<PrBEW)?^`KRf9Zt)9*<i=e3L8q"3d5L0'\j_PKdUYRLp069hp*/<t,R*OgK#ml^-8&AN]kS=IDMlD0ZI3iiIAj-;MOY>#;cO[m]U9NstB?Y`+Ab(IDE;'P.!Z\N@8!HZ>d>(@m"p(lS4/XIEKNZ5h:\YL>SWGK#]2OP.q;][.s$84/9FJeN')"(&q42g3SKpVUbifkn,mpIT- @XaW8j?_3AJT:Voh==X>+ ?1)iFM(aWV4]1_hI,\Slc#pWkThsicBRV[AhADB9KKPUJ`KL$eSSPC/['K8(hb?AE3^sJ7;;oEH6A8j$#1`AQXq]ps9,Ap08AYc/MO]IfN[.]7tD;U%6lh8;XH`s+'p4diRJ%oF_4b)cOH8 /J=sS"0kO<gBSc8Lf:tS5Gk2`_Ed[*XG@A#sH@fAg?QcggR_AJ&qZQ8mE<6R _A:&n0)9"WXr]aZ9hb1;JT_;OU0h[Kqdl>l)4^H.]mP3:cCoJ8V1hl+)+2d7W Dt$0'FNfB&5PlW9$M]DJE_D:(;N(?$o&d,qGsnX ;1dOdm0c.Rl^Ct/GiDTs&^SYV.PW$"J@8 b,>I-<Gm&@`:[p6h-V:)e7A-96;h8:[364n4pA5C8I3WTj%5k)'[,&4>:#.aEXL8niGh;KrT F$=M/DjA'3s5/9@r1hqn@+HYf""RWe9Afnlh*\tg\T$X6dE9C#q[\0\:dFf4!-]NS4`VIJhs6-=6e2lT5cCT"24i5G$]2n^Bb$3$,R6:ZKjn@n.A;.MEscbH4 DdA?j8O`!mM#7p (Mb(4\qBrt!VG>>(BIRK#@Z:0AcaHk=6AL-/"R+&S!c-BagoA8,om0\!GWbeO<.R":,J>2aU0%PFdYd004$69J5;\tLU!5Ym$k)$!cm%OR%btd4g`bla;Q&(f`X3:4DeNTAmo=m*:p1]Al3O5H8,'4G6c-h3;7n>Fq/)Q'@lk!K[k0:eKGq8'^Hbjj*^%?XnWb)/soo."AmJq]dI[KZDV&75oA*F:"*VWY1d`DAUtYXFESlLQ:A9c_qNT^NYs.-:rZkgJ".PD:)-#CMDPjY3^/mi\s+r67s[c@V=;W6e*^PJO9`@2fPXRojZ9Z%1+:OLf?fGi)YF]!H %Bcbh!X*+F!)/)#Eg+Z;c*f^&2;tm2;slJSP2a+& \W;9)_LH`"+S$tAU MQ+dCr^ $1(AY!.b-2ce%n.dInA;#Vipk<ZTp!@%11QGD'M!';#,H>o"dmU?'\qoV[ngS)K[\IhNC`)f:On)g3&qdb!?cQ&r,.UoSd%9KA8O!L([*H.!:j;cE7V65ae>>K)=('.65D3G;+]qYa4Nd;5l+PW ACE1@pAZ!9fj`ksP&cNdARrG dHjaQ5oVOYpEt>,V<p)n9MF3r<fAH*Y)q/2!P'XI_0.m'+PPISi+df=_YP42`P]8hh9VI5*`8`_F(k%t`FWUsFa-g!M3EB[9$=@ptPVQE;?!0CC8 i+Scs]<Ys,t*BbZ2 J89^"H;`O.8XETtXsd4L#I-o-Q#%GN0Fr')D'bg,l^]mW@^%MqYtbp0Ae!K=0TBeXY2GpWZ@n#.qaJHhR2IelC(MZ`76Y%p0$QYS"H"^?O:<Y3(M9c2_iApo9aeWBUcdk75sd+`R/_$N#%,7.T, g8RAMjc`4r0OY#;\J-+'Y2s8taO >3SV /T)`t (A(e3UG*B:$*U%1qF'.Y&@4m;$i R!&GXLANqSP^N1$/D5SG9AP@nCAr=gHZ8G\FWrDbm\'IM:n4b!oXSa#UmqGQ(=UD*99GH#2FAcmitH0)]lAfKB;T<fbN'_q=TPt.AbP]s=6gRTsAZ#aJ&+`[3'.,nkmM(M)>S5Q$tR],lh]mC$AP;D@ULc0jXAAT>pBH_EDkoO7H2_oUJ!P@01V94VqMXTS"fUAS.Vq8W7*8jMn9>mJBQE0?C@1KW>E7_AGr\BQ+q/kpCe2B@)'1.3pE0P9NbKC$`5X^'*+[69n.gQDdk!6N`c(r5CV8O[#$Yh Ur$&Z?,6iif)l0lTtGi%Iq;+L3_U>Y#*78dKr,BH6An2gR5bcap^l)Y3!c&>n<VT:7o<)r>.ee4 aE5AcSdA>MPOSQK\#=r&1"0_S^@0*e--@bKC&1Nc"P;&2Z:GGifAL6]:t%t"Y$9O#GW]?-?>OCNKs A@-ekH0m`@*!+J>,/WJ9]kt5tQC6j+V'VG<.77h*g&)+G9nKA#5TAW\ti)&M3$k/7W?A%\=P*&&L]kY&rKk!kjTUl,N6R7-cPUHak5odkeHZH9A3V/]e/;fYF-<pP^Vka]?L%Wt!> 'JSsn/16VA/c<cMH<R^q/)0e2;0#JS*Xe+:^ZA+@)L0T3EJ 1lbB1h=[9 QmbKjA&XLtea]?:Kq.jhNK)7a,bhS4;J%1oUk,]tlO*Q.p?H.tDIt()%AIRd@hS?]l4F[1!8eqI]gkcXGY9AIHK`GRgr/9G,oWDWTf\o=J]eNYPGqdFoS^/F`V;UhkT9^Z3a-6;;9XcCV8mb5-90k Xmq58-!MoS=8,7rZ;cs*fZAMb!<CkeAbep3lEp[jA#UOt_+rso4GBAt&E8rg[G8+pt6V4DJ] RFDWkE]hic+BC`XB(#,e[PrXb8N#OTM+.a$*(GA<g 2:'FJo+n!I9ng@d9oi N9R )XYP`32,r+K7ma4 X3`\4?)8dR6fAA>,(-q T)"`=2JkBj^:aT8sTp_+2o%N:b%QTZ\gnq"t4D_1B<2AXOUM;O4*Ak@I\ENSP'eanE/Y^fL4TOAcV4an>(*-1fPMHG=)$j4j8tKb`59DFSA+QR?.;n<(j:3sr33Q-o]b5;j^l<-Ua&+5%1?7smY;jbUM/7"Zf70BdK@GnRNi%\2A+%S1J/`?(NH8JFjLeJ Z9$Mq986!Pn6H8E=Eg=k)e]>^Ad=?#rpK+J^5QQsb)oT1ch=rtJrj.c+XK;Mk_e_dc ^YG[aWPCZd!n,D+1F=_O\K:LU3"G'rFViOQO`B+PP`%XRnoQg9V:YCrJjl'rh5"HeFCLg:B.Ic7r:&F($UKC>8#C"lGT*p!A\3'_A*'.InVC1n8Z@F<O&B45YQ%bA*n<&r7.WlfF@>O;Iq7_7tWk:q")I#=4mK(56h45X,q,9s.lG#mPRAAfs2l/8MBX_na39RX1B$7LKc'&?bV/'g' k_D5I67WP!W/a'l%;ZWeAH"f7AQ;OA"^*oPXQ%;8;iU46BOD>lJO;8k,[Z1W`N'Bk^0Q_7P<#K%b*cpHlEFaJMNaHL>>J(p@9OVAOb8]Djdf+69iccX jG1Q9kqd*.,"lmC3"mYNY35[,2A=oIg#`S8OJ#be %49a81hN,bj1J-ZB9MYg,p*,1gKDe=>lr'+(fb:U#_eKBV(:H8\eY-Zs4bW5CLo:PZ]&V ]tV5`';2A@r:h;k(62p]F.ga5.r%EH)=f=AlBO-d;9*;n-=Ztn1@/-,7Nm%3t"^-?+sTCNYq)pZ[R#%BRe&5EM98USIRnH]R,Ij[aJ5#GcDL1P2'U%1U4B-0pLMZ:],^f*a)tYI6->6F]]rp*Fi! h2_=EaBn5D)(F?1amaLA4)UZ)\;;4B8F8PAa#XA\=$>RK>aPcH's.cHKk<BWbJU:7&jj98ZP5/@p%_NQLhE>9o9Yc*7CO;(m<DreX]hQ>1f5^ZpkRf`5#?(],]V@j"JEi_U&+ec^F9L+o6S`$P;g':4%8Z<MZ]C-&Y)X3#^):;bkY-`MWD?WY4ITg#;T&5.PXB-F]a3[st">IGG_$22bNQ589\KG%;CdqrRWd"f"GcNj&-$QNs2'2=j6AojYZakT>_KbC4HIT4.^o=ES8*5JZ1<(!\Fs8!r;!:!@U[/oA*I:A<UkZKmV'rAjCFA7,$O?h)W XtghnUp)YO&g_sO%b&`L`TqZTi&s\"<%DbkaLEV2US2PV$id")V]d9E6-=as:T:%$."r)<#XcD2hH^S77"(gi,MW;ZDi7k@@e6YIQ\dZ"1GBHB-N_BK%A/WHnX#kan&g=<!g"?[,\!\EGsZ9@<4-IK-[Q(3N]?-+Zi(F'HZ5L\,$IE.8$;Gf4KeiqHA]nUR4)r\1dqj()?S=l&]`gfXAF'K:(&f `H<!-DqdR#aKYFFKLcbp0>eFUE.UE$^[dbN6./B(o+&Khj";/-h7U]"6pb4W:3Gd^'+82&iV6L$oar/'MR?Wo,W"@YY&)#&_<%eETG(I??e'7cRH$>%H&b/BCF"pt+97)2YnSV3Mc#`m#smn^Y9jpKoO=e9j+fnJ+/V]Fq?:kpU(tq8hX\Zl2#ppK'X.Xa2UdC95c)8D?q!AQmHL.qh+?a.PN;ZHUmo&jm]dEnA] fin@9St "5i+L-4s,$sW Kt^;[K.q2QQO`?!m\?:*]-<cpg)U6pDr]\21@-BmSIt:YjN0l3kdDB3c]"]/PIRn<'5)Wp@b$ =o"JPcV@\Y:,#[m,R;G$qdBQ&^2>j;5\Te*TYd[R*#XE?R%JJRX*gELE/ZOMoP'"i-U[8We5H5qOj30C-lI1\#MAo36hPt.caONtgNM,:8aFnFomY<fHcg[Hl8P AV!IbYROa,4^dDX__$F5)S)b2e+73K [4#q_+mrX?'YC]N2RB0U(S&QQ hOgA,AZ0`qb3V'n35LNK?FZT]%o7_G4B)+dH!WFj;?`(OA0p<tr_D)-h+-XQ:Q9,UH[4R3M Xc7#T:Fe&#h<:H23V*WWo046t0IM*G9$@%ALWR2C?ADqS3e>4(g]IO/H0$Sc3nH@nd0n)lG;+$%`nilmb*S[gZE0_`<Ab7&5h[g$Hs6l<p&6g3;54A#Z=W $^m? "RN4LN+&Gr3.`s:f98/6gD,<HA>Rm/T>RR%">8C$4 be`Y$@B<K$s&?R_MqP#,lh7?+Nh*F!&sN)b"%3P0q./&hbZ K_tl(BPd%#@DbcW&:E+eJH0,#@NU!Rqn\f9U^EZCM#XXWgnh4eIcm"Ji#dlEjAGiUt7`2^X.([Gf3s\jEJ=ZE%"@;Ibi,&Ill,[nhG0:1Wqc6"+G*E!Vjqhq!,n3RTG*4h4pl?RW(9U\mYdNrK0NBAdOFf>j$^Sdf4OY_N+C;K8]fi!4g3cF<58F-dat-XT:DkVSopo4.^ZhsjV/eX7AEPS2FVgB$'&Xh=VSM$Ik07PPW6ZO':)3Uf7)dOK8jh_f3?H(Jr=J.LgWnT1_eA=M1e,6f!4%<&&A2&DON;?=N_kWlt\Kag$9 26W#;7 crF(` K+M`V"PfX,K%Ul_d@0i!KWfX*OGp4i=EUbSAqBrLALs%[A.^,l0Al?QEaj(amk)]FBXCiYK--?0U(pfC?q!+_=@mSLkXrK'J*gge)^B-a6n'9Hs)75QM5+cQ_[B^[je,\&h0,L2:n3+V:eA6RKlQnAh^: #7oU(C74=K*?8a@iMN 6)?Y2imWkj)jL3t=2lo%-A%Gmm6AGXq_4!Ebb6`hLDF-N:dPU-j=o@5]'ibipCDlZg8,*CGk`A71c00>eW@`lpcN++U?e,n3\;Y#a($_>;^HrjD$XkV&[F,SB1n7gSqmnJZ[Id1g^sl*\E]lIB<oj:'TWj$k:erJc7cB#:UY/,soH*e[nmF5hk/+"E]31?=^CldeS;qF-frFMr]d0s8E[&`j^Zhngt?@jiqb%>^ROG<^fcY4L[M^]n*O[R3GnNg9P/XAAM=16F,A^V<TeQH,>M3/HLLO3#gZ!31(_R8kt:X2EhY\#6)+[`Q$B#C"A7-qpb/JiZ$eMFkn^MD ,TL4B?tXT&-c,/po271,` L:QjqT/q!K'EqA 6n#[#UY9n`TOWqC)=[A!8`QY#;#:fLP\"n+9hd&@S8<L/Wg?HaBIt%gi=K#]t*8\Qae71@(a;j(FHc(.siW;\+Z6Sr!A*.bSSjG[D:[SV]`QQ>&98>gA1=@,sIE$B1.F\m[c2-092XJD<`_R109#40(RH4j$j'(^%l%LaG[tiNdNZd*L1\p&tAXEZ$g?Z02SLek*3eor_IN&2ML+)kQAg3r8Y'\^UIW-h=C1`3]Rm:6]k..&0H*fa8l.nU@9a"kZS0BW6]KU9Y(_gF#p kT*6NY\(LoI+>=7e":1nOl4V"$!IZZY,B8hj6fhZ7>HA^rt'%q(_IeAAN#$#"8MFmA2qMckc  cP)2Nn9;YF3LqeBr;(\kgkAfI0eR*@.h`&A+`ESKeNB"7q;S,6E/B'U'\'1FYW[5,sBM+KgV1A\l(q.oU7(!F0!T<MI#A;:dt2WI6mcC\`WgY4fI4)O-*OT-bBsfU9k:)75H"QIg8B2!CH8),!@-B?;k;9e@L%n))6Sg?45t^H6D97\-0T%b+pEoA3(Hn *@9\5L59I.h_Tjr^P=!R>:g&.X(<$bD-DS]3<q7*PkT4BfJ!km`,/j,&=TXKS>Cr[2U?^/0_g%5=6=#cQt:]hj1O7-*[drWco:"b>R!sa"'8k_dU;QMV?:lSAcFDAaK\bO':MoAp_lAh`-" EqBL/@I)1Q -:'/=tR0A#;9N?(II?^7"Wr8-.@_*/KdAbk=Kb?6/5k /l5J:::)1cNJBbV/bC%Gf<"1r>kprV$Fat17n#07s,X$5"q5'M'%q%f6Y%r'\tr>+\UpOrS;&:N*0&?rVlQp*q:9LhNVteW"%&_0nP]CVWeWYb[mIOkkDfKdF9END]C>(/EUcC3'KtX3)- l^9"AmN>%a7htW0sKW>ko+-1p0A2NPU8ZpPV[sI'QOYe4+[F%aIY!jA `E?h[:=BrTgJ4p^1d7sAitnEHsfm)?\MJ1WA/Zim*4V-B3o'kMrct@h.>*OB-/7YG=)EW.tj!CpSYMa>CdEqFI@`1G#apQ/J4LV_VFO/PS]ZRV;s84(hSM.n8(`6LX.,jiGkF5,*UkI$H> /@ArY_7EOm)/2;6=EjTI&*#\e'#*2*>k.3T'0C*o0^#OHh[&"W6Eo2A]5GB6S,?"m$ER:Pi?aY4pH?Z; A,m!K+sF/-oB >-Xh?WQ'TI)L'mBJWWF>%mY!F&X8ZZ0)q2UfsSqZ[X:d0[4EWb!S7I(,FN3F)LdFX^3:`EhCO=U9>5.6\R;PF;)`^3M4EI/A b]Re\,*TD!C[T"iYIj^+l.tUG<0&ID.JdLFEF,lrZogh-JT-;a?2`HS7"eQ+Ng&icHUr[3kn'?nNUVD /b@7[cRe(U6BA?<ltXNL(\1rAT_cr.IH8&2GZQ=KT!*moSn^:b]=SUlC &s*mXBh-Bq0%O3RX,b:8(nBC`tYafYW]A]tJf^b`;XqJ+m^7q;nPAC@3p2T9cEOd_[J70^#Ilo-0F9s,1"K`=#?,^s!OqC*X],J`NgbSo["=#3SR/r1b4RaG4/i;]YRj7CL2nmSRk5qB6jqB#K6dAi1>jmq>ToSn @6G03!ngRd&*ZKo'Ue,Ll)_2'- h1 98UTlo@LX@i7hgRUb\trHlfc\epd$Dd'=6=tm#:U]S;d(`ABONL L6q,6lVID;;TVbZb3oT?#!cjhA#S9'J =Iie<<Ubr^#:;pOhpn.P%"P0<&C>3KV%eXg9ST cf%hT!aZIG74l-^bP>18WA:NRE,1<W;ioB;n-g*(PJteLc38\2U-"74d.Nt;:ofSZ=rTdIK*3^n&d?['Xh+L5n?C.j]T6l+>VQ>8n_d`II+&4Ume@SeS  Q`+>dmTNhhU+8=+gc/Unj=\LBal9)>-cT7]Nh_,!'&2Oa;O_!p:NEnWnKsUke-I@`1=nB)N>[)qs_)>E2r3B@c%N0R7PVUEf['eeAnFZtesX'+o>$5Y<"i?6&_Fj*<nm*UZ_nXNnnOek6 W[0ej.je1[^M?MKO,G%A0h#Wc!jZQKcG]jfmj1 gE\Ti:!7"`A#jO4Q,4!TI$2A(S;),-k Ia!GO8inSYdhSrZPLGY5m(S4:KAn(NDGpsoLs^38'`,>iY\Rr]5)>7/E\e?mp^dUAn]C3?#T'`oEe&3R5g7t[U21bj#^2t?>HAVAb)D]gf2B,<VBQV:PMU,nkL>esZ"shAWS=WN)5P.p+TZGN3\KAkAmHN2DbS[<A@RE3@aHjXFA([<8LrV%(pD+U1@=%%n2/'@[\%?E3@emR'38S9#&e!R1#T?B)b:AEU<flsK&_XEV+QTV/)/:_2YO,6nEkF6'T9?A.'?r&9VUnMC!rRjX%W9/A&53XK a2;9tcnD"Fm4k<ra0Ycl:*?IMgkgm_>V@R1fS`Ti50@R0>UdFAK1)Zi*-J0D7j"/FE0RKgkB;0iln2Vh\<@,l5r]`W?D2+"Bt/6X 0L>3\066f+6tYoOA`?=e&r+4_C(F?pZZ_h]2V0&2bBhp(=3Q,]EGTePc&Co;lFKHts'mB>=OgZJ5rFRoEQ6$W?]j$BT@RHgO*82+a[@NRqTPYs:Ks+^NG+2"2jF(5!\ kq?M9_GhBC&']rj'Qj)AhgNs#OnOQBXPO!o0&=nZ!i%DX?:cOY,2Y8#2IALK1>:R^N+o6hfqpU f[O%m6lQ%_I0=>bgAG'%\7(4Tm+LtH]Q(f[KYjRnf`W0-B'*LL- s90UE*\Ks5< =BWFKc485lcUBk(R%gULHnT^KAPiWSR6 ?35O?d<ff?d:X)7qR0&20Y"+F# 2jA>mV- ]mH45?&LV=EsoB]%)!*$'edIP"HG+V/A::SkJdA1k+@K%D:IB_ENml)0&r$<b[)qh6Ke(orDDnsEPjrVWQot<!(j%'>NS`[IdK@Tg>Jq5]_0*/Q-KIb IWTFA!SDl%\-:M7ni6Aj9j[^!L?`ZS^T47j`e`*lc!hK=rb;UG! #CL$5c(3iTti:(pCpR34`];*shFF]-d>MAn59AF1a_E2<NF57<Xt4jQKmk 'ks'DL^;mk\(#\a6&B2pYbaN-R(oKP$>>SbWX_0to6Q'":44aKk4,_OWN'WE+p9GES&eVmA!ZAWe;*qsL/ l"?l1kg2d9<5jgb5\#OmVf3WH4:$$ad*b>=G)U/n7dEeC([U<@`qL2iOVk(Dib2-K:K?Y*r+^A^,72qI)JQ>.VE SfW`"Qrg1`cJ!oAKC>O @CpG-A0t@M*]8=":inR=\NnGXpC1+<J7f1QKdi"G &GAc37cmGW'*sk!8:G:AZb=k8LcF0l&+[H=]J%m,:gflb*.i9I?=;h,UcLclokkEijJRo"]LiA "]#^bs*Qr-PeR@k9`_6Z++1R6"&99>]3lQO]i?5P-WsB0t^VO<idr5N0l8S=<pUV9]A&#(PAR+fAAo'$Sr6A5BgK#2-amroKkQAjs7'beCcn/;)!*lkA-\iAb$=*_DA<OdZ_&i1rN;6/]C"@14U>rZ8kQAh<njeqG0W`F-t8J7e 0f[isgmTg5$:#KpJ[q`""%O28,f>M+-/3'N7[h^&Rg#A%K\^9XV4Rl gZWEKgPEG;$^iRChYtWGPlp<8#\6OVm7h`lDL-V11E[4QN:,kH"\o(<)7`=*@tKW]66kb^#jiLt*/%]!)A1(Vt]%e;K0FREkVrC,XQJA'Foj:?I&Zb>^Z+4D4"A9)%`=J nAEL+q\'\F$kAP627_qJekh$gb:_FDj/*fM#1<(;qNmOX/:T&7B?EMGQ@QAs.O*o2ld' jcoHpC:/'!;`CX*#, 0M[`0HB[A5#]4&jDdoo' tf6e",o(9HXr,bVrfLCL0Aa.bjVFXVF5P>b%R(lpHU*'3XDQQWq-8MECG"t"'dj!OM[_N,FfE40OCHd6Z!'M&6f!PZ0t+@\2#)&%Pk45Vf#O<Zbbpid[CjWaL&nd&DZFr#6he(H@s]ah6W\O;[S2<>#be?9I.6D<CG0:7!l'4-HNnB/`+>kcS<X6L"SfT*23Tm`'LY4/)o%J3X&0%2R1&)qc/0O3LH':V?g$d!ho*i@s80,\#"aM;BrKe-ggAW7Ib6j^GsG\@:U8$^djWn4)8VB1->%rV/\^Te((c*l7+cDmM<W>aFCFhGD$Lh\ID5;V0a7iRq<ss]O[b<]O1FBh7:*jb&?@?)&RGF]%/C2;&J+%f=Q>dV)<],d-e>q<E[ (Zg7.D!\4EJ4[U(b@(AhmE`_OS9G&&pdj" q3PHR$me3_LRA`G[9poS)*7?L"2_qe3HXV^[%rTArKEAa:S-aOS](?hsJW_/7R\[+%;pe*kZC<@(q`<8!`&7#4.OoJfbpo3ig@50+m*eR53JRhqrU=H3GH@^KM2%<`pA;<7dUD]9FE$tYmlj:4&)lWpjoXje\L;nHsWBi%7Z8@%W2M>]WatN3e&Ya$P?d1_j+a6i$FGQe [Ho%f;j#Qt=QGoBobQN?lP1[f>fL:)H^SC9A[ ;\(Q=WAm6cp29%SZhY@(8TsDkq=l3_I,h(g?%q73K`h6-55N<Bb"<b\qiCo;QrFJc6nT`ib7p%bK]Z8Uo(27M&*.E"M&]] lBHe%8YL9fSs[i&o1*qNq$\A[-3b;`9KbFn% MU:@"4#9NFH/B`<"#)MUg^'k_Qf4rEI<!.UE0!%eTi"%_=E*?qJZhS7.2#l/]i(bnr=1mN@N7X,5(WfVX"5(.Ik%gY]ibjqG>igo3:!<3c4d]&(M/RC4(eIiBKW,oI1d4!(<;B >+HZ0)e.bs' II6_7LN#)q0a(AMn+>q59C$8oU0La]iI)[H9,gNXL4&:BUAfcT@[h'dlY4tBR90i9=:_bb?\QZ673eo0Ea?JZDAFnHn/UH6]C0 /t-;)e78-B$@6G%OBSL1a.\&FQb-+OUZWrW&1ecmcSTKW#ZdeT1+ApR'5DMSQ, 9Am& )+ e<2W.Wa?CO"X_l"lQ/Q<*[.hDltZ^6JjC[PiL2814O$?j/QC&AnOGmtW_ b]KA( 9LO*7FOICC/7dr)pPH!B?r[;`^d[\V2,^08jK/C[M3k,V78XZ@LoJf\HmZAko6>rTepb]iPgEQ!;4.c$ClmhP9 1T=6&0GBA*(Un49P<=BR:p2#p&bO!H74&n`98`_,VkA6]t dGYqeN"grDXBFk;-"dNOARN[5-%).(_NSa/RE::QKJnZG%f"PP=6#l'D'I48qT\;))GTV2K1E51o"_6-RH;:$cTB5"48AR<+U*>A7N?5J+iEFl=h2p+f6]h.fH!E0CtSO7t;SK_/h/-^ndjRX4$rfi7Onn#B$CE="L=nLG[]3HB=/ph65]@7dB7P#"MTBSV[P-60h'#NLG=klt'MR8q=d)fN])[O_`Ia-7BMX%eFAkcF6JT8MYV!)/cL3[cj3VnH$ &O"iJ_g2HosF.@ To@V7OK2"LsYYcAs5>M+d:Z1XW*e%Gm*K>tcI$W6Q<m7EInq/U],5G4#:r7W_snqr9AieIk[DsKbjR*EesIK>:;KCW8U@<iGC:efI1WKpq5*f0gc`oGC-Wmtq\Al+mGjk*8c((J7.$P@<I'/PWQ^3 [M<U_1e;3N#q,e*I>LOlgU_)VE bAQRh6)apl,gr3^#@NbAij\=Sg_"teo$a WNJ s\q8+r@pKXeJ*sh/T'M=L+QaNK!gdrAe+n+FWDCZ"d73O&/!Sn/0.[9[> *,%SA'G#Dns-Q(RBA`aO7ehjH)t4Y>ad%^:]&QOX[M[-RS5W3846J>)6])AO>s&GdJcAMo[mJfU<>YkGoI%14nSCT:feac2KYL[-! Hm.Y7Q=:(&B9'$OVjb=d*e?S5Zdm'Ar!qIRLG soR`^Z:ee +eAt.Y.FKE>i*h$BGo)I4L)L;A(P!-]ofO(X1\m,kn4&;6HQO>TAD--L"8+>W$6m'Yod<GBS 4$1ens['o\'?+TM1IQpBQP/k*mtYi%&NL""F7t rD]T(-,tU=e&hqTU8r$:1KQ4m<DqNX3""9'$,J-g+2>9bg_4 (a%XKa;;A)@t<"XXDf7j(g6/+W`o$%[@-c;ZRqq,9bkhLBa&X@(>sY^DS2fB`Aq]pm'8iB!RsL`MeG$<n%bbFG;ZT_,C=fKoAn0`.Z\6>atMf'^$hk"i[r`s^LS>(WP-?,oPj_BMIs_1gA$qsn?'oA1Z4Jf0BFg8n.[sf@=gm]33!6m8_IK6',"ZM[M>)ejl/M5S`7NlJr(^!dDiF[.n U%6S]nseSC8=_2>bcCgcoW!sAbgRfL!kgj%81")9\EUQiobP%Cd`[S%t/WV[A`T+_WFrsRlPS]gK0G?)-l)i*_X"4J,[Vl8mQb= 9Y(a^=%lViQp(feU]A`:-MU`^2tA#_mKUj<U[ln(,ai!8it:%F'1nCeHsVA5gTbn-@*%Q>SE*h,pKKl^n\bg5LBF6AiUAt tY,8kJ; B:*CQk]!fn4<&*&JQh^]rJ`k'j?PUQbR*dHa<FYHk *jLESb/Y3>YWN`IqI5d'*L%2HmA?=HK>g73Ih#/Xke3&c^@O\rHG&A1&F!VPW^2'H.[9WD[;=#!Wk267l\ggd@B3(CnV"@!^C*Cm!@8dg6pIAiaVY`omHsisq:(]e_iW)(,.3 '_Y;bm&qQXO[_c2L*>=U)U@@V6QWjlsCA_(^TWdoAjC-6.^kp/8PVmW2pMq]*<[rB(-bHH34$OB\;86lq!,hgU*m&"",6e6`dNO<;S',0jLdrW/-I\P1IJV##$>:TEl=B"$WHA0]k*cVFE+#j,%ZID]KSV=&2S=<XD\h!tWF-.maP>L(qS-;P%%"9'*IqA5:E(-H-^IJo4-*9<L[D_@F$SRC/WcRbs#2`+"a/.2'(ld0]^PMBfHHkYf42TWB'd`9LA5\>o]ogIIqd^G[U"P(ngM;AYL)a\+on0"<DIEF&RKY b4#dbB\N;Ss_eI0cNWF;S6$_N9ZM8`?4IN)9-[M A?H=9RqL"]"V30(Fn(d#- ATpboT=s  B\q&s6GkUoA 8C7.Q.`dP)!oV%I$cesctqRsMFS42&rj]@MZlMsC&$&6P]>$+A,iYLYIb]Ok8_fBRloV?h^>i?A;VM,5F5!O;mI)Dp(7"H4E+C8$M,K=ZHM3iaT?t;s*\4tZ*f-!dB\9UqF>siV<VlSi619AtA_cRe0I_E)Xa5 3aP7#M+6\jp5\D_I?$-Eh*5gIaAKH[X#_-rA%PiIQC-XBWRC:Ct^<fA$RdGAD#VN(&6l)"otBPmOtE1e=dY!,K`.FS7%oC.!:4V9ggb,W0X]]%dtHA?:i[0LKsX)?_lmCg$Z9b2V8ljqB%g/A"X6BBAFDA16s(VLC2f[:mAAZQ4kcBX%1^h>D8lFn_eNf,5In:nD#h.;fF#M\P=*J,DKKM\,pq1^`=90Q!e=,@LU-4PFS(IJm/J$0mrDUEDlDZ/<>SUO"MSWAb 3ER:/YH*ab4%E-KC g>8dCgZT2$7/5Q?8<p*T'SHb"$frE4\^<KG*A*+pSj"",Qt<M,Xdb]Y8n4!@T<:Do[P/8dIQeA@+"sD-$63g);7?\p`ihr:<\/ nf_A`RaC!]B]-!h7i1>)&MqjOj34>%m-^a8GG<j)p+YmhIaGFg[5=.Cn+To:r:$Ido$jIrj;9CIBUB<#s8oO<tM:ek@(Y@$,D1(g,^LIWC;F5]r=6Hhe"L&l]ohA9Kp)QLtaXKB-X0b6:4:L[bPb#;B.O($=%0ci#agASXh4p 0U6l.L:t<_AA72q%Y"1e6J.WqFIgq5!MDQ$C\0U`HX9hg L^6D,BGRt7 .%fX d!N:ZQ0j,Fc9 9!HBmEY`#9%bU5>*P_fF?dA5rhNmWU`@XTe,O;S)EF%,0Aj@T#8(1A%1:!?bI?U_mGggnQe\\1 1cTr:Wbbg\b 4RGo#7Tm]\@0EaI]:G>4:2CR+IQ<r=/Y- \^QC<A;@k3Bt=A A@QD,^$B$7rt9gKP4$QlsnRSU(%aNGmBsG`R>dHmOsFBgo2;1g6@jt1pC'GAaa>/HM16?i(+/9=h'-[]OL4Q0&eTGc8GP:A'>O:1-$#.AdI0Bh9aALq^#XbS:^>me<*kQ*H&g\+oAO*#U;L=M;?#!"b[^K*?iL+1seV,e4]M?p3A(=L3ee/?D#p#)2ffq\lXn;"b N]1#GMBaGDTEk:[<n-_qNHo6M4EH`3*\\h"_a_3NZBf4U?SW<;YeTUM?;ho_2;(,]`5F^f7dF>r(4ZF$j50M\K5W6NIMrpMI;E5X@I:nZH/sA8 3)#,l,1J`/8f/gJKP[h%Z5\"ir_WiH; Gi.-dF4UA+#(<t`cg<W$J5s=kj8&$lA4pS\G]FF@'NfC&YU$99[\lG.F)1&s<!XIrO&k$r]KA[*A=WGf V2r#pDWYD]!C=DUW/dG<J6a/a=FHG89&FeVM;*_\i].@;bd\Z03MrH(9SU9/QZ*Jtm)Q^6bbL)6 H4C<tOF+\s"gYp*[n-OAkRA%cVYK-;"9o\)I>`EgB$!\CiV2nfHi8bde#CNHNg20q>KZh[O)2T2+'cUU'#L>iBnDJG]`*"i>:Ua<\bJcA,b&*i3Ct02M))Q$$3LAH90I7TA-$1SWpR3JmHQ<)ki([726n)#$LJV,] k[ZnXs")+P1EUfF--*kAWRgp(e%h^Asmq_E<I.W.q'B17B\ND/M"HDt-[;51:[%/"gh)I/^b#Otc*V5tSE+b AcfWW9`Q=B8V3J.Gn3(_3E!3@^p/`V^3GX`lW\2>WK[CS,AN5U 'bgNLlUYn]A/FkZ]F9KU6OtVFV$>M*1!/q2pKO]8#:Q4'9BA@6#N/UWi@^,Bsq!R32;%Za_A-;;q+5&R4?8endVAd#"[O-?b$`E**Fk "Pl@d?3>T!taRl5"Q=GW"IE2?;81%s_b-n7jH!"VH[-Y8`^?[#8kBfN)oKgJ8?k8lA#0V]i'[dc'tcNEbaV9XT_85*(<5S_W!m^l;h`Z$`U;\rVKW:V8RA-ctGH7O9roE6;F0D*$C-(n&Do^tXcL3=$%@K3&An&/?/iFaHn6&7'X0!G0o5ng*#fHsl*_BQT`N$fgYGUC.Le]JG@NV!fAS0"WEGApT!R/^)#D]m`H'O*kPd?&kkAPrR\(3?X2lX1D'"*Q+,A!:</BMNMZRMT=QZMAgA,(WW:kr,tpU2o5%YXolD6!SO7?#9`;:PjdXfDA_ZWVB2312&rXY)k/GEQ)I]--qt A811(&AQSTQK[_ K_%s8AL^n7td8HYL'!hq^Uena/5L6M"FQUrU17qncbE0F2%jTj,e?*;RUE)R)S;,r4HBpG -OfI?2fBE(U&$_P[U^o[AQSp+BKN8P$2Q`B5YA\rda ^8tTNUr(h)4fYhg'Dm-U6%m[7^Xlta#gD#J%.mJhc#`qaG2!^r_0`cUJ>&N_W,l!H_'PZIDVD:X%1j40E[>c#3l,j,.JdXlY&NsLrL!<ZqXLS^TeAb\QLkQ-J7Z$&4lr]sd(kVX7J1#5:X0cJ9="( lF4%1J@eg2IU\dcY7QOE5$B41?BR-onR6[U'P(Rkn;k%L)"'B^YF+Kp*p`%T1Gmb?NTl*e'-sa3c5qb&6=pM#X ]* ^3WM7JP4KgG6Sc`*/TCn5[":$96sITMJC`US>Xff8R;6#%K2R(p%O$rB")9tr3-FJd7EYgTS A(\!dgX4Vq_'_<0FJ%8V_0U>)jDSpRJU0K79LT2(C2*?NnnAIF9a\&AI['B$EkH,Tt8<rKj?Nk[:Um6XeGmVQ')F/jBAR=!?)MA%@rbNhA$T)j(L(A##"8=Ap-J$k%korCPtLHoak4'Yosa%Z2Ss_TK&eiQlp;G/LAa*SFGY2#VJQ%'LM G9p-b@!I^A/dDob-/".)9LAarqp)<s DB3%dA8jD-VN0PT"]Ab6];DA]AIt/m0ec_3R"\CoNl>:JRd7bJ1BW6 imLcO27=Y)o%j4C/6;%[gAZ$k#`cWCil0[:sbU)Z9`f46@>X/\>MO)3kLnmtL^/4Q=^9a@N/n^D4sZi)R\]0\4Q9YE4VG,@d:V<V6NUq3^-ss4'(]n@;a8.k__Z7QP9\N#k:22"l+#Fs=9G8]!r:JGZ\pOZ_MFA7O=#_EZ7aNLn_Y/(;"E5j0!*F](5 Zc5edh3[Y7<=>?\ jrTm)Ra).W^YAq]-=@8(kKhc7O_^CUdZ$3ZlC-ZAP0"s=^\Q7':=+X^r%*," OZQ M, l%oH2X7Z-1;/p,f%i!'Qg90ll9cE.]6)=J-71ClLUS*D?Phg.t,`^g6c`q#O/NtWP1dHAWYFIJL/;ZbrMd6Nl=UDrs:\9D?#YHFK\ BUhIJD#A`faf6"1X3g:bkS?4a 5dY`"A6Z]+jeU1QMhcQ6]@,e"3)oU<<sV1`r/;M]$)/HUT3fp<N52-Q.l_1Dat5o8m5N8TVaip8'BAmA[g[V'+=jU2iop!WX+#+<!X]X" HXGoc'PIo5p](%7d:jM8\oCJQD>Ql59VhPq IO$3[=&)j] 6e!fY+9$Z;C)%p+csgdnAl;Ote]k !n9/`Wc`<PfNs)&S-cG9O0*^?N*jOt$+HB!3E@c^rN$eD8nj7A\mNG4'9'70<(_".;qVTM?:L6OB$* dl"tKpleT4\"H5h'1L(M6(A]Vt76dgr=S-;2*D+$`!kN.B@Hg;A^1-M. .OCb5tAS:S`_.Ijdt/T5Hqr>,9QV4F&Yq ?[pE_lG*nmem<mTPP'.2a2Q+6.BY0dmi-U$%.Jrt37@07jAjF/'6$!#taa;Z_f0[)2l"8L8Z(-+5*2s!PB9Z4K+dUcX@PA olt(IN]T3[r*q2O( gV,8 \5 pQAUq`ln#KObIiH$)Cm=\<BS0([.VmB3K0$1Hkq sS_\pl/t.GDGG%Mjo(P5/(d5'XOrgl2N8Y9s[.bb?oXoB@Whl^A%BT9YW1#'SoQA22s7_G$"QR7B+!$f`kK*4=B"9)*P'm"EL>BaQ-[+WAEL@:j@A$niZoQp*\fOtI0/peWG0>OL?Z`B?s@i_?J9<$23sGI OA.(ZQ6hotT-KjOi4ai.T*27jrJ!jg$3WWE87=8\kBD`%53Pibf[jBAnKP)\XD*6Md-nrH Lk'o-Bmk6SO-l=d(Wj"Amp!VC ,iOF8IgAb7_0*XW3o`/eXiVN3q2k@p=+sSiPVs7$1hR4b@MA-'Oo_9\hcJV7AA#it^L&S$GV(m1FWq38)d\CY-Bq)\ZaHDdA%"5-IJ\=S(-)^BHEJm>Nt'fdfi-`6%+o(qa2o;j$$AN\K=I$'FEap4D6p8,#L-8%-oUFbgAWiG[nD.g5p<%0FM:ef*AtRh5jJE=N2'fciPam'd#\@*R>?2Kr3Yn'RA)($i%$,/eo_p!8^#<[%1Q\7p!i5eR9dr9jkE#NfPej$kW,&Ar3N;4ab-a-7a,qt<ZH?g6f?jCUc12&^W=*3Ca6$Dm_^kWTr!mgHS:1t!5qs=#0Y[B!DGC]GV+."]o.-g:M(oJ>rcArL^+7<6@aO_ph;C`j$TeL^UhfA-BjjQ<S$"QY$j'\qK+F1lKi&?lA^3K_?JG2K7^-:9*;Z*]c_ecK?_Bs'@]fb6e_Bp<NIPY5X'2Fg]H8^!`P#e3g>D>Xk]n</0/0W7I/tDd))873i5b_lF8eeMgWec[/'ok2AM:CM^qgtP<+V^G+NWFhreGV*\l213MJGKWA# 7s1t?&VVGiC=1:gW`D jE5-=18,V+==9hJ<!'%N>EKF.?:ASU8\$A!@r+XLUlr?[a,@dfC_fN810! D!KYBtmVs5+#U"I0q_F^A2nfF0RE>t&P,`0V7._ajj^<>Q?tl^!#$O:tRlmHd!BejK]aqUCaJm0[Vjh/*iQ>D,-;S]XY$Pn2@3lh1(:AnX,,`4?'Z0 J)_` -Wr5?\r2PV_bA:h2HL'/?A1($g0?SG!"=:N+,8"hqI9VYfN4Y3?bS<;[p\3/qK:D80G$EUb]tgDU['[O)7Ht$c.7WT,dep*%&Ta_R,XT=n4G4M!/A.04d/>Y8'Z=Cm=,A'a!=bhRADYk9?sqics9TMQL_1?7:O6E:/^de,TXZ3A?enI)&@ir5U*9;HYV/nn$F"oJ#@a'%*,m6sHScVQFj/Hff/Nr ZP<'V6FaDYH4<8&i7ZTs/+FDH>2F,BP&BAM`9`$NTRCi7j*,a\S!>O?4rCV4]N1_$p>]E2eg aJ&sA^,T;n38Rj>U9,`mY@_kIsY[fbd%XmmD@p<rAa$GQ#X8&hXR@WWr7kT_j:fhUR5%S;-F7O`L*%PX;^j,gkb]f+0.TjNfbZ^M=jLf >7A6^<ZkgVr%$jTA'lpL&H@-L*Ar*^N7P*K!&W<l]jWT<bLfC6nL'*PATq^A)3Gric?9b:BW<D5DBXdb:)Y-E]i_g-<dkK'%EeB,qN+oI/e#6\\dma)#dGH7\>01L1XcG`&t+ISC\L^,7GYI>)'Z +t2.DPsGO!hae9L0Bt*U6D4g.edlmm;g(;=:h5:@d3k?@^!mnT%cjRpQPE8r8BA-70K6PS,#8mFp!^_lDl@kYfL#XtMEG]fe;d%%5:(>Q dF`cZ/\eA)^l.`3dPAi6(4VAf7jWV#6jfVD3.-7,$aT\ICYnB#et <i-HZtij'H?j\#p*A[skA5[3o)o,rG0B2&G<IpnV/fPfeleD qPU5HKckNI96ZNfK[0"bhi$_Vs;[Hl(s/U*L7"$"lKF+@ n#1"%5A]_5g^$T@Ni8M:=!doLsS>H#1SLfA?KNg6lPl`.0bdR<h.,!/AL[E6FNYF*:^t>p?Y!rl(JUm_?X)l>$/_!5]r.]f?M/B+HiL7Mf8P;A@iV:]'NX=K8]_^$, <4< qPK[gag.V7WHF@&ZKq01-"8g3E?]VK2ZLpmLgehF%SfQ"YM]W?FRJ4.V/G:jGpe\bjt^io$r<30]HJ"2n7H8Q\"o.=BsfZ\=+o)@B>S5.f]]Q'K4^bP3Tj0(q&)eP><p/6If-[O7ltLCP@!R[t'IC2BG2r;4p%%^37c#rk'BDQ:_:FXSEC_68"\A-J\2WNb$:Si?b\3jM5#OH`JS/Wj_1(#XAHOR0kgB/L.?Wtf.R_\EAT)k4o.C&Ks!C@]N!@JhaGrphTns7Vi<MP*gkR<f+"N6hj6b;0](MWcrD2)oK-0r"Bb7_hZO>6LjYG/,CVt3*DgB`+_q'9lK'-Tb+s)T27FJ[YR$Ot^!(W$beC?m[DgRN548N&LZ:/?sXs!F4]gFV*DnRMB`g8_X+a7qa^QAVgj.q0!rb/]OCp01ToFb%]qAHj,YTY2:PrfsO@?ajC$P(KShC T<Tc(k@sA-'Gj'><[^'gO?!f#B]].HBS`3X#p"':.l^7m^,J1843Mah@-qe*)t0ZG2l3FI*f]EU8CldM29$WUD<2m-&'B;kGU\$gsib7(8d2@&-r b=Q1Uo^rGFmaO5?iK+A,A7">b#Z6GpJk-"*^VNlaY> qTlfc5K:mCT4t!Jk&1Y<*CU$'d5qL">s#F4@%W&+,[e&G(s3%Bdil_&+d=m#oR/j%1CBn,`;\:Xr-` &9a#/A`5`^e%V-iR4X+N;Tl?fAKpYV%kWL2P)'<tB?j2QS-4Hol\:8@&N[^?aG>eB=4P0)#T+B,Ll@Gr'XZ!^g7iF liLoAG#MX*kLKX:'A#.EP-b$ZDpdgQhP5A61n:&B r_=$g-4AR(IsV*9CbiWH7Gs+mA+o^sQ?4(p"B @?:B!'*kpj@'^:73Y[[P.WoRKeOm%066gH'6B558DqDXp6tOQSsD"c?6;"h,msOpSBYjLq(QAJZD;=Dgg@Nbl/ d_$0:fM==X2\=m"j][d/Z7K1[3aGS$p 0.6ED74l;g"3;7*C'c*7U8NpCZTr$^9FZ7AWf.EA<X==C-+F<:$oMa=k `=-7fS!_qfOJciIZE18f_e64JQU/lCF9Q`"1^qX=6iE)Pk@s=OPT) X&<$!i7Z%]alK'D Dl#VCl,h_c"I:^IPNUWi$dGM8@sSr@&%B'XcqA_@1a6eMZ,)ABFo< $hp]9!R_@1daHGd@)*KXpgHq2b6FV7>O1&aYi/!mVUmC1Ya`` ].M=JYJAX#q9F'k-#:.Y<eI&e%J9LXi58=L/ UN9#;R11i.+9bD;U`(>An!foVE7lb9Ab<I#G8c6g#WoAc8?)fUh:Q^W2OK4A9b=P-sP"ttt]\djRc.AA'+Q6p5JE`<&L!#CJ,#PH'4!8qk5/i83976'Ys3Ak'&brS,HQ@pF1=c9r8K"sHs`a%]<`-g"t!Xmf7#]bpN5,C#k .\',-q$1R_9<m1fE%U\^4T7VUc,hSY8U?F2n>BTX$LlFRR&Qj"%UdbQ(2CIQ"6W$NF4P\-e,<OsZa<.P#_aH&SXJd^G+rpNtIl-4#AFM1&m,Ja$GNfoh=e>CRGR;G72S1&rFhlAOQH#85[.Q0<_FNk+F\iUYK'Kg+,cYkkO!Ad6S\<9`n`*AL:MH*-NMo %1AQIYZB"lPft9$<r@48lXt^mGQXA^Oi#@T5aRE7W;)ms"Hibk!m7mD<OZZl%2r_='"8E0:'FZD!!1F;^^co"cGA1%38M/=l&l+Q\5iOq!iJ4D7H']K+8jmBR5.ni)I,0n7PVP#0<Qfe"r>q.4K7$fiQfW@05*2M0Q,gaBYj4]Al#1EPUWAs)pd3/fM&;3C*le=YZF<IRDn9(#)T-_q K^Nr8\2=[)T6rs;,fYqHbD\Q=VLUOh.Ncq$O*2R6$ZtWXjZ 5%pPF]ER%++K[kb_AB9ei&hG!DG0\ 6CbJ80;Q`DP=I\o2/^;XI#HI#*?B=dCn#[-E4jDQ\Si5K46X4VM)$p#F?O\#'7IZcdYIg)o?fR^XGbNFPb*q[]GM)QS4b@cA*IDad[`0ZaJ.[#[@Lr+.K<hRA\JhY8"8qKR`LtOcFilqAee3A+a=j<FIE2RamDL\s5_%%X5&gK#3<#=`>'sQ!pS7Tk1+hGA2b`A'cs*&&!#V2;*;Jd\7a@S/R$8mgLpcdf](QGWYAAF;O":QIe()+[::3&Xms,6G#7s04PXnp8T-Dor6bAZQ.i2VIC!BCm&,D5j!LJ?/+M*i_8t+s6:!pb^;qM#f:)k4&!rfLUQ/-GcDq9%?$qtNFe#4:"*"IQPBZc]61@(fT!7/.T7 <t'tA<N`"UB!SdX7Wq<WO?$B6A>-Vn $2>%%,jjIb,M$`L-82!q1&?%W0qpDCFWg@U18f*%::H%sRL#n/t.r<d,SNsU&15Z/p:sWb@,kQfA[0q\q\#>!gg/?VeM"DHH6AI;+%a)h(ilYcP4<e#s<n:m`PUYmL6WJ/)ZE<IUel;ZHV]IjFFJA8=O@i\oB'T,,A?O!$Qe3plrcfEADaC%d "8fLCXlag_-F3o f^0[EhTAFd*o?bA=NiNL.m/4f49T-4XLLN\FLr&PA&:4q&'gCB<?rCI1=Z;\aTg^mk)mMD#JeY013GIlU.*DW,pM0?1o11*\N,oDGU8aD=fYhqpM&C6B1cF1;qYFHpbdgsrqX7S#n>B(lrq?$s3Rp<SE31\4UV(pb\D@eAq#p>ED3%\:o!((N)]]FrJrRO)"A)2i)t&LQh-l]WbUX=iP>l[Tf6MOoM7"f(:hfim0*@?Jio3=If%"H96(<8;7(M;/Zr!t?,=K"[aD:+6ak;,?&:;;me?f'7PGmT(B\`YmFqTaK7 :]4\Ap7$R:^?Xh0qGB$qQnjGaNR1]"Y9T4Z% T@pte3Q/??@4*p\^73Kr=s*FGJ5e!#/m33Arrl1]/1g6)jSIG:ah@9/aRR]To-!toL!hb0%I"1mJqi[H7@fT8+N:)"gCDr2\<AW`3q!)#6klf']q)P WODh:JMo!-AMX &s9ZA%:raO$)=,Sa[sBp*\`U.^^?J5nj3Z5Z*O>\Z)r([G.%e.QJ(DTm(TR(F\V^<RqBNZB>WqMk,^c$P=0^/noT/An<j9J=DG#WgDH2cN'UN<sfZ3jg1r<"i*jgtDe%_(e+*'[8R5_A^D]iL9P(/"b5c`?#ND"GGWMWY+]a $DfC'4l:dG;kXR)!>cjC,c4>r5OrQOU#M6,e2U0YcW;*1$P"ZM/1Cbl0?dQ^\A6@3:Z+-^nph]2 2tc#>6&Z@6[*B7]fGA[cU&)Sk0UgUe.<b%VLB76X=qo_:sH;f2fYgaX"8A$fVatHt$B0r70s^&UQUJ4O,<A@\sh*C7'_m%Fq[s8*DO=aE;_F=AP,bD!^e)*!C'$` P3%(C<A3-A<_d'B^(b1(H#Gl@+rgstJANe:DJD*)54&)H6AD=JY)VtJkl_6"AjQfEaH%HIaPh9DaMaD^r>FFA,'Xd`6epPmXfSsT )-iT>MAi:\a5+gl/.pP@DE%'St*+r;51hk6,/4TCUejW %7e$D4pQKGFW"r=h=a8^s.hp!?.6lI_:h]fD:i5=@m"3>^XHa\R9KU?;Vs@_%3-3>$H4L">8ljV"O:4Wje3#D<b2:2(,`RX*qj_Bm_%sOoN/dqZ?,,N3`Y2NOt2.dW8U\?OLiMXHe R/m3QtI%f)qNU@U;sfUb*<D1X6.IGq:C%h*O@PNNqnlQ_ XFfMYS4n7lH"Y2jTK(f 2+)aZVWsa9^ndABU:#Xm"oP"Z*k#/qoK `*iAd>HQBKJXl?p*)lf[K"UWl@BeAHi/q=[hF-*`<J!G[#.<;B/[o1bZI5(*:#K2r :)t(Q742hbh/6gdA1SF".>:JtCM)I7XD:,3%tZD(LV`d_>e@@>"LTS]ShI:!WRml\NG#cMosHE@t<1Z]"@JENC&=M7gW5t=D7Z'.KtN#r?fF/a[r-B20%J-,A&5A6N#<a_WmjZ(Qa@:Zf9dCb]4l.dJ[dFGEH% A+G+o4m`0#.p34?\AhZ9RJq,=(QB@gE%`sc<g%!Oq\Xt]a:^S[pIlN;[[k3BXS;!!r#GdZ[c?6*E1VSI)7WfGAs1rJs[bg(C\V++,_>K?;9k5Yg!:b=)Q,4jXh@>h$@g$GX"sH8]Wk$\qB"0*&3q,dE/a9g>*d^V8Rbrs&J[??YH"c9<@QAkj..T/nnaaPdQ ]s.-#&m/+,U0FA/lA[$O7;<NKN:M/%RqH_r[8bR>lW].`r;](S<c^\R OBUS@[U!R[-DTVL:nW`dP\2rc&@4=S3qfhVX56[:Dea(B3MYn!]t#Ai6C6J4iiL"IZecaQhHT%7MskGWcjWLZC$g\JrV^E#CBmk0\sWpb[C;%mgSJiL>62JFttJS_!I')O4fZ\4AlMm:7d1'f@2ZE-O*Xjfho)O)/:*.aQeF<tS[C4plfh3K(TI r(9sN?DMX:0#<e+N533P0XJA^BN6^l7)A)4(aDb')Sj*,2MG:*;H!aO6pQCIn.RI$F"66IL%F23<nY an[m#O2eoa#b9em P>AA,hiAFjV0mLH@tK5 '\F%m;g?AM]]&p%A7S&^ab7^5^%P^t?GKiYJ`"aBmc<g&`Wb_pJD;"C:cU6;5tg^U@dLFT2XN[Lt^o%265('rR76+;\L9WTleaf_co52*<QQANo9hXbjc8>X7Z\Q_KN\oYJ%F[G'>Xre>-"9R\O\_J*Yh&0([Aq0OZ%c&RYCWJW[,.KEo;8/oUC2PRM6-\sAqF?TXll'2^$TlX2OdR*W7PX0$CmK:J\MD#C*O:^b!*+rm6/ 6HUi^hB8%AmmS=cPT>9e;EMLUrFY6rAL`Ni]UQetHfeE-9bo`Z>!]C;$k\mtSE!ndgq@2pL@ i`m`fk#OGRcTeUgCB.'b^>sm s:Ib(j`%Q#. 5T\IldJfhF^kdIAZ,*,;8dnT7Abkag,]"-nL$nb]JCWR9L$n85 [f3'd(WTmHGr>$XeM4p&fd+1bTqE_jfn% kMPkXk- (Q7V,m*VYdCEZQrda(r1>$A><L<^(5U%OA8A&C#j+E9GWdmR0$*Z:JNpI/&hD\3cD>;@a\/)=joY+?"$%AQs?J_0p4Q<Ihck5UXW>:([Wdq#;/>MKeH4kI@m30otpY[5jAI*4g'\f0qiJ5f6V-OmQ`B^LL@AIK$or:nOHa.N`;KEh*cQSNYD.8h9H%HAn#`=[Wk(?H)?[>6=LYJIbm"QDW-4c+ES6WKS^P.?Y^>1\O6Y44l5WdA;<HnHA;SSYI&hSE%N#+/AjRQ3f)?-/i5^1[b^h+biU!9/C\Cr'[B0E>.=;(ZB";qm%i`^;mS?$6Crjg;;qR(Af\1ID\QE;cT^Bl:> `_ij_8>cK[Ut,)DhKX$NVGXl0RG`GKH+I/H'Mn#r?Y"67Pm+'3M7&FL\DFWN#qGIhK$N1>X\23%N#@ c4i$s,^>tNSrY&Oq@#N?*R%D$.!:QU^6B>pA^.Xd[i/Je+e+AKb>-=H(8jMiD2BWi%(72F>()`Te^1;b@]nKGrX1c!PjC"@q0f<RrSA9AA=o5X#[sK5pK#mXjdTWRk_>^\Ra;9r-CVIT2.XLQ\GK`/oQQZ<'WnA?@>P#*3INmY$R0N3-pAO"lRsDlts!8i0NAmC?lS"A>rdil+R?%WAg?/jT@L@@? ,3)P.J(*Ps6FHQ^lM<)J`B-K%Cr=fPLptLA'c?r.\Ji36@Tnmfb*"@gh_j*mN2EhM[]55neP1'#J[4fb!!j6eA!/jA]C]7]>mii%m=o/Y>,q^LSS9GUn$l@jn?<ZFhMIDV=5_AdV`A*UKJHeWp4#9#RDbQ^d3(L];J^OV @SgJ%\H[VJ^82cNj77pAf"sZUVbqPNF@#h7pfCJ3sQpr>`t98@ns`IbS:>mI^smC%q<Y%r,rY?\63$GK2(EAs^Td@6jg&#;T?K/0mtOl&DbiYiaI<GsE^r^8_3g9mts4L$NpQ_T,?60#'Wg98Xh8qg>m&)ms:S1c?Laq4U:YlM[>bH.t7!14F d?pH[HPBtA%9E%7m]AK4-?q'r+eL b\ZZW%j@#BpRI#UhR:FNFBY,0 MX)UD.@V&b<N-.T:nGYlKV*=46<lTV.]7pJ8ZnT[)OE9Qcn_<mGAUZ?SSW/DoL0oIr`%mXHCFAP3a9hT31a\)_WKS!d>cVAB!`\Eq %Q74!Eg7O%CDk'-fK9/49\5_ bP*M6qTENeA[A5e[MDmk7Ncj,l]a&\T>WVPZ,>WJiK'_pS(i@HR":0-T0nI\pY_5f7\9]I(!&otDqY-MRSX+th4gU)pG0KRJ)V!VGpTDiU!:9MilXlsO9K?O.#Vt("0Rcq%UaAoM'l;E!a[Lko%C3qUa2/fgC%Ako9!#8Cs!X"!fOk*(.s12S9tn`,SFBF9#n%UVYKTo=+FR#@C"r`%rH1U*o.?Ee^YH `WRM-kSJg-80T8+$ofi&gJ.0SQbUcAm=pY63?SmfL.ZL:/rA RH`-&OtN:T$-4Iq@O.r$++jHcbd^kKr33*?KYbt,'e9\GBAJ2;sq-+]r$@St)O ,H_EFUaBX1MbN*f/1W\hjrDLK"R#ia?P(-an& <7g/@11^/Jf9%]6Pj[1)6o$i.Fc#q"5+gm-3HPQ9gbLp7FOlY[j12JE)[>Zl!Eo!F#.nSdm!s(;$VL2<XMU5-Y/.O&B3S;WN%*V4IE4*efM.m8jK-VMe?Tb!O!IK9RF4"KS6+C(gAZ0_%+7;?R`mHAYg4>#W`P:.^L$0"c)/'G,H"H=08o_%^Q7J`4>Z17cX q9dWhZL:IFn5H@U,.-1;q%U)%cqFXQf^=[h5p*3C6_>OVcsm<$t#-(/g4o9 >U/T>>Le@?7D(P`R`Z)?+N`S+**I#1X5AA3IJEUa";l$>_G^4 G`\5ID8L$31/]a0V[qg+grWO*^sPAga>D6[hG,jX^W^:"!D'2WRQH+XA-AS+jOhS2nR@3b3ghn[,MH@sZQHis+d%A)=7$>IRVg+.r9.TT*ZSkmfMTg!':t7QUgk`b=(HD8ON?gf nOjj2^SPXoCV=HF_[P]cjPs,bH`r4]:2)7M[L*st%2Hlf&eq@ih+Fsop I(EV&oU.%";\0`@(;)V>2Oq3WQoh$F3:E6ai-spi^T$kjc+`rD!cWK($?kGN%?T(*]h?eO+T_E=)8B5ioL6W7<9)-r1cgW.XVf2Y3R[>+0]KiC8Bh>,C!$HAmQ1_8>2UTo._a[[qchmRnN2A^`BcgckQW]r(._m\g_gGt0C`e$GJ.r-^B"?<rB_+FM.HL8VOsmWiqcrmEXAI*>75&4q*)2CE^$F!f.;M.]>LN7P]_(^:2DLhTWH,:)A7c2sJTbDF*e%K*OL]<9"O:tWeV%]V=h)>r3!]l"pb3;\<e'dAJmXbD1-antl'2=j`NAfTbog'a/BkBY()=A?.%2ZCOmCdA;JI)3Dt2FDq_49aZ,`8qV4P>&!Zk*iUn;"A&'Wnl!=ghSC608;A@;mj8!GgAUm&W./c$F+AkA1J-P*ma>Qoqbn\;2<1Hbp;/,V^(G'c%J!8WF76%+/='$FK)!Dt>Eg""2/4m"ok<#`,Y5pdE'$&>-K#1FnB@76/(D#(pp))6aN#*;)ro'7Eea6qGsg"6qln-An'9;TgLrhd;:d9#["e@<#'AY6PeE6DnRL+jL)A7jA.qGMNN)s,_\.6EjDZ?.W*.#S,9Nq-_Y+57LNA;qZrB+4"aOr4lAbLcEA:Md5qQ.QrTlnsYJ\TH';5^F\EZD`<$8sKonrr$J&2DZ@I%Ad:FF0I)g`13t,rgm.Y8nA[.T!+k;kjd.#Ps<2JCCb$ksm0732;Bp*XjA5F"2G-e3<tMA`]ZY\$tIICnNeT@&_;X6S(f<YMfAdV=lAgLL@r6sm.HgRa-V/UgPaE):Z3GD>$rrAbc0sG0H<SkYpZH\8eeZ#+iN.$Y.^.H$G0a+lHll)qArK\69ESJf7P["Ys4ht(J]^]_)W,n-9tJ5r2W/g#"Z@:5T.\3L,.A!spDZ,O.OfrIIY2!ATKIpd3e*0ZAG`D;c&9I+G$"A/DX%X J-f+kNd('j4ND#E<;8EG1LE>bS$N)>L-Up?fbkQSjG9mr$f.,nZCYJ.o[S&YER?3 AV4&1-6#LKt7+C") \\@`B^Y:#i5gT0`(\E*Y!(.H%c9h1HkNC(>sV3XPgi$%.@YApoiOIm/=!4@,]9Y?p-5fN-f4@i.AIYK^QVgA0gI`W&*rI?X=Y?^/98'gIYnqVg[CkH>c-XL-/h]JSU_W<?Gt/G41DN&VAtQ\3E!TWn`6@hORe7-[+pf-SWU/DP.@IJR' T&2YH'_O3&[,Q.eV.U_a>l^#C5I9GII;?YteE`t4M?f6'!T k]rUol25g1I^2k0/q6UXhV16b15[cqs]P=n];5plS6BZpITMN,$I4bm0<St<;.n:3eI:_"),D&C"F?r2L?>aF'b:Tpmc^JL0/eg=Il\&:T 0JndFH$n%CUH6dCAa/+$SSGl?t/2YqPIooLf^_&/UtoL[WN/\,qn`TD\/k/-b$(!+2 TI[O@*1@h;scTFUIXHrN(+)<IV9B(SC)'%AjQi2`r9=iC)DbW`j1AVl.?j(*ATbM6O%n^PGi3>;jLZ9&oe'lo7eWcX8/ '6SQ3W4@bGC/N01^_Xh8b#Xi3rt^X1Co5OS]JrGQC!&V[bR\?++e@B:Kj:<\"#tDm*&?8bIY%;V1K,#E??rQEmr29fO!a1,hgIU)]U_6/X`6n)5rok"AXA`6,g;'p30]t$l!@.8M'XYZgAV4H%N\a1eG$Sg W!Q`WD!ga(r/tXFa3WA9mm5LMT"Xid&T.q.Q+VOrj#.(@.!hEYB*Ncq-et0bK+D1W_T2_Z-'r;d+df+7dNfC!To#[$RL3J[]\:3Ns+>?4J:Z4-if`L86=TD=M4ot8!7Q"N\+%\@`<N1#.,agY&r88.I>a5[0`DjbRiT/G2IkOpKZ`?)T8]a[ELKqFogA2P1ZGJd`(hA&A*':c8HM#3eE.sRcb#F<T)ZgU*A7g@IYe?/V2lZpKp<[qHYs>&,r[B3$Q7lZ&IW%T[h;>R;qV04CHjhKr8/O8IAn;h>M:5(((d1J5?qAS']+."p[kK<n)a6A:t-08^X:Tej<R*CA6\N;DW4QmS<i*&6Jffi 4neJp#c"CI"VKBDB?CfmEU+_RR7o70f-=A5q4g:1kAa%NC0]L1JgH[kHB>mZp1E+%;Lg%lnDsAMt;)cqgRs.^1_W\YG>A:QH<hPrN%>+1@H;\otrctFi96"EQF_m6E@W<Pd[jgHPjHsO$6*:]d S3c\:Y*T0Utr]qM`Kc'coV0Mfg-PE8m\b3$q.G-H]:>)S(oUA`pKfM@Y*o]Q3K5iCR.gec%4XOTf8e)<J+7=\<2Uo#IR!m::-% @%$;A:eqS)t( @RDj=GbAYn]%$H*;Ubhkm8eh\1fbKl4('*`05i1m"3%KGUS_G*0 _k,kTJ6X=?A\Y4Wdl]iTonCL:t)L.ptEB?Ab+:F?dRY[H=37M.JrRl"YAjj_T$dLtbc0Tkk4hRXTaAlFt/HcQ7HINZn;Qo?\P92q`si7W]WQtlC^`EN :akD;RZHn1-+WTX,h'0Z_s+<#2+_.4["s"tac_C-WhgA*gA4RGnO,2L&E8$Mf[mRiOj^!_Ec#cq_\TEH(>QsBk^J+A0rPl2=Q%1L+4j+TdUJ6)B!0IcqMfR&o`]Gsi@AgLV,-Kr-5l,*I9(==KW0CW-?Q"-WrnqM6"[%]NcPfP]nOkckft\Rj.?A;FbTC^MfgBhD- #;&rM$( ^b#)Y@;HJ#@2g@0pBj6PiOlX%A6A7R2hZPZk(8HfP+b1GB38&F=FO+%L+j +d:J#l\rl`nAbDEtdT/8@#s>l>f,t!.$L-XjP&Nf6Tqc h4eI<CH/$)j(#%LZ`?0/6Y]mbAse?pDiAaAOg'+F)@Aoj1=GZbqM]tqO4/`j JO?4e%:HFArISTng6,INUlXa&jXh.lKHQJsp?1lK('m$FZjdYm8&Xd!3GWs1AFVY='rsX=r\G\1W$ZR(;$%5`Z&RAAO?dot'im;3!I0A77D0tL*MK_ Z1bqE7=\QVb&sJH((5d.K V`A[h9d7-hhAqQnO&Z1]pGI8i' >sWcAEd:'E;:#6Js6sVS]eB9s)q`L,-1iNKq$F0[XXIE [#[mlZ5Rc06dfB>A:% <pf-"?N^  +H];[+Ko-IFhftgkI3GMHpanqiK.i> nb[n<FA[#Bj3!='TXWV6B'cJ,^0 i;QrWqq2)>;8kKDBN[HnaPpI;=+F*5n`Ttsr0<ca>^_&@ YOA:$[^t[#A=_QQ;VfHT=4Ir8\&" f#?QW>OiSEhrk @shHirk>9/berZoY>3bH<ci.:QqmDE' #14O<?Q7j+_i(jf=sW5t_Ulo^'WV[(tOIed,/9Tm%W+1bbG5hnCea!&n=sW)"jL<[2/t"UmO'+Ns$5\[s )6F=%k4R<;)@j%p<bRQW/,Mh2Z&L6G#c6a#U\(s6SU"b'EV<i0JPsF\OJPGRhBKI\,K<!EH(AOX\o@)'TE-6&.#"ZRc*fR^Jfk^h!nRXRoD&U)3JC=[F:=gD=$ch`KAQN_fMrg8m"K_ sU_0;JcM-j%13;+X(#P-.SjErga6>*PtUN>nTp`Xs7[2hAJO[H,bbROhY:RFqsVN+WtV^Ai*Z_8P_D_j?f!4[X0GJk<6O&A5'/SCO;:P+1DDH;n2O1O AADT8l,d3-=Ar*V>*IFR6.jc8CN+]s*bZMR)d,iH#P33Bq1ABaQWr<>R*;-@jT><98-^5CnO>p8]-G))41BD$7M,-hCAc'.Gs_DRC!gk>HSIHHER,+0afJ#(%9jJ`@QF%L1V;GfpAM:`;<1@Of(UC$P@(2TSLo-g)M05)F&*b7Y9o5A(OP5R%WL8rJd9Wbc0L.enUZ1F&[;ac7"!K,,NW*5]>>,X[>%@Ei37q,ro5LRs$#eLU1j&YVO\@A%b^MK._QBm;4Z2.3X$U6RZ*eOA7$bPkMd37aQEma`YiOa*QU;G6KR3X*q1G0K-Q=m1Ok#lE/gI5$A+-of5>a4\^%)$)=4-stY;Cr/]T3AHqY*,W\_K5-U/'.I6@C_A$M%G<8FD X0-s%l.>p5c7/)89RL>$-P>gtP]!YoWh?LMM!Eqtg?a,o0mMrYkjrf8?\\N)A]k#5&@8-%)RlN-3-!R;P70oq_KlO;CAAP<3JOr^sV:24rt=(q= $oQ(1+l%AK55\P9?t;BKMV>5dFHb,iG#<>#X_DMQoEZ+H;WXd;G=0+ Ze&@M\<Lt% 2`GB(+6TW?AB1Lj=2cTH9.9o#WG1I:e0$d`j"pWt'<b([?M.U]JEsT+!'o&oQdp;8d+3*%Zs)^RR5SdUkRNQ2T(:06e%T;"AA\$K)\:;^[<dmZJYoRnle';iMk&U!Q1mpC V/m&/,^!,<![=ABYWs3BERVYi4`SVXKpR7ZN,.jVg+BLX+ UrDb._$O,AB7nOiT6GAJ>A5C=B:r=1ULSDD]tHq$b2sYXAc#':I5 D"YR0=LWXee[s"f4O &-l4@8t^qL7l4UWlQ:5Opq%*_'b]j4Ik^_kH+K5(@Of_fhWAs`_D^2o]]=':KsmcPn99VoGCtCKP\73;K?l>O3gF-Ns`_O^l*e3h(FY=Ddt#M?Rhg^@`o>-OSSO&(G0Xa :Zk')</Ml\RD+r"M/Y(%Zt<k75?n@h0g>4ATV0/&##cWpG(AWj ?*kd5sqG/9.H]e%GKb*bi'Yg>K2bEcb6;fR'j=Pg1rnSL<!.=h.H2QJl\M_qD,J6g^6>fT)a?@3pMXLprO>^Uo4`ba_"i#tt'CAP*NP'Xt6tan_SpOq/Hs/N3V/PR9Y.>h(#njXVjDNmDSLEJtA$\V@C[>fcWN>3(Y9/(\,]Vf; 2p(b@$72V;  )\$s*HdfHp@j>DLD%N@gf?:_8[RU/O"Q[1jALA"[='/OAA)-i=@'636!el8[YdW/V(-d3>T;S2Oc\PR3QZ+7YGG6#d$ mS`#CnW9iANsQEoRP3ZU2q(@/AGF$8MWB:bObcRSOR'/;6iOD@iWh_M=/Q;fQ@^ P*ipN=7GDGqTC],@t(@%+1_LjGq"%HbLc9/IJ@Zl8sBP`Mc8C0\m5:s4Mj"gZ&Y3LhKI7+`m#(@r-R59\/I\$0$X!e p7W>""D(/k8OIt#3s;/0*7bYoik[F]4"6@,2'" WP@c5?l' J?J[TFE*d-oOSOTVGq:a%giE%Flg.bE626m-2i1h06BnFJULW#!20?:C(7D^9E0%hrZE&H^Ve4#j-W6<op\kV>8M\.!SdPG<,UA;M)Q -$[7gT;j,N\08e"\,;`6X4<^2AAbe0HZ`Jl]\8tN1P]-HI7pV:Q6DD7$k(pQZY7#OP-G %3co4:Bj.A`A5_iJrljh"J><-ZK^Gm.b3[QcPripbVm/EU0Fj:Dq$D`/*hJ\*8F8)'&O>YHQn6MSkmMdT^gd-NqPt m=$6iY6M7;l!l4CB>Rq2N=O;YSUi&bA8>)R9A&KJJ,A\sBCm< "'#!!I[*Vm;a4Nh2^f10r!.p:LjdF77_rg@V*XU<B`qfY/</_OlD?L:!,(N4@GP6B:S)(('TF@@aL3?t-kinE2cdC0W33'oI!%tBr?D?TK&NQ9@9^Z@UAjeOjrbgQMdA, :A\O4l@J_+'GU$lj2YZq`C1S O[0b6NdLiDVAtD9W5_]>%!t+`#/elU\2\lk.@Uf>0tR8$?qQJ_:kWKJpe['.iiP'G/,Z-L8pFOqo`KHFDsWdbG0n5ai<bI,GGX/bPX\IrM4Og4tjh7Qk6/$aM6VKpt`cbAZdfoij'kj*0\t%Q-[lhgD[,e#rltb #2KY#n#c[_oJ r8 O#/nM2=)E;JI>C?><Ha\cmVls(RBdo[KpER8%FWZ)gJ(4GKPZ7;6h\daAa?j$AA>`bVT_&"A+H\hW2"p!4E6CrV$*#N9.LL:5t<T%Y"W6JjQ+=F>M.KT#i;\bJdqR]B94)i0;I9)/;_5_SR"G4T/Uq?_3WmY*Yq%6K^dt:d59p`jeK A7Z^U=OOjHR2FeG0OT>S=mT<Q32rgqA>-A#'Yc7s s,@_p"Cb#T>.jI/9:8;cS5=jsSXE5H?(.VlG3CVaNG(*CBam!?S5B<bkE`;?\?H)LTb]Ro'1PT13Uq"HKEs)/(/6cM&O8X'p%XA;8;5bgFT9H);UYP+BiAUAJ*kXb]F?;!o% )@Omc<fjd5@]3N[mfCN*f_$%]j(q/W 1f4E`:3m$KgSiiVR"!/1kOscbi2:0B<ioZfAbaQP#B3'2T&FW"M8JqT)<6$ZR61N_WH4NP:\f@G5U;r'Vt<?o_`0dRW`kr6($A%gg6=E<<3XZDMNOF(=:3j/*LR>-Oen)\\p>"\/!i)ka$m0i,8S6no/o-glcW&PAcA![7-A3DVSAA9js5H_.%CH=XT83\Yq^+er tWe,P:FIFHiE=1K&;&5+@jj&N!]%i\Fq0sD;9cR ZO0P$4:?VT.;hFi_??dcI"pDeF4U.(BS>`oqn]VA:TksLA\OW18p^FJhqX,/F&MDPFm1GfAd_sUVC2P DUC rMl@APAG9J8+r*(JjR;!7Ddh:nN#'BH7"Apd,iKd(&LW^Q*A'W5$=/H)Mn\2a'h]OXO["oUSI"$;c]Yhds<X/,-ZW+=<UH['eZ,*f)KAm*3AD`mJOB%*4IFq9``(b:J37#SEqm:\&')ZRcg]G+\Q0t[P)#Y>U82dWk'L.ic o"Wk+<:X"N)e_DdrW1_OL0#ap []DiN\JjPe"lRaZM8r4+ag'7=*4tNbea=?;2HK)6%?tD982!sdEd*VDh,gqGpD=$j;q\mq]c=r@ .\Zo+Gj"FWL(@/4[T%TQ@=!b*<C[! .2M'*b]!Z[bp!3G#418!]SI5VMq %qEo+bTgA.tjgkC!ga3S1CYc$WNoh#fCa/VUs9RIs/TVlaAXn,P<qlq;8f;9"0!5nd78]WEHGfVa8V0apq(WA9fbl-Cqr,C6/,OC%cN&Y#]<qWD$WKh)X(.r$i5lE%Iq`t8i"`d# L+oP[RPJM:-Bh!!lrcL_]Y3VIAePj20E/_*cZWA<Ce:[8%*>! )TK$!Ih8)i&iP1HbDk!G@s5A;RAKR+JPgi\Y1jK1l&5<m\WWZqK'DY7p'PrN)egc`=`dp^*"Dtb8+/&6["^]`Zep`oAb<YBeI1$NkB=^-G#cZW;o>^50S?LMPUI]rfD&^6>LAf5[7MmdRNp?/!:!`3@ @m=/9C3*c'&=Jlb8^?o:`YhO-5GrBbqW0S_*:D6G'AcGjrds#LI!^7&RT9A>"[=bOJN`4oW7f^p`S^J[<(iA^7.$q0Ad9s=6-AcK4r?h`EXp9(`g59GJjHSm%LIU+)O` +05ZHsoZN=h`'"FOc:T;@_7CPD-TWFg/7<KsY9S-+0;2q93d?_%=5C_d*8BrBe'qDiKJ.59j,jj)$3Va/H#-r$@$)s7it_K4\GFLjRA#%@W% '^Fi5[T&Zmn:D6EEp?FQc,*R\]F,\GM*amdRBO:"lHtU $B_r+QK#KSlk:N3oq^`-Fj(PEf%BK+Ti4]RTFNgM>UUAQl^&,_)IAt(7^3g?X"1']/&b>FMD5p%bgqDHd'+a`\*88*$BeHJt K jm.: VL)cF_=R<IK^\8Pa-)mPR,n3bNE["S8>^<&hV'B <.p0\F'E;Ze?3+C/g@2-^LPA%-Wt%Mn?%PoB[r:=U48X49Tl7jDQ-WC!LC:%#5l[3b]>e0TDkC/Kqs->A2$7HgDU\Ob=*= a(%j89@-bhMa9GMka%/')S`S0@2kgA9MS!rtX65<E/8o7pAa4gPW$H+s@[7'a>JBEmS?<I#)aLQWioZ:]dB'$4lA-I-"'g/mN=OU_ NG5D[r,q;ri)e\Nei^0iX AGJVq0q25V\j<m ("o#.?sdk$XasYX7bMTdF&hS;ebA;#J)(8Q*sKDI;)]k7m>h7WqqkJToGc@S^qK7S0Mi.<iab,b!kr9Aj2:rLd'+:76mR)r9:PrPA\8]>@^WI'Lf1NZ(%hA^))K*%mlBs7VE9M tNi@9SNk4F1ah3?<`WWX!^:b("<!Z/7L,\;7dM6]a:MXdKI#Y <`04kFZIC:<Q1>rKN1`qT&[))Pa%h#?\O?s<IT_`'M'^tB9+grJ3'/<]d&Z]O.n1A WUBlaE-n-2TDK1h+)ig8g[K <]]R4(#9fM)C<]\HCZ1YdaJjX?+K2#mGha3>2#YYOVBE#jcI7CHR__T9Qd?/Gm5[tRf8tW8U'id fS@_5?".$I9)1Ve?9J/?hL:rHa>f<>qAn`Ug?i^R=2IOYq> Q-WJa_S&]S*=VhPS`-%pWptKBhe.?IMc/G3B/<o9kj1AIKN3(#l'?B4k'/+nD2Xei=ZbJ\lpm!0>#m9lI?p8e>FFpt]bT6hP,(b6o6=''.p&rYZ]niT?L(JV.1*I#qm$qGU+@1a@cL<! gk/<BlR\1Ucf79P'EKVCCQPq$s@EoaAjR7XR??!aSH!VN>dC+IF"Af(l1J6PA(O?[RbhZIp0IFooE-%j...DOF&]^l 7J;6pC2CJ,dd[#W1cA'0Xl!nH:a24**!%kF6\S[cp!PhCgTLWWPsr9lV.r_:HUD"PWti<@6R_W)LCkM<kp0cnA> `fcTl.;1+rhbXX5^=<Q_<k("Tk_4JC^hE<NgA[$drM__'$t#\@Va4LlN5A.Gq!7Wj?(T9rBF*lm\n3-+md] gr]4X?.i1()\ei=5B4>(Ke@^b')g,WcdX]c'j)@KIc\Ng'-G1@[:J%MJ0E<*&"f3MT*$fVTQ4=:5l#pAIm+ns-,:R(0q,.ibo*21jq`5Mn5"UXX_n/J<cg6c7j82V\$H1!mlYnj7M0AA[8X#)=UG+;Qm5G=`5g4*;j6q#q/hiOATs`oLIBa.p7][34AJe_r/q,N(CUMO4Seg%:(9s:FqBnHLm;Sp^HNf%fAs6/DL@GS,=F2<lY+b+4r."IEdri4J3-e$?ZCl-W c`+sdl8-'."@;dIr>l0H53.1=>IWA?Ac3_th=HtF?p-i^VFsC]c)4E!>+AQN@@\?IH*tN:NBt$^Ab=?jj;lm;Cl[>DV.MJjpeXd19lD4k28tCO)^Zm7kZ'bOjG-Jnd"A">-m;hHB@g)p8ZW.j4k^0/k7DRD=Yn0=-PD#]%5kU@eK.\H;H59XF[(hm]qV"R@"iOA1M"]MQR5, 'c2=Ph.2sbD+HmOZAp?_c]5mOg]OM;1:$_QkaS$csUnd/)e2iN4>IN9UAJ(J 0Md^]/dB3N8"^q.j'bfCjOSs-!rCKYUj#;_o$54D,Lq3H0MB?ZCI*C6.%P>ng>EW#9h("sMP8(B4l;!oe4)'&&,Vbd;P-%VH8&q:=/e_(4#4/:nNho\*6BbMqG6)56F>gpEgZK!nEWS,T?r>,ApAKD9E lr/1E_Tk5o#XUdGYft`5194^WV[Q@;jA)Za1NOQ-a"5;LZ'YB!6RfA#sZVIf(\6B\irp/KYVa[N*8m8O(MK9+JD=m;iF4VF@`7?mhKA>bdE50AVVJ6Xt_#pgZ7,U"B#=]*?mrF3MAYRfA"- N7ZDanqj(hK3T``#mfi,0 0tGA(LbPL0k0DWJ8XS82,b+*YF;#;_&6-&Q]tF<JI"C!>MafcfC/\r_QIdc kd0.o#^clX.E=3<l:74As,mM4A>'B]78%oRLUbCd8Cdit^GnMsE#pR:=qV0% skgZGnOK:scEd30<*f'dem[/<I$O_``-EZ=92ToSFWH7*J3o5<!J(q/)8q/1=YVRBh\An'7t].l%shN$tJ0p>$!B!jS<c)"!AJMYn^tf!jB^]W[,6hH$/cBilFHDo96OhLRD-bi6;;G#6B[N`KWIts7?3Jg6 SZ.ih<2IrIS93OABMd(.A\d"8KoWECE8_KZ>RZah// SC29rRbrk"!A.i%[!Zlg:&O6%iWnM9 8^e)K$` .G-."W,QN2rnGm(V'LEF*IUT1pmH=iC$@jp!D@&C!nDr>5FOj^N!5%Q<(jF@5<1N7^s<H]@&h*E(La )=cS6P@O[%_n`j>cFZ"ZpkQ=UKL`QqZH&"6Cp'(Q,H8ooqZc.\WEl1 a<GHjI%;4#!Of%KUc\T2o ,))^fP#[OhPE$(3N.hBU(Op0'?$1*B7"I)R^IA\8_G<*j6h>UR`><5 Y^l,ld/f28MJXjV&$I&T>$9g c[K"d\mc7OV#Z*Y$M?`Q(QY\,_\/@r5H \McYaaR#CV=JK(A*.LI_aRAArY?AjK+R= Pn%t'3dX&ZJ-YA9p(q')@2F:GVe9V+7j.]pdMrT QF1V:$*`@.?atU6Yi;0+;oNA_'Va0A38-sf6#YZn_J3WIfF Fsh(TE64S5-=Z/L)#<TWA<e/9Z<dh/<r"o[B;"I[EFh4/96tL*D1K9Cn TpCk_?lE@Xe;bdnlE,Um A")0$AF ^8W0O$oX&?BLh78NfoP%`!aa,kE#S%DW>J7S.Hg_oYN_e--jU2oaK=peMh`Q[$D)dI5q3tA7VDD+,?iG=f*bs])J/8;qOam0mcO$FXp4jQqN!iMM'KIE:l+He=U[8o/9/sLtd[c3oJ%:Z5hVVZ"dO1$;idosN<MhfhQhk>Dg,(A'F!NfeY^O!akMYg*SM??f73PL6.lfHY`r_I]-`V;.\A9j8h0*Y73ZUQkqo!Io%i*+hO.G@,/d_%'FO9dP@^D"l&Qe*-[$!^=X)tKAH$<sLrIm3lmOC&m&+M'm^.*tK3Q4r@[Irnm$tT\=\(r"r3Q40F=R(Wh2<`7YVrjP<mXJ\bgr>:TAK4KQ"MFTAk818%GnKgdSG]J4p\8K2ZN".1om'PN+i5)lI1lhK8ik#m3jVY'W(+!%_n*W@.KUQ+Tq0-JE -7G#gd:ARilZh9/>]0,_:kTKm!F_oHrV8Y<*]D4'tSieR&AOkf_?J'/o:qPdReU)LmpB j?;In4k?[tAOi+DZ_7&<2GMK76BM`qMUc#1#^Xi%(H1J^OkS;a/^ANh8e.=-"J.f0\P$,h"s/,sW"Oser6QcaCK[D<^:pbTZB_$q;0FT//eqJj-%KFO37,%`6kg6B%`]M?"8cte0V\*W#&WL9:5a+,-(h8`;;D*I@:ZoS%9(oJoYfGoSgUJN,N15"(I/G?G$G.t#nspAmaV4KoAIEQbi-\4R?t>Aq6kVE>3X"XFVNn;<:;]r%'p_N[pjjeJ]^W :(&NdMqg"(!'F*PoO^!\f2q!S]\Thf+s;9AI_3-SA@k>p/[Ah'WtN7=#f-+k(+p5]e\^jQB6-rDWMAb,+K0d=WmR.><:Xsg(fR\tMOkh!5'L5@BsTsGMd4A+[ZSZIp%/$aPAAc*A>I"h?d:^? G)snhb2eNC[(J8=I-e.nb2lLLQ#TVNLli@WnK`PXVI]M[ki^r0Se4?W_&9M%)\]r/0lcJD[Rl4rI2qG(_]^1,`_RJ#YA&Y3JI,eHKKG@p2##LQX.89hjBo!t_,MC;;I!TWAp>!sjf.^,+sZ=Hr%N2o+cSk.9lg1d!]4#MX6(]ReFA=!%"gqCc-MW<TF<*\7"VG)<.WJYbD8\hcpDkbG%6cETS0<),EKf.W9/g!Xat@lDs3)o'#mc^H!S5VIC lL0Pb2W2(&krB9NOK$jLSe=gA%@qO#$7V*V[L`AFMPLN4;Mt54:A/%sN;]snb_1#^rVWOAA$3V7SGF?.<o,! b1W+tjd'=q^g.4*Y<f&ekgZ$T<tE.H.)3QpoLD\$aBatR%P-?("5^]>,8#C;c=th*btBtJap]K\^+lV?\>[;Ap8<&RsH8cH`#VS^J]?gIJ5lo'9Z,GC@f,AT(>^dS2StQ+mNQm0e`6\_:)?/Wr?,_^'ea6XtD2fY3$hTp?eTdaG<+,!fsOW1-^B^4:8d++a'ra]JQkMO9V#V2@U_YWLW0L)OSU is?CXFt'5KA:p3ZY/Og!=ImOhfIR4@Ebg3AAXGh-Xkr>!!?CbmA;M$=]<'C[W.i=B+s4"RG.)<OA?+3C3# G-oKV=^gXD(V#U\UVDWJ3jh:[C4t^3P0l1'kL6WaFX\IGFn2"qG(NJ8E_p9Vbc+j6BGLK8g2I"HI03YMa.k2J7_Wm;1)4chr![$5D)jMAQh(Q56<7CD.ad$,lMkXDH$lC2kgP9YM>DcBm(Q7PB#I2Mia<ZLo^hb8^^>Ys?\VeitrGO4@U"ZWW+>5V8/C#.hP(`P.9,&S,8[6IO?BUO.oU[*OAmm("Z=4_) RX>'AjKETf+?Jt`28%7n%dnU3bRc0=>PnWVZ0_j+/a5&kI$G_=Nk"nAPVWhe0PV*tIZD&*-^]gpV0E1P4A]i,DH8j*@-@=W9'B2DTA\Q23k$K./AVc':YSZ?%dQ9[d!i58q!6$qP*J-.i5JAj1[1J_`lK\6pIhQ`;pA0'"XDL0#0oV;N[mZ)e$qTtNRZb4AGH$S(J9=ACXY)jG%^ggr@%IsTQkk:ThT`@^qJ8[]qPj8$.lmTp,H<71TW@ASeAY:q.[0mZ5N,sA;VkN=6?j$E`[SPR 3n*:ND1c1-L1KU'-WPH6QA+/E_bph'83j;eG**giUl6ASo[]7m2[^T8G6jUUd@prbCrAOVlgIU[9_ch<mjMA@0r&$6Y8f.fm,LJ=Ki^A4G&^'r[*b'[&/F<>Ge;^X@ T.a:+&tptA0%5-p#@#$>r5T27#jKEjFHtS15pplmSM\mO`"FsN)d2jm9KKme *OTa="`gABf'/O=2@,e19XR&<8p:1L&U,(@DBYcCGOIeD<i"RT)8*M"R#%"[?"PE$4!a@630<Ib N[oP%rQ6_Aa%:/B=;5^-+e(s9]9Bj/&hXX+XK n.ai1k%^Yc((gD:6qTA8O5(j H0"'[$c'XIX]_FGdDI$b8M7&f!X'fi>7ajB<-fbp'\V>q7n>o8fBkERO\?Q4ie#pFb eSs)QTR[pd1`-YS=Jk/9Y**^`p#YPQENmk6UU-"]E'ZP?^,L5SlthTnc2_lKd_>imUpXBVDmRbd5r2-O?G8;6=,.$CRM<KfVIZZdPeG>UdZ9RVs'oPB *U9T*&Hkf^]Rn#VHLZqlh/JJ&Y`At `hPB&TR"an*#.J0E26`+CW=[s;^?%gebsV+[^`EUZ'aFMS!NjmB<oR8]8Agi">c cAG=VO+]+M[1rgR-?5lOMiXm^@0X1"7j_=A& Je2mMh_>M'mat?$)l[S'YjOsH]l ek+Ls5l8 cP,=`MW@m UoEYnV^MD/A>4mN=4?S/Jf3*>f%V)B@(;A$Bf^IkcLAq-T(f]i`7i6Xf:%=0U>X[+'(ac:l7o#[Pp;;`&D+CLq:U"/k<";m/K[E/L"23TMi(bf2L6A0'D3*B1 U.-]Z3FHJ/#@9'V5<U<[#q)ss\;/h'q0PYFh=?L=]W:\b%I,bdps1\%17;.eWfMm0DD=;H3hXOet'6/P<(/-O]8\WRC\?-kklr;7XPBg"FNAGZt5M6&`mUHgLI^^/mG7_5I7e?<baYm_"q$/NqMU5"qMM-UGFaHDc?H8Od>A;Tah)q8)4]JBp+%7>nmhS?e79@Iq/C*J_5r@9_ZdsVc5Y/k`BkgialL8::XP*%V[cg^&Aoje_/c[ms_4<MKHE8:4\X_.TrALSj=1>\N3`Xt^(KCneo>^ogjDh,=^/RP'-=q(!%[B54UpT,ic%K+RcrXP9sKD(0/m%>ZA:s==@cAdm`aT]JIC63Q0209[%MM;9:d.`tnKqFhg,3(YO4]4 =@&[?%6VWTA+K=A%`S/[jRA/rCA3#BBhAdn D8p'l/W+tiilb;=^'\GRM(8b"I.[?*VF,+%1"_#J8mL7EYJ#1T%Y3G?K^57Xmk(TQ/&Ajl6^mhsR0CB12Q@$(tBiE0YB)Uk;A@'tJYCab76t1Q9Ta*0f!AdV!5!3%;K!<GqsPHlAZYHP6^1``V\\C<Wp/s=C8MAO?ER@:Kn%5A.Tn[B^6nZq1WTLl2?c`lMHF5_iiZ;gaRT1!WA>b<,N&mO%TdK 4bOOfn;m`I_/<?>:nHcOq]Uc:3ljjJQop8strF,cY'Z?ME[`ps[+adMHJ2A:?)ffMG@OHf6*,W(kDNM:P&#"f=)e3h%4^]f=0T]1+bapD=A60M&l'b^4HU\la-I-j<`A_"/V#<Ab7Jps#[s8A(:9Q8#hDAO8rVTZ]cT9&^QjY,4T !:N\#"apZcAn?&T+f$"AX^X0(t*WAQlIc[QTbT%k#Ei)Yo\0a%90(J8fDQ)qnrr)jgJR?L)')0l?/$KoY8#N7r]ekrqIHHj?Z0HSK8NV/@pGo]b=LF?N?CA+5:0VJe;'?=hc+,0k;H,A1E:O_K+2Y.H"?N-`XfWfRW:7+,*W2GpjC]n*oD9i$Dh"[7OY<6n*9qUf0q@pG+jDa3Zm2o(\9H&fpVa/9H.3;fm]JGeYQtG8Zl5[[KkZY6f:2QQA3H=.`;_66IWsh,AVKml<CGB7/&QkF3dR;;@k\5L_3B&;QG8h'O_&].=h=#n9HJJdCLA`BJ+9T96 aAgN 3DNN#7[XX"E<ejGt:.'rA&].'-[=HPG?D[WMPrPcQNbm3a_.=]c[0LB?JT4$j?.`s-(9i/3WA@rmAi<1dF!$*@glo>h6r)_Ti8b)KG.K>6ECdLQL;d`<t1#K%+kgDC_'le24[qs8T;"a?e2c&]XQtJI16 8ZN-pGA)AcR'M0Z0qG]CGN*eMcCZUMRf'Jd,r4rA?f%=K4?DPK)%O%nMNn02>VeFI`8=)`Q<EC!$^.`I3/#gd^l77:8Z9bN2p,m,TVF3P]%,,ND,>h0ejFQjJckrf,><6bBmIUJ+rZ MAs)AJ'*[qSIC_e=K*1P0G.nW_A]c%)H*HR.-.g-oO7C N+Ie%aZ]_fDW]:S.9TZcXq3*ih*a)U6k)iqoXs\"*dp#U&eM%A6mVd2[bp&`r$'^UEi&jSsWU,OjYX4r9$AG*r^Db71Ul1M9m8g6+s) CaaTI`9#b)U1AOY3ALhtA#q\_+]PE2TiW'6aZD\HdkD)/U<D&l9i'Hinl[%5/S'3^IPe\$(c1]PnfGtqWV"3oqjQX i+9A+<qe;gAC\$ONsLdLr,G4ikN#RG+#$A,G!hV@t-8Gk"*d1Y>p.d++A%I^#fGKAW]>CtGt@A.Qj%UKZZHNnXer;a(&?Bq,]W*ot]P9e%iZ@]lXcdPU(h#TA7HGT.E8R(h;EB9JT15I]q)XtH'h[0IjLYE=/RFFlcVS)&GK"[Ag`+GcdI?tTD,_XG..XfWAl)gT)7dOFFs3jC#ctjk"2lpNM!Ui0$5H@ja;XZXDT\FMh-m ^D%AIc;N5A<sr$+1Q&[GsOUV77rQ"t:$ZXPqDc3l;7H6nn0sEUbd!Tp.rP8'B4:Hsc=%^.bmYfs;jgILi_=0L/n(@;dPU<_U5'b>.j%o%"a>#'h:kjq-Al`V\]Ih H>:F1hd,tSoPac]sc\'j:4\Zfo<-%foa.F%XN@]ZYm+SIFi3f2)prdB/c$U1)["WitMkFS5N?=b.\XXf4D@[A\\jpg8iNkRCch?pB@R3$:G!X'O%-B!HRanglMWA#5eaF2;a 2TCs_<CDPW_>>cEXqFAo7-<l$ ?4krlJ/q]K\Y)j_$AdU"3'P`AblRql9t06f8(bRC&*:[#E5c6cnNWAQgS7aSnn1X7rNM<c-tV+Hpd`MN$R!AL": =LdPZ[D5mg=%sD"TdL)m;AaQ7P_-9A2s[.'TnY'6"C6aFL!a"G][8>&Z0U1iOHNSG BShrT+_I.=P0:S]oA[]6&,W.`4_+#j5G7Qk+67og`SA8X5RB1)K9WG\go0C_ao<m$^:m[JAA4RiVWn_V`c/am _]F#-;K^ HV\QBI4UD()0+e>N-2sI<b8G)2V38bA`?:\Js*gE)E#3p@_Q!\'Ghk(?!ek\S=JFB+U_P0?Pnn<qZMQY+M+q"[+Ga^<<d25 Z&SUg4PQ3F1?<KG@kBY=sQ:EBda_oNV<OF7D03FJ` /Y)D3m1d[7@JPj)LXn8YknJmPGqOEQo.AAPCI;d9*<3eIiO98tl_[]m8LaAhC';5`ta2<H8Y+.*%GDJDA,6[+g\@dc+3c[D:B:C;jr-0fS6mJns=D%G'Gt@Lo!DRPV*!e=Go/,+dP>8bQ*>P_NM#%ie,fA31lW[sYn)Z-r#>4lA[C@Spt9bG0YQt_;1$V%O\-Srhr6H?jM\GX"KX!CpVK,)Z)Sa/YB6&^i4TpU\FNZUgPQ#`l5jnK]-.A*l<](I1T)M mQ[TM\;AdEF-n'*f[o&=$SD`oD#*7Kg#R?0'N=FomX:N"m$rM <qFI+S_jg4bY7pAf=UP6`2%?l6Q5/U2dH4_]^a OI@JZES6Mp<1Mr6\[(/J\b0MSRHDh$6pHA![3r^#M**XHJo?X]%E`Y3%6E(BZbmUht6*di2T$DSSEg^8fI`@D#/?:"IMNW]`Smf$2&R/P<qoX]sHKQgCQsMpQsKF4'cgTh\@DZ;SkDGjm_ocfF_4qcWn54/aH\)F+6EQsOOif4sa 4Q9'LTK_e%]HlDr#tL=\akd0A(p*YLhENc#DNA(:t84FYn'<,Z0/NqP4E7#XD$T;>H*_2X1o,RRolm1@Pe05A)X[3Asq<ig!'gbhLPd`1t_,eA^O9R] jl+a=jlE$g+k<"$lm]FUTi`RPZ?3BUU8A.F0lelo#drgnH2oJ -dd6*>n$r0RHNDAfC`JoA!e*.E]NQWh.O8CAM_Yk%s0aaP22;=30;9p`,liM"tl\@(q9K\<%V!ifKFoh0>QWs)RDAA=Ra\o]GE"3"T[2iC$PL_ M, TFR<0G%iR[j=4EJLZ:iHnSsAGCQF;-gd"'f^PI3s!WP[gbp\p2K</_:$sbN!V=r2ks&;J&Fe$:OSY`Pal2-K71mpkr.)+>g],fl(NBF,k;l[bE'27W%cKWL(J,8RH^PLqi5d[&W%Y5iU.IH5\6PfP"-2htG-L#W8b^"J%'XB6nV:Yk7'bE`sp[^i"l@kZ@\*T<pgMMK OEP@0;5<_>0jnA4(]_pf=R^SYRG+EFQe[V&i<c:NK1.6ACM)NUd]&GR`<#1()LtS_+1@kOK:GD3-9+77di^Y'>W3OMp!VRghd)Je+^<VM5=f^)qNs3.KDRBCM#6gJL?:(e1@M\U.&R2AJtbdNO&9 [\-T"p$<H)bdbVUPIIogC<lJ 8?'<oI6oigI'jY=PLB)`CVY /K2rJ&Y`CGd]`jT<qF!%''lW;<DYTq,Rl0Nf!jX]GK4r5S-9?b]TZQ?/Vh45G%)CE4Z"b*@ktUl[tUL%4;`;)KI/G(h/:GW"GjG.2Nsr79_+j_(#f)l7kaO+sO]j^jM>+PLQ$Bco QOiA;o;N'HA`eAV+654S[o4[>]AjcN/g'VJHS9Ltn7b7*k<h[<o<>F5\\`rkP@ChHLh"]W8!;V8C)&^%qLE?Mq88IHbJ-eA$;+qOaB@4kCGY;O=d8\.oRU%s[]O?\D\0JO98 L`imB\!#rHo0]i+02k9"4#)5:% A&9Q:,;sDZk0[o(GVlI*T-W[-G#J+-@r!,AF3NG6OhUcK-hXd(##J85GUGZp0Zi"9_Pj4^e])>UC3I8T+Hol=BE ([Y24p[<]CUcnR-,G=hO3WH`WDo]5;`=EGi3^d7aj#G.r2kEP6S];>ab[<d%0<kE7lJNQF+pboAUf[;< l/&<gFY(WgTsAh<:[8(i]^@\,B\?($"QQbQAXA-A._A4<^-d#ge4A#G#@?R%k'JS:V!Z[D=0j>3jh2X1\'!2D'sl/*+oZ8;&\"VXrI);dL<t+HS0(6 6!^=Zm+] :)3VZOi="O$Ynbc0]LR]d) kS=rgq4,mmKa-0\0l1aS!f?rm)4L_Bp4FQ^\)q;)F)jq3)XJ>A%d<WQ#&E4E@0"<Pf;*4BJ.^kfn>\(c?1; Qp]/?g?:.b8%J!N`31"B>Or&U"dHHk-+.`=27f%IT+#r:$0SfoeZ%p7[4RG!3GTUmO/JVKYm=5aC$WQ!X^@"9li>0s2qj)2G,AZ6%F&N#lHlaA (B5r5U5*TX\LJGd1!hOV`]YpD)_>[i*T,(*_oi*"b6a-am,)Y"nK:-T#Eq"-l>R9TSU310G8h?gm$[7DgXt4B2i7fB+IEWi`Hi<^lRseL7U>f@*+N_hAsH)J>f?[B$(-,E*58/44`l%/9]6c,Kj)TfCDaNAROGXnlUaN=WIt_!Y9b5@@?@57K-68'\0[`cnBG.YRD@coGCTG*&ChORm*2%a"<'0s7TKC!hp_`.A2Vi,d*)Zd Iq6QK^KSO9[n`[soc&tHMWD`s=K]1h ?BbJ?pH.n>A%CIWKNsboRXU"/p%Ma"iVi`mA V<a$IW"fdA-np8qbLV0P=UN(i]i2$cr&%&Ddb@`i:+jL.sb>'R)b^e^Ge!iqH`dqTs@a6\7EA(lWKVHW^,,2o5@moD^Q4\GN9YPjq7K4e`AadDQL-R]3/b89]MJ9jf7*2#m>=*RW&Dg1`A)dAjA`^&]^,<VUqairOTOY9@q%CA>OV.iYWHliSEStGtBgt71qQY86*KcG453U//XH5:'^R0<[=9h(IsMdA)$%L(R'mAW<m&07;O1 N6a8EqE'ZCXkqF9@DoE^UMGOkP);plN"H[aqVD0cg+J S00;(DcDDnA1VZ9;484q$C5%<ddiR+TK>5BRHkMP\5dm.:"J?0]+<SJ>b+=Eta#\XFb9VpAZU6;?1S^VLWq$\!V=./:2\+lnHEC=.oMSj/E72a7[kE1ZM$ h;m1=lfT#32?VZoCDnK?EAA*MJ<fMq-j9?f6i]dP-YM$I=jjPD,L4@GU0P &JV7^5sb=Dqjch%B<^/]`n!W9s,*1ctH.o>%MGB_l\<&/P:3%Me(rQ3N&'@,b@>KGk`4D^h)Fl$DmI>L:J>^1"MYHK.o^!_]!qj(Z[=!'3S._MeE1GdPrI#i^#jGq4"h\DZ,?i?jdXMcI\MtsT1:(PG8#?DM?Zse)Gi1OC1W:d`69"akP7!>:PcQc64aGhpcnC/A+d/nn@fQsG3D@9+i"GP?G9[f.3W!RACAqVrdn!k/VWJSfoh;f5C!H:a,M@n\7_]oT *>nDGh*r@N?2;9"6cV0-.e4](:FDEas<%>X fle&l=!C,q;6dNIU`;?C#[p9*d+'L<On \ A@egA;=o)["A"0,O0$C46I,i^LPTlqM_k-FYq/R*WBTBAt96f8:+if2VjTP#dh BimMR0sgI^+ik^71Y;h,d:EUQL?Er^O"\<(gOoi!]%`3+T^FtsK4U(\B7kps $_k_6g,VrYU%V?A@Q/&h]64f[L,l,!)YJ(;45?d/i#Xf`2Z`1-OoXjlU:2?e:L<E/*$r++T)cX=Mf*r`rl3c@i-NA6CC'HjgHaIPaqLG!)V-:;&Kca.21_[@Z4??N-4p.e!b%B3A TaB_*'27 Fh%&e g-9;"Yh:as$\*Q)@gsV2Ne9Kce'ANN--E<O`o3R<nDi\R4(<Iqp7$qVtVH+M7JHtZ9KR=YGeDh7U#[Wf27Fb9sh7Vr(GA/d;kF'A'!5t4VpN\kOc.gT$D\c-4[XIY4*jgX[HZHcAA$g\k*8%c@:=lfo;#<mCjVrLE<k&BN??K[hLrWn1$1Nl+1#*C8ZGl<bB*C@CfF<abJ^PQ5@ D H)MF;2Z\-6Fd9f*KUSpj>N_aX;a.e2PGRkcVPFIk3X*q qM`"jRY?>#E]"-`YLK[C:QTa/,8p=1J7_rZl7XX-\rlM0;$HGfZSt;_Pd/DPlGJ+E*aaO!X['htANedI)<'j+s!KKh@q #VO!HT3m\SF$Bt36o@0tc-ZYFs?VnN2)D,?Nf^['h4m#0;OLSfOA/dcHiX#L8b4dnDs-nV_btDU6gJ+[C%Q!&9kL^.Xh?JrO7jiCTc^3d@;\$,t,+JQOjjf^FUj+*m+*A4]??RgFBWlA]bs/CcX49ejPb08lN]h)>=g_C9`9sY'g+e3;A7At.1j@>4gM^Tk0S]E=;r1Q*p)8ira/O:I+9/_QiRc.\R<,PDD_lGKK4ff*<AEG9rt%s*]Bll_M[1B@DV\`VXtD% !+-2E6^M]e\URpb1>*n2A@HK=&?4IUAk2-S-[E E`Jepsj<LR3&st._hb6BfP)*QNLVW&3B,-:9kn>P*B-$@`KaMlrHo]6i-PBP]%i]$/FKR=$>-Nj9,m.RmT8H&h.Y5o,Y4)8.MPWLmnRC$A.D0pd>3C_sB(-p%7orENVmP6Q2kd*SPg?M+GB-RBH0'JU%NVt-qg%>-A-Xk'!V2sEXF*"<2[:htt#e L*[AMYK3B$ .lH-Pk85-mqpcW.2o$jlf9>%UCd%E2(O6)#kR1,1K6OPDV1[2$&)bJeFc/R@(2Vr5Ko==WmK80+s(4>Il.0SE XX= )-<g6\FfL;-8;+hA;sLS,mYNX#]=b't]\/3mj0lY&5gfCE&)F]e+SJLD$.]Zd7Fsr2qbNMJ7#)E3Ah>[W"=@BNT//C4EGCWVSGo5/iZKJ@$A2:5Z:02L1eR-1Fdh[ljahX"+-XaD&c2`=eod1g"_l_mIK,kVP!.1^7J3\YR%G0Qjr9N/]hgAdC3@bE$hb`$[A:f+Bp1rYU6TH0!KcnRN4( r9 ][nqNnS[brTD(`CEkeoLoKAZ-Bn227d-k/%$i?aU2kD`I!Cjg& 'H-/o"E'7bdaY1gL6bpAefnAqJabJZfnQ"^G@%SV)S.4 t>>rrdNp7f5?Rb@EmA6_q@(%OCd^_]SDsbgf+C488AFd%Kn@dmQ9D\8P9dW\^/+g-;_?fDr) qb#AY+T"R^]JkF-n8IP7o:;Q7W=4s&A8?IKrn0U9URPPf0Mj7^q'AL^<(D0:UsbP>HO>&N6@J1`s,&^j/Gi@^#i+YjnEf>G&!)dohal(\&Y^d\Z0_+LC$c6OFV>iPn9WCd`?eM:-Ahk[#"daffELAi^sAqbgKAf9q-+=^V#4:WJa#fI5rFrU'BM:a?b-&_-j&[T;,0KH,!:poUkAORn6L-U9VsCX9r<25r9g\hltAV79W%b'k2WC"'E6H*:EA A!V1`PnSba\kVrr'AVShRN[''U60+%2)kll<+f8+MefEDtmsXgB^;_O5A6cG5j8GpWVs#bGp(;;[oNB9tD,/D3[pcJ.@+@=n\F*l!CHa%KW@(&@0>=(W%mOj+"?og>4b;3Yl]ocT0Nr'C_o< P':8(\3.Lcs9NB8*WPk,3.[_29,Wpt `+h%:0\]?>$5s56aeiS;7;tHIgZ`5j_WONE,e`gJPR^88K+b VMQ jWI%]mc)3]1tOt5\/?;TM`=$D# d"#pfLjUn"Ns=:RX?gObQa2a[i2g&<^(jG.ZQ]>rJcqWpPjlA#EYif^<&.pAl\3=H05lr.=K'@dWb@AWZD .""MQ7dsXcE^g0t9(:TYUlHjY>DB6DgGP>'9[$](VBh&a 0t&@Uf1B9Bq4ef$]sPI'S'"=ef&b\/j<JP$9RfTA&s_o@</WN[sF=k\**29HY"(2ok6bIC0]Vcqp:ERXt7'+m:ASj/s4'EHTHV]NAcTk"4R2D3>'HAM"s1tPkh-^'GV4j"f5sAl%WCp[Y)9HJWC]@VNTf:o+'5_L5 =R[Y50##nJhCEX 4(!G#<9A?oi$pq`Pl&`lPWVAMrBDYaVam"L70VbSbACEAi-;]WP )>Rp4ep.3Ap&QF2Q[C!LI6WM4a*f)62!>29VZ6NG]7F)M'%H@Mjoq#H^+.XZtnV'Fp4H#Cp?055[?AK3LIt#_if_"9msn[+Z V##)Vq\/_>kM%I.,h=WA4[f+Ds:SVRAoHdn!o:CS;ejT"?@k-Qj*2!#eXpm>9RN&JS$Vn6kq%iOQ-g%Cof=`\A']IGVV%0O O7"qqeBtJ)Ula4Mm*86#QQ\TmkR/!J2G'?6e`)6RVq<DCIf""2bATAYWG.?PrG2ls+VR_b611R>5%*ItWq)P:5pC#X!:K^# 3 E-"eF@s5X9=$AZgJ>>YfZ.iq_C1t^JgZ.4D0]^88G[gsRo+=^/8d3e/(lr ?n4_4EL&%VX Sr$$S]@@d3SfX:\!>FphR;%P$R;TX<bL`VU3FNLfc<0osA, ri$JX-IF0(:A)PWV&sfiFpe8h RWBEeEagm+Vf^pnktf:V&nB;XarEd6A=6VqK<X#4L_3=5_+>>\$q=%mafk\@Z(C]/UZnI9R"P%@0U^_pf`opkp8.>?ZE/c&FVqlGBdYsj*S!Dq^8!K1?%mR:g:PCNqagL8hS"T(l[ ^<\J&9ZN%Q!A<P`C:*^c+RW1#c\_?*bnIY?5-%I;+aG:<Q3Nl)KB/H-YX4;;FR>tVKS;DDkbboAKT'nkBqa!Q90#LJR;..-te=aabVt@40KFBr8h/T`Zr"A-P\1`84Xq\fCl:USe'(eR>dblk.#l^YIH,*rbK4(Ws,:?Gp@d#W0_+.,2aiK5trRDn`KO(+4kemO.lJ?g^bOsWG%D^P5NP*$nf7kFG@%0W]MlP*3.$TO^l 9;i'p#OMAKdl/rKO+jU3F!JBFdg!qXAl,&sR<'o]*p7V[A\k[YNQDr@"oct>!h8eIH.QU5'6L]Vpe*-0XUhJ,5aAkK:6]UlBLMtm5--at  3PA/YT@^D9!E;%cUR(ec5*-SHVfBA]86_b$]gT@ FOG!kf!mUmpI5A\lH,^sN- \%?.W&ReT]TN*jJ;3!Z7GWRW'[\]=Sf%A\GK$6,s#'Hr_ME8DKc,HiE*H@0f*_TC(8^'qCZrbh#.`50hC]9A!oK-Ie?]f^gZD)'sC\JEmKPK]1&6U:A<A=HOlI)9?$ErSj8$\)6.14Xla@eN,lj5+Y;g@A,=V\l7$h&BI];RMK6(__^n\[Z6rLKo`oO\q-p/$q%AqSEB-X"A=:AlDR1lKCHVl.Cgn`4?5C2iS>&g)d"GQDg4PJ,1.ADoP36IMsso$*m!@4"Geh>QM@e]Xd-I"C)D=`:$5An$4sle" +\s/k".M#dG 3T/,,LipcSZYU%c_T&O_/HrO+U,IA.$a+=U GBt4BgpPB`!Fj6< &#:5M<??Qr .T[`"[Ag"O^2!9 DWIQp_/7B.t6+aA/W9DZ($JcYDAf+Ne@iLs\;P`/>C'e0o,0](Clf:Dfg@-F"`ig:*Fr%>HIQ#V/?,t5H4B<Qs^A[l%88+d<$'aMa5Cm.fD9:A=LAHbpA3^M%5=rcnMAA$pCANJ0qYil1jG,8IPA/4.,b/JX#nhUbM%Ynn6S1]*=`pO^q_dlCh7ledKj1HfCU8$"sA=<\K=qKAfEX5+*?liR$rUBh"W`p8m(**5--fCj?,18QS"?h5^iaMZZI'V_qC#JPCr.`&0Q=n8LmNemp1Z32eBO;EACRQWaIaj0(]8dalOb@!NV2!tkfsC?+)\'f783/-1Yn4lV7c*A2Al9*8:;(^JSd#W69%p$jqQKJs8L,fAaCLsOPT5=;+2Sq%VmEA<1h#6J-KpU$0A-aA: $a'NV]oQkk^(f?eAnQV&tVO&a9p)A2Vf.ata,FqU]$KsTf']49JId2t'R"j7jO^$A;?9:0HiEi<scJnpnG] #>i(OrTP'Wc_G#2W[Z^L2AieEf%=k&&-a0f..E8?2gh7=S^-JY'KkHm;ABpb1&)@lZ!eQ*!<JE'>QXs0.qnTHkkO/Vi?pGje3%^0`EVcan>G`Xi XZ>kheR`oFNGZ'#pRA4:^2)Y).tsO%g\YYK#n/sA2gO*?MZLNpFXVcY@R;S:X3;9hHgF"N_JDmYCE,=lPY+"&qkIgr@t!!d?I5bMd^Jg2 IVIA=FRRat.b16dEc7l-V\7^Om3 LQd0I,tsa@fG\sOMF%P-K56+\82XDJ445em!")a.*49s@>W6`j)>]E$[5h+b`-ji*Q! gCZ01k%VIBlCt']*a&1 MUSJ4H+AH(BYE&B$7JT/TLbqtY9%K,r)Bt>XRsk[l]^9G?4p&N2.5J)4#k''Mq(1/FnAeCZrKqWASh/Te^'+p>)O\4rL[hY)F-Y+X,,@"#J2m:a@\Wp-]VbfRRl^$tA\!)('E-KC*[K27;KbY#<ErKh#`RYX>$*l")_lb'NtU:GX%n=[BX`.$6RN5[["/$pA^,H5/*/;WF/H.D'As+N+/6.YYhfjX-a1Cq&?6I48OVR*"tDZ=#p\&cDnbnP6Qe\tN6C_Wt2f@ATsR8]9[0#s*IUI>gA^be#nKI`4fl-]%0qXQ_VM1Q=bY1hn*,3UIBIMOF 3@QLV' )F>H>lfHZs[P[B#bRK_f&d-5_d)Lj\*Z\Q+aI#U)]D9TN'&!pG=<8KScpJ'WjU?^5&-EaU$aU5AK)E5eCIO[TKt[&WPomg8`m=S5j9lUKB$`i G<H;BqtakAhJbX"TK-41AnYEj2\$ID&PhN(sk5e1)Pqmp]!G5nD4h3P<Glm!Z^^!Tji.VZ aj]=1/>K5+qcW/>$FKQ:_rTG6K,#%PWP qM4f'E^ r;<_\Ja4/2Bo%a:f>)Z`X?)]0.V-<-=fkPIe$tRoPdI1M;;d0&1W5T$^dWVn!CX&]b8@:_AbB1c_V+,_:NtkthMM6m#Lh/PR?VEqb&lrCXFC`O!6+`Ce^5Z$s83MeK2`Ho_.jo\25P7ghe3XQb.3bfF&+?#sGeBp,?"*KNh\1XUqdn>j?V*Jm87r%U+ZCAgeF>\(9SPU@GI<<,C_j$QjT<fn]FFBGFPo-WqS"a@&T3!;Nj1qjCkfIa>>J3k +9`RcbX bL!&*U5Il$PjL&^W>:$=FcVZ'qg-8VGg17-o1"B:B@iI$$'h:F$5#We1rS,^onIE?S/@%_gc2oC_ AG-MnMZ b[i ,-#BG_Z/jh0;ebCkqCQef8UO"$M1cW O<tP-WA /US8VJNV<'+/3Q#nWt>"Li;97/9?Z1bH8MaXEi;3aAC4-2dLtfU@_=>R:[Plg8NkJF<4,dXk\WOq)tSP=T^)b#G+18Emjt.eHFst,G`]Xa(GBJ=5;"/>;/=&* +'/3`Ag kI-[i*Z/T2#ZK'>7PaVO,kW[20(nU+(BqGB@AaZ<4:YdG6jUAXB0CVteK!7Tn0Ai&rq_J4>O>siC:?#FqO6n,NY\_;SElXKtLD7WQ+*/J_Q19*]D"H(nP4,IA)p(M\X`or6MdT?RU5d-Mg8ZU)FIn4Jn4A-AF[mQ`f.a`;j[AgZL>3$<:jcnWk/!+Jajgf<F!&Ap:Hl \PE$KX,Jd,bnNr<$>:;p3reF6!Y!$f`&68$COR&#9<["a*O2dkf]hWRNjKkl2K/Ts+m=@TjE2%^/R8ST4?+*cSY`M-+`dNhd+Yn3d9GV_lTP/3#^LKM!h-j#0A-QJ98d8(DL]Zjm?',U=+O5e_$8E)ikIY\Fbc[PLVco8:NYq/dIE`bYm)0@7Y+[DtHrlTd[B?.TYG02neN7s=fF#HrcdSe#B'R\a(X%hKTUN>-Gl]VnX-i)cVVI4'TRSP-X3Y<7,K[KAqoOIWbhWD18$\*^h P]LL4s7*KdbJcX5HSOLjEJ:DY&SA,nZ]\\b&^r41nPIoQ(83k<:K^]oW940AVfHYIb`GW2,C.G9X*tPI;G+RrZ^c65Ar0lp3Ah8Pc2CAgZr=9DBe8X8JmT;7*%Hkb9tWg;Za)Lj(VUX.>9/XbC>GrRHqtJMLA,,Sc7X:<,SPAVF]iC?=7CX3(;Vq es8I8Yjb[(mkYc%"+j!hTkP_c+_K9"KLjHo_2)$^;:;G;B@`!$Q6(W0G Ajb%tsAI'YWIFM;gE2;05=$db5GT#s4i9)bp//Q*GT?EknHAdeND;ABONA]*fV&3'-.@ae oWH0dCS[?5DK!gqA-<H:Y\-sC^D0@'p/J1".ZBB@*(e=/@]1BN"8V:FmRc[pWIb$*]R9\:GYip?cI\]jofDFVk7PI+3DniX.[?m<Srr"[F/00.cCMM2GkTq AA<.FT5I.m<BT\s"I?0eA_G:9,$QsXDANFVD(0r/7!pgpp.qgqe83ZmnT74/%A@b'RWDD0hB]jo"8B&iH!Y\8R.'-AB`d4p-r3k$MoL)XHgsW/SA$0Wp?-fRfc[Lg"Z[Ql_XXdd757DXnED><cSga-r`sHH))obA3YIcNFIKq:<>b)I7!6-&ND<'@i ``I/YqMqY-6d$QCGOR-IiDk93Mbrcrl4K9/mK*5MP>AQZ/m6_EEti,m"A3X [fY0f"(g'ZQgE+@-OBg]=U CN"=?1m5\=&h0C2G3t-a.Zs5i-PaF<qZ?g?C.BjVX tVUNXj;q6;.&'M?hVCfN-G?462IPJtK2DIM4Q6YJ<I(LG8!q8#cM&c]YP9D! 2TSA:ABUnM3[A>1;QnAAZHeio-9sq9\UJ6Gj =W^(rnNgok]mS>Fl3Nb##)6#&DVWKP=+U3C<YC3@p <Kt:N@q@KJhWGdM,acAF0<,nGNAY1jm=XGaDBMcB$RM9E5'd5Z&;KKADHAW*#a.MQ>WfV ;?<?<+cZSpd-+3V6o"!j]p53_b3KQUP0G;72`'5_ipWF59>/k\S*EjnOe,Ep=WhR9ABBiWS-%?F.6NQq>n#6k<*H`8U^B88+:-<(^=T,5qAp.OW%i5ncXA'[#2@72_tArB3s?'6=^faQ[ak/XQ*bqmJQ`C6SLM'E8i^Cl`bp!c^f,_5=t)o;\G*0(U/"m:)1qC+JUdt02caN)oS(WtK$=pB/A%qC6:Y`Y4E[UK5KTG47mePiqFRacGX9,ps\M1sK%@r@S,9fV((ond[)ZL8@.PR_o+2U"J[IADF 3!5sF9>UJIpQn830RX2VfpQ@Nomt_h]R0#pa?lXDjhQ/ZqWjnC2T-5bNF 0E'L#-.t+bNE!:U_W/4Vr?Up<\Kj&/K.p@Zh%PAtdXJNA@F Yp4D55m\p]-[/G2PUo5>haQq/^^Yhl*Tn?Fad=jp,=Xrd_eN&0?8G`n%8X_Eq98n8O$hY=\M,[@n$b32JEBA(9=-AcX'H3BX3\Xs0U'9m\E<a" N>Vs[(4)&$9AkXc:(]HX.dL"Kq_mb^2O"nJ_A/EbFNXT9"pqsZ!FCDZ5sg%jm2fIf2A:_A23WTjS^?P5ei0iq)a/#:jV8C7-r;SP>M\c_coqI`W3ripm6No[M0W+jtcAZsPS+)BdFVh>#lZ7De 'ora7XVAS@c<ZCB2gnd$%''3h05S/#%$'9V_Jm/Y46X^e:boLHs+2kIeF_(s#Q'<DcSm+_reds>AC?CCs35JjCXb9'!AJ-D#2U;MO](q] ?jhTskl#V9O-gZL6!ad&b95Qs-UG5hNWd%a%C5B;Sq;;"A'P^0mJ]F`SfkP2aQ_-@BpC@TBV#DdfO7asSY<qk)1\FHJaZ%A##mkbL(CR AC.0Q!QcHL]E<c\'XY4.94r_YQg`TXt%\[sR+GAAgHF69[2<lW08PrW=g=[b>'!De! ]IT$lSo-c;qS"Vle^I:k(Oc+Y4DD jQrFXATEUlm-3&3Za]Fg<05T&^!YLcL%<))1A&>1N.YT/D+):#!go-,+31P"MC;k0Y'p.<;CoJGo+a@4("!pX=?Y"$0E1Y"%UAZo2_]&KiNjH@*PKmTY@7I$_a)$1cP;OVU>I/$tG3RJ02Hq`X^c\_E<!_i2Agjqr\9?K.O$Jj!_W8A+cgJ$Ln2rB)8J%(Bs@A@iQksIQD<GH,tJ/=ekf]!mOtoW. >MCX8Z4#q,'HF/B&KiY"IQ&p+$@:i )1)3/D"*m=2MHX\CX;mQ+]((C]`%$A*c.L+3<kJE.,V&l<9hT#c,8ArOqM"&6GG3o%?PoJFSA, XdL >7:A!@A\66Fih9VRW5dQD?1'"t;fq3.lrYB@R>7Mc>mpp>g_DZ$Y P@VE)Kr.WAjScRpf:d+af_S39#79BfE00ct?DraP:=\l3hNQ9H9>3_Aq!lD^-ta3GZ\W;Aa7l&s`q1?"F\JOpAR&XW!QR\(AB[ X(t34Rf;1X6_%d4-20)=!4!TO8I.&#nl/#.P\CAYeHJr'c$b5EJio^a:e%m4tqZ$3H?%5r)E$$5q98rtU2-QbqXsLmFA`q7AjqOIK&X19N#beR,]q1>^?(Y*8rMhthFT1qsjsTCGFJ6BPpJCVZlWC>hpKt ljt#+1DDZGV@eci,19LnK]j1sA!g>f9G>&rDQVA7m#Y8a6;1q8f:3Gk(VAc8gKXh"f.YXb0(H4mc%#?sCOh#jX!/Qa^c]5@*NsC0.;WIMJ2l W/h2FWr'Vq),Jqd:Zi$:!eDaC'k;qG$1>?Fiq_hSJd."BEJFU!QIQ4TMd%A"5rD-*WAmR_BF;866s-s&Ns'D)fQKWrp%9Vq27(fZrjKA;3"NWDl_]WD+_Ji?lY"D%LRZD*7m+:(0UqS`3WA:;AG=rKUii]qJH[$+Cm2c;?te5#YeIjm@V@(E$U0XQ^-Tq/*V*@hniBiK$M&"3T1]hV3""q@-^7d+D! Ai5D;=k_t]Coa&&4UesRq(3!S5XQB"j`0B`VIhBt&O9q+YUUn1f'1GdoKk"H$&[A:bst\+V%FX1,,]m>k%b!ZY!]mk6Aq0aKQfmbA?`-"@&_si2ig^KnJA2i4)5RR.m[1C?IlAj6X cQl5)OGp`SE>4&=%)ofQ;O9.0r=.pcm)HY*AMC86%"g`2_Ac2n\?AbA^p<c8MX*#*d[SL5N9XSpP]O)JFk,1@P[d3EV44.@RF*^Z;8c3KFKg`iYA-G_K^a*PcbN`GT4O8"n46?A51lACJRdmbsNY4Pae1tV5+3L^ZH!,*4<9Dre!AhUb)T:f/aT_'hI9!S7ZE(->]!,HKj>g5scI[8cL<f/$?!+5iQVL'_^D6WMXg6fE\ImXTjY2pN.aH-Q0A=/SNO'$F6%#B/;AgcWY%cP?14a`l=2BoFZk<`2<q'+$Pq=OfF?s'e'<*@C$g7rm/0PjrW4<e6N;..#W\X*@s>R# 9snT;^9-*N3BG"rq q#R;K<`"eb+`<"ie:@sA:89MVQ8N4>2 9\UKt':KMRV7!>j*Hs++aWcJOOSg5'QcFV%E7"_I`k^G:Rj"rH.42PQ1fF00L`f#pJsroLXFr._M2]-J] ]gPaAi#BA7M8iB1e5P-FSl4j!GTk'*U3PnPZ)lQrQ\Z:EUS:9i3G87PB. GMM?=jr]=D4BWeWWtd.Zp$1AbeSIAr-+-GJDZr)g: k4EOKl8g?EMYqAmK0U&N7ogmHC!A,]kGG<>!qThP`+3n7Htdn9$#*WKPDe"Z@7?MH$6AiiS[RMsq+$2f-3:U7N"X"(<OHg':MM <BWW%-pZA6 pn^8?Ao?Z`OO`/XM/f1OJ#VRP0Ke[>1I?\="i]1(-JmY%Z/4%)^AMdk/n%=`%Nom@Nd13#(YD`(k0FJrFiI:a.F4#N]U2WcD@rkT!G:^k3t4DC'Rm8C]L`ND$q]WYe[5$m[4H(%CBe7.;,t+ArTW!=lTKmjn!i=_4#BdX(ds1#1Gok3GC;DcO5WF:7@BT7[Cqgo> B04p'1LQYEYR50PSsAE@1hi(*fjocJ@L),e>[3AC:_ )0G))l6p?05M\n178XlA#h^lpG)>\]DS^_D&mULnqgJJ:2^$AVa_lIFh^dkAPo[gt?C'B+H>,1`_gboi-M* 5 30GeG$5B*s:l:O(ZBeUt!.o#'^86\%Vjdb!0tQj5Y,IJ"(qUD(Apj-s3[2I]fM41Wj/#c@?HrT+J=/WlpU\>GUj]so=jIqEV5BA13AD"d#8hl[#^2siAb'[&!F_(fRH&%h@NAm3,>XE4&O4>f6IP\6%nTrb De@EYF,/Wbs<dB-r=](81:nZT6%EFam7fP pQ<\U]-neKhi2HQntoU_IHXWbAZD0EI%&`i4Yg,C'd67Oke%iooo[b1,Li30efA6r6sR9GM*r#06@81lGe(&+ R]@Mes05A?]SL2W9o_QDO,.nBjHri+(CC?ILngU?%t"/RdCUZ2<1RroLqSKk4E)+&1IXeCTl]H%mhW#EI5)c+Wc.GHI]cHh8Kkt5!mUpV9$to'0&m95/c>3%@p@E$YHQE&Y`Y_D)g2@'/$4]p/Q#N)$XnatM:<:HrPg6&F7doN,Nen+bHtE4lJN&QT9fl^<G5&h47X';`9=/<)(\s,-p,3tjf(=37aR<n#R+!*(e>P>W3j&Y&Q!kra_M9[192YW>R`!U^!AS^62KE;=[AVrPK:i^_9] A)mU%SMngF]GZ D-Y+5S@HbHp'X^@*/V@QcU*>iA1dgK e<""`R^YY^):rZ!#9#=ApYQo.EkJ4.*EXcjqmS*:kQD6gYdi$.HBnsCni^5rq+SY\0hC=:t:UH,Ns9+V&k,Wt$DpSF!3HfAM^fI+-A*"9!=G^+hL9R@4XRG3S21VGfZ5a  c!(:r+c7iel3<l.?HpmOQnKSC*]5j4H2g$%qk>(ZAIbQR>L1BsVnn3L :/Blg))[-&h`&IR6YGFCXBKV&G0)@AGTW7QY'$XC0/U<(W&*<nT9P_1/bWVDS)q@^?p\T&rQ:.WW-2VB'ms2(0L(dYMXM7N*nt?^EXqdZi;Wne9_t2`&Un&_'N)%n]\`Y6?PM^]GjL.^+1q&?+Dcq>1R'&Ynk*A8Gnl]3j20ReM1';6T_BK*9h@bB k83;"nq%n]FqqBQp'?QD4>6oSb[4dm.:+@YRTFMABYW3eI.@<D@,'o##hVAP?B*kMl@cY+AshCHMM4UClWn#O4tpgtU1a*"<OgO\Ora^o2oU`0k38E\V,Rf 8b&lg,TA%>5 cJ_Zt8E9640;C9AkBabe.0nZ%VYBYF8;kl`9^^`aF7Hg''q#]bcXKV#_@pj:)Pla@+ +!6A*no]^?$V8($RlJc]jXWj6]=9M61r*f;btbBT*(N5Fl<[ON+'4#X'hsGeGWpML5&6XAIGWjsRs]B]8'IU#-m$7i-RQ2HA)Mq<dd>NU?/b_KnsYSD7=8>[d.)*SQs^K/"+n1Qe2B`R/+oK/3Yb@C.1O,>kG9d%=D8A2'aG6Ln-P7nrtoBE_;t$aA#OSj/#dJc=[X9D#^-#i1:\rjR3A*5aZC"2"bQ$otgkEkES\MoU%*H'/i;T:`f(n8:\;"NGRgBQA<.Z@,7a3R=;gZA9MAV6!KOH:=tKWJn)fdoSC=ttJ*N,B5E'_L1?Wdl-M]bGpf@J6'[gRU,Y#edf=T[($O:22\<QSt[,8TOA6Hk4qB>4Mo(Zn1E85:6lg4+"%K3`PtR9*R$tlCJ7FJ,bcbd^T_N/nA!7*QO\0t7JPSrlf:-Tn=q`S7WXG1;7d!N7a5<_6Ul`M_eTE0eZbfb0%E2])7@P3hIDkf\S>#i$Z*[p5>s@ZV9\q=n_O/Y)G;*^S>?/NXM"t$M@t'am*M92] \VEX]^G_XTfDKL4\tA\Ls)J;%:1E%A@8d>&[Am,:Ke\'8kZ$=(+K[s<STch@rHkqO7h.PE[s!nf_Yp% s$7RK4Jan:"Gr3f?nSAD%^LXS7]RIO;VA%o8KAftsO4HE(/nZcZ69k#n`F49Oap(K/C=tP<9o%./Y=S?ENV9N"?Uk50BNnNUA_=]FHA4&-n34/o,B]%G6s$h[0X$ f-/1N[@=P.#PiQ5hb"* T(\LZ\R*+9.3OEi,E$M7_s.#h$UjV)Z[?PPHT4Cs^>)R]rj2X'!ID"#VO.>Zh?L"0o-=pY^!=BRMA5g#ZK8-/:ab3:mo/F6tL-jb-N)At;%VA["R. _o/Wb#;5C_(NbF1F"G<a4IINL+I3p>4N(oh`^$18bA8aL`8[>38W#c6t/dcEkQUoZ0+S;LS;G]a\>"QKCsKT4pG6dTVg@kPTZ6F$&*/p[c+n,XeFd6YiaE 'a'n;C@t".Bt*Z?Tb8A`2sErW0CXD:rQ&B?]Ys)+`St-2ikC#D<I!;ah@a=t7E H/^pR!=D4%K&l;nZ_+`g)s%?K;C+^NTL6@F(5Kb)=B(>D5$!LORR*jHj^^eWiQV9GF*EYnr.:RT<+^oe^,DR XQbpF\JalQlP2%"%Q9U(?XX&ER:`cSLl9-%78O7Ol3BJ")P![X?J?))$2T+395?;<kl$ponP-U+QoLVARdA$?eQ7T)l 5(-A$p(V7BE\3Od/+&U0<N8[3FZmH)E]:N3L]Yh/h]maKhD@7=-C!f1%rY"An@X"V(='5_:7M/\sD,+saTiZ?Z's`+Xf[MkM'eQ\A^,RJOh??:.g+m3lj1*Cj'U3\@X=o,mN)]8m_Bj&75@&ZeRtR?DoV2;Vh($W9'_Gg1h_Q)(/=<p_2rJ&C)^g,oq(20sh.-`i_MZm-Wt` p0$P*'9Ti%l#oNnI\YrtB$?/3.ke#Fht-$m;`phQcSNMAAj+h\fYbMF]*AWAMl.A?),A`,+nk'6^]+P9,d>[A5/<4kqm<(tKhPGf*D.O2$-J4t2p%5OFiQ8Y^1#b,5gNYWsb"e/t[`JqnF(*D+5aD2!_"bGEcQe1V+>BARj*J:t*MR3.\WiSNg8BP53,knAVNm3:pD)pAh.JmTnC$A1pZ_$9VOs^[n26PgFb5g2 WWr1^#5TJ)F,2=R%KSp2J!)?Q_b$s9/?lNTAr4kb:/Zq'/%o%K>Kt1$=L5Nroj9_[3;.;+ld=j/a0kq.LE!Nfn?[E<UZ?3f)(1DA/>N!1@:GsOElhN0=qVR=ik0I<"r/m^ZVk]3.Ee_3;aACWCV<;0thiq]hCj\^3/eC*<Bj:\.*EAXs^C&V26/WA"b(`m!Q!^fJb`Y[sT_;EY6VJjN0jFR^?KGXWYE&.PNiAo(l4Yj3Cp6QbAl &S1frIP3lPta1'^bM$t_j$H(c3br&C)>8Y^$RKh7^lBMQR4<C^MQ5RdO`djRIcbnccbY7a4IU@2%3!M9[6CtHIQV?&c2fZNkCnF0=dlqQ.l8i(c0p.1J?q>0A/7P8Ap>4P).gUKPe2XD,f7pAV:<goLf[JFeEED/H,<Zs%VRV,O..7=<SS[/1gZE*3 U=t"1KNt'%W7]n12+C_Eb*2"]'oOiU3q::&AUbZA[B#>aL^d,Un`am8iJ"+o;p7<(VIN"&q#g's^eQ1lj<G?q597IW]g4! F=<7I5A[,H@5GlLT"4dslHt[^Bl=0fT\3sY Bs",^K.Tdcj1H#Mfb\@cb33pkjI<'\dAk(se592g-ja-6Qj^(PgBUL"iSGhm/-rs1eaG2meF%8i7K0besQKi_?L@54>k&LhTHR!F<92ZQDZg0"GKS&9^eE]$7-fad<V.48j)\=Vn[pl66',-7VMi2!_ "!3ED)fsrd_KD-RebP^>7aLC=2]h.4IT'`XR(_s&#NEptr_h5^>5[2Ff@O[gNZ?\Pe5k/AO?MlfOmHL&jk`ei$r9hArAXg."tEV1+1F^e6WeTS`MjTM4;/SpUt,0&O+V'41Mr%%<nX+!H!Dr=<GB12^olgI4BdbG-lj5#+;qV!TA(7dnFO@?#fd',Dmc9g_U: UcKOXfsJfU[_Mq I\W&,1j'GSsJADDAeSAAn&-ct&YE_Fh'GFl4tl#SE)#qf"#\dW<o/6s`XWfl;0*0j[?T7'rdhGh>ZI^t#gk]<]Q[Epr$VD^00[rP5lA'OdjbU;R1FO&*#)e _"N/8KCEOi)QAWFl<fl EAiOc7]:JKSgSACs5aZY48\Qn)BIT#^^W4E:ls#%X4bT<_`<Zt+p]%aTf?(k,MdoMaKH!rV0"/e5=_]rAMhC)fL&VkPNc8Me`;Mh@,(;.Gc(?P9$LqWrWq0@n8IY/$A]mVG#;\)Aq';\?8-@W*i-D_U)*<Pr!IWri;2J%k&UAL"k1qQ< F!NbLt?PE4/.k@A'$qV7nrh:;+G3b6T>;47_k<[$PA0RR c)HAB52JL<.+TLp,!2sJ;,UGVk&L#ii!4V\mibWR3Kr6hp5;e0<h^W36s,-UmJ)#a5pGJ&*dSNkNW]h(7E]2btEqDX,Qc@9Q*9,d)c#kIZO!X-hH[>>]d.X<d2C'GkH'$?7X+K7)SHl=^],S?dbX@PA)SFVoI'jG8sM@O^\@c;F6\3Bht)lm&s#A]9'6$tjXNNWM-9a,2.p)O4Q65;2ddWA]?V'D\"4qgnmA9-4\-fQOI8g -<.]QL7kiAtUf GBU2K)jG!e3Pb3G-m1hFt%![VD:K]g:WU#qAWAD93O/6H[&8i'gt/sRIrq6%aCBTc!:WK;bm>HrKMg2*#IWT@6#f$JR>W6U#BnqeJC.iTePg9A?T<B(&T]916Aotfn/B$XBV3_D:a-KMhL#(BGq4&r^ZDnh2EtNcH>E>cfs1Ip_N#L$s`X9aJN\Y^,2CTllW%8#r@MdsB^@7&MEfCMpFW0Ze#2!:S0Xm< +S]6lCPk9L%AFM$<.l:V5hF+eXAt]i>%)C8:VA&QY]q]Wg[;@G21#mO*5"3ACRjDO24Iq6pf8e,L_JWU )8_'+&O[Li'IJ#<&(IUnHnhP=7q)kf`2lX4m;fFq0!>)p9k+]a2 c*:'^,>BWlUD^W-63A_O&[X]Zkp\da)r !WRk#[j2H)N^4Ss>k3lVpgiLM&iSe\L4Tt"oO>s=Np)UqfAY/>LPQ[r0L=?5lMWFS03H,XM2J, VN,%O5&2@msR\m<(%sDJDPAT,`BL%sk@a9.sq7*]A;n5iHY^?&ail;J?0**s.^'C].*sAKEn4[D\Qg.gSg>jXFfX!%6AhFBt@mM<^8jOr#Ni6#U:icok"'d!r>k(=E*5sQkX?^<^-4R)X:!a%RCGU83k"P*:eNCCBfLjtA],k&+;oKc D+`slC\c.m8?LVsKJ*2Jc@%FC9Ql1*o%>!2hFqnKD0cUh/Ap(_4a!AYA(gf6?;L0"H0R#AM(Lr6%q@A#qfDo8CaZppKbk:H,UJepP'L" V2pLY@eNG`;m!OQIE!^?RABSLA_pb.FbkNoA%m_'F+;^&AfA@m]<*J?*!$NPKr-=Ze%kRU\gkn^gDsB0_?mk`QFsHcpJt3n;A`.0.5)5Y8NttXQ;]LW G7 b_3,XhdYA0Ak1Go[1j0K!-rC7X+1o;;U<UF+c]GFkWifp/XqsRTQI5PeL_1`b2]?(gs4b2PIBj8H$Yf?mq1fBcB3W8^#d90a2jCkkW&].9Dpt*)&3`=L_`i0UsGc8JEBe[HKqWJ?da9A)*hm%Mg!ajr[tm_V\/PK"A)4?>*9iOWE,C*tkLVZ^U-olaeOWM?hkQ2mFLlOfV5Zqt16o&,C;<p\4sI.a3-1n%"O%;]?@&&Kkb'do] r,Who/hQU<`Jt ^N0?d)pHl2h+,,m3o7\4k/3]4f78Y(=N"JRm0V1U``6Y&rBfgfp?'FG!bIFZ"_GefA#O.b>(LlZbfmbX N0q/c[@WlhTsEsWG&2CO=@@EFWdL0sAsk99o## L;[f4-*IE>7;%X+:A@F(=-U6o>nQ<#./LV7FPb1q!6aROsa[[\@I_F:/<2(7^TAL&8@Zo0ZcR.YO<+'cniABAE'>O:"iq<j/-P-VV8+7JALk;f<Qj:r9cA<"8IC?X"hrkV75ca$;EaA<_?`LFUiT(U2U)'iFY.2F2<'^;rcU'^[1MjdIs8pKcW\fo!<=8rj538'K.6"UAsU)IZHEs/G19N&;U!(ir@,0BK`O3@7\h !X%])j;R!h_A(NhhZQ4g%<"L=8A?6A'_Z!I= WDY4;>>^=5NB-'3375YdeL hRCPe7UQXLT*bcA[13a"@.TWjViKS^rVT.L.`-o iS$!Mq?+K,Q1Y %%94)m#8g*i QMdVkn5X*1=`$&8jNs?/isc=b,*SAmYT/^MWA]"@SM(*Je7G;7QtkMfCo416#Pl:.*NkfSc]T5J;)!ff0m&q]`7,nC`<t,>bMbpUn\)o7=LTfP-c%mTPhm:?*![U*"5((V?8,FC"$3JL]7n`.>D$AjCl?Y/E%%C,+<A[/;.9XpXCUb5G=n@Y(BjcjpQXUO^XYMqKb\#W-C$I]#n>s7\Ee&Ch]^ m-tmoYADoQX6Vj>df&lXVCc?cSBbdCXEVaI-2;72PVG b$RB*iBT]\O!)tOH&fTbp&LMY bAB$3,m$SO;@Y>&>"SqE=%gLQKq@9A<%'_f6r-9V]`eC,9`!"6cEn:@e*W%tI Oh?Y[j9Hj#"t@.#K5tC<rGR=lk;8)rk]BpIS(8MCRU1c<=oq%&ra-'kPVc(PdFK5,ES"@(_I*)8\"M7q^EeWflUAVCDN\M'MJsTZi+kXPX)43T$.aW)-s<:#o8*Hq0MD1=8B23Sj:>J]<f"bYDo]":.r;'L/[WUbel>qVVVN #A0/A#CMrgb2'slW>-"Wr4Dog[$-j]eo"P=Q-cEVCE.4_/'QR8rT+8=8T2h,A@'N/\NL8[.2K0T\;OS A?(AS&o2:S_TK+b`G:bm:e$N)[G=# ,@;\KF:R$&`D];41=E9aA)c b[Ks+K9l,3r>lZ%LBs`(AciUpF;A*$"^Nt-i,F6d22+Qmrk9@s 37'LPk3-dHad;Efkq$nJnleeLA$YIASX_A2)bq15M'1l@W@=7Y&`bqfWO,.6p/pj2^8/=C._bId'"Td*Slpmo9JY\@Fj7L"(YN!jAON2CAtF`:rDtL9b3JQ7\ZmWZ1LnD9bi,liT0(e HY);_0Re%r1=X(>fl\9`[Pb_.O)3TeSDF`+h@nQfA#3SZa@__C#65Gc]$6J2R(sB<T(r=cUZVSQ'1&W_r;I:-G8Ero67>FAj)A+VL/"LGY5Par[F^bo!m=sbTY-&aa^;LeRCD=*JNrF0H[p0U1*U@TL=2]O.?iK6,$T<`@/;Gme^Wd$\<S:W0S=//-Q@mim^i:JJ[7X$ '6Q5=jnGC/53rr[[mTgo<^:;Q)%PTYcli lDS_&F&"GRFhV?B<:&/\T5>nN_/b8Ra]pZFeq#g,t?D-V]M5$II3(^b.17rU:(%_I!:.j3M1oooLBP2SW#(V 3I$9CVNU4mdl1JpP&oq>,`mJJiIf5e@\H8i@IcP@8hk3]O,\;43*k4?'q=12)$A6>0DB:7B_el#XZ!U.5C ;/?r:qM]QbO3I&gA%#.RncpfG@UGTU#M) /SH+"r;Z(mJ+M?i]*CcU#dkn"J<4510Z.$YcW=Gs#0N:7"?0X9(C$7,ZITf$-1<(YV)i/8it@m;42Hs1b1JZnMC[t!4YHU] @*!q^3l;bhQ<F&4^(,TTgn]IP:Oo9.=?>sQGolboCh0L3oO\a%,eHENt Qc&R24M$j0Q;C?b^=I5=A.ZA>_j^GY]Ds/D"E(jRf@p%dkE13&O8AY;^Or,!?IYUH%F5k<BGsdi8df)7&IeBj@Dl+:`fgYdo(4A_A184r9q8M3&$Pf/S6RiOK<ThnJ<KN[CT@MLDJsJHN`D(+P1lMaDc=igP)Q"^dESaAE9I9>_oCpY#A"FUWrD*R9Gb8iJ<p0:p27%XHpYNSL7b#?KfJW5 $STpEPQ_9N!_P!3GT#l!rlA2o$D/U V;H3sQQAb&0c4\A902=W8ZYX*_a3hqL-5PiKYPp-)R^`2I!'\]_jgBKF!PeprB]:,EAd>Oi'HAKZ/2:RYhToX!qIIp+`N\Y2K@ e,_3i;9f.LMmEO.Pg\6b$tjF5[sQkd,3XHK&HqVJJZ'tUcnK\gikacet-hQlH&pPAD5TM[ehBh;)LL1[#-O.e@-*DWq?7aeI2;LG%UF;_QL*osn[`TKs^EqZ8oaE'#:p23P7h>HBHd`#R;9&tS(& qKeFHh<$4'tG!TdG[L*-';>+RKU J$aNR2O=E3I'B__9B_\BFolMh"6O\4rPq$f[mXa5'3Tj4I!5t!D1L4dF'rbiUdtFj!(*fhh`L27$# PA-YsF*:&o+7%AoK!"T^<,Jrp"WIr8BAB\mEBeg,&GUT"$k!0(Etj:T=J8W%G"1YGqYD9]P&nkg2-887t@d^XhEJGPa3RAeiAi9,Pqobp+Xi<0)h)BgrOI&YW=R(J^;;_HiX_f]aY_=8@ZQ4-&AKh<q!1-tspf-U6At:!pAGO"_$b_c3coN49QQ0+ZA.lcM\PqW!$GY-/XB9a$S<P&FXjFFdOY!d)10".lDKA1[\,5rP)h!Am?f^9iTiKBZmA`2kEUVrPFdK@]DspH-X7?0P#%RrH6O+E57JR:-t7iN!A?'7'L7ZelsZ=QA^WGa&&kC/;D9U,"9fGW1kf5@,FW:[b*QiZotGbY5(92X-mp7<+;ES&(::;M]$q4D4q=gWH"`80(f;MVO%hi/p%kl1< MM)BmWa0-BKtVt2\&Ec'KNqd5BnhZQ1Va,5Kn3Wneb79Hl^fd5/4)k?&7I\ods`$"A6d]cK-(,mo/<)5Ljii&jOH,AUKI0GHfkTp"Y`.?th.`eCEA<,@RLmsD1!I!oApIl?+W,G87jU\\qN:;Q,T"e&An;mI@Gt!4hMEEF&N1rIQh.<MKb!3r\CtGT,4J)E`P&gp8;#abj,gCc$H@2]j3=H5W!/li:UZ/7B\IeIH^9a^J*9tM@rgce,HO7%>*RjZB`rL"'rMnZf';Lr+M/E='=$VCmB)O@o6T/I\!Ut]RVCEM>o99`ZHXp]81FIsqa_9ab:+Z5-MK2ob:"c16C [p.IfG",\GPUBAA1JROjW.c,UpK,Dn`'@co6AQfr*G?TN6kgCX^dI]>Tb/H!IUWA`nU@Neb05D0$HQS_I`'Y4!dTl-&:p,+CX^MMj\W@1TC05 icp/=Ce*YVqS+ZHb)Xr*U[2(oN.=CVI[H"!;diAT_Fi!M)L&G1p_lR0NFYj.aB@@_X`sB YX*J9.9'r-`6C%ijb `F]Z6nAL1X/nUas1A%b<C]75JGGe,q",DDncIIX/AM2=,rC6YCZ>M@Ah3Bj]d@ ;"8DcC%orqsAT7)h9\QA=i4A+Ka)6sG,SY6X6qh)h$&*kLL^#&;ei!;()!dVO;>19A\iZajHd;Ihk)I?$orOYU:scq3Tr@<+&$E53g#k@;5WISMGOicsOOq_6n1D_Op4F:7l#&EhbpQO(r6r8aJlJL' d**Nrr/\bfhpI`Q_>q/-3M)!8b<seDU $<4 []6";L]3Og $D5SeY[d/Fam*c1e9g]qA:Yd<>+ZZSF[Y?: d6ri::(sr%,.L,8L;9O'A5cq`KI!$9b0O7A"\:Nc@3LYA"eK3UgBJ/$\j%OI_/D9<;2m.DUr`q4#eleY"&UL!AI:=8'g__)"r#:VN3D1#<CbE+^0Zb%8LF>Y82mEA+Ubb-\g,AaIN&>?POXk#(94`fIfA%eQG!(A(;Z2`mFGs]c\qmY:nXY6#k5"<7bO]>5A?(m?^3PQ^C<>Yd;WUFRs8@D\C9l+ GS9RC/+R2VWe!Q3*X5=_sj!3PDC=A-?"SM_`CG#^.j-E'R:7:MVMW(TL>lO?l=M*4rgI>:052*0b%m[dOD"f AI.3n.MjLTn8K:aDTH@mTqP'qQ.HaB=?6L?b!ma5:"A=3tY5C)VRF'GIdIEa3JCfKWnQQB&^e7BUcZ>Q7?WIP.2dP)Q#T^gd0&AS-<EX<:^Q?j0(W2#REkN2PO^hGcsBpR4jkrnC0,r6(XTZ b>0L<&@4\LB6pcW "VsjB@0LPLMr 7qm]ga1--#P3;Wf4FVM;l]I)[Vk_^:IiW+KG>(,SZr8_%Apa0>SUBh<AOT:YAio-E:q1Qr70gp%.i<*i=k poXAGj8qNT>AW>VY^3\JA\$$3;<KZ$4.saZo8V[QCi=rn.`hE?$?5]lO$h+`0]tBa,dW40!'s-!U+<A1"VH`UJ'_7A=$9*$QNo3.im_qr[5e[W3A62TIJZF%6>RfIph*9P\MbY9llP22N1%o^Y3oU2D#k)*W DCN&1$Y"@TSp+`4c7 ]t0mh(IG"/AXZ,D?i?_-%l.I#g(^#Z3%g'RmB4Us-T`G]:Xo'rE5ZDGl5@</<6WW$M%$DTW>,]3crC8_:^HQF6h>'d&!%3['k9O&gFO)r7SEe=_]=6Oe;DaK:XZ%VNm$o%'>;M>q5qH8@DFFXFU^t@O8DQP-J*'"Fj+N4Ur5[?7h6).#+C[:J6I39>Di2CF+] Po"7*"Ih";gA/nhPJ>EP_9"?e*m3*UUAT##9i7eS%T[/m$%Ab, S^!^X+DI!tf?cN9@!t*L[2NWOZPRfc=Ao E$AH=\("8?oe15>dT!B]T<ro+:pAF1`'aH;XMr*$U;)p%9P 'Hkj?04I]Sl;j&$(,S3IC8,\($%XND-+i IPY]DU7<HN>s`@PBo?d-bfZ")mOi#$b2J.A3A]Pk<c;`eYeeN7\kR4>RtQRo Fb6G4YJcKB2-i^Nn^t7)dTOdC:/WlkR1IoW)GF^*:=YFA>tV94KRfkYnFApkbb^qLqkc`7 K5m4"$[\RIIYJ-Ys&Qd;P&RmL;fs#2=V1LQtJ[K10n+DYg&ig <Z;* d48"QsJ>eYsEbt4EjPP@FsaUjs+^[<i4)Kh$2fe(`<n>b%GqZr_+lgQ>idEMS+7'V)&=nn_m1%=G6ZLP8XTP'rNo>%[Qb4/4seF[&XSB\EVi%!S^SrtiD:ARnB?3As,%L@_OFhm"@:'/=N*A*OMESS2@M1VpaXTd_ISUSkUO@ERQE`SaJm%V0BX$#WAd9Q>_#-]SV'[:N_,_W4/BeP(<,PA+A#lQc+RF![]Xs#_A1Y3Dl_A3,kXp@OXT(i'M>m: +#b9+IMkJ?!94+p`q0Gb<M341AoM\MbiCE6La`EcY'[j'= =k2>rae#sVoTXtlbmSFt(^3P,?jpp#&H/f#9T8m]UJKYT"N?,36RDGgl(5i#j]% # XE>6l$5^?0&kKs&9h#P-G?$q1NMUXc"Y[Re</N>1,K%2RI3D q8?7J6lbG(>jT??)E/F8%MmcChF3Ie1M*d21#"p0K<UMZ/)o[8A5qd=Xeb`3feWnq@2P0a3JZjdIIJ[;D7DLYK-a1KF&Nkas?7JI_GYrK#aiX`P/sm%a6@#+2 BpJ:&D4D)GI.75Hb^MA #"HRlLD7em,F[bXDP.qXNo,`.+%YMNl PKmbRE=Cs5btD(M^QOP#Ka+r<t]Sb%Pd2So',(=Kh@\_(s@T4H'7(X2Ss$N9g7(CjD)nd4f8)^RS#:J7L=ONW'=1(EDk#t\-*fYQL#S$BE*M%g:XWfFKmX9.c=d2p7A/m:g/9]\SqUb:p`p(TX(Uqq22R`1AQA$571UcW7EJ2G&,%2Bm;K=bb<Jd`3YHV-A3h^dK&F$D[[.'W>n0:Hp?8/XRF! $T%-<0f8c&+DV[ZCV#+;a\c'<+^"e`A8+9!<03(<FU"Ih]^.m8SAAI4gP#Cd4!onbCf]W)678X$(TY"C0=VNoZn_4%\4 #J-j`+:M[!LF)feC)R_1QWW4G'0`C?X9TAB%A2h@P<NhDD`%R&*ak3-(D:%-UdZtdCBE9C1ba]'A$AZI05+N>F">XTr0,hl-+pZlKA(9a\pCQt:QtMjYYman]4nI]-kD@`kO<D#+'42ij=b"N1]!?*-XAEZh0;3"n,.'E,-2RDKfs*$*pVVY=AmkCl-6)GJZ1,O@lBL W6Fm&"J>VZX3o_`Jp#@\q+hJ58LT_8El&d8%.%=o(,!f&"Kca$Q),D<F>BJ)_FNob(/BD5Jp36H;.R-.(fE(^HXHeUbJkN>X(Rb-<o!=P5l,68d'GSP.OGs3O$VL5?a)]XS.5"j!CX'=A2*O.K(3Oe^AU3Q?9Ft0Llm1Q;%"4HM; i,@h':b0Xo/icY,ZV1"W B .c2gXih(2%D(Lapp>V!k1Lth&XdW-Afg$@0'@[bcA52+=at?gA;4W#354d(Un]l`=+^_'P+$pA/4&STiO&>t5#`HJs4V%DTF@j<D]H>/.6Z&U<Kjt"Zc:n`0l^#]OBhO1]jInmJC:+nktQ$d,bK'NBbgX9`)A<ZrZ 9c_#f@*MA$DMjD;qL@(^.:$U+!EkPWp+j=jAMjAFn_+t!V!d_ Fa%Aj"6eX p28I4Qf$FkAfr=X3s3*C`Pr-^re=d%qRsqE;rn4fk[m0e4Q`+kX)&I._QTN\^pV(0:TZ&i0-d;(m,_=:kYtm$^[#g$06k(l+()tKN19A#!QTZ>>'*[da%>TkjrnN3\L.PS>_g#)Gk&fXrqGUJBo+7"oS?U5UeE<n6NGTUJJ3`1O:JKBdYL+oC _`^>'@A;Jo`;r9Tc#)Lep\scM8$--A2C(K?SZlXU0E1M00AJY+?XnhSE7WU?L l!S98_XBA3$ddc"!rtUcTDOe9i;hk1R+`k(?a@K1lmZk5:eSAo*Q&n>Xq`<`I/sg*Lg"=Q_VO0=pgqX1+C^rO-.V& :>rMD^#Mc@-!f--t:KR+ 3mC%[4&nS5!sC`E_W,]A?,5CDSA]i)k0pj`_ne@Fi9GJt6q-d]jJ-jh4PhR(KbmDgL9p:KakJZ8C"?iso4%Ar\5[!Um,i)lgXB6Xl-*U8V.Nm<%7Esb_`?*7tTMqhjqTGh0.3[%6+@dC8W+h(WlR2;27:a6_O$5k3gQ_o(bh*IE0H#E<PskG]_#m1?XG_+L10:\U#Ra7,63fKDN#k'pfYc*/[F*UE;dV j*UkX#`(jJ2@n</rWokA5L'ldIqt/[eAC80j*eV8!2,.]>).4b>9bm<%NEI?N#&GDtP6&N>cV3.C"_:O.=!23?!?3LHd5m> NRA)lO3c/d+\1A[QB`C\2U+57OpQEqSc&]@0AX!d,\l: H sm<"j5'(d"[gHX0Y"O#`$hU0mOkh01NWt90&rAen9)NA.io5lq#do>peBfp<>A1BeiI])fe!\R)]1\"OC?0Fc0k 409tn!#qQe&N@*E[FLpPR3HoY,PS,%8A9_iD@Znc! Kp*gIhA*nI"`>;Tsr;g[R`1cmt6"Fj/Pd#gLr!=8XR\:Amg \")eFXG <]JL +Jg@`MOD7a9Xe)C0oZPBE4ikP.QT;AD=3#d^t3sn1il3qM)!2>\c$\12;!jkUftXecD"IYgtr#2tR*Apj$rRT:*-nUY5]T6o*fFNMq#I :.G\ah3sq#`<QX_A()=YA$;/ 2,C43YL:Gn()AlA_5L(Ap0WpptgOlcVD6B%\Ja,4jCg?5\PsO\m?%bNtAnK&!$dR$&kS]3$S34A]Gc!qFE q o1BM_IsZWE875i"VIQES:tND# Vf<hG%TCMBWfmhtI35$A^]q49nrbnaNaomsDpZ<E@jX&so_PKS*_)UbsFT\4A\@NNkbN"_KA7Qt7LU-TEte!XE?iAL_ft_;,rT<cJ+)U<j^TL%&!Qac,@ET$i%>7mT[;2tW;U(Ps(ohs8?SStj13fULZHM2&-[9#/q V\fifI8dq+Bj:NCjEpYa\g<1ef3>cBJ\%8aklFb4V<-A3CW/+L#C(9r+XoaMar ,C:t>6r[KYT3XC#5Sr1oVW=q'/@58a@qD!/X)A<dg@Vp7"<>A_LrB?Z^V?j=WD)1%eD7=o9)Wti:`O3"]r+>KjIK/K+3+ki11&ciJ4+p>`lA#]p[int1`QTg1/K"d:CmhYG,h&@F3#>h2dZ$kYPIT#Bmq6m4f,seO5R)Xf1Fiq$Dk[kHP74lN>^mapAnWrCiSb4HsUYAYr++\**e-%UVjtfP1S7$K)Y6 0 &;OPXKY]L6Npc>SRHd`?n#A4O3[:tCR4*!;&DQ5c0`lL!])^HsDUJ #<t@+c+TaG6ScmA="V/,X%g?gTs'`acLUe.`kJ9!*$=!YSjjk2<=@ZDLlP4sEJd<T?dhb\%!B->&ZO1bXbe1$:q;/Cf:bH57oUE]H%iJ6H8^em60DEeAX6WjXhV0_MiJ]tdAaH<oh,]j+P"R^e0]sJ$AWa?XnK]hGCsYgk,ht]_7])nX2*,+?3eSeA0L^.OUq6&F^[IdF%I#ofm;/J^W#N6N,7(>o-k8\6FSN(a K(6?T($;dRT0Po5\MJOXqg^pVOI[.W<8\3Nb(s9g_-P](("A_3$Ra;b_tSYLb W3RKP!_JV9],P.q!O9>?Z0d^53"Fi+J=bf/0RFnPa]'f"iY-g\QK+ir!K?H&MK6K'Tm:[>+j7P?/>mZ[s9(/$=sU,q787+2bY U#h8<,qnUc6tt3nJ[d372 (WA&*936B1%+9m_]j8m2-Z4OOHppbR-GXQq!s?HhI:JB/4,AO1+b+CtmAAS.In[)=AkLOMbmcD ZP%sqqHrj]F*BeAaso=.5F#BQm7[`h'3l\3Y6&!S2j+pX"]Ma8M; X``jhK(5<%Xm_(DbU^I@1m6qGk0`2hXH5T4Yaa/#m`+cI4UiGc#^Sdf .">A+&!A:gW_MVb-TC/S"c^r;9bbHc6TEtWemNqNn8bbDs9=pGi7A(SoT2d&=Fmo6W!o'haZL>GG`9+DebsocV9q_T_g03?Kl-&'WqE%>sn`4>cA?_@-`p64Z.rVFfH>t:)d#Pe7B>oK&Z1]D^A"A%2`kh#>_[&o/HXjhH2LOC$fW$I1(.?r@VIH2sgDa4o4XM(1VTm4^!Ra6`AD6T;U9d@$;tNR:]4k^ 5l359gf'b"AA&9)^.r!>hA?)]]bW5F>U&Si$ss'7_3,6[`]Acck9AC8Ca\OL3bb@fdQ=VS(G=ieci2BBb_jFq)9L8>o0J)DAL4<]VG'E\a!lI1aEaG-$(3`N 2VrDrQm+!>t_O-X`Ze2 $mI9WQ2T+U;\1P;aAgAHl<i"40L_(Tn.U/97^@]3!EP9.!cG-'J57-Ri?Ms0')8A-_4WV18KJdI%.6W%nf!0I' #\A\$lKr Xsn#T.rE)1"1MW1pT2QcY.Yj 5YW_?41a`<H&MZc!9V.LW)J-8R)D:i#B:;dHF,O9#H_m"U?3D(Ml"BY$M1;FK(#k!8bk3[PBiB?Fq;4Ka]FkWHOOL*kcE\-<on1HJ'1<>^Jn.;-@TX2C.T2J\R9A*--2kjc_X&sk8r;^'$AoDON5=bbk6?1,0rpa#+R&?pGAl8f@_])G@lF#N=_ 7cLY[8JYO'k%d[XS$ LdF@lE4Sk%A_AZbP^7lZb62k3p0?XR$q74j`Pgc\Bkdt!3CODA5Et&8@!:A&Z7B4d3q2'ZH.EhAGt;rWYYo_e">WQ#417A<P=Q.$/)#Z;W.->Tk%'Ro,pS5;`5'&E'<PHZ$\62j3+>\XK>2o&B??IHl,4Uf>95a)qR5F9;Z _AS e-cWA!;?Qc,UiT?iHdY)5rQgD*:"-:* /l./Q%&^b)_`h@37IGR*P)V0Wj0<r[]AKN-d>.RIS+t _UMJW)d^S[snLfAocTL(GIB6ts4tr3%Sr6^S&P8:npYaAlVC>n*D``6F)`7-pdG+L:e_e7MnrfSJntJ GQISBRm996%%X?c<l?G1T'A@'Ih!1hp9U*[Rm,Y<@l.:'.i#`S0,nW6hKGn'\):IB#Na@$,5JA,VP5DnErnN_\>tKSm0);?L&`D0E`[;\Rc-9c\ihT/;*9\j'(V"-T@#>lgS$0]^Aj04nKC$<9/D(2K\od'XbO(J5F9PR6=BGFp#3l[p"n30&NEQUe(OkEiJ8%)BAPiK]L"6eM7Q)VO)FE\bYk;*,R %,K$,^#O2eX7#dEKk>]5(Z_p\B_Al`f1HMokqnGU)L8&AWEbl"?495+.`>IO;o0$d32g=b%W=n[>9Bn$iaB=Lr[gP3ZU6;htm_J^EpNtWp;;9cXO56Rro-'<r!L?`2D:K(/b9_eS&f$AAB0t  P bh0 %^X:fA#W=$$qOZ$W_O_(DVXBMrUPA^_iidVn"5CH%9`bmGMC+"C>13)&C?tq_CX[g'QtQ8fHeQiarjm3ha^q>L@Fd`A'Vc$i!FiSXKDh=*Z4(d6,`.+K>Kq`Np%`.4TZ*d-BAI#/q[Ns+(g(]0s:X,A08)o7ALtHHCOOL&@NqhmikX 8,>=;]!MCea7RC'0sHWnW'L,7E7'+o$A%t2Ff$$a(pZoc5_76#cs76&,b$n,XO;@M"5VRUld*"q7D+s6.kBY]VbTIQAB3PePkO9gIKTSVnZB&0m,AA^?_QRkk*\;:;UiS'6`N:;2.H85:h2ptSR`V24@ H g&F)&@T]A!Z3EdA\L$rnd &D9TN"hCrMls<r^MSD"7SKAN0D#NPe1n<<;e/%fhZHOrV"gLe$1j8Cckl=Ei0\#tpYJ?*pIXc7W,j7r-25<+K`7qh$,Q?DGdpNA7A+Ph<NfHb+jC)UIUt4GMo2rJU@BF5F4RBK>UiJ'Y9Lnad?8r^;^;t6Did,l4\5%jH[;fPN(0.ReEQfRcidVVY^lX]F:71LYqL;A`m$M*t<g]c`hKg UrJt>5(]c5d'A8%"7%!r'mtFDUj.+g&S].*+?7^DXAL[s+/;f-'#&sk&Z*"b\pcchVBdi*7k-Xf\+"-#A-AlbL,NfbcUf6">]^*PmcEOGU4SKjp,1&(]?/.rqk%Jr:UQl3H!X iHpMOr4)0ZB"-0jMqA!>21F/h@%_X$&)Ze_R?_AE$YP6o`,\6&L@tnB#Ja$n,YOF1;e2AZ6;>r9+&IWK5N<3Y'5 GrJcp)ZK>r`TXr%8QWs_m80GnWE[L%geqW7P_6XIq!-'(imGMnKg,ZOUf='#d0[b#&L<TB]iRhVkR>F%'kK@`;/edX)=pGqsjOnGG:467Vl&r4] SJ<NVU8GJ9IL[)HAh6a=H:C>%sI%/VQX#K363QfJ,*YGK(1hHf@G4'lTTTL9>>[T%'I3>rAG-:r=GnFE41HgIo=&PT[^BWH]M-!;W=)Ad!.MUs@p#[:>lmd9&^8 ,T_iP9"Tj1ItmHC;-Ib'[r,l?RRV2$V-j[#;h:HK*P8?l+h,$#=t$D,%-Xo)t2#)RZr:>T[i(jlBc)E+>iPIP+6h<Xe\\5FDAX`8@]aGHjX[Uq2k`tb<DZQl3Za%Q39bpPI'RT?O[M(/UAdRsOEqF6A=6#&_G?aeNHYItHQ"Sat2R+jpA`,RB#H9'WVA(45m#,FAR9&*7TK-I$+UgGmA+R9 PC%^hcZpYmO4f%aQe^"a)DC 3@cb"p,>k74K<ht$pKfm #fBm\3J6"!RUb<=g)Ob9@YV c7;ZZ$3=eDM&`HY,"J'7Q=`AhG6m97g(n=P2#e>WWML4<r38Jt-n@Y+)@h%'XYElcDEFe.dBU^J2/*[$3'I7>*3Lq/<L-5;cdQ22>#6[bn&_GsnLPMI-+cl>[mNdb"nl-$W']\'KaLPNA ml]t^WNOt\W3aS\7]"D5./8lS'5g+Q+<?pNBpNe&M-^g/fL<r!@@43)&t_PR52XG,qil%WH=^&Dqa/^p#Xq;aiNgpGH@@k%'VIOgF=V(fbAWg67@ i+)6W^*;nB!sfa@,"e()fk=""j0&Mp5<`KUNmF*bmWZMT"QY(^3'1L`g&c+,-1JUL#^_4:S8a1c^h#_8!K@hUa>hlZ&mm;OK;f"@%s]qkT1n$T6AHtX0FM^en7eIdsKZ<60;(:X<hIGAP4WN<APS"*D5E`]0n[/nB^)AJPf>88gEg1W@9f&[Y#j!;R_\7K">Y"35C0IXdi0O/$/jm(!l+nmON8=2T8fe&Tpf@YYJi;BrB9Oq&5gDl'j@9F4>/"5J0/Wg;ApWb::fBpp[B'MCUCsKnn#7Uhtp7BqAtS!9f(@Tc\>pYD& Cl&ZY*:5mWKZ3jDVXPZ2( U5KbP]\)#qAK-^NjVd.b#'qk>#F.Gt?ZK@rVt9FgG3mQ;iHIe&m57(h5G9i/8n`:G&HpfXLD:\g:RXg`P)X\k\V-`Bp8Q/[UP0<?RBLNT5Y(!"2fq<(-/q?>OBCCMHY$i"X61b>q.Y^-7K8ENOXTF%A92nmd>72e FEo(JD?ZNYM80>_iD+1.R^H;pK=AAqLFXnDD>'@oV5,tZ6rpcpAh_F-$A(ljbg-bS>N#i5 j%dT6I_[?_$`a-*)tAjP Pf$e]ak1";1#G/\k)%+c[/3P7\[qQ:\cAE+4M>^;lACMfV$_d hcesHeX`,E7a$_?sIZho7V&49_)a<JT* s9EW8"P_\!"QD)_0\bjUYH!80P)l6:'isq!t4c(Fi6Q>>X9]mhD""gYjf[9K1caC:Va$SPl_KLHR1jo?Snk[R-l$`'aWrA@_Iio^_b!2ZsP^Vg_6Pr`8@>BdRtLp2_G\#iSoJiI^jAj3bm[=T"<h?:%J)4^:NG3-SQ\'hOC/=s7mo=CGC[=V""af2R'=)]:f^0gf:e]"Za^>@Si FfG?o&r(?"gb>% =(jheYkR(BWC_H^Ki=1q-aZ=g*h:Ls! =EMTN[-n2 [MC9*d$s2tn'@0fr%KBG"6k784fZ Dg%OTX0PpR7Kb O5..q`kZ]CmirOg6$*Es#<5VXV,Sd1X*$*oo.&ak3N+g80Uje[H0$l+\1I]*lRi)6=h?T9FOHk+>)JT#a))fl Gd#/"!24O6G:6@PDQm/?4k_n7%[!Ei2Ap@VXmP_Agm9?=F:7WeW $NF\3C0%aI>G.ZNDQLQASrn(hjfH,.Z(kp@:<e0sjtMrSpU8WS<PS:Dng?D,8mWo._BL^XoIMU0UA"D-TYo=&pVOLi"tk2X?4r[GV6j*I"G?@4'&Xolk'<.ORsC79L^DjIj:!'C7q3'E`CQm>&jI^.?T2rLol<;8<ngkr4&1']A^?U1^<j,.oAsdf-9%3"P:%f:)koC-FMa/<se*FN+Y31l;(18;>o[P5tS#U9%6Z0UJ!dqs?(d7Lnm<'K%_)m6n^,IY;-j'OTCZS`A*j_^b-G'56kcZ'IGa^kNJF6#.=X4Y/VFIG[19(A`"`KjoTcQHfL9Q^0jkRNZK5I>'&YR#g"6.(A3nU?OIcnd+QL[&jN!<!g'`LOUoTWPO3/W^R^`#a]'En5)=N,?D;TmBitXdG0OG!JD=5;HkkOY>AVN];igf.:E*>tRBO:S[*mYjhPCJC)8Qg2$s+0AKeBd4(s1eZ3WD#_bVo'6m.)\&c-?V+f9=&A_j4L?9ZQ:-c'pW74U%r.m#DEH8f6F7H1BLDqa+eIq_cj&T]dr DLjep+oNt93$T10 GXAaL(Dsb(hT&(:FTX,OtVO\9I4#2%boc,0Gh5p(f]'bU$L1[0ZBkF#?ogBjUm2oQH]pTinSN":cD_FaEkA7_M3\*:Q)^WUREFZde1APMp`McO8pe^:-^Y&H9QR,#+n_JO&0Np+9re11>)YM]fYAIkCACaA\3-7fKIFfY7Xp[s\oM)f&*+p)pFXkpjGUalhQsV6iCn2iOBU"?19Ns7.m-_kh<-qI8OlU3m<\r;tM=]]b,/.]'%Lm*Qg1%jGlE4AfWh5TR,:nCU3ob!)XMF@^2%s<JY"@\>Jdi,@/Am2Pqgsa,nZm;*'%^XK3e9R!96eVbt'2GkO+s,%\F1Vcg^W"s`NR8eM$?&'MA?]^Kj<@nS75,jA-V,`;<J;Lj#K>=V:=p*@L>_Th2>&7TI=,.m;XE3142Z#0$m$8&(!7EC%J<>+$t#-;-"1EVJAW,`AkjOtXb:;IaS#q)lDk6J_DZaJ-P-7?]MO1XrqU4ad)G.lD%aH4m[:`_Tg`5^=Dj_nNSfQ446ffRC<t@?6VaNR/1fk*@-$qb%t#j]aW]n)EG5XJ5:K*=M.R=)eAgsTL@OQ?m$#6t@e-eJ'_J'1BRLF=gWN6;3S*CHM_iBie]VGUeUGI!.0*DR-\-[9L\mWgN8ebjtP\$S0?_cR??[`HX',O=>c=9#Y.j%AtJ4l:+H2oK`*5;d9mAIl_J5LX$S99sY#TA-=nB*G^m3/#T^"sLOb4Lg6(nGa_'L '7$i;bdDq'j@j5ME_s1BPYWDn!j2Z+MtB8*Q_V#ofZ7Z$?K\)g2Nrm@-6S@C=^tSl)`T$bm2"p3jj8a^UlME$JD1#.XNRk/$,A^g-\nj5@>&!-mhJ*XYNKHps?' jG[*S"<piI0HQ]<)ob]%A$>lgP$H"CGQT m"hkHk@U)N?"dVp!I(]]0$0;kc:)Fr2DsMXGZLWUFT.s&U@fk4$L5F*j':N&X(DQc.P]p*0ai)'5=^6r4,)%Wi]`O9,L`mPj,pJH)_S*IoN%X\[X'A+RoetZ*q4b<^;2I85HAbh%l5kgAJ8)+,bA1nL!H:8&F';1!V(6D'O;KDE&PhM8oRQViRNV4%Vb@Ab]qpP:Q^i6iqW%/'m&kBK:dd=j58ITNR+CRgI(g1.69cq'B+'+0Y[5[ti=]$0Pe9=7H>s$oZ,6,^iNoNJtg8,SkCjpYOPlSoZ3oP^KF-s1ME@)n?U*KtaWCpCSAFK?C*CGmr4;hCMd3]bLI2%]m*4'aPg%K5He #TLa@#%"_!KItS"4:;9lZEoTOSI6['*(_I^@qFf0+Kc=f3E.`(0hiK&C!jq/-@HQrk&8T*Y4\S!%q"-1H(_:-\nR?O=jKMFfFin0LqO9#prAm#%HHt[4jXK.XFEH?G;""Q0O\5>;jWL;5@c6E;`61Ne?G'T+Xp"-n7pF=#N=@@ri<G^jf oU\UK05 3*>kG,/Ze-3hB==Zs@:OY\AVX=_Y.UotK-X8H;Hk'\U3+dg?Y.W$_Cb=KUbm=j(AYc\CZ%82=JWY53$D2p_qITtj/.1M+:SGC/b'RJF67h7X=gEREg2[Z[9LRM$fRZ2RL4"r!`AYn+jVpPT kPZBHSJUq?AL!fBo`\ ToH1XVtBL0(r50hV['=UCt7Fr%@&e2K^5md;r30nn^'BL?Ra^ZWf&Bo#Xa@_FFUics@m[;tt)P!43p`hR\@O:eYqdAjmY-K<D6ZP'U,:A&jRGH/a7-LA(_J$-Bbnp%Qd#WEtd1HEq@6=lLghDO-Q%CtCfn-O:W*L1T-QK^ptb':`S)`]l7o95VbO&^CR`teXGj\:PAG!p;&3$_a<:a]JCgK5qI]TE$ipgnNJPV'VY`i93SbUqEL.t$O``NT<+rBjN V$-G5Dq%mO^AtlXC5b;UpaOPgUEgp*r"QGce/3?8q>7';gQ6Fqp/rKqYn]BsMO.-UaA$)#=-b:di#ZnVaSG:)*]AF]]q3L/0n<!AD6bAM1NNR9J"WjH4-^lnbT]Jo>GU"]2E]MLh-gp4s'QhQ0;oq3WOtNCi:ZQBf,_,"3Q;T&] XFgE'rg*;?MD3`*=N-7$#%nj9sUC%XN%,h#CA71ZAk>q%mKB0mO2n.I]h-1I#+!Y)n,R:rdpBbZ[BHlAV!q2cs+@PSb""Yskj.A81 A.rqFgiB6gJpSc.V3N\Nb&jJYI<(+%QZa7dA<m2MS/'R0\Bn!8Zp^0j-hYAjA?+iLbi)*rl,.XN57Jr0FZ7j1*o,#PD":h9O=tD'REC!#CpBP&Yk]MWm`>TpLH'H:F^3FS;YdGY25_U PeoQbr<>J<+Sh(`$P=kcM"0nV\O<OZ>#%lEcGnrN_=X<pG_^5Rfk@p2UPaY%&Q4>n?XBT13k=qq).!E4BsZ2"pqrGU\;l1<Vlb',Si]XHN</7X'l=SfIUMG.RaBe,`$fsp@Ug+H,f<)3F`ge1sNk^*Z9,cAS!T1@RJes"64iq'p;T2+J<'Z59S.-6<,[q?gAL&kC`I*?:RmKgCOsIAW+M5)C8-POb8BA"-JYggeM[-QX5I<8F#!g2H:8LDTcR4b*K_!@e#!!SXX-@='t5BG7o,QJ26>r:re`W>b'.nrZL2I_&S3A4OnVW6V\E%14qSG]FQHi?&2);SqGFPZ)q%bn!O<A' [7m*@$Y@IpG-3^p6Z3lBq'<rUH%^CUir,Nt=`ikL*it]gsAn,Cgd_SBW\s?=l=%D!%^R]Y:]_FBf2\,Y?@Ssfb6FKNrT`=]lhPXN/D] 8kTXTJ0Y`WR!jSp!M"(9TK,$s%=e9QT=?rQ0:q-; 6K0#@pIIYSfO3P_&Q7-,OaT?EjZ 6i.5lY8Zt7-0?0%D'MD4\*XE9!2<6@qsp-E,VkmX<RUUnTG>s(*`5C^(*>0`8f5.D*9CFf8,C3mMpmdn=5E!X+9Kp8'HHc  [%Llr?t-,*RX59hS4_I7gl;;k;%qG4bKscD+RO#go605<^JCZM5pBcdA,oJd'75+Olr=aUe`l>[rL!36J" Boio2$`)Kl-=Mgge*+@Cssq1n:7KE(pZ,2$dY.AK[ D9qAKrjo; ZeU:Xd+q/-KAI&1Wa<VO*Xc:Y_QU:N?sXKCd]R*FW0\0L!O"k,?C9*r:$5f=oO'g]-o>UhsJA4i)R17&_1LViJ!EDpiILQn^sp*1"$s(^+^&]57\5A9G,rI_$&qFSKBff/)WBe!+6ka[k*YaKYG<0RLEA,t:_"g.Y5A5LdTWl"/_UisPLQ:O'Y8-_`.4&gHYIj!1#PfbL7M]g:=hT@M>6<i;+gpeZj&DM:n.3gP/,>%1-t,!2*nXtltI8#X#<)T.L857G*F7JjXq3:n$5q(Ad(<V=+VjV0A<<0thM?eA0a!=8rrO'D,tpXh+GbQJJR`Y&g(:"D%`V<_q%Y+s;R3d('E*]+d`T.ALoYAJ]U5nsXl#W[F+[\n>8>7J#H=4si+]U5\AAE2PP/h*!cEG?JM0:8_5aC1o1.cI,h'd8B%6BH:E<2"]rrfbOEZ+=q4t$@iU2hF1[AmRg@>t=r);Z 3+Hbd4PcHV*i@Nk_EMD3?Ct0P?d<#A:5W_!F+MG"&kK]4j]-Xd Q31oql;?O7Qa9t@bNSe6A%)hRO12E@VNcsSf407#@?#92KeEU2=b<SY4L[?2mL5*80pj.=3P)9b5/Ri0[:`lmE_LkT5]gLKa`\V> oes)XZnaDg[eh)3PG(*G>DB/:^GsR^-)WK<&BA1K*2i8gd6L"nn2 ,8Z4O5[B22Q0p"r=T .]Mr6AeC[qY?5W)<t:nIU#1d[^3i)?U[nd[psX>d,72#0:\d]T4LM-2d1)>79[4qAVkE/Z^aSB%hq7@UL)iN!Q1=(-U+2WIBqO_RU\L$rBJ(q9oH53n9kBB5lr[D1*/fie8Q?LB\M^0dIih3Z*^J?)Z11k@,sa:p59]G""sB#2Q;LX@?Y%NBt?t8?p5FZWl_S(g[!U`oD,=A^_]3?8n'FeY(>,kqnsFAN)9nE>;YpIm+#\0lD/:mU0jDZ0+Q8BD+G'oAMtV%EC>FNl6Tn,714bS2_f`X!lJK0JikF#nqYP8DSi&d0+,%+CVq+V4pOd>Se5meYchh2-f4Uksj'3R[m43qh!'/.Z^3j]B$#CJZqjWb+XLUM&-a`^0)b>g2lFt3Ml%Z$g"D(i#H]4FbD E9G+BtjS?8[1ojO:";nU1s';M]F[8DTpiNP7iaPnr(/&1t,EW!f Ige-AD?U8EUET:3YB= &,E@JT;%7^rdl"-1A-@YLU%?sXNo?r8m,A[-H/2nS6#jEPYnV%?8s[ZEKI#;th?Gg`=[r!O=(PIh,TBX(g_14V[jS*oaF=I$]1sbg[.L^U^;gh(YWfco8K*Yo_1m:Y<9XcMf`cd>4B5_)2tP$jja#:\4!Q&4b7GY`NoO5)l:-NSdZ!odhsA<0YX:T`=U,f\%TD&t:"m`> M!V92(Df#!`WYAoBl/A#NLH"XGVXhdmrjc+[)dJ*dXK,\IGLEm)lgX-\MejV&!G=Y:j-ck52qU]f:?rkh:i7<OD;/I$4a:cAfF3^[WHA5&SP$$p',\i+GN.q@!-$`L#&XN\^sT-BrlDh:PdqS!e7`WBg9t# Y6rq:T@PT>?2;1Q-l21cr[\o+JQb/1L2)t5^A(K(9BMK8ZALi4=<=tND"j]nXAgtA(i`T%!"+;A)nFJFVQU)$Mi`Z:1]_AA[aVB@XD>;h9_6WE(l2Gt>I:nBrLcj(nb@GM"7=g=S T\M 6Sqi_o/_)cOr]O:QDt@qk`:jA4tO^+:j#MPV<1kV^;k:)$;)_?,mGqe*AY8#Ago.k. #OY5g:>?g`$qSg+7\>3k:ak*qmj; gdGUiig&5U,BYiB?$QXWArV4Kj*DB,%W\1*9ES^lg^=HB>8qa4%Pol\nnS8*!r`%4Nsqr15g[*Sp[--kpIAq&^N<OKL/OB'(rOcp.)'AAAgj*FZ^flc#UCg?%BjJ+>b91"\Tp_iT^&m='FeOUT&X*ni*rD\0P%LKUetBDK3A0^^EX08qjg+O2Wrc-@U"`M"3R291mG[$7G ;>pnbijT<Q]2lJnBc@@ra"WBtAUh"+Go 6U6,<Ns]kheJses]+A>)6F(,$e?88$sX>=(P;!]7e(ht0^MgQ``%7KjDdCmVbV1SLTeWg7PE0g[:e0Q+,4VPfHg+k78Hm^0UO:Ea$>AV\hB0c\#Y3NZiA$i(hPh>PN@s<X+e4SOTp\_o?B_7C9t=LAaM>_bKW!W_El%bNg^sA<)b*p66]'!R*Q9(K4'&YfSUHY>`J$0X.Q.m'j _%.LSMKF2 hcael/5(B=mNh&#@7pb'ZLR[41U60[S2L\Fn<pn]6AZrM]ip)-?T?A7B[dk`7?e.CI-9a$ejs%(&:bs,HV$@C?.=2)X39dM5i!`;h#@hn3AO/ pmFMOpIGA2t*@>@eRM_2X+hGYM^-7[G-^h.^4m_d=(m]5DYm[g 9)kF0/=]Dog=hA`@.A!0&'kK'<dg]69t`mqqT!q]K347>#l.2,T^qBde&[Wq2F.bl@[(-?d-,l>[][34(NmM8*/l,m/fjif[+b'7gn#A!8+H)tiOIfY-VqEbFZ_*d+(Gi3n^cWGP9"I$gpO)Tn\@m848(OA=mL'MLD+#aS^eo.mA0cDK@Ug5O`ig%s&b(t*&?T"O3RE;'g33#cEE.Q>B7Dl"&`\[DF;(RL8R9@%l'e4s$(;7Q3(Wo@Dg 1?GW>,B#9f(48d;E3nkY::p%B?E]4rUIIl/S>_Jm)dkbsPX]I1iedL@/lhDr+!)O_):A4=cK\S.U:*t%V<cAeeA1*5[q>?A3hk!"i-Cgl=KA6Xo:/DJ##(3"Nm(Dh+j>tg;ORJ.t'W;1=k.C5W1sm^T?g%slq,RG37+!"TtcTI$U3UA+B+=O8'F`?mh^5=beG\9,e^69I]@(&%moD-N!12*d]<.7Glqa!*ddYLqWLO5j#$QbW0oJP7XXJCRG,iXOM9&\=[HQ"L_I)^,EpN$[A@0&VdqbX`E[`UiCN%PZABVibPN)U&/l+h_E%h'%!t^k?NKmL9?1i^nB\OT?-_+,`*X4'OH8h%\#],cmg1Mr?M3elTGrA&po0n.XNh9Fk*>h$[(Ol cr-K S,)2mYCtm$HqMh,d(3$Q-Er+=6S\YWS'2tE(6">0]g3D.9*7t O!rO1C-g:JTq5Fa/>MoASLgTj9FA%b<sBjKpDQPe8HaMe4(J70%NpK+A&_>*%I\Cj1.jgkX?3n:,#WmA;@EUAEa&bJ$?=5(D.[*4F2ReSk8pq#oOWCW-k$1ks=<o'B"1DB_32:OW)fXK+hR-BpGCdDA5iXgdIa9s.Od6n-^L$A+J,\X4;E(h$sJYXmDel0FK_.ng-;-bKZlY)a-=iG>hN q& (PUA[]iq(elgSlXbZS"I%$iOcin8,_h<*!@@N\raX+JL 0Ln1GTjgIj)d,8ZU#A\<84AiW'@s%#FZ">/ #JaU0hgBgGB0!Qc_RR&rQQh*7 UR3Z9@k-(lDP)XnsEoXt"An-;LA:*4KrF*13/-n;Q&[\U&X'&e97jkU',IY7AoppX5nK<Z3k/^J)A_I`KVGU+X%&) ALWm11a.&;#V&7LYm?]h^"?$IblT7cE'ioPMr7APS+?iaY5:SnJdN?i$;hYAooWQT-oT>Z#s2JS_na@R6ZF2m6pE+%-"$6mt.t5\/:rcnO1B%KC@ r4sr`p0'RoCQ=lfNam6;^?dLp<SJ"di_"pHp\=@P!2`)Um;t(gRmFcqVUc[FA"*9)AbM,-!Z/7Ge@Ad8e<WP=aP#SS, BfpOcB-Sf1NH# #_,DkoqZk8?ADO34bJWaG*mdBVcPt@N@0nH&!!=3:2'["U_[cA4VYtFt6tLQs?l<ibB_:_fi[Us\%@^p<AU8iI<7<YbCKP^ghShis6,Ob;I ^>.'3SX;-pZJ?b,kdd;V 1#KB8WX4`Yd?ta$5CGBdo<U=Tjd;KI?tN-6hah Jj&_FdV'K]M$] r-]3t(++pSR&Pg$f8R<`Al6=RrCR#3K 59r07'5;";`;_c6&0HR [,RSAZ3%<1G1YdP@="),VT:Yeir44h=n!-Br-"a,C,+E@WQ$*%]/Tn`?ZX)=,3#$LNQboQA<!n6%H"YP\]mB5.;NX1pe'?`\@$^BNj<tQ/8-PpUdj_Ck"=&FO8EV0 ehmnK(Hk;n:fq2;G=_Yg(Xo8sq!*VSd5qfW!q6M7@nd$5ASh^2mm/[7rC/k4]5^>1" P+tR< ^o<i@X5f)\1:5JUnj+ CCbeK%jo%Ne2bDfVj;i(;*)7J$6g)BtY9<i!_PI@HYZ^ %[kkK[hbds?-tl%f_:_lgeXGnA5*JtQ&0t<'f>q-F=0-.J7Kj6)nmq9H>5(BWBc)jG%qIn*INl`TI/np<d'%:lf__o"[jOsqiWUa"1hK+"bA7`"/*+/6%?F$n,^rGfc?.&c\iFICkTtQeBgiR?_9g/G9:N$lKMdnpil^^p==U5)5?7BRiM0l?b78K"H]c%)GF^dR<4\tM"qfhWcKHcJHPH[i7a!>hUP<4<@19*b(^]?:KTZ+P?\/GE`[QMki%nfAV?A6l+(g(t$O`\-2pXCkcU 4p]AY;-+khk6PoZ>lUDbnGJm2``G<h@p$t+39jh;9h+?^4%B=VJ<Y3<</0$i9Fn,H>7^'I(_B0^ok/>K!iIe:rE"5UGl1c-;O@Z)ctM#Lft\65Yh<@c#js.!]J"c)jQn\GBaetQ[0WIGn$P(Y6;&:*QW38ffW4DA.Ah?;#-mJ)gi1YT@!fA?7`]Cq>[87HL)rgZ0hYj\<Nm$;h7A)M#PS?$Iq!oSjVCqpaS#WIi(J5=A^c*mX)/#S=%UI-LG!pl -(!pWW2#XiqffEASLdN,(Y*]FR36OZ[EIcY<q%S\?dC-]"I.,bf+rdB)RmB%9I7q8>/q+_t$%+.E7=XB`.PGg7hs7NiZm2`p)PM'D]*e"Y]@-a/7+)DAH[KJ%1?rGgE-G^B1EKj&'CE>-?`mdXs#"\b,P3LmFqOP^d7C:d,4OT2ZpAfBt*^]h"+Q/:8e.3AeW_9;4.fDW@]!!^!tIss`*le='i?_4.F=/L'N3<Kijr1"d' AO7(I#0NIjW]*O-P(R25<&`.7+qm^kf4tpUIJ[rIn F?k"]9mF`""k)%Nn2-+#Xb**5@om2 cV$KVc((.,&N(Sq081q$cI]"U23aRXeOOa7/KcCs3;IXj)1jYF?AG1\YEL=Det;,8Hi\AmQn`c1O&acs=]*0'DMfdA&s4DUl&qt$a6G*/B?'-_]%Jc%!gW-.@be4R?k[M\ji] 8$srTOm'U!jP;W<$pXL81bm5Vfme26?m3as_4?M/l6>(B[d$aQkA%4%+SF4Jr!AHRTWkLNlr+)_H',e:6sEWnF1YqAiDGt?(5Kgo?&aP/t"ZkJgf6CJ)&ER&^44_dnjZ"> @`1L<3f,*t5Us(Pb>bKLBA[*n:H5MA ;V='WQ@[iBiPFaWcj"C\=/RnlUoJ-HCTgEt>F,l.*f92ArUma2 3m5oT4%N^BS$=$_KW/pP;bL6E1lDUPM6$F8OOcI7I?.d>*E35",<tIg/JU%C/T!sWa4:;ohiZ0,mXUjpC9@b?TJpJO>9\>4R4>^8i=/H@%_*iXi!@Rf\akh(dl+#rsRJG]H)B5"+QEC[1ci,I8f`(QY+>Ws..DmH+/BDV@9PTTA5!?nKhVgAF?['JprQQEC4^@16rgRqELddHHoSl $:X3HCrr Sgi!AOG#TNg&*?r^o*Ms@< Ooi]j28T)^C=II-tdag0=:oQn&>)E-d;+mVrWM*mH1d%m@Jk<*'F$I@KJ>.:25Yh73gOQ!2?<AM\d+TY?PA26qtE$5<8lpqreQIpk1R2EAq=?+?P@?2qkfTPq^J[cJ+S],:AU*kW6A.IY?s8sQjTo2^_7m7llAi&:rrl+M,bKVM#J%RDlo;I^MZ^Ab[HS&)'JTm]U71fW=;!e<W%9P=#/#_]NRY@C)&W%s^4t,*rFtop.4\I&$/NK96VXVJ?aFY'A$!<$f>:O?2a=/(G#)\X#_rg35abm8rBj8K&OF7$QKH0YCp[D*ROI8F^$\"e[:rFN2J;W0a"-Zqa?;(Z1CU5;OdaHIULE$`^O^m=A5t &Q'\"0U#i\(EL,j)oGOKmU^b>\Td=.mn=9\EcLH`N9&jWAcsOE2!HEkag7:LefbK;MkAA_!<e:7:N!-T?ORM)mY!*^$!)t'(_,Hr$AIgU0@3EJ-3%hrNtq]Wf`p544k*WPMq#XB[N7] V)4ej[Bip(X(gJ?=`ArpfY&OK<?(6?UlD3jR ;,-M ?a*#>h?iAWBN^Di_6R[>0n@[ FHg<_A_-&l:HNP!A_j $<r<JL[H9]&IC>"]s`Q'*7dRl'd%F\B<N*3c%8>&P.%Q?L>q)\]B+ce )qT\KRgNNHQ#o!-e"X/S=(I2bDE3)FV&4:fKY:?&9;nS!RALA>q^\FBY'-4[>lQ,?]#3/8F3.8;J/FG>$0,mJ3dJ&hi$,n]iE5P?Il*"mr3FQ Po-=<)id_<r5!A@AgD3NF$+sHqgUoHj55Gfr2rGhVSA\Q9[P)2f]911O_5)*cYcY\KNM]V_YACfZ1$!tRADrAWc>X)e/ZF!)qCA:#0<M]`/ h33#GTP%#3X4l@jE\SX>Hlh9)R0L$P1O3s(O5XjCK +$QRLM&Lf#\D[tJhQ0g2%.Et.1EhW-I$@8PA7ElQ<D`F]FTQ^0lC^&)_qn$R2tCd_-pY#7B#0d-h?2mB*WV ?pD%.">FTX4 @Z+$[0ER'AX.T0A&m[J%F=lqa,sP]_2,KG6J;AN,EpcbjNpAM`HP,F2W%@,X(/9s7A1.haE4Z#FV(Ut ;DHrtNPr;p_V(@9<`YlTF2\`U9Q_82c#!(]T;r0&= kat71d";K$:+LnaWq))=ON$KV:rIda\(@Anf_Z/I:>&-k:i$jn-^O4!j#NfEsGh[#"Vq%5 qn3s3+)b(^.Xd07Qd$dL61bR(%V$D!s<dqo86T"f66 c'q^/lJ[1/"o:$pLILA*rA$G9R'#gY[OJB=(3\HJlA1hMdPS-[(h!9)dbDp/MOl,_:ebkl+V@NbsX\D%6-_dp3-Fn+k-,P+SG "kA-h3C;<Z\/ae2k1Rm1?g/$NDZ`Of/3(V].(.^j6V>Acrh"JG'FK&r,d%[thtZ1Q&MgV 5Aa2n6jV+Mp"?& "i8h+dmKbo@<'k.<mG16:-qL]OlOU7ICRT)""d$TBd*&4jfgFUV";gGKRK,dNB_GL-JneUoW`*#EpEVi5."M\2O_<OLAMV@9+C&VDX0Yh!*niX1@0Sfdf4;oIL<HYP#!#"?$mn4P>trdH3P('@$-kJJrI7^.*$"Xl'Z/C#eQ_7@8dEmsQ\L<(8lqhf8OlRSni=T$@'FgGqBD=Xo"m^O8bJANBdn2$78Kd)Tmn.Gm.]f'S4-XCO >b i@K#>bL!a gme-G(e%-kbhB*SGXF(&bkF4M5[B 2ksLC[]j=BIm_C^n5oMk7>mXr><^?YRqJ-88)nH.lYeBA(TlT.Xsf%bM&i[iAqhD2nk#JkbTS.Bm tnE:?h, HONo<Z.<h2K^2a)Q>E?+(+t'q29[5Gg7D*0"EgODHeaD'[O#SDbpNbO%h#Z6&7*0AW3*9%gZMk8C,_#4R*V5Z!5Aa``/PAcpnIc7)q3NakD44nF6.r\P(rB<cbE0XDEKF=G;ok@o@'+]4q +-[s%"?!t9p`A(/YO'["]$NZ9R6kOZZ0r>!`cQ#$>PE6rn,Q'jq2Z$.t@clQH/q)K@IjIV?Aa%+.qQ^o`6+`NT-Ac./4;LQ!"HJ&@)]4kS-dVEthjcMWCM[?Uj2l5`!(la4LYpAt120S[F,$+i]MY0q[j!bOcpABT<*A"Ge#%>>">l>J!E=#_#pd73b\J&81(+-=b0;ofqW#DAeENO26b=Bte<=Q:LbC/W4L'NOJi*]kC(<1A<.ne;_k2K'(KA!CN5IYW'_f>XmZ3J5E+YHf><U.Ie0TJ'A'9gpT\k79EXXKF8b0ZVM CHlQ%oK2^ZtaOQUMLc&hKAA8A3']1)ZTEOZ<o=W$t1q14YPAlP7>66pe(+W%MeTFtGO2C^kjd;c[td7:f"JErc^WWW9P<GpOJ+8?4&i,+SfH/_G4gqie$fM06`*M;nVL`BQOO=mGet9)$`o/]'eRnbqEgs+ee;b'JNQ1'rRh9F]?,`.?M]s7TbZ.-7X=gI^Jq[V;aDnAa+XZS%+X?sXr BK,.G8`7d<p28WBnU2:ph>8X"EGNb`\P!3@kc`]ThN AYGM_6jlqXqj8RaH`BpnJFO2G;^ _A$Q0Ol#6 m4hSdOQJMfg_"j>o5Z$7gnSf%i:A=s5P`M/6*>oZ72@;0\\O\NI!bo<H>0IG`/1l0FW/<@lnX6#\BVl'nb\s.l4/KP60orniFN!MnRO^2`l'KZHHne*0:lA(Ha<*Lq3,M'>&fo5';oqXZl.tbHU-`O(sJrsD\3KA^,LhM!:=YmKqDRCN^&^:L_#H2SUS+n0[(\SE?qGOYE\CV[7UEIk<i6-*F` :&3X4r!O5&F1#Lb(A ,iOq,bM;= KZm*4\8A+^g,KTNo7LM!.<5FW/IbH/+%m'bq;5@GB""IAA97Jt_VT/K;9EA^t4rt[;0^.88>jR)bPsA=$%P:0jo%B67\S>F'D*Y(onLJi''3pJpDW^$Pd4\e='d[lCfj5m"ncOQ;FIGS+"*#kB#*.@ tW\Z&!rZ/116]lhp23o,2?=qpc"]3#8>$/QXtslaYR2e^A%NGOS6?^h"1-9AS%H[/tUH9NF)0cKjLAl?WT85G:_\%28?)cM#J)@i0ajWF8h#f!%9d68&O2;LHS`G5&8hUra(Edco^\Af_fNcgaoXaLH)b Y9DI[]_8B`=F*8"H&*)hD;]5O<XF'lZRd:;TKHWGK<QEmb fq?t;J#0M32#G:5/%Eq1hD97-%5JN>!DI?]VPR+`VE/.L[QFc._d!kJD;5.;pG^`7\?O(tsh$nn62%X>5h2j B1*\can[?.t5>:OElXG]o]BE2ni.m4GkL,#AM5(=5h'o5P9n sZJ))QU/]T!3ngkVGW2:Y\\=A2A]VQ'$-g]taXA8jY6@8c"He4j4ai [b*5G^>bRXBCo!^f!8c54&.I R!a`b C(<=.`Lhssq:nHF4m8`5BU>Wf(Fq/AnO:BgHbAXd4S@TKWFscj3@(8DA fCt3Ap7Af=]JYGcIC$k[#,%/jE+X8 f7<$!kZpZ'sT53W@@oTiKOi*9Rsr1Y-JI;>BOIqY]S34A:*s-hhkQaL3UCsK7eGVcodIqGB<O*0@*(fgmF@A<)Z2fDN,t82a7aMX ^,o//oZd$Z&ZW9A;r^5`ZVRbd:#t[G@>`P6\(M$9>q$OYtD-_`,lF84SFOAWdEcsW8p1fn6\UUoi(3iXNt[M-7'ZDh*ij_rhO3dr_V*E/3[iGGl:G%9 DdO%+[L):QVF%E9oo6_+j_o=@hg9c;nGt;7pWCA5OSEb)beNGrl7Go*:Ab9/La (Vc,CHTp -ed\QeI-L%^$'Vp]YT"Ce[HsM3"7?T#e,8Gj". e06qYPms`_'mp:AIgealhh1Z7$o5sD[o+^XjmC5-kaX]kGZC,0Lo3S!dg56eJ$*G#U+k=. <3Y149a=1@ _Q8R!DPMU^/Z-WKoDM0@!E5@Ja+&)`I]-H$3-@*_tMdI7;A!Do'78BOZ#9RXOGj0Hhq[#^m4&75kF tr&mo6OD,#G (Db4"\e0hJfAj!I#aecb4UEfl>.a9tA'T&O5X]j]I=ia3HB0158N'.%h"6j6Ip/g,nke$",.('-%UQYjCQ'etA(]lGP!Cr0aFO1GBX\F2;Y<n_-XTO:(bsl$bs2]eT5QZ0k3:cQ0HF.0c.mG0-$L4B6[SQDGaO0n$ed$_9c_"7%E#qms2S3=%BP+AI3rA=Ugt!&%=BlB!Q8rl4(p.W;^ABkk.(+%3Bf!AF_P L1iF<&gFYhbO-0H@Kt$S8KQs(YLVFF]Dpe%ljBO'#oY%Lt<M(0m??4F99Ekc"s.tc=OtYXP"Y+0e381+5=h=e9QG,J(QV2?1`h/>n?j ?DK"]kVYLb%\1XZab0n:7\mt1sHdf.pUOS_)#B+lat?3L:.T."\JbMJ,EPN^2 6d+31P,TJ:\TMRa6)*]lT6iG=B/W9l1)MmQP+oBH<O"KFZeR,sK"gFfCD9&Ae_S>&&"Qcq4Ak+f$jphpbGUc\f[UZ@RXh7[G?O0eGJ AC=[ot6X5ls!ST!+^:`01dKna?8=_V0s#Lro4'bgM52UR1)!ACO4Vf>4'R:r=K-=6Y^j"RFjjL_R ij?@tpa(EQ%n5.B&bCY]];Qr4P;LHZSm2b)M?:0rb!f/C457tRmAq1Sg\=GtkG;saf9Ag[AS*qF:FYp7$rm;;ksPf3Re9egW>eLT_V4L(a<\LAGjmkD1<FX&5DEpmtU59b]1M32#J(:fCoWI&!AfUgghsnTb2m_.G.C68?*,PF#cd#^hO)nA@Wj>(so:)mCI\4QYXoXN9d_8R>+@& tGbj*f,FC>+F`'\Ep`J1Wcj*3N8#nm;c1=qIi<N<!(`%AsA)Y'-NAOhgnpKXB W-3d'RB?\/T?B8Oe :73r&Ac.h g!s8f!7H@)KAN'.@cs01Ac;r#,;l.%t6s@gW!&miGDTWS;OA3GF67]!7!4,;cpZN("8(`[GR*GQTOC(_)tr=j)Adh-W%\'4\LMU\e(W&5$4c'IM<- MUj\;1O=iHcA\9D:Xtd9^a#Ag:[m`deAaHbQ=QdLhAY;tK/J&LW Ld8W+GST@TGhh9c;0,&ks $TObV`+osdDbg_c<>9*#HMbtdk<A*<mEeoV=rb2Q#PtA,ANTN,=:#= Mo5M\;Eq:9lHi>J!q4Q+k?VIQ(NW&nU]DEA&8pMTVq@6Orq;NQ[h6q=)?AEoHTEc<DsXBMqqARD&9O!9EY<7qST[bGk]F@A0&-Z*KWTI4ip@cRr.SW/)A8/'3=K^ZU:EJ1q@.O+p_JCQ+7s\eYra8^CCFs5Ebd+Jas^Ga0H*S"X.:2@XT)8jHT2qP5Q>QN?DYD%F8N=7F75UsA=^DL(* Y:odI+^'3"c`OK.;G`c[8;?c2[9bUmA37!/EEfNIQB*A"1#<sQJ*[a0GBV=FH9VN'tD5?>Y"3_._Y/'Ug&C_`&5V'')6[t.4n\<b+X-a[rH8Ci^:E5a3b XkAjD]&HWWVS-8/.pNM/n+-AMj6=1P>+>[qn #=A66c3'"a?_'R\QjPd\-f?c 1ga%M`^3;c+4RUe+8J]Qc^c,Ea6qR:1N_@#i+BgPD^QC4$@[7'<8Xi8^F\gEH7_,mHW?ef.$QcN6:C/?-W:]`RDCKN`d8GV@@R*k=Eh Pj1@94h%n4D#m<QdD?a5a@ ,Ws#A8G\6AAY4.Asj(l/\<b<NaQ[%F-/%InEjS6E]gVdTLjBEAS:mb?H"$l1XTJ<(d1?L&64B[RAA`>A8Rt0O<(l7;R4(sg)EZH?!/(iS@WX`.fro5+$Bg07]NU^+S7&3Jik'IOK_ZfeGma;rK#$ZF-iPa5+d2LMWJR504_EW'/!&[&so,'GJ]NJLb2kEp'S87"_VCmX<USO8M4!6AQj>sKc8&pDg399c8Zcqo+(^9VV\-4QE'79ir/;2eI#HTb3i8nXX9po&?=i+75Cg$d8QYB"qAB0RUGUdZjq)EC)99>ednIT+rG2P5>/"l<$^#62@X.OP0<\l&t<i/aQAn2-K*bJ"JP1SB\44d,77@<FL85Nt_B8$\B#DQEni@^c_nX^jGZL]4W*WHcacrkEsZ3<0jWE9!JWMA:@4/B+sE_Mj O>K2fqSko[-G5+WXG/4i,lt3m7j*gp-Fqg,2;DQAA17Qs\*:UZgH@MD$7.Yg+jAnA,_E$[ZrA(SbGGRn$P[ Pn[$Ak]Kf1tm&e"7\3ZgYWh+Dp4r<`'ha;]^34 ^PTd8$Fd[_r#L*tL2S(O/TG34Te\7Kh%WSk`CocYt@2tI<ZU^"0 [J`;l!g;B9"jAtnG6gqjSh89#2Y^!DA8(lgp+EboS8!Q%)UHU)BW+!XniJb_gjI7jZnqj>&0YIVoa@#:@iq#5"gL79n$[Y7Esp?b-3Z+QjrVJ1i<LG]*UenM8`='sdi9B!)+^Zkbb,(R.+!H31&=XQ[/X[)oF2?GrLV\hl!`?Ack@P0fp=kL3o[g]__F-]<8Mp(2'f&YpA#9S3\ibKX"9W.,&RM@'k53k/I[M;?T1<^2E\K4tkf.:LE=*,0>B&m5p[nZO&j\7BHo@k(,;`>b@A]b)Y:*C*%g/ab=IG/^&W`7eG?"X>\"D':(p2`D>QANkSke_V6MeJ3X4&gB,fes+mGORj3NApg34f0\+L:%JPm\PA=;Gbh^D\;[RM9rV/!pB$qNAA9sno2"bCM\QRA.MZc4&Q`?^OVQ 9'DLP-S,'U3la.pjBK1\g5Z)i>)S33M& T52iAlVo0`A76jFEimi&aafI7>pOU8]_SroKVeW. ,lM]!(:Zf1=V2%@/"ZPF:XF8TXDtAC'&rc<GitAK!RO@EM33MoBTP3G%7U9Mab@8.ZF@1/9(&S,!8q1at=5*C2&57I?phjEH scF`K/(=2raBP`AK,!0%BlY1d0L$W)+mc+6,OtL?(t&qr)pLS9b]9ECFm!KZS(V*oJo:g8_X-rhI[p.A$OT$#D]\PC6G<44 +5<rdIKBI(.d_M8/`;3,m0.!V*,q+WqU8pBL,>%9T':;oLIa<&P(D$MF8KDsKMAGig]UmRaIbOn<YbsU=Di9XooN02J'B#YW/BU[J9%WD]X#8R"a#%Ffon0$9<a)QBid@:t0_Pd.EON7:i"'/%pEf#AKsrZa"F[De,F[#fSZacHt3BZj]))[jm%coClL*)lTOGrD)@>P?9.Yid]s6::3`e4[H*l0Eg)\At:J#o38<4!>Jb2/QQN<H2`Fgh65@1n<E5=?[e(P4"qIhU)C!JS$a(1qN9q2TYBkh(a2B[)15mFb)Y#dN^B[.^tZ(+XIBiCqOaf"k^hfCdt*[%O$HU+9*l+mG@a]TDBHWVZIb.HE%:KCUkgf;0,#WH+-E2ljPK85OPnd!<25`AK?5[p>E*^9An:I%-bm,)Ar'i?0,So/k-G)S_(M)sh></2S(%ra7cA!&,Y6_n-N:56nsW#Hq5V[9*BXWGM2qr3QR;W>TqJH:_2T9n^P\A>g)[Q:`L 9X4[k.#X424]_oHPg.faGtb,"!s8\ PqGBae+V9R42d9qQ$#GC?>fTUd8KG!VIAiV$MWr$aMAf>,e<2jfgkB=i@\;CD$Oro^2B=FN M^o+ n8@07?E!`ebB^@BWN1?IR];O_f(sPdLnd]6n;5"7?n>2I[N2L?69OH.>.iZq6&`;^iTaCK !?Ai@S.1%n(A2\$;/fJ!6P0[YL8XT0@:Q:i]C*9E[-S,t=Jqchq:UW[AKFq%A6I1R(F0,'DT3UZe5PbG*?FHaRoBd[MNja0sN@4@X2_T_Sd.^> 8Z]A(dD>(5K54HM5@h"CK:`F/4='/0+bgQKc >Vq]Ff.HK*Xm`Lg+`L7mk%1"32so5Nq2j6W8d%.QnNZP`t5eV, U3Jln$]5^5]^O4lT8@SgbpS"F)7'p?SYAjBSR Q`opb$BV`:"3bt>WM%_CT'(Ap3P>i_ C$rbf47bdK760,a3\&EdC_]d?:\Na$)_5XF;B:_ENnF&Ltd"XEF[&0JfAsID)k!?*21!rI&:Cp?/tkUh>:&:C6KAFqCRQe3h;nNtD$kAqj>4kJ#s@L'YCp-mRRZ[R^p^Z,BUq=6=`9+!)&5AoJEg*rWK]nnb@)'"/S)CsYO-<Aj-pAC+LR>X@5?dq.MF[PWEU5pt5F[]W[M#rZ\Isa%#;KeQ=4t[r%K)mh6b1o04L]N8jlEB-*F8gn5o$TcJ>T#%;1Q',oiXOQIi0Z_lm,Dh]&0e6+I3Qeb9O[YEX)VB*K\_1_t'N;nNc*$I_7'0l-_if0pYIRimXPt?ZGZIs<\>Vl4t]F!X4E&(rEEV<I'1!+9: S$Mg:/*p^'SN,W4_'-mm+F9b[pEa$Di1&jU/,n&I:H`\6"=!Fit"f+W^Z%s:b3-2D5,]aeD5%[a.=F50nZb^Rn$>o6Wp[Ei^=+r*q)(lWCFrUk 40p(TP#ATs//KMZLGDmD3G9nF]A>_E+*bfHq<nB]hO$KUAYS6%B-I:_]CN1PPN );>A.A_-X')92n<S]d^QJk4Wp7 0?YWF%382[T5>DI?cj^nTCXE+J]Jo\"$=Q`l-,.blk58Q3N<$X?RQdA5B6=B8pEDR6:KH,ppA=jJa+K@n6^bn$'$O/)Y>J?c$$I-d,#3j^]j80Wt41MWs\?WJE,;COD?4ms,oD.sIRQ9a\!i8t961pg^r4kF)6VXh%&Hl9b)q6K;`hc#H8^n2 )AkTmRhAMi3I"RWbVkaFcN=+%5FYH[*>XUn0/b8XsF!+f^5/0ZfClKWRFbo)M5tjDPecUD2m=''7eSmM/[mLm!r[f?JmZcrkg!Lh[1dUfN?dA@)F.J-9M)3$.Y20n8Zg`3!(UGd<GFWZ,OLk3V2A1'We#bKF&(.#]1H@&LS8c/[_#&paml4E7bisULq`>(MW(!#5ZTk2.M"2cSaNAOAUktY' nW2%P$'I>U\FeZ [N"$%gr1Uh=[6AGTHBICP3:\*l#_Y0k"Z+i)W#8i_:O a9$IBpl>:i(VYHQb=`r"6 _fW:gmJ[^6*`E9<gJ-2_6B#Zp_p.DK]LC%0K3col2g3_FWKZ9/R ge&+EMk </5p>21NAIAZO^#7'9Vb?oI&.\S7c%#^#opo9IXehk=\0$T0,G%e9#82k=g$S&G%6N#^S@rDA!+rrf1"bRe%AL (FOT^tDX"( `1?C:Ip4sIW(W%[>5Jh\UWaBn>X<mJt+@8EgG_lIbM+)O@NoiR)FB\fX=XC3_G FPq3:ECsU# 9on?r'd59J'^/>."Kn[=A.c7#a"C)<:kfN" 9JLLN_S@aRHtdj<[DVF"f*9?)do<>pD;1kP>]0Vi..`S`,5.>9fq^pL]A0`k3Vs6,]857=RYbq@!UHV7#9\,F6f[O8Rh5,X8b!*h[.&6o?BmZ#9/Z)=[Ff"EK@J`p.i7?7s%BA+n6$I\-VL0agqa7[42#t)+a<lkcQ,']@$RIUdcnnW%"l1oU3<4gNki&^=).I@U@3[aWLTn`'QA<_4$3VV\?9Za5kO_/U_>`/-F(Rs,.6$+6As/EQAETU`7_`*NQJaYlW38t<[FGQ,\S2*q!7mZ]E3a2[gBgS.p=<s2JStK"Aro<,?UZqPR$-1EOp_b.,kgN9:0qI$RfC)f]rJr]lPr`WZ,/IZYSCM,gTQIJHE8GX+[UUMLf_@FA=HEQ5W&>`(O20#3ZfCMTjW);J;1_>6$@ZdU &m[HUg>Q<tgQ_!)k_QE`[%.ZUB9]k>^^db"&rlbj?KDiifhg/ZZ_APqgXga]<I?-DH!WC33EhBEm:UqNh_a 9 3YZR`nlt3FRqXKC@5e-T8E)NmP/H)gSL%bdT^Ar6Wdlqbm,1;"d]hL]>(?jl%0\"OeGm?l*& ",ptA&]q;N[%KIrr&p_YC/BpJt>aANfsB" <=<80jfO3+pc`%iQ[G?YO6eP+]>d?nq"5,^/b+ZacXQa#(/!&"bCEbSqpD'3WPdblq$F-AJi5)2(B3>5`jF[9LDU@hh6=q_?L`R9H3&:TSj,hfhNA*J&%d2[eWol4`ZW^)Y0^!M8UM)Fcq<;610>oIQ6/7GKALd+o.:$:3kqk)Mot^Ne0654ciIqn%h+O@\$V9D+tt.B pB!1fVL;MUGE`s;(<\*ZK3'.?WPO;jH9K[/G&>P$8Z#-&E_i1Q(^(>e+;[-g0PD&.AIlFo?\RFs!T*Z?#W<d2h]oN@:2`R>7aB/.+4oOgQd@].*bW:=T.qJ3\j#%5^!N^a `[!tV*dojYTeUId.kI>%?8Q&5Gp#IL'^Tsct/5E\imT>p*oJL KO#5Dr>1.1mRS2eKJ_rZ2_cS+c>rs;kE3a<[K3[T*-%R^`@*W1e<i?XfV#qp'#7 <5n1(M8Fhh>L9&_&l#=3NW`+Y^]KVcg]ZqYG,l2Z,j.7,[02J^J]!oeoG-5:U23"5Od,da430\ZNXIHd.rJ*;jUt9d>(t*L^GPkX]ce Ya#NC7c#MGa)!7cN)j5LF%&X0?D@Jn%*/A"NAV$G#mI-+mj)#/^ecY`^!WKfRk[)Krjj1ARmUip]/P#qG4I9H!<]*fVBJ)k*dr3,gI*\'M_bb4C8`ip<-G_<?3qSr00rZ`%W`fA*7Nqg6m`". t] g2mdFdW]WAc9)4=#U/P>ngYq,YmqEj,$oYIi\#NF(>ZsEZ"JWrfdhTGDVP6tSH?`Z";]:gMo_QQYXA7I4Qg?Z#tE>?_t)*t](SE;r;J8cS3EP7.@3p'VJW<A)kt` t5"(Kq(5$9cM9(?7cZIbID&b=F%"\"=?E5&%5$i)AKY1&3IY3cQ@:\!:'BsHm)f`=W]7A(F+^glU afRa5_Q<KWr153#1Q[&B9g`J;O'7"?MJd-7]`)M/8$QBh\;e237ma/4!D9aN:FJL;SKAWAkDIt2IN!5'TFKVm?C_SA="(>gD(9.).N'LTH5eA(sfaM8)K'8QK2Y8*pNK9KN!%"6'@ho>PL,fHsD%eim[CThlG&SH>eTd-BUo]MC?D=gptat:;":Q(X;YG*5rU7Z<K*kAUA=/oY/qE%?ft`LdHnI-j// =(aqk\[K^ohBsC`$%LEs==T$M `F\]U[5WQVMA3oGd[p8l]AJ`m?-IoSR&JU\c\!&?,##nrQB:>HN&[9[!)eRGqnV#8A44nOnh(0Q#+G))c-nQl1Wm/]t4bfpO&A(p)H_8@!A_!rP+0#(8NNa\53QCFI<tk+AQG-.=cJ-#5RcTP>!Irc\#NmmKX;AX:haa'Xl)haG'N+(A@hWfd'QR(Xql,mX!#OA.-?k&Zl)HK5Lmf6&Kp!!d<Y\8W<][Q 2.K&b(7`4nmjl5ELj#PiZja&G-`!fXQ2q<VKb97D44;7i1bTe^JcPJ#;Yn[E>S[fh:rabYhCSl#c#B'F4ZZ-UZ\$5XJDf_X74K]nr>T+"jem!+*`s[Pq'$C$oc'/r=h,'6!O*=3.1m3.SPF4D]jS(X0#&@ZCo)[GG_?`oddGD 7s/7[bL2 fN#KQ:7i:B5(2q$;s=n#^1"c$,5G^6$`V!H?!I%/M.t5n;;?%rph(p0YP/[heg5E,:o3toP@=.OPOPUSnd%RH=7k[O&Pl6c&kYdi^%Yj?<BgZIA@34tffA;lIZ"1(r#Jo4`KG<nIp#A@^/9j)c7(?:@BOJNeI!&E=>"FEl-A>?0isP3KJ*=k$--I5Rr:EOJWo>1bA:n#($pV_7VoIs)GR2[p>C2C\p5A0X]o J?QjNBb$qIeSQL=@62^#QhfA*aYA%f'$XRl5l9gh_G,LRb7a7O1Zg_;r&A$tA\PK&B8sASCYObeOA=(FACKH3!`[DHfpf1\JQnEb_aOk@UbO%?'3-WfSV?b)DIcVD^I;eAU#9`ZH(rp!i.rf0tKF[aO9<,A8#or;^g50XfIG5;t:3<)i"gG9)7CQ5;7MLf>)nr9EY@kSD!Uis*c0/^Y[aIYBlKoX#sQTP4p2+]$ZA1;ZmF%b.aUTSi<"*+@A?G.\6d:EX2%=1PfD'oeF!UtZ^KJ"3JnSh]"s^8M4* ARL^S+oi.Z5-$j`6]%?H"gr;YNAr)-rNT!E6MgGkVN>8`9e#$ c#/`"FR02ME,e2)ber_C8^$#USH:EaV )pi;h=oT aW";R&&9B Q]P@K:!1(A&"G?]L4_c-j3lFVCCqRJo*<$3$!R56l<^*C;)1GBl.">LC2QnRi"AU.,%2o;E9>F.TW4rCOfo/.iH_\Fk'T9b3bR=T06("Y=C>A%7JNc(`.G":j!GCto[<hfC]9E!NOA@<GN1\fWZb[-o5W#!>aZnDR2LTk1C/,A$%Qna7/lFEjJ-dHFf6c3`2OQkYBi"9m"YZf+<l"qPc8%X0=#8ZIOkEN_EA-t\Z$)3bCh,A;eqX%i&0[iWm$n6Gpi&?]XPXZrMl14%H3+R"i#4Jea]3_dQ3 B1jsIVR(AR"r_r*T%l.b?%++-G4O5B%oGDg6 T/Vij GYeR,'#q3OgANWVsVdXRo'2Vqq!"(T3U>,Y%.&o*;H<*=r0- UT^ gp^c8J,5cgsUKleXTH^l?kDPC1 =*l,qpe@n>0enhaI!4A?OR6jb.ja:/ qrO(T;_9iTMME!F/]rOD0`%V.]BpcQfk]Po:)0kN;)d%.W>GCY/gjb,#Ce7'mCOW2FKb3Ea4ZJei%:a@^T`p>D9Q(;I?U;F7(Q!eV.$(O>l_q#olXJ!=B3m_N;0QB4^<nBB%N']-0si5Y[<U5:nKi8/BmThY,q/2!FE3hAA&_F^'101\sILD*ogY]CoKW]N*8j52&!F9'QEg@h[ d^\r*(rOm%+];!#)Y996'*PW3tq[A.:%=r705f?6a(Uj<prOQtaSNINUIK,7(;nXIp9c$g@(ID,N9THl6A[Sf!QXI6nF2A"ol3?5Z-X-8j/3gcm<mbPr3Q0Y&_R;j`XdNtL1Fj2l5mlcS6rf(IV=/dS?\\(fgoEfL&(9Y#*<F $K>pjrmRp-4.#=#)Xm382Yi&8jA[-a!(S2Mi6VZ+>Q lFe ^h6P)_N+0nsbb9Yk7R+FI(WZE8\nN-.eT;105'(^QCe<b_"eSJ^es-BDt@O!S"QR#o"NPm^&nM<: SpI.=ksN300qBAUQCV!Yqbcs8AJ%C\(dN\YEI8,h0OX` ,#:T#flVIA';T.I+cCrOb7IN8;LHLkH`)ri:t7WR>_E$J4e\/8ThAI:CU`R'&>HPL/pt(n"Qd\A.5G3r_>th%lS_^sk6H].jfmTNpsJ=",8$"TStbUY#&8Gc-q,Xh<gse$deq<a]F6FMYG2g6W`_oD9-%Ne;0VnpJaM\f-/obn`34jB1&Rd5sbl`6<:D[.A0[DStLA=[F9.;+ 7,48i!56#br/X'eOE3^)cJp$0#qWI36pjUq\Rm+Lq,P_H*[4Fg7lb_(8VYlaIn!Sf$/VBg(WFALPf=#,PpMT3< i2af/k]$=%[/W1#(dh+/Oj'PQjAU!4H*:KO1_Z\?;QL;'N4 "k-Ee>4]h.p4YZZ@>hm8^_tZ[@AK_h$Xn>47//PMT@Y!EO=m49=?CO_;(2+nS`3AgXf&][c_"$N&BUpnj+SFhTQ1a<dhW Y_NaA+CH ZWoE%e-%'3Vl!rZ"#_g>CXsZt&WFpNl66A&2V-Qt(&&""=IfljF@"'&]Peg$ik5L%TKo)_^7m=H37bb2(pOX-APf_IlRmiAE#c8*Z4MI.bJ1:``C@pSH):W8Cdo<o\co+>SE#mbo9G5c5"b!VC9IZ\6GqgGtAAlS#S#U6"kE@+$`P3YC$n>J52S5t5P\*Vt=Woj.->>WOg`d8:iidhR\F`Th[l?;m<,OAag'DY_DmXi-asq^VA6RW=lpHj*"3;J_dN:(AZ>CB<a*WrK"bUc$=EE@^/7k+o+L+.'jffPTD4B5e"^+Nb#tr:\Uj?a4(S&?O=l/lK$`%Hq`7cNh*7Pf;g]5.78]P_MN`PfVk'KWUL%HSgp@(Z^@#;nlJMXpSD56I^c0'V!+Mdi,pmK]L'D[orM<s,bTB.aEia>gWC&2tqrf]/*jl%:Y&MtK@?>\Saf.>:cmp(-\n9K>#5DCA$!_+k4kJN'Th]3Qq!dU2Wd!=QlT&n@^eBd#$`/rgc1`IYFjP1KAh7!RG2-%I\t"ECc`n6t5`sCgjHk/rMA5])U\7hMGh<(UAc0RP1M*VaqH9A;2XY.s^s8-KeAH#ipk+5@U*DF4`#+h"*,>3`6[cWB?cGR-TehldI1#E^88TCKd\m7&IQ=?!Tb;DM_$RI/&8;Sc%m: V4o;3[48$>5d0R\Wem;+US0E)+`G<2=]Zb*L$`W0[^dN^N1jQAWEcA$)L1sM 4YIaGB>9<s6n'rUAE=kM?OEof]"ng9Dt7m-b9LbR;Wj*a=^-Z]Z2OB\Uq)qS0%AUeJ,(?aK6i1$"RdFh61VO5*ZX/0,Js(jo'&ITRgP7nl/6>,e+4m4C1_[g5[s-S_5#L2f-ZkCFE@J"l?s1(&*":A-X'Ki@B*Z?AFdY5jlk5OaT,I^aTQd^V]iH2P9GY":ph=P4oLi-)3P&[LS3"cA.85a Vfbl5VA`#[(UDKh[fn8+MkV&B?]`6D3o#JZLa9Sfh0kp%Z6>$MMN.!ARk$Q3og AXd"CNCM)&)669T76A'*lB&A".N#Y0gsJ A3sc #/cL"&a[dC;S9$.C8R\[Tg`Rk)nmt @AD6>sk5+6-8V=]F"Y5`Z-^L>(2Q0_ pcig6GKqho0/5dZG>6.U__ S6,!L) sp8eYZ;<Dd#SYY\mmYt1BHO7-B=q>F`K7GK-]ViPKqkIrhM.AT%3H%eH 'mqa<lgTX Xii$IC"#_@t*KGro(4j;9"V.`tPX%3"#gt/73ta]@>4bh>\.3P)Cis(/;W<%LVXeQlQ5lO'31IB_&Ue0`<AdoC&s<bhdA4$^;-4WD8.=RCBq%OQ%p[d64UT^^9`9.ZYg Ak.\8oR6Sba!rLVn3'C@/AHHE90#GsphJ9Prh$8.%21jTjhN&l\#8G[!.3C4 ]d4J^PTVJMm4bpl*3PCkskAktVO1(8&!h>#KA;A*1oGdKf268<lLEFP"9K<!CA\qo 50!FH[;MPjtiG^N>licsVtcpU,5<#jnr*O`Yl_fTA<gX+?SqA\1<^"&9mb;q?$fn/tS#@<9nPp#b3;=]OGb=Set9!&A/,e1?C7&XNr4Od,OAV_;mRNEAgcjr(00X]p*n19:@inqWO3Z:3Oa#_+l0I@`J$br@?6E^]m'!$Fm^BF=CDlnc>aMrlPDU ;d JH4g1]Hqan Y*"qWsiA[0&h+6EY .D]4&<d$ t5-T:-@/Y6!A]7;@_#k-%]A`VO`h1gDR A!i>e#eCRCSsC8Yg?gRP9rhdg:@g.H!X2Ab RNKBsQ=>mde.t3)7&m#DbLG]qkm1Gr_tAc["br-7-,3#r];%W$ 3m>>K%JgT;,!@t`IH?]R9]CEq*k)At7Q9<@nKbX[8m!:OB)BWP#<_AAO89sON[g=LMBk3](F]A8\RYt[VmMs#,iQ[)eC6JA8r""")gW?Jq#5!AJf7nAa)R,3e2Q?cA`nFp"M^)kO[))qS6lq#%<8%%,N7A`#Lk= >kAaE``=S,r"EQN\3JMMR)bF/8!Wf.O%A'MqIg>EC$s`6%: >3]pHd[`hZ ,,j#dH1>OWPkL6'^HNb).YhY16B5&s:!k_,"&%A:!ZRpNfHVTO3q<\QNAt](F%K,B03a,MYh`k<ba]7R.,pOCE-_j.Y].?Sg%L#m_q3*(AC\rU$!1:CoYgAcF96VFGlK$:Vpn^mC0'Fj\/'HY6-@,8Z[c=p$dsqd6l2\Rj;3cbM$5][jhgrTQ,e90d_)l"EA[`5r1P#AXjeanD\%\&he1e!J&iii?Eh8'FoZ6[djVAi&P+c_4RZN"'SoH6&kb>^jreYh&?NCqF_H8\99 tWpjJJZQVqS?p.!-:NrIC7*[7g`dqa.M[W6i<c,VaV)Q 8'[>#8`I80ie6GGY+FWfAp6Oep^\=#=B#.rA8:X/=d` rP)t43i,s^bKkPBS4G?_Z]Vhb=HA)+7E0M ^V,&^`c'M&kS(r6b#ft(F*@rYg5Zb%4.gih[+,r '_V)d07/8(d7Algo)GEhW>.g#jhJ\`C\Z,Hn7k(41`o:. `9 pHBRGA0q/%<_+43<Q*U?Dj$:tMX)Y3SJ-U^\X- R[^_0H2hIR/T;-%@2PtM]c\??A1D^F&#`H'&*00MjMX>_2)lB9gjFH+OLjVa&:GrqR"$_'m0/GYKA`FPio<Z-#+1qf1/2YLSUW.:L<+ti7k^j(tVY131(Yf !Vm.&^rl"=OR-`hA-jlogkW]M.k?U<d_I@IXeR[c>D-2KlH`fk"Zh,@sOG30,e]#k\4a)47S:%)lhNd2-Olmb,r)hWDW^pq6t3](2('jj8V0oDRe)-r/[mfAHol)'>"R/5U"5;5lW>1RDc5TB7`gR<(%jmgVCl+.dLpmsb-t  I^&@.lA(99NA=eL'j[ZS5iQ7(27&-JjCTlHt&<4r;OorA+Qr/1-3=jc'g.*$`Ap>3)O'_M"h6Q2?ghgsPrJXRbA8T._&_)04!0k`ls3/]AH)Iq>s&aGK7fU55GEQLD$J9'W3'.`i2=]F7q)8e<UP`RDGKG>tEl!B+M5_Yo1bN-B6$79"0KM]CsnY6;cqeiHNdO.9J"BI[;MCo>R!rDX7T;*9[_ \s&=*p7e7>4L'L>knbW(n9K 45(T_<mYo`7FDa&cSJ.:\o<&%^t@OtRqnY^lKUEE\_]BSZQL_4;Gb^#C>G[$_4k3Y^8Yof)550FJ9,^6 #AXiQ/tekn]OA3Q_IG\;nbP^-@!EQP6n!h]`-AV*6Z8kUQ!<fBR-T"csCmN,b;8O/mpeIN-l.AaQ[Tc9X^.i;$If4_FV.) ``9,lNI\Mj omK.YB#j D2SjfaaW`?TKi+CY0dOpn^##5oW3O=YN')QI-cBXb-5EO+Y.^,;9nr2n+;or lepUg0'-Io+N*$1^[saO$<<n]Yo13^k`j+/UZ_gorfHm!tAmWiO(<]OcSQ1.$:F`bF&A8;4@MFKJe>g&dL"\@C&EP cN/>O<ElY c`Uk Zj4G]5b?+KZZr*m* Zl.pd= MS3JH!rOC%E(JG1DS$U&'YWbGn!^CL$SAd51KF(kL'ojFXsM%Ck=AGIA5J5>B#A<J7=\Oob*n38>dfA["=OW]s::[WLCfiRqa(9;ldB[REY^Ep#//28eMZ4<W%Df*q*D5AM*-*Bc"9?fN67E<P"en76$U,,!fhW;<-;?UV"$Z(H?1m-n]Q\?dB61'\+lKA]TCZ9H:5pQ-6=Q$G4729/#!n[s<!oUB@0Tcra$e.Db@dAFh2Sg$3'Zlbmr_oC"o?]>Q<L6[m#o[[HDXS>T%'6ZfDBlE[KP.^V3ljM3A%=?,>+/-P83Mik2hsGoB.a 4dne AeO7i-mqXo g"LQb)4!G_ [e">4Rg[Yi('P*Km3K\_=1(4IinfR:<Y6adAG eir?6UOAd'Be_bM6""?H;QAN]Y6leN`6TX(I3f$::F/ra@fAjpA63Yc %2\3rJS8b;qsC@]c)UT'd!A:Ak!'\i*P1 25WDDb'D)b^:so`E4l=?8F"lpb2nAp+\eDT21''$m\&l#h\g+%"<dO'#.aVE>R0lr8lfk=94PLDH.IoSBf,;]#nK"3kb?Z6RY\s],LZi_"Sd@NAI_$GHNBECT-grSAOcL@WX1,'FDeT2XL8OK;d-,L)lP,3\ngKVG[Riea`tK2rist,D&OfRZFD#p9]8CqpYIPq*n)pUEMW- FEpiW;_(< <6To3Jb?RdV(@1j?r.$#2^>U)#AT]+t?=FcB/aO1h',8peaN!_qE'CM;aLTPF(<!_[8;'07l_`OI1?g,^]fb=;<k6KBS0f(.6e)<l3aR>pF"b'`kk[*G@%bJNKU<a]Ij([HC'lI<h\JcMPARB* JC>)=]#?FpeV#28^Ffb,1+mY6<8J4+=$M'!7 =_"1PP12";)Zt*MT!V#B7coB0lRHT]rLXEY+3t"-oq%`gV)1IEs7F?Y,67h%8@6,[H"ihY9+5:sHTNc/qo-esI"_nrmHUZ7Y$!Gi*k[.TFrKaagJ#.ZYc`IZDb@S;$R`T([%\otr(7'-!-8_P/?#1qX4e<^==3L3codji\,sAA\)"NR^]KX38CDA_ZRk9g/*Rgd'dIU'T:UREr*9C]bR^"e)&Y6nC(fr]"=0?QX:6ldPb8)\o\Hm7b`:k_PNBYO(itiV"o./S.s\Q0g<I;qQ>(!@%qKX:32LDk^S(t:MBCXA<j Pn'4tpQbgBeOX(V5?'WgC,7#Thr-n K1VU<VKjE,23!,G2tG0'?.c"#],,K'-9AgQ>6NN1<q%ViZMW\OAk;aF.egS6Y+(g1at!Z[?N.IlpD6"BG.!J'7?;l3>AsNU7_-)@(He/,ltg[<=IUe6,KP$1APhQDl*O&lpe@2At-@SYUb0%WYt6-,Hg!)>DV3BDO:9I()T/t. dja7JL;Zl3@ )K7@*esQl?.:8Mq"YW@DisKkf@T:jA+<\AaFYJm>1d%;m:('"A0aP`C?>D7 eN>JIfTEIAS1Q@B4kRn<Bc9h?'+#jYqrEWN+n[.?f0%cVj<WmFD?\!EC#[;6$  $h)H0WGIS=/j8r,LP1tY<2ns' GtS=GOG)8mBnXFbFbVn>\/`4JId3a&'^,\n0XGE*Zonfp$1?rO3LT3Xol:O`46kib+<\F,ilohHRS1?<X")J'<IhYe'ZH:\e;C]m`Mpn65`r8Xs=tj@;<b9a$c!0c]<^_MQfZi''P,M=50C:Ac*#s=5p3mga^t=nK':YT=rAacMX50lD2S*56F;[: _agqTtBLO?&D AH0/]S4O%E,jjpMKkObY.82n:PqAD[9+1UUkmA\;HZ>ElmM(#eNE(!'Ip;L3O"t'lr[VhZQkcDO\5*,0d]1PD/( <I#:X8K:;9^m_[jU_EBFF$;<lCN@PCl*S\Kll06=FajDN0PgBT6MDqLoHQ_SC^:A(VAK6;*EQ)5^8oHk\A!0%K3SmDf_##tRS^c"t.3J-nV.&]lcC/=Icq,7&/p52G]idg2/s@[O9##!X'F^dmJ^Y@DF5>mf bcoCVi2chgQ^I%J1Qa3I+[#k&b;Rd?PUo$Nj_:*[`pPNtob%3Xt!Vm],\`G<V`]QiS<!l_a%AQ?"5D9UaVZ><"[AAYl0n$k>dQ[o-SNbQ<qTEND[<a%4O[?J/G_!^0[VPXW 5Xt.QDD/UG=NOsr?`q[?4.)QT9K'J^ipt=ek!g-9>'ZU,<-T"<B])n:GE4I$!4rRGAm8V<.XQUsiHK $aYTl0@1W@5<a% !pa> Y8Zp15qL@=Ao[NY2M;rAJYMn)X8p;c7o6*ilL(`mXG:aH3KO oh1=t_*QZ8?L6Mrs^+U9h%O:b^WlA9QiiRi'nZipZ._VbMVI$4rBg(R5pG!DD$bn=2:!*HVUHE(4!TDZO(A$*knR\hoWjk8Gojroa..Sb]Md;t>Ri49_f%8q6(p0i1+7//+5<KJmp)80\_m[M.qmCl_st06T0YKfldg$4N =/ MQKIhpmN[\oqOdb[L$A#m6_^H^bC'+t;`cZ,QRm\L48e1KgoZO,i/O3i9$)];(;=8r.q;i_?PTmK+A!Zq J8%fdh8(m]L*6?2jT8j<%!O[("MA3hX=Fl>P0Y+lso[="9V?)#\'mBrihJ9`0NG[*'KjpP(<ApQPWZpcG>*Q9ofL^e3h*kb,B5YJ'M$#^P>&Y135]ci3aD"d&9P,"%5"_YUXpO"F83JU))9PJk=?tp(f0.AO7SO$K>B4AIa8IqNl'OYbY"jA;[7n%Gag_9W+egY.f8(k.h)q%LB@G$:#C1FA2XM0>TkgG$kF5[gPD#m&`je4[-'8PrCC"VL!)sf;7E5Kbh)r,&kJHlgEAS\-`bqlN]0Ya#ka2*Mi;K+@EArBZUIp.E>NBh(j`U<+-ntk>t-QmF`Y,jA*I__nA._k/S"U[ql^[Ctc>e=Rs:/oE7/i(6A8^c[i6'\tlQ.q[#DoBe[<BS(GRMR8(f)LTWWh9pAD`R+Mi80C2?APkYH"nA_1^+osK\_brdlsdSbEetG0E5$Irk(:m#r_7Eb&'e\l$TJ/lAh%a7(;h`=rHol<5aqhl:E,jHcpPoY9sE$\,?A%! e>ZHk$ Vf1W5e?g2f\6bK*SSYEZboDaLqNrBB8nX(sIU+*Ca+!K:&/f1_`Ym9rMWU.e,r/gpt;_4Pb!\tIW"m)f=T>UrS2+ErcW=!#LbbR3h<Cb(`3n(fOSX2!jTA!i9\K1K)AV]12k!!Hn2@8FoqfBK0)5kisTAbMb:P"^HogtX\4q!OeF^!G,c;boDYB/7$#cXUV,+0W*GjL[3o\#(:a?H'BqipVm1-sDj$=d>niPS#J>3i61;qWL.aVmT!a_qA:%LZNW7(]=F^p^D$$cELa&_e:AACH0D/b'BMaat?hrA+9tsc)66"5OsRr(ckAUFL=TgA_4Da")KA0@)1gp#c1d.P4-n*ng*.XG1f.=\-;(f]\s"sE#sfSX!gY,?]sAjAOs^V_&b4c^?i=?iDjp7p%^[O+jC$Nb@l9CstnbkrQAb?'tRRE!KJ?+TtQ26[&eU3KW(L7`L)O>8E-)GN4H6/X;Pg7A7j,$]&[?KLq1* o[o'mI<maVTI==r72C MRP./A-5V=0mV`^0+e;.h-&JPGLn&gch0'#@-?OKl[p[8G]8LRrOTC-+dA%3LenE$iss(cg?/[L*nH$A97h"WSt<an!'ZceZQ-ZB=bFs)KTFSCA^Mt^I88`i3hA<7L<!e@jfOZY`?nMO;D70[A=ngLid*=&UXO71R8<(81l.Z:Qkh0.RAf\+Tj4j2aEDJg?>\iP_m?ECe=AMh)Vd%?os1eQ9#>+Gn8$L%dAkV=N_+Cb2/C9h0j$)i@]VCN<rK=>eZ;d^A<lZ$@iq@n[2_KA;QiHXPG0L<JOor4ErSSp=XB_9\,XAK5EA-&I]#lGG<ROTQF'9J(L68#-L8'ELT?C_D2dEd_t-b"Js&9-%m2=85% 7N;AmZh]aip9CC;`bM^N75Xr'$e)+DG(,\%>,Q7:Z.?]#DV6q1SsmMT$pqN""p#`5HjbIH2^((E*dOp\UFAZVKkd2S?FM=n&[nHMJ]S2*aA%WFE7(e"tQ!0T()5T]?F[RQ\R?S[Ms8*-G<iaJA"UDtom+[I^K9p\9snIUt(PA[["d3DbTE4@3)7amp,$,W`Pl?A1]Sh':`%;BR+@bK>[fP!_J<6MbE&cY=$;1src9GdkKiJ+ZlR3m?M(;Fe:<_D`.;I HI !25$:BS-I<^1SPj)!NEmJccU1`0 >o-S!b7hZc+C(.=k(LI66g-"WP>Kpn^p`EY)T^HB?nA[UW[HM<RXbY2;"kK-9gH[_MbEW_ET;R!M"?U"p!.+[/c'e FDZ@is+!2tF%[p3igUjIqIh.#RiPns_JhaIE=Ei(T^OPad#52d 7*^8[8kZT MZVc7C'tl8jA=\.&8VQ;&[;n(8*2LDD$#P/YbPde;c3<sB1>D6&,qcNb;($:gJmLcLa;mR17pA0,I1lBj;sB4U>?t>'_sA 2<7&`HACF9IMJ?HlSCGbng-J[$dG+&ntD26WAINnS$ A]_Eo&;AJdci;W?kUBK JbHDU2=G5Ef#hnf1aTo\AsqX0nBCH'iF)sX*->7G?;;FSkT%]^U\is?>BNWMXGh\in!Ld=b0g6OS,41jpN93[OQa,1.*kNNV<H.sHba/A$1Pl^nr)9d42AO3AU#^V*5A5EJ1Cia$gp^DnSGt%=B[=en?!q\i&A6eiad`V>Yc`IMI?gX_3YZ;ZfF@+o>a^JZn+W6P;UN0U<.WdE4)=s.m6_%4fQD&t9@Q)9>F"O)3*oS An?632I[`68Gm$rdPAKMtHb:dU)R2DX#mmVB3GYt71=dDX.D,kLOnNd"EC9mP%S<fD#&5"$'r]5O"3c#bRaIGDtd%lb Lj?`fIQjJ,e+q\>9Ln0IA&)MMa C@1.a+:"J)A=>LimCYW(1t+9,4h\./VSQHRJt7f4UJFn:HY7bef%/5=-n=;=Ek$o[Q( .:-a,fQG5TE'dntYs7hClXj!)CQ20gEE,3B4^hFrCOL$;id=;lml.kg-]dX0[ZiJ?mZISK"L#H=4T^osPQU(P/T.AA/Nq=oh4%n:m#mK<t%):7?>M!D;QsN+1?+E^>iC(5$9-K?;J%^E3m.UIL6WZ>i[bY-sDtO+6_BDXm1tZ@%c<`&b,g 5XVjH+AdPTWB"+sp#^=hX^'NnQ;o;<7-c_>l]%:O@&2ei68IoJO0+h#Sh"'0C)^1=-qb>C)SQm?)ac!<MIS$K[R*=D&XI6BSA=U@&%Vn*4p`Md0OV`c\ Lf%qmJ#$I?5gs` ((o"]c6J,i:^!gAb+Q4rjk9;[SHo^"&d$@=<^N%e)!AZM\$n=V`_gg:.;k5R8*aOU$&&p/-Y-IPf:j,XtJ1:(HmD"_PfOU'Ao@g+M!s(G[f!<K!rfA\R20YtA!&B8d_ PqD8@I>5DHA\c4sNW@KQO]c_FBO^B>5B('FV0`?C36-&h=ap6 ;KHkY'28PtoM00:m_!:h5AK8<^)O@&27VPRr>s5L6CFB9ZssE(ZfTdeGPI$T;hX#ksB(D8OY[:7_8oD;` ld8QA#ON4+:oi(Q75g]Uh#'YfDJSR "nVWiP$q'>(R[-=Z8T#WI0rWo&k;0<$\9F]B8O5!baW)45APX0PTd4ST^J[F5moRCC0InB)/t7Qcq'tWL%5tX!]Q)E`fN38\8$hGDg5AA:)e9cU;qGf2AG'2Wfqk!!j.SV2EYn6a'_Ors;=[F^6D5B+M&9Oa3J>E-DAMA#[q4::0jp[l)h,:3Y*IVcb/"pqV(EjehdV:&\X&]'f@ffj4P;)'W Cf;_2-C0Ps_tJ$@*ZeV6)LfY[a2U.m6'VL YFAG-)?-D<`8!bYab.GE&AiTj?*V(hAsHaqNHUN&3_M%(Z3.@NB;%gfi0.aH,XVl8UTlG6gAlcZsgYM\7ZoEb+</?@ekq<l4'CTEAqKW`rIU1iJ]_hhm.8Rh$ah0@HqnkAG*R8Rod6s/Ve#ht!ak4RMo`k`8N*3:LnM/5lQs*/^aR"`fKSZsCYd7?#X"p*A?491oA#Ke6id0*NV`c_3lZ.21]AQqH;c+BcX!]XXfc^.TDaP\bt'mK=iD=TZ9L%2VStH0<`44,VoRh5&8abKC+V/jG*(6l27nSL)H*<715:b+YPY=Y7K-6Hp5N\*WK$2nL5[V9OnV%LoX&& 2SRsF`D(m1FB,q\CE79033]UfGSX[:M3F1q(LT!hjNATto:QQPe7Bm.6A0tBfSo^-@l27HS3n;":<K%d6i(5CDMihB`nr7,0DZo5t@?1>FW(OB+m&g8AR1<!tHRelLAP"?FRcatTtlCCTkWM6V3V:HK"l#ofVd]9F!:ga-R5#a]q 1(Ao$.i[9*X1M7_MM_gML^Y2ebP*9kt`<8TqqN@0VeW*8c60)(dJ=Zq#0J_^&4c,;NTBOb- .=D3BW3frn3i!-h&r=EA8*ts>BB`NdPmTd8FD?!9*NHZFQ(*Hq5kc,/oJ efAmpWGYtP+QHa#LqN ;bGd<F*nq\Co"7k!Fn?7'BG"MQQ11%T^ID'J20_0)@lH#bhK\#^df9*=9tWE+oeR$o&AqWe!ADKV%kn7RHUNS;sn:]J"K#]Bl[pmh@eT.1=k*pd2pRs*L5IKqbi9t+hA#DK96Q'fg1'fC.3*h_(j $7Q<`.<`'>UOep`3&Q*:NafN6@+-q)%l=Bh(AjZjaIsF!32;'aP31I';WtBo"_DEk<#?$54O4mOH6YhRTp\oUZ=JTEfDo9*H@I+/A`/H$)PL+EVM 3R4nR1^jOc!_^?`>8KBMT*]QFP4_r9a&M-A/MM%9&Vqm58C;IJPMR&!nXR,\6'D'mFfh(TN+.q#$=k><h8cRE@NgXi.L"X`OrKc4ApGa+ .1o$)nkM3qJN^ FHr\P=f5&kdd`Gg$i3GS@b/(2Jg7#5>T?5t9H?$nYX:@=DEFLVkgA:'j<go`s].(N0lDA-f0Q.^:oE6"^!H2()\A"<9*0W$*7o+U44n,X[Z g2\E,e[d6DV/;`@D`FT&&,":snlJ,Q+3siD&Yp>M,?dGG!AIKHp"$0!KA%2%!d;(#\TG>ULXZ]'24H?Kq-hK%Ee]18#S$nTE*Q$m;[-:@7GI]r3$#bNg26YaDRCdb1H&G[]@f@&!#%]7o&J:RpN"J:Pt5M:2;Af00/b"F.7!?_r6gHYI-&&l*42`PqXHAO&cK1S q-A.dej%g2r_N6UPcZAj'/Q)iMYQoWA!63at](rR8BrAmc@5 g>XK5U;H8nY)jn;jRV$p.%cAZoJdZb0.U:dba+h,[E\Hhc6PF(</$Di?7!U<6-@#i@4h"%0$RL9H-9 t3KqOC$lhECjtH?#CF.Ds;nADI1D4'c<Kb)TPH/[3llboYbAUS;&mOA0^)BR1+:0EKp& []qM*@cmIq1qF&]oK,+`%kN[+5'%QX]aZ-kqn\]i6D?WP2K^_eI/cj%/pA$OI'7RW;:T.Gle#akm0_);11H/o01^BBKkh3daC]5nc/.S6P0DA6]r13E(41ZKh.cOJ(>h]l*!O-%"kg9[A3pWJT(CXae412[=6,Ahng7YjQ<>VoYsY>;?.56aQBtL,B+c(9:4]43_H(T--b#jp38=3k]5PJZc>mN81oF\,V))#F!FO8pMD:$BI,H2C\n1(U[r.G,2."jbEj4"h*G'5CQg"*o-_,o9Yq1"=MFqm;enNo)2me[s@t.b1,006:h*-7kAL!,dmGB%p3.[dh=meVN/,;r/n^Are4-1`MV4rN$"q,n-M0s[K#J=@/X9JFr0/(gle^TC=,-22CM71id:$F"'M4hWk9mU<\GM13iO&/+F'>'p;UlE'M$X)i2^')8V']\)W8i1h'=]!;D4sMj$7fO0=[r/O;G&@%:E]DJaKDVX0b;LB>1H7\r0+C':R5aq1k_kUe<Sf^G&FYW\ n*O5$F?B^ink#a8/QOhAlkDiQZ<H4#J8!YL-PtV\#\M6im4W'^m`a(4G(Z0`$dYfrTiJ4:a3L0"9mR]<,;rr,PJD=lKb07ZoQ7<@tigP!c2UMGq6.6k"18P"%/c8);Y-)?4n`pXkMiDD.AdCEi](X!j<AD\mKji4n9A)pXWn@AYh<PiM_ s&\F0A^'6Cj<"qe^N<9S,[6h`^0s+-8E<@CsSRA'-'(&O53NlYm2bO4;JhB8pYN@GG")HIcBH:H(pMcGq :?F[04Gkp6$A0AN(!a-1CpnN6U[\[#3%[,FB*e80gs&BX$2pM^C6nk(m/$BQY*OGtU%5(W_A0CAm1 bt&4]UX\t)QHE?0Rr<eHQO;7@o8A57QLJ=5?s+4N@AfN%n:>f.BhFW40Y1^AN!bM][3j6#88q33ddAoQ5NEQ]ZZ<5A=(/cN(5@UZ&7aZos:0 pdrGQKe+o!!c !I8N0Tq7N*p/S;Hpcp6*<9ZEG+V%;SWHk%eQ7hU908p$nboO:5E'(Gn'BG4)&E/6C?OMF?ZW`(lq7QCfPF89#`\SE-q2]N2nstM`&iN_ '`f6Mq6&8p+*TI/I.!kM2c)Ibp+iC6Ll\!iB+2gP/7b)?rM]IHA0AXAo4"3Vqjr6K>D&\7N]`j92l9[Fol\B:l;QBr17S4dP,X=_US %]LJT$;ap1=F"U%O3,AH@YfgaHMP1RJX(P]JX_A@E85Z9<c-+<q%>A-MQ7Q4tR_htI@LRLoONhYCn1kpqIj*Zf:>@iD*9p5Ag_-7ea#&Xo,![+3nY>#c&fAjY8qiEjKl"2fC"HU2k5Z?(VE]lc2o&$N].k9o?*/;TZao'g+`[E/gpCbgp+2[B8nDGdtiqU1t)HBNMn4Q'j;b<4k,.V?XIQbon()B8)jnL$)s.JGUo><)]=+#Ha=+dLlZQ[<$Hg/@PD7fAi).d5*Z_F^jk\K`7&9#>W3V'1lE;N!`N-<0-H+R50#A_GJVdB3>@g^XX`4iI3 KU\6*/:BNo^U-YAlY0L`(BS;EY/rHeA^m[]t7^[dMT!-70VfUgS5`W$mH"OL'h5pO2640 nVA[6'rDE6sDJ5;U?[52?Y03-h$jT#6K23$;7pDLR\8g?SNojB!VLtchs`MR-75n.`SZKf? ?+4lTFJ;jE6*$mG4'$K>BSZf/=5c/IK&&Y`MARfqg/E ?[3n+fd&NKKe-HkFVch+[3ojgg?4H [5<=>]Pl 4?Q9Y\4gsUq.AGsHP3G(#^]6nILm<Ic,Sqp0[latj.Cb1$_<'&M;A33B=!?E GtR8J`:*m5AabW1TAR3tA-,&$UO5*-.H8"\IWSJ3A98-RC:'JBkfU8$Je)M0*Z2(/Egs>;9dR)I\sH2dM3UVKE7l2aTN)7:iKG!$PB>`Er)j7kP:HW[0=Ad@p_(52`>AXOcgkr0aM=UR7!KFs8Q@06JF(.0sSM-*#Q-&+Qp$q=JX3X?O`EC4eAtJ7fP^DFRR>4MT/jnZLqnWafK\VL\!Fcl&j,?;aO@WCJ49e>mJ=]d]hD]qml#mDsM4t'Kj9j@@jWp:kmmo<RdjA67"C2OZXP`<GFLql<Cn].q:kD4qk#@AEhl(%f)5JX.JUo;8ENC9L.C*=k7D&#Xitehq^?AX8#W1V_IkZNllg!C%\4iPh>SU=7Vm"A74oA+SAe^JX,<BmeQ'$+h=c6ao'Y]]T]6CgM3dtR%=)F9Y )&*k#PL;s+'H-FD%-70!r;6g-\g!tCPFK'X\#qB"&:@Ge9((AWB,Z,04$^f4_QWY4Ao7C1F.HAg'Vg. $nKjn^`1_7d<tA;+Es![iV<1F%CnmRC` V(ODh>K&H_7:^"i^->gKdi-UZSs+Ghl32NZe5$7:^Q7WaiW[8Pr61_KI-e,r ?%4n iag8!+,Jt.A<aEV$7Z0]#$?#./o^L?$W\ 9`,EHa*+f"N^:H5)UXIq"Xj't<X6n2b EQ+$+H9bE?[*n*:1dtp<P,!^=Yk$mWnArW-UoC$D9N6eie2lR5cX_rV9%VQR52sc#!:dH<<;nWji^Dj aQ+,k:2_[0#o6KMKL,Sg?0l-4Ps0P,Vh'S=5l2@hRi* E"iSB$U:1>*:COLpr_HK$;_ga[H3E+('^")O6n]N@#:;dl?]09dbH4g^pS60c^9!>RF$PioDhJJb14(oF\AbC&2$JlC(;9g>DniH(`tN'>5aqA#3[mT\9(F&!J5L3?F.RU6M9;'=q eV&>Y1%d]5e9?ZE&7D;>B*-QJSr"O*WF\S=c(qe8#N4FJ!7lCIpn69-<SeqIt(UoN',d0Q:T2o;>3B;W^+6l4&K>;^U-R\@b13VigD%Y.a/c<Nhp8[*1 $JgFIb$*V487n$7/1&/.TKP;Mgh!hW))%k*T$#L-ar2':,!Agb'*#'gQ`_E_,b@Mig8+9?fN)lBNUV=2KRA*4fTdl/A[o=b+0(c$Ck=r>[N?d+4-TRjI,k`m.LfE##>#lt27lgCeL_>(Z\W]$a0Oj-f+t5/rnJc+dj@d4d!H(a3DK9lq7 .mUI$^/HTDL[GncYFbZ& R60(<C7NZV@sA$5>hmHPd5FT5$[BA9A"!n[;#) (n3#5oC#q%f+)65O =tR3\(*dIjm5\)WO)Qn+6,D<iLnD.[VmmcH(KXASP?dr^ToW7;f7^hTO."4]P>9<WU2b.bj$&_K5R)CV"&7ZYTa5% f.^TFUrF]P:@C#fbBbP`1J`2a$Xk(/Aq(/]&C1.3bSV%@JoabA\R_kSQq+hH@MW*l1cPljPQ0Ir3+*ZTXD8eP.--*q@m]q?hh>'P]A9OO-V^f7Sm:__ $=L7SgZ ./&`hE )#T,R$mE"Io"_VLU4`qjO)fQK=2fS,2!MMY?9]=;1Osa^T rQ.OA]NZ/<@MWrQ4)".Z- o1,XjZK\3EB75DCpL^pl8aiUeI9p1EcH16ZQ(^V>NiA</,$R\&J9m 8I'qh4l>OBKadMKOl*#9nhBa`?_:+I]1@ssK`%AH&JhK>(L03mPfr# J534:BkK8 ^QD"=&),c0%-^WY1ZmWg8Fn422;M+I0UZEA<@-U'&A/`2D=Ni88)t\+F+`l569P/Z`7R.k=ei2;CLTo:'jGb;"<m3JcL2@NXo/TELWo4K!)*)8i3rAB4BNkbXSVOA\X"R/o!a-D>SaLdBqBHm=d;O!5Aj MCsU(AKW7US]9e"_9bg,s:??4VZ1-6HirJD"67_)%Fh7MAN\S\BDSbY3rmWT3k39I0329e<2o;0`:W:4RMdp;mN)AC+>@=chL?8+XU6t3`iI<O'jjBo:,RC5pMQOFpY)9c06hS%@<"`N_`>e2hL:Y9)!NU)97V@U(tRck@5i+L,r+iA`9@A=MF%1crm%2(YLX&.ZR6IIFZ$tjZlZm3l&1/[.B6Yl8Ug7V5m$;/ >EB4\>MOL<0%&@d21bOK@_XNFh;H[J^hQN[?9b8(QG7AeG0NmSAE"LC>?P!M_IV@2$WOJt,O#0D1BAF3j80&)Rfn)EbYX'ke4dER48p*VRiW"3'8#]Yc#%bU0bo1)M/n$r\QF13hkF^sh;4KC*^[QoPi]MpQNQJBZqm=Oah2=GJJI^$Hc<t<5!3r1E!-!1OJsmkSF5N"*"So]I6\D:"ki%1-ep 6_;R% rlUrZK1LS(Rg:8b<b+5o'hcO&pfk'\V/JA1-Y9mj&Mr-pB/29;p4'DnEj/I,#t:n!;94qE!2eaa8t`l[-&PdfB?BGSSnti/lgIq#<?KpF,N@gn/pJ0#%(GWoJq-!H#gXRmnU/n`,Rl?'9]m<ac@?VqH:453Hg@8Rr*^':?"<m,_3\D/GbMTa^D6A^r&%7i!4Kj2_m?F'PTSTXBmd'mc,:"GfAph/Oi!D[",k*'?_o)_0nb6MI*;]66oQ?[UDag\01 np6W)-Y/2AVn/=aq@_V@8HVe>K\d%_e7f$6=mP\;_QtEX/_J-+F'^%4Y%:n06T]R]^Ch<t,Ab.::*leb06B=aUaWsfoNO,7fVk/H*=-lta/tQB*VUWl6mcH2k70T9kK$;f.Za<<K`iQ[`ND$'OU5&'Z9mf5DA+5UcC[P\-B!h8:=&4-d'^s3k1#t ^"dfn;p;nbf>sh)Y'i_mBZ^ib6^A%aP\sFa[MNb@GCXC/S]<'jB"jG/)^&@@_ADT^bht;?=t":ZOi9b1lJQ':NR@gU%VA0ROb^[Z5 #Qk5%cldRbrb6$j$C7.r8p<Na0r)^4pWN09k)jZ79g*:W"R[\8PGqd2;e]t5M8=)46^I).[CQtVofl@>?.q"pm=Xc" YLPr[:]nh TK-qka^LA5Q=%ktd?W/cK!old>\C1bUIL3LeNoFO7.j+*Al<LTRbLFoqS`QZp`5N\[r0`f=*k?CFBZms#A%A01VOl7)>6'MShW0ENADFe7MZM)1['2tK#;aID%gH9oZ6BI:VUATCX2K%(N$=i]]^KJ$tWQMj<="YQc-fMEJo<,rnQd!0LO;C<Yn(Zk<^)TTF3-$HaD15>dnqdL1Wc] .n@Ni2psT5BK38n@h'%PW,XRq^gH#A=k7t;4Op\]S,e1+mNgj(:9 IEO0$T&X1G^-CU/RoW_O,F(6rN<6J?SB#GY%;c=B;Glb>mm*&XI@!(]!7>sT7&m_iqo/#QNDkj\p8VTmK@$H;(9CWojQ9@ejK;`nfgOoYbH>E'MQ7MT$;nG7Z'9)^WflKHU@:Y4O;5I\FLUb5t7e:gkN"q(EOdOrehq&r!ROY3j>U;iTK,p1sJ7s1?4jN2-dnArgtpW0D+eC<>efRa_Kh?:aZ8$K1@ABgL_n,kgQ:\n*%tW;#CZ1'c)Bks@W;'5P:hg,iJSFcD$P);k=6mh#A:c/DSOpG9./#iTg57o7rU]Nt,2KN4rW/'!gVA"KgN8U]_irJQUP)7`oU9_NqSfZ2`dhX,ctR6T,gS,S^78>W6hiGW%!rJEdqX)#jsk)6(^M#cAp%@d%o]4dgqLK]5d@jg&pt.dr)`$#$WECm[Pp 4Q #0f]At_hMl('aJCsA2S/M3jiG.a1d@c22R-W<q16KsS@NRK%8A$<b*J4S\Ge$k7S<b`Wqb-lDo;ZURg.?7johY_n`@O.gA.j"D<EDl)KaAe%ce^h%jrPe5=[6sJ5(W,&#A"jr4t,mT]k5fOSl0X/Ts-X&\\_KRGm5]U:HBUX4pm29]b!&Bh*IoWaMcA-q,"Acp:6QQ]B!ntcGY<o]iXK()20/,=>Ib3DX&S^pK*qs-(.TbG^_/E/F'_=p;U\Ji-hkMS0:O4.&i'a+9MObIlfMF?\Qd=#A$pq;N+bh6j>5;Qh>$5 N!dT&XSAbADW4T)`/;j,t%IK=GA\SP??R/f9!'E%$7mK\tcioalVe2g_FeSCE)qLAstRl;mOLhksfHc>@d&\h&FsjdS/n\d@aDA_PdU-_%fV>3++RG=qc>T:(0&_G+9U;MXYUK\AO?H+s3D!R$OV]mYT#dE#g_RWkM"q(I\AB81n7S%M!VB,O\6)l9[Cl$ F["h6ARRBHh/At4ah]s<"b?4;fL[9GKmc75:A2r\0'CSjY\ ?f@o]pWN)Lo::Y,-#+jtJ`NA7`[8Mkt5T5hqeAf:tkTP[K_,GE%5A'jM>h3J@h%WG5oVsbDHOr5V9V+Kq?iY7-:EQ)8fAS<\s3WlBPJO7O]$o@#L@.bC&hDoW<#!.8j.<deSSBIlfMlFMSV$)=XP]6_r([V2O\ddm C27IL+'0ifqoH"?/,Ji$R`$!_tN4=Z\^BU&!(PKnsrC8W$*hPSh!JZ?:j5e%A<c"[4f=Nao3gOD:VjotqmB%&gJS,+#-\^8Tp!CWGBdAAD2!,%:H=@[`S@R*WNnRU?T:Oh"Z%) frXRaX=1(2!"r$/b8E!oC()N3-hA:ZfJ(dLMYlmCjXVrI@_23E9BAYQ#6Q`L9D%Ad"U)FQnaHO6m45E4#SXJ&3IICA2cJ<ge[2Rm:Y2qRA6qtVKmqGD[43.!'!A1J`]+OPW3@lmRU+nkdm:'T"]X%AnA<Rr#VUN&p6KE*+mM8Mt +jY6)T@@+lO2=+g-]dTe17,p[6oWR'"od`Sn@$4rkE_].h2mZOqp@rQ*V>/YVOL?[po`CD(-at 4c#FcK-NZ'E.V7+pq,(3OrT$8%E>e37o57[BeTJDYASSD!^;%ob5K)46%67J"l.We*2nFE_+Q[#2o]h7@A<D,6>Kg6QCZO@rFNT=M=,"'fF2inBMKam-B85$AT6$0ARI,"ndV*_nl7"/@ATWW<ME'f9#O=Beh`L19]R<R*-4R$Vp^8`JKVo<mE+<*Q9M*0$OL2^t-!lnW]fOoSca(L/ENf]M_6_<.\3/"Fldg'WiL:?*re8S-Af"tl@:Fr[8DnZ-/U2!1LUB77,j2?9\K!HN7GAGk9C#At_7\mIHZN`enlks.BT]m3?[SQKS_dd53bMc`7f/Y@Jgt43P"PltP7MOD_+h /:ibi:^[i,NV0A@6UI&?iC@hU0iOM8OG(PaF)]Qbm,l@82)4hd2;nqsj@&6sdP]K8_dH?MCL@kP XP_AA37%*a?U9sh*Q7JCo;fi!OW"Z>Gg:k39m(>t.AWg&?f"3>/Rp/ahL3dtB `2/$5?1bYrhmJLfcMKte`@/n ;s\PnT/el`laD&EK"5+(3,l*jjPWJe(E7Ikt9cJ0%Fc@mm4c3s^AaaV6B,<-O/m`>G+(.&:#aZ#9-4LM," NefR'XeH@nc1AJ?![jD]Ct+iFl[%%TUY_'I:%<*,/&hC@cWUg-2(9>91LXW^WRb6Z1Mpp$-:l[ DQi0AoqIoO`]b[G"Vn:+jA;%kO0-<5Bag=g_$P\tZ\Ufl!4Cii ;QkA\1%*dY(s(sSHDMq=oX*gK?G>A!kST(H.)`!NNb&A>'kY/-)&n'UKd',g+4$qNIQOCHPYBJ7!80Lrt;"M=>5X5G$;DHMNYQrdj!jJjQt1Y!DI?Bq)ZRZH>nCk\c44PAC4^5PLIc\g.285(6$?(c/!0j8:NCC0RiF*k?AT^qQatHh0"d(C1H4W8P>>B:\"^Ui?A\d(YB mOnh*JlA 'VqmWe\0q4-=QqaMbKSI45>A,Z>_#qfRJ#[:c^r\S2+6le^O/TCPFI>HZ8=/G-548sSdom(J?C3[$25 @:Oh<;JJA6)#$H'B+`06\Pr)o%;\`#+FA@:D7CMl8."5'AU5Y0UCNL](BA2b`2 $pHjf\&jS4<0!`nLbYrA eMZnU`,o#Q.[: )3-IZ>^(MUp29?DC.a!)r7#h^d,;D1-coAB:U;=))#Ng!GP/>"]q>9M(1`FW0a#Wr$7"cB$>#E  'eDCTt]3.FS0roi2q]J'B(JtbZp-es2]((SleEpVd4,B@X`=n,LT_b+/I;b?K )<6CS7;lA/*qA"_;J:1O=mrAgeP&JekLD(Z$ffEi5O(E79KWOfd]SG@7@\\NM$^nV_B/US&U7s"kM%G'"K!&?gb:%Kb82?&'"*Dt^bXt>k9E'h,Bl94+.Ns=el@F/FC\1-sA37Aa&<4p,BO5>LLD/c2N@01M\pDte )*nCBEAN]bo):3V r8BdgCl Jq6TUiF[>CJND$=UnJftI5^ApC))lfM#&RX*lFnJ'h5c@/WQ14=GCl'6o=;No2"C"JI/TgW7SViQ/(cjX>M[@.K8?RN([-2HrgS4B.@A^?AP2??N`")AN+U<@;BRAOX5=9<)\F/B!sid \]R4qV(INR$/o\<Pk&-gc?iO,5B7njk_6]3dW?1XXpe#RANAh@2KF'\:N*P\b@?SjE.R@::J-L:8[V`gH?3Wmsjm!_Z'K.H:mpQQ?UNbDjf6*$;S#6+C2eItQ.:Iqr2% CQ`VJ7t(&Z'[ZWcEZ9YB[HeD=tFDYl^a2+=Sh!47W5YsN\Y:cXME$Mq_4SE:Yj3_ T*'/>*\m<g[me*gbD VfKt)=NW;/-_4*S*J;Q_(j5]i$Z">(_8eC3ki.QkkFlPkVSK2?HWAXqMY5*L<Q+V:HU=/[P#l*TEt!fUf5..0q/;ANor()L]\1ZR9YZ!^qaJt4dWt$AoGk?B/@jn?;1LDiLXq:qX8Ip`ciQ>87TOE`ko<3Dr-QBPV >cE<1T([B4^_CgZ,4LZf!bt)t9iVR(1kWXpj3-rrq(aG_SZM&O=-2QU37V@gQn@Sn,/!HqiO-gccspXsa1$%e, ?Vf'5=@/e_,It<FTB-]AtMt$Xq0jHV.>O*U2`3mYcqB^eZ+#Adk'>A;.&2osb[=ZEO@^U#:ifJ<;GgZB^o!>D5Gc^/Hq9XH$KVb=A?c%<Oj4ai"%dcm*%<RRQKfJdi#<hb!TsQ$9`kBADMEk^oYa;l5&4cFA<%+]A%<Ih>DI294lh+]p[^cDj?&J/CH>p>,l/_1E#i?-YZ-)._(QrZnSc5?KekMbBPs;]SmRbJ=(P-?I!AedL*C@,$dqDm%P&*/*( g*qmb%q!nn8.hs\;nt!UUlXRVsAQAE*#qaO#Y%E)r"LKQNJ@dW"EfX)+\Xf=5.TH3/>dJ?9W tU9s#&CHsFT =c`3DHLNJLkA1cJ"D>aQJh%<X8.h"X.`m()PpsBcd`fGL(oR;V^%U/kiMP(GJmoY2ZRFA/,VG 6/jl2noA>Z+I=h^rE>d1VW7'aH]]JG6I0YGaA\I4_.$q\b$R:pKB;n)m>%K/0l9LG^(bW1$qiQ\NbYONAA%c. ;:PFQ++0-E5P^s=7^MP8$)rr47`":&$='>ihiFb/>A^7^3UO39<>#]l6N[%B8M$t2jP@%RBeVOYO0l]pOnrFAN&oO:7o Ts,gtoYh7:\1!Bh9)!XOeCHYE%9C8pB10HZh'L-a0$c3AS=r^a67gCNkVht<`c_]f>R4ZAitLW!L;og%CIJ*^T9RsA,q1:c#X`UI`K>kJdN]*A"qD#1.Ua/!FE7e?JEj EGALbU2cdRpPf&=$do/?2),R]p 2D(HtnNsNp-J+k0V;gb6l<gfhoN:'4`=_XeXR ET>2;k$e5o:JBCXFf.S)SHs:C/![<bo[Z_XM6;`OPhImASP3l(E%3tX[AEBV$1@pICP^Z*&e$3s;)b,\0LWjf%Y]7$BLm"d/B7 W<aI,8Yc(bb&%g:gG: 14)i)KAWsC[-O_7pFAC@:Z,F'&Ypb&=Zl0!Q!JOG&_S#&[@+1a@!<\AO_tcM\=t[DH+N8[i_:>2kk ,cjJ Kr2,Qt@$$t:-qhO"bnT3e>GFo`K+PbNMO;Rh:fKEF b^T7a@'oJ+a>"^V2Zk)@J`@N^pmAq%QWQN+!+M+bt90mtZE0 `g%qYf,qqqpKg+tr6`aA;Of*\RbV#Frr=&+-pqWsEFAZ/&ToT/sW&kO_7Lt4FL-UA:phLq#DbcirKJ;:J!iUhKdJk`Iq?!8S=dGd(kA8d;klrp4J+:88cXMP*\1)m=,E9k=hd6*I*90X90`?JA1dXAYfX!D16fdaBiI2gA'(;n"cBp4P\XCih-r#GAN3R<%V0<q2I2WtQn8%:*V2D!F@KPQf[A1`^V*qr7U(D%1C0t hd!_.2J4'jr-]MrGV+bo'"EoM:^a3rR^#fm*eQ'T$gA/d'Jp>5c)Ad)p-E(Kqk78CE#O'\:KZ.$GT^d*>)K3MQq&G=R]"2OGEqP%;BH#9<f.r!D^/1tj[ik8tIpRlXq@#7H8R3rJB;AKNR;68#k&"1O)^$.PB0(p]pN$R2i1>-%+i4*lhab2R3M5=b(`WeqJPG@;KkT,dQe)M*WF>&D_N*ib@0E#,[WS(Ne3YPtT -;'m-BQ,jbp'eo[pBjAF>f#h2b+qRd>%^++bN`P]?CNq2Ks$^/XnGO3@G&rEp\_&AX7XH,7!gr@**7'BiS)pERcqFmntb5'[=Z"c/#p:(E@_eZC:p?kPH=o:1p@3<DV&e"32@[_UeiHmJ0!:O(&qs IY$4-QQAOdd3E[`ZYmEClsS?`EMMri+/A5,= $A=tYa#SY,_5l?`F#.9"m0:5^:WAV q_6PX`d8'eSS >)J$\A]q'*C]G*9fa`jeSZgj2laCfVS/+Rgf9=%S_KB[8,l[@`lR"B[o4mBA-dY!UM%Q2c=13AZZ[6fc1["[9g\"=Uq5Dl@d4n^K:'982?V909L0= Y\5AlX1V6$1m'%]"ERYJPnT)Gl#/Fc<]k`/U.[4;cR[b)j#q4q0Qpc=c$eAr-5V+n8(\DNtiJhPis3:@<.F:[`KrKL8W\i,[1].b((pCjbj%LDh0?H$2Z*)J+*Lc`jQZI`Na.k>`PhQHNn2A=OJ@cppcMK00LPg"L@-WWZ5K<BSbLspU\@C<WdG(L.0srsX8XdM['n=_"PZ^3;e\qYL6fAC&_ nB8q!!BC8%OOH<AI)LmB*?$M%l),>E#s_ldV&Mtf)3DBA%!#?1I@"`-^E^=!X]4AVDEQT#%;70kd_4V"dKX!j^/UfH'O@[*IHC(b]AZ$ZhLM/X!0/Q]Hj*V%k0mI(Y8$XOn\.qIn5/e)B"I]#/Da6V\'O]QkN_G)[I=8'Y(Z_.RqXB/)[MIAq#n& +nm qtG6g<`OU\iKY/dQE6D5kNJV[rJ=8[(S8T$Ig4eIP_Ff),<Y-Lg6  ?7kM]6f@qqRBc#'l&c5+(&:EVl3b&X@.cN75BSO1$;i\+E\*3"9S2"%6p3Nm2h_RA:cej+ESdU8)";5DlLlMcKOnT3s,\-,WoA:6P;"k%&Yq:ENNZUHH@`?1JHR(2d `$:U,WQK.$OS'KQn*;:-2Z^,=[ml^t8N=%6R]Meg+b'GoQ5DWU<q#g([:WBVRD<Sa#N$;T+)bC+gm]pm7]na0UeM'Xg!KICC>`&Lp!cC phI)oG57]I6<N\U0>PZ7ciGAcfh87BP]!`AMF;<5TcIYXOemL8En[ag"!hb]T(1\M&7[4C]n<>X,.(bE"Z=([5+>& rentPm#3'4/>U[ mc^#Z6rV*\t$LgGp3$:*IG-1.25FGebgA4U&coE".Ab+j-&ZR+E*e!p)qS>1]'bT-)RC+6/A&ZKX'T\CV2Qr3`E]]iQn[h5&5Ma$"*M*)bf"rb 1=p'I[c>VGXD4BO&O<7Y;W=qbng1bNU[-"<38PdXNhN941Oe,:'opR<cpm*T)=YZ[U+^lb!4+T:-_3)P(\78hlkojE!!m%qq5ZX'GMA.Aa_GfLITm/*r&Un0b88@Ko[;dY+]\Kd9AsWk'(]r]8A]Gb&^:W;Sj)!a#<UFgJjdBtmChsl&Z.llni*'T-"_Mf#%g_Al8;b5j'rj@S=.mIZ7ojf75;'3D/$*P>3b^,0YF\\+f07p3"0lXp,tKtrIL.0e^*.pf'00aE$R#8W]O?4=0QB3LUr?mkX7B(m;)co6E'"<1lQtfQ@5mR0YR*`FFYID+'S0K,Z(nal4ssG[7IS%s^48pi2B,8 (A)KiNFLc6m=&O)5j2 ld*[8=I!/f h4\G#i>h?@8P#VEE76!^E)V!l$DeRMMriK1&8NgVG;f,X^bfZ8;N4$nqP]C^A\%?AmO '$aWQLR^Va,+Zq/p@aiWi?>N[Z"2S+^e]cMRH;7DWNFR1OOaj4sQ^l*]XC`tZV8T>FWeS8N`'`ZmSGbb2eSFN!\>bDh=Mg:S!ks4EOLh&T0[*TN_`kpiT1=?:k_k;Q0I]3Nl])gbh8Q<Mb\fM!,kf^g0SiACn3fet?)1G!0*8a%iPBKq\[R,k:#2^C8>e[+!k4U1g]>XHKo9tgI1bb V:/`F<Ta-5AmhPmDG^RO5!Qa),VN(QQ&B:l!J%5t/$goAC]T P24"<X7?dlf,@T34ZV IWKU8&4 nOeO:@3TsdT&QDt)-fAeoar"O"t$9i:jHkR.]l1b!B?<60LU1qa*G4(#EbT&g,JK;Mt&l6SE'<*BTRst8=MXMik.YP=&VA jG'?3pGS1JD'm4XXUPXg@KJiN.5r&9_0H,4ed\JW5RIJ^#gOR2_Gf4J!W6C7MX`cOt8)V"8]?a*8#baQ9^,tDU#(%QLq,OPQ(kPA]^`sa3$@NW@5@2C!,V">Vt5e&D/pg:(d.@+Ti`LPWE+W&/"YVOO`C4kk nOkoUl jY0"< %J9d,%lsY,a]+`A!Qd$WR\n:0DE(<M`Fegm=apA<i(A<\scW*^:1j@dAQ-5g$ommh:m*M0tE97_NDO!*HDCN!c"8ZC?_0QdHdR0hP_s\0RX7,JjM+k\>XF nG9G?GMXFO9&eBQcA$Ma3]LQ5RBX""7_De@DAoZQNAZJegBWjA36hDcEt.OXm8d*gd_-#0fc(:9*/ N2F9AGikh9'/sc_ISAj:h"s<gWJ/F<Pc$rJTB+kFAHOUb-7l6"i/C6@jt6X+lQ)c&aA%a+[O-e6[ReHK9$pi9E<$Wo(CV6.*7M7,m8[^7p5A#AIIcVqGHt AJ!PFdJc!#ZQ%sX>3Lk_'a=a`^3(<`BbZOk["B^_Z[[/,eq4;LT:oHXk;r5;lA( n@cjgaLC2[i)rKZ;OI:EhCnER4k#)1Yoa,+EQ$i6)dSr%2Ba.i3: Z6SA($a!gl$/nC6>X0EE_a72CE`nHL"`ZGU_5SWAA?W! (WXtM9Wj$I8P'8dij.S0aU*$(MBK HLH6'U[tq#JP7->J=na1WgXIWFkjdW;1Y/sUn#bTMqen^`7bA>(^c[!Kn[f7p8AYb(N2%5\FG-L0^5"qMVFfaV;sBVm9oiEHgj8H#OYoUjZMNTL]MqdZ!s]cpa;;lN)0USZ0k+_G!MnioBE=e0hs3r-CTIilr>3q]9?JfI)sNDPA#dp;\3rFdLnA@Vlgp74%r7>Cgf\N4eLYHU?3*\67rK]pP cW23D84fAQO=2,.p#g4RL\<&QdV ^;qPsYans`GF=XZhl-GE%EW5^<fLR8Mc7rU-$*iEL2T/ZkjAp&o.scbL;@g\c2`Ut7*/r:\Keo]K_bGOH2)[EF])dnR&TAp^JaLIgA!E^q\*L0aAH;o!`+A6'OE63l^,%c`P_X3/0 -1b3X516_L/Dmt`5 B\A;NM$kJI3g-**5J69q4m:,4kr]0<L1`rC%bH@DlS,]m4^6XAY,A>K=(+(V=OtTqc&:bh48P[RUX/.YKGC]^DA<><6b=Gh2Dq04>^*V370c+O5F&r,CEhV5fK)nMfG)Sr8`i/9K-7fO=b@T+\J+7EJ@6klM`Q4^Yf+e^kXIrNXAGn;/:SJYhcqAr=0shWAs',%1sM.3OZQcJeJI`fO4RV]9g$#h">h=C.AR^)4e&Q&K5,iZ-B(t$:NFV#FF8tY^GHO5n1q#PIMZ_0JrgF[%\I7R\CK5A:-rc-P6fFm:TGqbU_rjs$q+O(I4So>0[ApW!qQ5IQnZ5GHgr=EL-H20@6Bk(AV$0UUF_#f9(6#g":j!<iI!+3'S0AK@d#1A,FO! ;MDIY!d=Xf#.(EVm;^>Vsn&pX)b477Sif2mg^V1$*D#_.DY@_CmmU-8`$i1,h6^8U.(EtH9<m]5og)eJ!bbP[b!QGEpJkP@:bmPkCONM-(-`U]cXU]gC"%Mj,@f%/]*q*9;UYd9!)=Ne'4Z7rtB]b9pj"dpVkMk<Ai)F'=H Bh]=D#&BS9_cTZ]-B`b`F&?;N6baVT8Fr"t/gerd??\<J6Q1bLprbQH\C?&cHaVI*<5>A4d>@k<(tQjjl"\gQa7PArYdrTe6r=Fe=T9cYL&@LU6=r5r]hD:o42!1ARde,?dMrkU;`BbNYcA"=KM)hRQ`r\hoQOAA37TNtXr^(6q9@=N9)j6I!8CJJl!pg-_M;tMdSa2sD)B&*c8t/dY0;+=;j)*-03I1n 2I7F1jpOc(ocb%%L/XUj\s$EE2<aC!=>[!<;]8k#])^N+AlXfNZ6/jO^Z2^!R,"s'd:k<[[^ig6Z6W<#(\l5m0+^GHLN:tD`4,k,D:V*HTp8)O_K7DO[>f!AM&]rN'< MOn)D"o@mK?jmgi%FltcD*0.@,-H(e6!!F<5Oa!Q)A4OHKi=2=NDBR6@jDrV&Wj.p`!VSUb0Gh8*Zjh-X[3(Gg3Nl0:'`YMLhApqnB0#aJC$$_67?8k]:lA:+pqsqs/Mm4jBpTGGsKA8RH@k$)kJI<+c^HbkSX0%Q6i%m;?7J(<X\V\G.lX)qP]=#7?7HPMQA>D&q+P0N@9)JKEX!8dCA0b"8TbCZ-4C%L?#,4$UAo`9IPt"K`Sf`b$7?,ne4fS';ok_3l4HIS+7H,JV(5[NqX4TO0KdO_&'"*ZKDtK30&f;<?lD/2D8O[cWP;=*.I.YV<lKc;^rDL)J(OgJN/e4Llt[QV;l=qRjX.7=!,$.X15V:7[?[j/:bf,_PN?[&7K9+`.ih)Ce^:oh[ArJl(9\+)pUl>;*"3p#]t1@ZYl82b^sjLL,;P)$tJC='b,pm1Cm1CoL1(]URj,HA?_J9;VST47LXYmIq.O^,!54Q4RIsp6QWdbW9CZ0g-5J;Z1i^4bRIk96r.nI.jUBUtc^I![At*:&UE(KjS(/ Jd]<V?>I,aAkEn]?QaL!&MV:b0tVF\$_(<SjK60T/r[q;Pt41mA5qRC]BRQ@pX14>fq__Uo3W'>*p+6%E,[*>T5hJR^FkJ*$#43+VhrK&&p"?K%S'r";pKQ_1qb8JL_:#Np5>I_Oh%>m3;' $k<As\P,Vt*bEObBn,kh fBU+nb_"'I0DD(6l<oTJgP'T4c*.+fp4JsAP^/!;;8Xod!mJ@s<1Mt= +pNUJJb@%VoPc.R/,MS'l?/8OG/H$1,l09FJ('-2]H,!*2d2>A]i&P3A)7WUXm*#ZnF7kU 1WcU4+/c,^ -0gAri,BK K=cYV*G9sXa#/#<iK-Y]`m` <?SYcX!]$%0N^6-<p.&AGO.s99D)Qi*aPR^QNn;XEs[#4RPj`<*i$/LAdh>^jW GtqIn+LA4/bkSW.9MZ)ZRbNBKV_LN\>$DohPie]e3?rjWX GP.8#A2O5-\7"C,KPlP5Y&U2[KlMQo25q.3EZ/#]X2UYU:gAI"E4Yd2`IY%O<$ptj+Y5]LR'G?P^<NsgI_ReKZpmA;8UocDq?Q[_Z2l6O&k3#f"AGEA(!3ZZ?-MWZ?HFP%E@kcCBcY-\T%5'#r>mRdRd'qh/>A?D<V1=tZ)4NI)B*EWZo&jmiXAmqmZpcdMPN0mA7MEEacOQF;k,<!a]92?7Q#=KY;>ch4Ys!%UG'FYh>6K5g'Wo]c.oGTbGS-?^eAW\3VOP=+T)_WecM?5/9/6e//Jf,$7((V@0/%O_k?8A&H!C(gZA$\lIS=bt.=ZY@%!*`3#1(<:>NNP_$?-H;O/FPOsqr#q?B!C3%4*:JXFlF#cLCIjr`AG:B!d'B:ai=HEr&4cICiI=dGf.F'X;M6n5/S8'LkO6,6SRf"?UQJ 8,8[=tiC(UO]J/AYl0_?+#]rgkV$$.dI 7HGbO;WJ8I^^/ZW:jj+m+ZRir%>jmWXkmbC"Z$[TT\)Y[%)L_O+>NLsS-^\Kr>eStgZ#G A:R:mQ9l024<FA'(Cl,B&kVWh\=L2ERI8@k($PEKC9gDV4&.Z#nAD@KmPcgt1Jr[\\6(orWJcH[!Z2B<ikM-PQH<$pmTY\`'3d.AT;,tq<cesEdq78?HYm6@#LLa ]FnE%MAW6'Dp`,]efmi[_-D=;-rB8'DIN4<PEcrM>Xb[V]M'lGW-%sjY%:s+b?o?Oqid<XES%Fp1)RnCg@Ab6dfeJ=tRP()n5i@VE;W;jJQaJi_rNk5gB"LVAoe%SAp1?F'I,$!Zg.TO8r&\c4Tj?V(B[N!&[p`Qe0;b;S$;]A^mMlFXhq^Ye2LOI%`SYMBdf>&TFsJ@HLOL+=1SP31P hSX@eR@61(H7f\W"`mdPf:JlLE\%sVboqP4m\Nq-1j^;jA3521f9X,Aj8 h61c=0G480E30bdNHdj&m!Dp.4OQXj#aaF!H!=VO5-2R)NsdM]o;)bs d/2NC8_'%hG"68'4CP22i5 ID*8>Kok0XF^'mPq6em/"*-0SQU`KfTbIF."oVADl9.i?JbIjp!>4;qd>\/mJ%tM9S^(IBK8CF!'a:/*2^=R&TVHG1AoIgh$;4MMC.sTZ18b@_Zo#F^a'lH%VkRFeh2WYgs>2'$]7o 4)V)"jRBN-OqbfGi5`bUbEG^cc4TB*.I,M<9sX"\hpBYZHZU&@Mp`(t:oi*W:4eUk:j=1q ,E77#5=+>#V]iiI`,A,]$+;aTN]qO^elX5gd1_cZJ&FRjfe50o5YP2'/3.:tN)GPGsWD^3FHn<Po<9t.kFBFP/9mJBM`>qf7Y)jBEs,'lX0J\@FpCNkj$?;b53k3K,1&Op =ktW98o6go'DlS/q$]6qIlD'XPAPmF+52*KkbNsoh;Et'l?WA^MS,cWZp(t5!bSfAhfY-_Q]XtfE,'-9JKs'SPbdC1h*.2MmDb#CcO5ZK4qR hc$;0*<<]G<3F)bo 'As'2@+[.Oi&<\UAp2/fMeA.>A6/$Z"R/ENAd47X+n*=b4Q+FRK00@a(!! leYn1B)b%]n7>`@,nF9q4>7"BE9fLGLt1!X3%,!\R5KBn;AUtn2@2m,"#sBAj`+n(HN2KR7c2Q/&9'N ^XS:_/A'igE2Aj<AhAZ6$Fft3'q+OB(1$aU=,m9X;.e Y'7'NM[0iCbgc&3f-IbkVUtpXrl/j3Fo)ola>G,k@@A^R,I/t:L?DO'U2Prl1NJqr_k&<lnWkGs8!hHDhcll%pi2n[h<GItgs0%5\ZL<AZVMAaF6fC'g7!rRX--,`]K^0V3-AYVLh&(K`i^C</qj6C(geKYFA@/n_<LFFh?pfPeP;eVO$,(]]K?i7Zkk]`%fF[%c7i\RUKTnKcM7]NAd^e3=bpDXtLGb`6OAQ&[<Z5HJ9F^>80fZcK>Og<s-&1HYFbg8i:+=@8TC6GL^"HdhZa@D$#-BtK;.,Vo(!keiM:(oDc,3m`!eK8`/jha2Z&Ch5ohpX1bFM8KJ(4*T_*g;DQ#N/SH*GBlsjtIsQ(*>'6c3$J];t3h6CH,g2P/MT7r?t,TKRN9\;OM3RbVC0bhSX_6F5R-M# Tg!EoD%SYW*1Qb)JLI/!MfTZ5""s:8<fd)7^`*M.ZA!F>Fmr0*Tp7P$FXqJ#%`#=_H<?MT[%;fhQrT,R.=80>i91XEeFU(m9+m2hA%ZW4E[?l`=:QW"mdF>Ps03m<9`7jB""<4<6$-`bCsKjMAMPCG2W BC?^;O17GSDg1l'"Pmojqq0\C^,I_\).2+#%I?.kI##'n*@PSh /o:lPp2Z4b7o0EQ'c7%>Xme8V0/+A[A-_n\L\l)=Lt!%c70O[C(7qZ&Xk_@jh'DphP</EV`'W[cV4KO_1+b_/GBE0&O$\aKSBddD2ne#fjf],/]]cZD!3)XUJj3g7mPPs:L#THo<Z&n4>/i7p^g2br/7boPXRH[Eo?l];bY6T&LrD@<b1'?tp2Efn$Ai>4Zb mjUf9>\b\PdtDQ :AG\H91r>R(6g6qAb$<S#hlo JI:@*8EHoEei9ARh9iB(=.NH&4D5cDr#k5jWaF>7DXRdjt&#mdFFjNoXE&]0FU;,LKf.2lK`7In."M0#RCDI4:C;p):5PNIKrL3?oqj=BUQ3;4 AVCAC&1nibS^kES7a0kLA50\3((0f?85.QdN-/k:in<)tFMAkQnN#Aid/G'-+((:Pf*)lh20R&gpeI7U\Yl2k#r3OD%VKs\#i>oggj6J8"N-QlI4:t=+raJWD%Fj [k"AM^O5frFf[K$SI?eH2b,*H<YJZnt5(@Ir6VDUKnPh:9lsHAn C4]AD&Q`"lqil1BAIW+FfiQ[K]K="X'dM&Nb)L*R!A?Yq1C'gS(Y0#U'52,4&f5$">_FN4iT_2W5`Dk;&ib\_qM+VUPX*#<Ftd(f`XXa]BO';.a61BGK(DaU7XWs^d* f)=8R\0C01IdA(>_o:LX2<lI18nD[aGi/.oBOg(s",&Y]/[.0Cm4!IPP7AN-tDC@o;5--DgBk\kF'WV,>c1!mBV<XThWa\g$m]O!+H,\9eSo%+^'A:iV+#"3f]=7d/^gA?GE6%HH@9rXC+ObJApe><4l/QA=!gg5c!dX"1f/cJ1P((2,_LkH?hi77HZ0I=A:fO?4 ;$FnW3F6sg?Oof1g'GCA$&]Y)..5U76;%d!Qn+-kp0BTl'km"!0[bL%2]?d_Br;oa(Z>qta.#5A& 7P;BhDR&rW^c(N?H$ZG&e<h g$)pfAlGAf;B)gFteIi2E:N9jGntD&QPH*InJkOY,UN?L\/>E-b0]m"^:$D&m5aAeh=a_.]970#lT,`a5A]BVThe@Uk)_8 ZpR+H-.YTY3;1>![%_HdMoDPG"s;(hh?NRqHZt"eroGFR9`2OY#VA1#2g>Fn`]<sQ]!,Mh1Z'3Gofp(K(sF(?BUJCHa)%'=L?7gb07T-&X:'n"3`8jh8kaK,]9IG6\/<Y7Q7q;RkiKU%r-d\^d"Q'6c?8;oca32VQE^gU]<0tsUS7LHp?1kSD:$*-:H?mB[-IjN/a>(`5fS$U%Y(qmE"h Vi40&3B5$.\'V/S^Mh$\P#,Z%43m%R()7^iP$oVJV[p@6-t)n&\87=]I^1L\7Xm$T9cp,j7KZNa<98DU:iHc [F!naeI4_E3A15X=K/?&%%JQWN=Hd/_DN];2 a2d0B4+h6($ 2kUAp^im/nP ZYNj/+7+E>\t@9r<sP'k&JX9 h2^2QD0/;go?MKAsS(<&3AQ7?MN=Y(hX9#b<D[$?'MdqLikpX1?<#JAeA,Al)fG.!]CD-s_Ua,+/LCJ+o:SM*^93D*.CY0A^#B<a&mO[2Mq8esn=W,eEtLci30-FK[YQtMWT54=])XZ;HUZHN[`P59LeeKg4<k)2T&qCEXj)?_&HTFo@r`sBp6[,T3LNn:2/3&kE;=g:.(UH3`[QLes6A!@LRj8:]U,h)=/_'_!j`(\ H!Y:h=UA.sclXI?ASLiA2hZ<]`!HI4AtQq4GPikAtU7!b*@aDO, 4?s$+&T9-69GP9Y^U%#@k`7.hBR5Q:s7:n8AetPr3XLSCs)f:K-a9lQ"Z`fqsi0$R,4t^AGMR4`B5smUM"H'B!#]&R-[8de^6X*:Vt]6ZU5(6:*$TNY_9nBPd^4GTS&ejf5Qdgl!:r3+P.`Vf$g#qhm7W:A("#<bVHoA5l^LAN @=:)PE#&1b;LF[G4ER<dT aaN_pEWe=<WidNIg_Cm*I&3m*%k<?.U8^XLB4il7 33F9)/hf*'VOfP>LReJ6M*/8L>="H34g#/NK>Ad1 \CmZ'F^F6E`PKDjC<g,dB]Rn%Nq@&CU_r_"+5=832 /C`(564:VIUVLcC@;G`2qc>)efPUQ&-XD]o?Eo%(9,N3NA#Z[P\rhcrL<84n RsP^.b+KZHk#;\'XYg'knHL3 gJ#doTCiI<lA(Zt`]X[S_4!d=JjP$*n6NPl_<h`MeAmQQQJ-.p6;-8sU]aAG#gl*/V>%XZ@alWl]r/9b_7@0q/TIMA%=L2AbG,3a)lo?H(]!$t&k?)a?b;gpK@tF:H)I5+29Z@Fa8^58D%0DO%(5564 (&RH(!OdYt9-C=.ZJMsfhMR%ZFUc(Y\\5P!gcVp^<TG =d k!i*9tW,f9'PY ,N@rR*Mt/]GBr*sno2/TmHG];M!7a#UT)53mfKL0Wm=+QW=:$n*8;Sc]PEf@b!.7XL0bg,],2MN+AZ_UUA5HD^:%=e,_A3Ep[p/B`j,lde1I74sV2@(L\_L/U$g)&4TH'`tSC2hS;F=I)=i&m4G1eA-$a8dDf?66rdS`Prp!B;)SlXA[N=Lm`o.4TtiFjSS):ep\pm)2,T`GYKK8P-6Bs7AXgQdpEs%3"lCBDJcEWZiBLm)*#P8'!L3M?,[D6AtH(#Gr`5Uc&=XLr(p:$97R'qr 6pH,a+G_VKBekG96_MG(`ps(p$6`)b#Kn*8Rj0Q@<d/A#SmpWSX-;Y+*p<>+5)\]*)N .1<"i-71jr$AY7p7"9T),c)=`S)N*B6:L0U*aW-HDXfsXVf&a<(l/tsMn`;`[l=;f&rbgcDP19ZEZA`M6]Dis-MCIcAO6c+p_Cjkirb!a@hLMC@MqCs2O`]B#rob8S>_U5OXA3pr&39^o:+e9h<W,t')V:Kr#7),^&"=l-iNfP?7jcT;/ZiA"'`s>i 'I3"4N@<qLlApX^qJt`Vt\.\=/QA^Id:T_<*ecck=d0&h/J\hBn6E`[D3[KW!mkdGI<[=!(1r!`NXLXQN l*>\J7Xa=lJE3f( #c!T]m0R<c$:P,Xh0(nCGc2Pk5LWZ/J2$2,aFQ8'$44__AEApbd)#=;YFi4t$aDo=m-VO\_C,=/'.!,TsXFDNePWVRJ`3;#D%`P7taS3N`rVBA2d?=`[b3(.@KRA82@U_TF^+A#KFeH/#2qiXKa` AB/[c?XX::Q4qemr`1IjR]5X`?\]o-( F]Ud8/Zd<1/AeMX7'MXALA.[EWo"A%')ZLIJgcS[>%].V"YU.*=4nA:rY`)W`4sGkr.ZjqmcYC0gq\QpDs<Jq5=BFg$j"4bQ#0b@%nsDE5Gdd6MQ4hbZ,4*F9HTgOPS[=['&;b<tm$,OahH?!AiR6;.8fL<+m%@H9k&=hLI=Y9V!2(p@>/%Qp5h1>ZaEk$iG4ddArO`raj:VV 0a9Co?8!$SI/:Y'1@hY75]?Ff'^? QFb4lTA.f$Yl90*85i)JDM)1n "UeV\ZcL6WMYrcW7"8A=OK YqMAG+\;q"$Q$C'>(S56?>3A2UgAC#$.EH]?mL2VM;j1kO[A__NaH)etB4AY.nDt0PlpQqVNA`@O>JJG]5joI]sKc[gAJ3GibCf`aceB6$AQO@=hcmn[:%9WVS$?\24 o>I^]qF01Sc18 KGW9[F]`I"A$rA]$6Q?OnpSHiaO5_q'XZfnP:UNHje<=W9eXhr+2qdXobd8)-FRk2OK?\GH<Z?V+jY'U!IC6$5"WL;REHI2kE@>PXt\?Wk`3n?d%5iZZ.fCG#MDi_2N&OObPNm(' SW:B8jX`%fFdY+_'f#)B?:*J8sbf$D8f.?<&Hh-37eQOA$E [(Z6"/H`*"%I??Gn<X&q5,@D!$gSMs/ :*&%b7,-&<;A"Bs3CMP]<&$r=Mrl^`$Gg"Pm/521-C>ldl[&$aZ-6gmUAESdC"<mkJ[R4J_rn+E7O4Jf9]atEa!sU3OA]#XlrMJo,JrZ%5d2]d5Kt<MD^J>t`86-WGc'm0cgT?0g.!InTDh,_;?C7!-SC-B f9t$\^.0oSHA94BgE+A2)Ca^"&sN4aY-`fF_N`'<!^NUk[.05sj`2-7AO'WBAAP1.h--3,AA';bdbNhfL$p+p^!7Tdn:k V+oGCW]j[IHOC9Od!>8''4mTaq[2kH70 i+EJh<,N:0<@Z`dsBKA/E:$];\j-9O5#`\Y6.'F4+AAI*L >.+Aa"smg1e-;U%U)M/>o^#f3*la>+ E/j!4FcZM(9RbWR0'hE\*-A68[F_G?dIbeH!+cS<,-m6L^8Ffa)]!9>E;kkaW%rds,W+a6mDnhJ2E?DU'f0OBb[Oo&>"-\P2'Rc!Ls I0cE'nArkdfYsfo_`.74[rF` Hi:9a(?&:SprMXm4Z#nC>I4SZ3Zoq3E3207!e`N7pL]?ALII%EcE)UcAsE.W2Hp;H9f.6+, ghLDk,_;h T&AP("mHq/_[9kfk(L0+c_kI+X[b[n.99_:>$f.%.56=4%s9A%%'/"LZ^Q)EZe,i%eJmpGE?Ys+0$FUa@=fjAQl!/Q.CH2_%2AX^<_Y:3SJ]rcrXA$dP).gd([HQlTq=]p7/]!LO9*@=ca0/Z3@0FIMFf_siXZa@9.G&^+ C Fsf!VNRTJV4"sdYt1e`A8fG#/1shHkP&:Bo8g,r^['#Tg?tFsP%J''$2>C)+>P`r)'DP&/J95^P fLEpi4=G3)34qS:,XGEEiEqS$Qj^Zdh7D/7C"8KP&(1=We<URP`"(9Pbg@B9-_]NJ)^]ZiS^XdL3o 6ns+YqAs/7/c3+Wi,kVL6IioV4,5s\A-jfBCQXt.qR/JRlL9B:]=&[f0^A(L91H! Pj?F^B7M3R:So;X!PA@p0AmW:_R;T!OU=T=I% @ZS/4#E%;gF,<k>3^kEtL4TbtU?mk;.VSrCA$8d\08>K*hJib__TmH4e!?G<KqO6^Ys`b:?/A"h="9(m?NeJ\'A=6i*'R+G(<"4J$giO@R.dsT#icqri$&Yj 1X2L_EbfKJJDg[5=eaGDWt=A>5SN_49jl!&VAO^s"^ PQKL%5)aA [@#,S0O&p]=6,mKq=J,mAB.<#*(_eS ii#NK#p\H>Co*SBDXiV`"%;o^=4VaGiDdCsB$H@\[  FiZ.iALhM>=p0R8UoC&CRV_OUDI5@4>iJ,%'G=Skgt#hMR6H)Ka=91GU[ao9UJH0Ym]S:ZY!d,-1$1"ae].!Ao&h-`/L"ej3YYI.Ge(Qce.Gn*QrSaX7WtSP`PKoVMA;KN3/?YreI$!KB'/mi/ h^$W2`BjDB@9p_JIrqFTq22\`WQH:;")70d"di`KBZOp"<:%U6/-@@T@:KiYlANXit!UJGtk(.t]$C#o+k;:WA&DgiP+TR1r[W2n=KD.9,<_F>i6`85t/+(]s:7J?78q*>>7Q' (Gta[p"f`;AAsNQntj[<HcSFF"iT%Z,P]j/G4lXD3O,ABJ\L3N%PT8_[='i+QhC8A \.X9$Krtr0WPSG`"p8 tU'AJ#e([Gq21Or[em.EB,"-r'+:\t:ZmBb*&( kpA!:63RTsJLbATN`//D$WXRI7,UIpoJ+jDc`<1tVGpW$Pcr#OHRPs6hbZSTU=mkPVLAhL]>@*^q:UJ,G"`'&/)?BB3]4c1p%P,_% +/?^@oPQ1?7o+ppq"@$J+cK4!GY">?J1'-1fA_lNn/[rmG1,_j4oq62Y?^9Q11P0E5'0'3J+tnBlP^]e"0kN3Ekc1WonI9-qsMs@b-.'/AACX:FY190e GgVY!hZ+ Aa7V`Z_k0E865">AW=1Dk^,,nadpT?l,%$1UUUqnh51&M:W,(UFc8Knc0ULMJ`f8h]Pb><?T;qgM] pUNi?FA*HgPa*Ig6rC W*>T*i_Y$RHG5hsO 7bb gM/A5A'5 5,*;5S82DX%QmA5fgNi/1&P;q]dsNU41[#D2D^Z:M&[;0>b\:7jR*e* _H;m;@09TTsFcjAt-$H?DmP*]l<i`33Lth-ObZ#[_K:E1oBKA\U%ZRW/$HD3JrZ$M-%5!t<7.Z0]pM.75r+4gI;5rS?sXMr`\0Dms:P]2@-S@b7hF\ N\EOW*Djph-em`ak,Re(UkHPWM1`S@_8=pfcP8ZF.\sl9LfGbh6r!*fU Y@Hf?V<BLY49;#"?\^aaUV<$#)%"2a4O'aQ,IKl.n;^dEAqKdE4Z(HOgOB@!\-AG7!?sUlS$?.M)&TW25Kia=0F6!>DaNQ=><7L_aC4oAT*BE50p%_nI),^WUrm>77Ah65?7lQMn<"4@nc]oi3t-A5qp*BD@e'&XCij9#C.FZ6\dt?YRb+^2EJtNkB#o$)'-j*T;Y!\55BHQ"*"fMtP2[jgYr:N!ncG>:B^p=+AK+8_oOY8Gd/%R9]$3`o'aKE34?h>E9q%iIQM-+L46?T]4U7`fUoR!'Wekf._+*ED9<%CIS:^tD+/dd>0^3NWop?Inj>Nj[%&qpVWQ<<'dAhmO\pAECmd2l&?<e U#5.)HBCb1A-KcG/MVi8]>2 mDI:dVSc!3[<EGd*YLii!/6_M:1t8>Z`'!%dlD@8pAKZ8!mkb^^kWP[l.[7\C)Ut\hHaj,H;QPBdpohH]fdK?O.A,EX'5g-6 ZS?]! 3rTg@NE1_r9>p K>[;D9OjYkX&b1g4#fGP? @VHt"HUY@2Iso4nIZM6TA]&Uc]!nEHLj2[@dUd"(f(l!VOgneeni],`S)L:dL!&h2`!,$F,=5MZA4(5*0m%#/'iQY 7D&mN=2VB,19(_Rq]Df+Y!\=HGTK:1J?rkOLae^5`JbE9dah/X,k\]:A2<imn=MVE. M/HNTl8g$m;($GkqHs&f$HhGKOfe?+A)F:2^73<l9KSBWWr#R[/#JXY*;&'R`Kk/#o9B;rL?Aj6p8DIeFmGefh#KQA'@SL;>h.Gginn.j+Mb>EXl)Xsb[NNF"Bltp.U=0mq?THM0*nHSblADA&aHj#s#Tf13Jt4@!6NKoK(d5.TLh)9Zneh4)7i=N;Ns?BA5kc"=Hc7gUeX 9spSSBdPO(,JX%a]"Z_fAJ!:"Ds9frG$$lIrib./&@O%f(/`P6E`3T@e?Tgo]rbc*+5IM:H8"GN"j"Ti#37eB@"h44>+B"gCU)eXFRsTHp[V/&a QO:W<^A$_:tU<b4#) Vc[$+>[/0"2>T,YTRNY Sn_@0#m\3"cqBtQXY'?Ial2BW6nhIA\cUc=c B^!d<XT^L*`eK"'/$fD(;\=]/OUWNB>^W9^_-2_/qD&1#nst7C-&W03D>ah.%AU2(Je.AB.e#GZFFZRP_GPM#E dNaY 0VP1D8d.hL-%'UnXRtLI@YE"@q"QSJ5*<S6HM31gL;leT&,%CIVCA<0o!l%V+.>.<l_^.0p59j-c,/D(PGX];F20MbqZS/71H10Nb jUpp<,XgB: 3]?!;]nJs]66fbIH^W@Q'>1Z&LKison[,3VDs[^MEaS]Sn[35_.]M@DNso)?sOc94@$QJ&533m.$k%T[B?%5:!;D95dCA<g8R\ U\YU67Z/O)%6r\WpY?+3RN+$c] 91:cqN'9s[U?I3^bo3"Df-2+&Zp*=A$O3[kn#a>t"f8(M/,$_8@4Ng[TBACtPE600l;0IMBA`e;JD.6+d_!,C7X[3Ap5S+JkPT-T>@p*HfGgC8G8l$Gt&;j qFHG47U5rP;'A(8RiEp@-"gq85#djA?-M8U8l`BjW*7"o#3'\$dI"Da38TRHP=P=b^Wq0LaaA]%K'8Ykc<M'RE1.ZAK=cGBNZ5Q-ehe`7C/AZIBB565C!l^AsDa-_H!W:e9"//Q23bDZ<7<N;/8,s5\C;]dA!A6*5F]!R1^_(jVVN>HJZ0>RVokpZ#)k4 $Ta( E*Tc`dt_L%h2PhE.5Al1Qj%)HdAUd<e1Cdhid2]iBZ_)Y&3(Vs6!.kH\E?X;EloK*@peE%tn(n-8YnqG ]c3_ 7];d4;IWQ8\2NQDZ:TGXQA<7n,eM!=OH6N6Zd+`j&PR_??4^pH/Hk]n_*<!#RjQ_A((2N9Kq>@.S4R8'+U'p172,a1$&m'*N+8iMb:A&]<tDCi8/#cSI\a9V4ai5LalmGl^ogSk@o2VRqGG\[8,@&4;kt2O2%qgLmo=D q;O )14-B0dlr>JN+-=Ad,"N$NbM?d9GjD's27\E<@s&bG1?me7&qFJjE?g)-^fUf(SoF1K_\<l-"OTQH`-+4UJ_n`D=m8nTN_t'3(Rm!*A@p;=5oH"qq4B[O;qM]t1UF#Bpla1KBSX;K;<?]9ce_eYJ;\1'*I&lp.jHTAeLc9tI1g/cQf4D_mTP2_lsaRnesN;UcM%GQS/Ctest/sun/net/www/http/ChunkedInputStream/SCCS/s.test.txtaA@;pe?>W!jN@`lf3h*-Ud%8Ua!AkXGOL%U]+4Ol'!5J)M_!`X0/T1,N^(.SC77FpSiE_rZ^N*g5Ul:XIks/gDdZs70+kKtZ/sdg(l6mE"akc.1'.6) OI%<l`Ea/YCkJe%/+MrAndHi4!CXC>Xoka[%<;iI!q<$n0[X\X)sJ>:.4trHQF,< =UMci)!lr1H'8bAc_m\8W7C0[fP`^sZU0W?$$.%XAB5G<%JTq#0L7OC#F"3Lb#eC?XB6:[2%PM;S+e6!8p[lA*QK7Ci6E)FZNRk'42FmIK"7$A NL!DG0!ih`'L'-@jH*PF0+^e$4336K>LoV!'YRt+!IpKM5o7&]JRKrL  qaLj\W`;_NT >)t?;[?')A\^oa518(VaT5ifW7i2_DFA=.XE-R%Y+TWiZAQ_**DS@<6]AtYN3qs=;"t+ni@$pS;*K)6BAta'lcX6kMF2Z:H:<sDr!kI2UsDG8"e&>].7)+*EOFhSH4S;R7:QU`N>c.S9B*o6^F01lSo\/NX3nd:7>9Nn0! 1Jm7<hl`RU;.M:_j%0I8 UQ"L<++5*<OgN2i&ckKCBMBP`(i<rapC'm;/dces:fHsZ"pn;n_R]e!FDA\Y_1CZ_j8_ONkb3AJGAO1)elqE_ZPp8E0Cn!dGq#hqH[gf:t1=al_H#OX.BS0)`te92e0:.1m[nN`/1Fd#c3'6J(7eCf8g^$ttjOKk'fiV?&mR%jHYc[teB#73Gp JFp<a,K3._$NBH8i&<?8dRR^?jh*$3?S'.kmCi_N`4'_gLkJ/Ag#gl&3L<i('OhGXmgsC*?$7*EJN('mD2LM27N9geZ[-nAb\&:rGJ;*+h6C!tp$Ys("dEZUT3T.79sh"%Loo[c3ajg1SJ1NVnZsd/ HoFS(eq+\/bI.&ftd*gd[,#:;`Z%<M.:4&l1&aY2?'_A90V^ahK8W1P!*CtA:JQ$L417:&]g;nnfo\`de080A!dBWZ%OZa^1-@&Vf=(4OSm'<XVgL&OUi[&ci(R'<G0iX&V3.l.a+D]'p,cJ8El/8A%_8o)#3G#&F88V1WZ-)=m.D<CGCrNMG[CB,m2<\1%6BV10q46LoQ+8`LBQi[_sP]5@cf"=/3]]0$&+3q0pF([9(%bA#mm]fR%"$,Y$T%JR4T]^p=&e5r'<H"ra,j5T W$opW:i<GJ)^6s2'oE-W'fiPn`aIU*@G&KSbM*NKAeFjf$I83:X)tL*6\4(QjqO"F[akAH];)DO&7rETrNsR_MRBhNM>c8X$<5`jQ9,r;qNsognA[a*D2sp5:J<P#?=K<pO3XA>lS@D QI+phUn!m(;kKD,2k+b`Wh\M3+1TY(, mAs;!2;NTN.U^ /L2%D^'L[QT2Q[;4OJqK]Ck7E[o2IM7CXBLW*m1?#s$* H"MR[3R:[/.gC\[T!`2h0oWM]*&K)&Z,Kh(JB1&.eHq!N[M[AA$"Ee"IC1\:j7:DPn/h):XZM\OPG)o],.9]NghLT$DA#5Cl+I# V%t[!l9GmT;)8AOiFEXoL^(2'AVZMN#>0;9L?,JF(gifpJ_*pOHQ3o0:dC>aAU=kJnrVq_:;m5r9BJ5Y)df/`3nlE-6e:^i!!7@!b&&cK24pdA]mdr(%hi@YfJD1YJZ(Ddrj08G:J$iR%o\o@4aVPjB0h59$ek;]W)hK1B1-(^=.gD^<1Hgl8LmF9M*e:B5`Zf9!)IH%8(l +VXME\Bb>IRe8JEQ) XNm9A8j5.Doi^+%c&l;N$LXq4]U/fkm$0$;r.q7aX3)I\b[`RhVg\&@]Q.n/>g 70`Ugc7pRQ*LplB&QOro5!!g@8HMZB7@,8RtoC01JED6o5:l_/e'Q(7hal>EiWOh)`KnQh+h?5r912!?'r5'b+(Y,[Q'#='!H\( _`CBR/d;`6AUDN:%d)@n`Ag[,#mPGYWrZ]7?(NRG'Cl9$oCS@^WW8fL#po4`[U7&;&#MQ4l9T.Pr902kA!LQ<N+o4/=.N[=@dpWJXQ(U8 ks)70(nRiF&HE<1<[YU9Ef/ 4+W:0o4]OUs%@tWD!+Xe`%CE:J9;As:KGch+ORBct/"^#oRJiU(*iYS`%]_M;L#8f$N!*,i4DD3ed'P_]VAg4 oQ8QeV.h4t(=':Oc,JYWD\Y"?f1ML^)$oh@k[O;AjZ:Qp[\/LKUH9M1?N`/J"?Kih(RN7J.$.]Arg5n;_M8;>!A026pHaLYmq2=C"A%pr1rIoJN:ZnX5ejVhokNR_#X;5h&]m&_<H) f,#*!tAX1%mX]W(\%!('#QAFpP/nAi7U8Z$"3i:s"2\a-f r7D])pAqsO,JJfT9PM0f$`96Vce6jT_k(<Lj#$$=G\U3\gS1A.9=K=#\+U.;SY)>Ckkb39/GjZkTm)8VkLZHmj5%UJ#G2ngHtb([`WTN$Q+33HbF]qfKqUmRZ3H$m9l6*G06>+h g^<fc0`X7Y_\aNE]]X!`\pTN9=t:br\LS+kiB7QJV=NV[+E8H<,n\B,*N4d+@2ne+A@ )fq4\\NZcMne*\a%6hFY='!%ZOcneid>`NWdnW*Cg4kkkteOf*aOTRrN-:\e#%2m^87^1[J9T\#&ASQI9[O6gha2]jqa Id?:@^8]ANc>@*G&.(W!%J0?U\FJIrV&_CKVR))Gs@H=0I4<i-`B<OGk)K6L*"Z;MYqA+n5,0Sb@P5VLoGcM+/%\_c%-+B9,@+pa%R\/GLC2 _'cH/oj3lAP8lDp2?C.X2.9Vh05c@K8m3/:%$XI%i.1jr`8(rRLm<KK9C=5>f]-MhcM';9"l;L>dm-)P9fUJU@G*`SE?AVGn>AkA &gtCe`Q_-Y`I@AZtkJq!oD\aIZ5H(X;g<O5U]Z\hpOjksfb aKpH>9K2fds^;SA%_J"<dnF._00$)+VG:IR:rUNYf*?e\0*KBfR2beA&JnC7n^(b[*g'ZV^Ah70:!+*UO?pAPZJ A82GEHfAkI%f=5*?`,-<Z+*@k]F3=-<O4lmie(C\:#n-OX#+-l3ENgb3W=88A88&IhM?H<5#5:r?r2f8+WqQ?B@*rUV=DW;<ARrQ\Y)TCX(j,rPW8T) PW0_h.b:,&>Eo*"F+F41H,KleCP717"L69Z%5(Ah*j%:q?HH.maa@to2VqoQIm!5CoXk&"Akk>%/['&bP\X']n-A.)q$1OA_9C4AqpW%f`U-PrC< M %6DqGB<QWm7X@O!flCOt_B;2lmK!KgjG*'Z`_.:6_9k:-"ZV?+KZfg$<EYIV<'s"&N5<m6ok"iFNPZ3WJA1AJ*A]#Rj&pC=hQ*?2PX7Og1<B7_>\_bYLtdAd)L$+4'd+6K/.:ANU.5nk<5$9fSM+,PIESS]a'Fn"=*qg5PO-=bCW7EhL6/1.=hgF.JkE_GPMLs7/2WhW#ZYGLY\Y 'UTr;M7Z[\e:JIEAEjr nisP*ZAD%%X5<U^UZAQthgV]=YG:R>bLSMC`_0Vg>hbD]l@8Wj,;CX(K&3XT%tFR<>F)'q*#R[bcS7Rke'E>_6IV[g83]4@QT,&,. ^7K>nL=N'[,Ka`2s4gerT?c1>+%+T9E6_""$NjT-]_A:C,\O!<H95nQQG>N)oLJN+cIh>7M9P;I8f7L:FJ`h[$88Z#".tae"1(Kk12CWL:mUi@[/R^6[Fl?`m89[Q'7MIKRtbVtq?jZOWADLb)5LfY9NDQlo[I'jbtm>1#s;n'F)J\B&X$T!9sH@4@gBL"KZZ3lpNV*pm%E,i]i5PQY]K[8M8A02L]4.P_8!6oBbT1e4U9s+LmG9BX1a1SoTJ!RArs-M+4oHkM kmbd?dm^IE$`>fCid0I^j_FA6VAr11+Grl$h=>6ptU>V.D$-Go<;AF@[>3j)B^`8scNE>>Mn-B>,d"H6>3]6_[`pbI Tli@StiR;]&^BmL(.O&<D$)U'*n7+D]7<Q :G`sMgokVOLI[nq#W 6D4.1%<PE/@nAYlgm& 3hAt_NHU&NVZefQREB6s),R:I% d_;.TZJdm3T@A<^1 >ll 7T:H4n21BRe?`b,Y9@G=BC`3%/f8^#S]K,AJ]Cd>%tA?@JhO+3jjb6mg.[lFKH_N54JI^7n+.R9()PAAj',,kea\.,*heik"i@KE_Wd,=KmhG]")2:_[JOp,G[C]tGs-d=!_7L_p<MA5,rL]jb*?p1cq:S$NLHAn)eMOLqiI\PpeUhSl(G^-4H`WVCG<7]Vh4i!U_Z>b\'kZf$1I'2"0NlS5XXH\hW0+tL6tIa8gWqDQa6SWil*jk4V31KfU#h!L-(2kYC=6RZSMKj.M&W44@Wikh*,8+A/k=b8h5/*O^Ei T.X=b?\bmFe4p =Y\%/5Ad:(39>AWP#ASmINmgl"gP8&^icBi;B?3,qR,UdC*COaV^0r9^j'J/g1'^k gr`W+8\reRBgta9P,Tao#^njl!.aR"nT:YQMp[+;sLi9m?"h, J.7VpH.?LB&'75J%9JoR&iS@9[rK=UldXCCraQCD_O("f>ahCTF/-Pq,e*QC7HO%sAF9-@XEV5QAft?fZ+]j6If9?D/*Xq,>H]8qjGaZ,4coEai+qPAnrsoL5!OCPl#OQ2Qj9SNTT5r=@-ghrL#+Z?)f9Cn\^+VT4['%"0Apm \ajn%s;She/E2cGUe6S7HifFtC\C'f$Drqhgn6BknpXP`&%lOi=t-aD\j.X/SAW)7AIZG&UWi_(%A! I9pLp8hgsS>;Q;rV5oG9dLDI1=[E9K19`__]/68q4[nWZ+J3Y0X Xop\8bDX.*#el,[HVfpa#`@JL-`dp)[Tk#.:sZG[J>9<e\W=5V,lnp4i,<g_cmqV2O;)W5R`64U^=Ad`f>P$:LU$DZ--9Sk;"PMja,,b+r*i@qMY*07mWpi@@c*@ G'%setr`Oo i$*<)K6UY/`X<tP2qM,;.An2aS6=$B86<"3\3!731(Y<#tL*X0[B+#BEn%F6lHP7/K$p6 bH.PBt=V"Hj!-T_ 6@Z=drG0j5djnd'BD,"*5],!!W[4epUO)E7\jdeYUbPAVq'tY<R:EjX0/EnMLIUffM0"TB^$XPVSGNnU5K9XJs-4JnEsr`@4-7931N%+\gAh*>\3./4W,<S/RRGEA5o)#Z6MSgW<0TQ&V7f;*dNpn01YprAAPoFH=&1Ta5([9[Q8#D)+Xq)AAqE+V(Lto<RfAJ,e4/"RCUgIcY&g,:IiCP&i]?p>cg])P.^>ENU4ZbY,p08=b9KW;06emM0r2D]rk7*eq>]UYAQC)68bl4>opCE\@Cia?Yjh'DNB5e!*%JLf=/:.eGj+P4?DC_Om=IFNsJ`Q,R`E9*te+:d6sR8O$k?=rhKA_+]7Z]$]6aNKc[mmE,:FtHn"Z[SU`r.E6a;'n` .6L1QO(!JhXaMIO@+Qsq)'+DD-5?B4d$!Oqb!;,%/c=+I5tW,Oj<^a?%TD:r%f_9U]1t5js[JC>f&O_cV"rIgiJs^,mD?<?a#[6G(U4b@q`T#6eJ6.Ab!M3#lmO?hsEZL*(dkZ]c2=tLk(,oE6jHZt&N=UMKf'-,$$)6 #7**I>g(;(_GAV)i\M)[#kW''Ur!O*kP57AnnHY7[47,R[&9SbcXW*BVr;=mr8+_U,nUr0I_r^@ br^=pAgHqka3BEOph67]1U#"j3567IZTC*`oGdO21Q3l/V:m7$KdVE;bV28[Z#G.F^&cISNhZ82.emT>oY/^rs.//X=<$%]BB"528)tTn4ETK _5C_IZm;"&."APR@,;=JGk6"o.[?<%Tq4S+9WO,Y:aB#0J<DfKk(5b#5sT<s>LjW0#Sm(\nr`o/sP3Ql%&%j&<>doic^smX8+27 '4\1M h_0q6)99eo^tAm^GH!C'QF`e5r:ns#*bFm7-:1 ](B`E2trob<6e`^FeI\XUA9kMIt0'M5)T_IoX5pN`2C*E#\2AcR-Ns<Np*/%X WAd`q_JP_gEEM/1(Do<C8XgY#Dp<Xm/%LQ"81F5=N2ip?Wgm>d+ pqo5=;0JsKDQh+'kN'%;"o%:ChHIN$R(KD5)A7Jc[eHBs'!C1>3m(-fGVYj$ZiX/Q7HArA'Mn;8r.W]i6m8/f,>4>XB@MJ!Io(o'T8A@s(?h`KbIGDOkMW_XCee:lL;\#@1I:YO8,p&dMm]#h,*B[o;-E%qUt_O00%l[_BkDt,Wkl8g\6@:S#a302_O>dZ>*>8)Sat@-\/Z)ds3.<cK]r=m?rMJRU//=EbSR$cY=SD2([/I/X\8,[noB[3;ors H$FV/;4C":NeS_0Q=R$^cai6:+r^/&Yl?BQV,?edHXV]5IkLG/CFp[19UpnD9sA=ALs3&8WJH-Y*r>t6]-a:eLO/0_0tPT-Yen9(*eGfRT@F")SfYnV,$?L>%q,A7NT=/k'oh.kI9f.4kQK S(%_X%`:"%g0/]-iEm&[U\ARk8N+U3bl4(Z]G$9_d'hbSoK#bYreD-cQ"]W1T<lE#l1]>26F@^WsI QV,cpI.<WPTP<L0AWn,X.8N826l+S`=o^_M"<<ALZA/7J`TA+CmW%=Hpp#G.LQQ7,-+d\X_;XKsIh:V;?^EJ[CgDO=W^d5[HJX^sf<MV&9^EGckgbcj>iGi0/^_H5W^PS<eaIa+!`I#',0+8EG_45qFL6`VqR<?0'<+9K#6@b1iV5lT=n0;")M_As1G#6s;+SNtAoM"@po5<'RV))KZnbo#=h7%Kt1C9glfp7QdoYlP#O5<ne4nA`qaYG(p6W#-<'koFtAo$aZ/iWiDlbLFj)hl57(eVgAqV:r\VX@J7?Q2dK#4JmaK6e[AKpS\:Yc=Wm=Qc*a+n=HP$8Rca8V4""'\Xqk]Z-(ER'AQhAgs'qL4b#R4#dfJ9ZI[Ml^+ V5Sgj&!)!e"R'qLoig$a+22Xg$%Ha]aIbfPgUCH/Of>etF:UY-Q4GMPIg:1N-Ol;P#iQo3i4CE.]eYi!b.HPqP8?8rqMK&)%ltAtt7I[2Rc,.F3()Il`)9B[FH0NMiF"imOiBAAQm??^25+I6r6eonS@9&nM5t#5HMGTm&V?EMn(#^6B(X%X_4*o&["<gpegC;NPVl<q!n^mh9(G;!9A44i$aG B8._?n.9Kmt_Zj3VmR2>iS<lhfLWQ"r\(S.,[FedA P[:eI.[7%1=F9feY+/-pqX451L:lO'FDF99QQr3 N?7)e8n=JR*B9fd'CSUR],Qm`e@9#bgTe$TNn;aV6#'!Fl?D%QIa&S7'dg,JOJDlp@ZBl;Q#_-Tg";T. AT#NRW;.50QJIm9aZglf5YlG+?*"h7hZ)^Mp $`9&<2X_i)"snl(JEW0[4)D9A*/O].#e!*V`YXIe<;[*W !UY6+;+gMZ*Va^Ik&Q;_`Tj+S9S2b86$*Na;?ial(-5HWQA'T;rp/kbE/#9>mAC77R<pmk,dTJbl*l+&Dt4*$5l+L5Kd@W=@@r)"YYeK)RQhDhAWtU;jBHjg<n+XE(-4#rZ/G*/Ykp\nE;kb7JZ WdR86< 8.V=_O<HcE8cdW!\\&VFIM=K9)ZJ37I<2SNB,K`&9FOIdcZR6/@-Ykdb-hXdSi,5[#gb(t6Nc>7$h<(k9T(XHbMA7/&C:WHXsLIsj:_JJ*Pjpe$sh@tIp:F*]"#H8KFR=QiEorEFC2VZhO'(\4^C9qN<UQIrXifg19elc4/Ebq;8^U_o9Xp2_f(SMKRC<8Y]#)eI':0-CiAtjdVV#kZ%!3Ja3UftM%_[FWt_ =*X7()b^A7B]M]dog.cq;b56+MLVUB,fO0<,>Qh,rjGm8[JAmGAC0V@=G;mMLn%Va\ZK>niK0tYo9E7\)kK\U<#6(oX1Ngcf?Mo;dB`lpDI9fVs2>#Hf>LXnq7PtYp[8>:NaCgFI+Z@#As?kokS9%.00\jN"UP+F9*5dQ:ph\)b]Lr*Z:E)bkl q8k1L3mKlc\70&ZNfp7Xq&3]dNg@[T3&/p,id;XI54:&`jOVh]U"Gd4Y"gq5)\n4f!TN!A#lCG:4NV< ,%p`b<-4q\dt^n8b&lpgM+dc/HXAsPgFABAakW!5h38tHVne0prOK@GV+Dh;.A1#;WF5Pb &)A`Has6C#0[TASJW&\8JYpDTHK3_DE1RTlPjRrcm;G&I88C2CrFY'Lf;8c&sr&pBrTSsN-&LTj%\-ct[k^\Ro8JPP% J;Pg]p&8C7`CRLg:cd+T=L*p9VD+'[R$EPM"iniN=s(57WT0eU$K:l,;rATGAKKE39d=`!N-VEA&5[b!MH?;.kKP"XrkJKa-\kZ[SLD5VO,Z+J_lNp@2\HE6^^NO%l%+D0^c9>j6D<\'V;;6[8hd4)2r@\">!pAjXRrKW_:hPT*039!&)D^slWa8AVt35M?6^?8)XTqI*9O9$SGsX!cbr@t!.FSnIGf"_TA(FO)_DGr?Cm"*'hhOkF)C2fiNoDP8YCIkA!l0gOG8bCXsn.F'3=9#(A#r@K@Uq51k=@_,Qmf4;^p7XqnGH=0h#]p](HJ?Xj[>r>?U-4ZH_iR3c;LenPcIF/4\*.ORidj\:Amc]oJ.XFN-<es"F#Q3IA9>aNP")GnN[r.A9qFK;Uc;f<$%X>U+eU]\#pj=Z hqWM:MTq$/&N;eS&<8TLd:&Ab*r$I`^Tjo9Vr=O)->.eWoX67"jKGNfFA%?q-'EK=8g'_3k:PMOEKE66cTU99+#(D PREH#Xer)2ZO_:4H:'/d Hp!I)nqOrglfos*[lJ#rR&]ShTa)$W;ZKenVk`)S[8@?B*'3dHLh$9&h*XmqI]Vk#@AZ"RV8n(tC#LlbRUJ?(hjnf)ZtlUY[ sgHsHKC%1nREJFq+@D.nb4aA!9pS?c$#$-DA*6GQ568LTrtQOT79!lk2d F<V \=VL),,A*r7Z`\M8Tt-h6b"kK0iYt<3jNM1@,16$2'fZS#6XF?)@U 0paO$6SGHL?aq:nOf1 F=\]]8HI1qMI^MVRTRK8:rAMciqAYgWp-;V<*eim;N=!c,ICQf.5jD(U*Q"s9mbb +kppVO`fBYCr%5DOEt?.=8dQ,^JA)po"`]Aoc&dVOHI"D[2ZQ&4LUl:-OA-LG.k^Yf0cfJJP)jBF]0;QV_c\^J[AbN6.t,*Ya"nlm,m%$:i(LURoO=R7C=*pS=!=:El3k0PA:!Q2YLAiNd3OhDTX>Po5@"s!WY7q`=s1(Q^S90M#2I/3pHgkr=3IlK% 1r\_'N\1cEU!;668C<oAKN*1JToC/'IakSWG2lc`DA5E ^eL6(#RcT3"c,Jo5EJ&(9hWoq.];E;6#Hh\l5*es\7r5h`O*&,VFX>"1-W-JJErl:VNKbji+2SUDcdH0\3kh>c26a1h#6$8AV3dCAk<5EbS1Z 4`1CE7a7ELnOsLFXTVF9S =N$7b4;a&,7cUY2hr*P]nX06GrASL`<\03eZ*[lG`_k`i);at3041D"Q$`9L]YVZ)Im)IX<\62,DmYMR\HS"t?]o1:NBtH=[:>b#K&Y,$Qa /sl][0 &?pbqX>nU?)1#?jkC0)^$T;OIEGAQ6RT>Z2+')DgKA232na)2586_o1=A>?mBk.9\J@isKbA6//kpEdDbA]pCoK$f!%#?`e;Y-;d[<`&+=XS\&VAoaFZWlAJ#N\)4E=0tMCMKXk$6 Qd<#5@rNCh%7bQeAke(c)Vi0bEG/"8`maPqA!RC6D1 ZH8ME@A_[flBH_CGObF\AAL];j<a$\sCpRQXhFHJ=+IQ'Ap`NnY?@dpaXiO6'V'9=]XA:A^a@dD&9$;GmjRT <5BcG=72X#SW_-jm8NZo *bf$HDJT<F99b[a`]5`Aqt$%lr0[-IGP1m<L1tElo@J567#/\[)q9J!$q0RcS:48tfhg\?8I9B)bd)qqZo-;O$?! GR6O X7E[OqO++"X2oFnYr5AZEFqSNi!MAAJ4>_@Wkf?hM25%P6&fg3/0&ZQYE4(ABStJ'qKG&=YQ"A=esLc<W!hKDoiHFYa3?9]",+Q'qDf\n'qF1*Y3q%.C;,es+'SXd^dCto,X'<ZEel$Q1kos$a(n$G\Iq[].13;`PA4'qEA?X8o !Nn0!e5D<`m&GpQf?AL%/iV\WZtgl4jrC=(5eOQ(TAS9rj?5%,]j3>a`BO5b\!,Cs%U5WTM@Xe@59in0#Wnl2CGU/f(I.nnh8d9nL:.ha],dL%!O&(;Nq5MR]r<pR\#Sld##DF;Z[sJ9eGCe1\I&V&qCqEh8h*ttJpT5X2eJEi(Kf;)JQ`%AWI4g/9.*=?H?2@3-:$BNSWXGXdX1)$-fNk/7q72%GgVXc?7.%-7` Cg2ksnoVOp#K0K1'N*1Die>N:/Z;ga-Rd_JjKB)*`_4T'2AY=IC:d./8@WSU1) [8s3E[W#gm#Y]g4;[r>XD`LY)lAF4[TCgf$-_4' 9MH"I=N+!+g4q:;4m9WI.n/0dm?!6mW,,C==\O0^I"PPLZq2b^J$q?gQG-16I<rW'6]$dII283 UUW7V6D'[Vc)la!]N:Ym*K'^0$U]RH_N,U:]fChQQ;\"8\A.Z"\1-!mP#3P"6TY3:Q]6Dr:&6q:N9lYU2$QEtY]fR3aCR5P^#hO4:X#--91cW8Z96HVZ$A8P'm9p,8-2_R-Wsh2Ckf@4+@Ys(UoK@*CE(U":0=1OA_.Rqn<taYeNB30THNp#c-7\ZZSdGK>WAdHt5a>4J/_ls R#6\J5$X]o%<%'"3 `A*]=0>+@dhpC!UWb>_+;@E;ka<HZKR8T*,"<7J060U">\a h9Y9M"7Z_IET>)L k$d<W#+Y-)D,lI'Yp;_ACgMEQmhQWtn!$)&9m(F4VZDP0nWM,;dqgGt,rFM!A[#JCK!gfSE(h1im]f9lW7RVa<)(th@re]`/:Cgs>bAaL9]AM>As=oO(Pc-D5@p#<'NM[JQqZT[P=BLtscn*t6C+EYZ_fh0QSCk$LI0(a&`:jtpm6^%=L?8?]\F"P"C](I*(^fSr'$[gatV&o:&k?m^:PMi.f?//`>jOF%`N/ 7-7N>d(R5l"q8=<L2b=?Em0OkSR.3"\rG:o50,sp0GhRrS$)e%Af1^11B)^ER^@mjZA2%`/T]0Yq<A8`;XtM[+[,\S8"[\RLH/tc[<%6c mrAN"CkL=bVE(M';(5.Y&76diNr<PDD1ik*]7sprI) ] Pa /l.@O0Bt9-G'N[I(QGYdRt3&Gs<QgCJQ'DU\OZ$[8NVro_<T"8dt=Ba&\"MjJT[&ZMZ@'7 sQ.bMcf0trcH],A _r^A$p/*7\mZP"*id I>D^C0(-M&tddJCYL:UdMj:pZPmi$_;/0cb7H/1?AlmR(S62#F"e,&CpSQO[m9[-,&dal@DWZ.7+H!;etAsatJpZg,i*okI,S;8Ef`rj$F-N\'%=DM\;$jk (Wg7!2531OQ;Sj$^j^m0jU%(l]j-e$RGirG"po^71[Ie9h+(OLAU9a D4e/HbsAn<P,5@RG'M:#g/eVa@<@L0,(7)X7<sVT&,R!0V*3c%Z8tkS._Io(Cp^)Tah`r^6FdQ T8p3fXjBQ82bbqh8FNC`L[i:O8CX#c7&NA5p%Ph7Fj=Jg4eTV4_8^fBm.:L7Cqqb^>e.d%SN;;goAQ1_`SV 'N*3#kBs 'TfNp`_JsMp$VYrcpIG9C+pV7[j4d,5N^\EK.q1ff!AU9AQ$44B8T6Hg=T-E%"VjgbM%dq d@13`UgbS?#6I$pdl=Qb"p1;A-Q]0Ro]bA "k&5G(8>0`#6)JtrC;_hdrU@CBBrb'%$C=ohkmZ0Q[\1a4A'8l)nA&o0#<TM1aXEGm9.%BqO^dP(H&?q%?'FKQ&Y0g];8,Y-5c"f<1V.t(%#H:;ek!imGA"`(k8+.ak^_CUl(T(eZ@^;sf0!saTpj)5peDp?ZE8?S>n'=3!iZCh-<:f'ZOb0<f&)cZr,!/r-]^I<cQd7FfbkOOQcmX@p`^^4;%OKtX<pLK 7s*r3W)kWFDn^J sjIQ4/^Zj=&7&Z:\&+\^%4-5bD^siO^5:&F9d'I[im#fMPDHhVJJTpJ/sAabPtV85*Qt2`_!2GePMb.g7E+`D6)]:dFAYm)>;C&mAF\[7(f7=KfAhpjlM7RT)%=jrK%C&I8J2&E8,+c"mag3<rUK6+FR@M'=@L5g.t#$k9Agjd^(-I@C7Z'!e!''k`[Nl'km5P;;#i"OfWWtNVPKpZ+6QS%\3l;Ot;d+NM,=h#Nn:&]UFP2n0_>"re'""-#rrA?O _0G;KM2gQo`HheqqRGAmAm7"I3r2WYc'eeioojXT"V!hZ3`D\Etrgo-O,VaX8UU_#7GiCgsXV%-PK1(JSm7R'&eN$kQ "#kUArkU4lS_VQ;rVsiQ &@A`csf1E`*+EjNC59F[V\'o0$#Rhbs)><^/Q^/bqL3Z3k. [Umki)clEnQN\. s]S+8ZF0?MBlAqgC\[o7F(1WQ CkHB@F>BU2f2Z>AZ694KkP4q;tkSKaoF\RJcB(+-92"7=6Q_*$'[h>e9W-2,'"E#:D .TqXm'"HeM?]3-jc*(T *QET<^]bb3m-P Y#-\Ql'WL\X5r: H_BjbLsb9a4N"Eb/Em)"hc2XLIKrp.QIXGDL.n*X5A6:Iob=-6k;SAQ_N'>e#C<DAeL=8_GZQTE*brM,-o&FALgF@G^i+HRLB)A=H,.(U5tW_"F`>\G?BtOAd%r'H8aX7%5C.5iR.`,Ng0CEKL6_:=UQ7F])d6r(Vo,^O6[I. IJC(Z$kS-sBWMT(mRG*::NS0$Oo!1O<e!7hE:R9hJY6IE?as"^YBI#/Cp'9YGW`V*c>`IO,&)k%lQeG4&oQ*2\aPM8]Fka(/AH508dooZB@\\I\5;iGUNH^;S]NpcJZ>j!EF>NGe<i!2Fr&"T\cMiC@K-h2\g^pTTPl%X3Q#2%t7H/cBGACb/q%>rU>On@+&d"5;;Lt2A=N;$S67l*ZT@Q%7A&t&c[&04&C]e3M;+!:k&ZpA`B!oT$CJ:IJ@Zd>ki/!2_-9/'mki_alD bhQB,nUVA#7dW^8EB8?R[o.<B^,*,^7%lf.LEp-pHD>T(A5E-?80 DSoTFEi0<plbV]/C]#gTHPoP3.+5kF/KeAOUeW>4?%h1h$HL$L-L=nTrHlLAj;q^A;lL1E\XL'p/B5/@9orORMon>Gmd+6B8_r='+MABWfsqL:ipbmcc[lY!A#^f;AS\(\;inAR$^FTn<6%'<rGA KY]PqQ(B CG8km(^4*FaI#9/AX5dqWkn:)DM5eNn.iLnl>P3dckS&]nV/q-mpOIgF-6\kriesO&TM;<HBX.]iUlX'D^.Yn,HQRL08N9l7)9F$,hop&[:;8e<`k4."P?Y,l8C$Ql"hCsEa-8;e!n':))D_+qCBYZPDk0hci5ZoNKr$t5=*U[p2gr^\Fo[R.]T;U7V7''2&N*3KSFA:`3NcmBr %A"%4?AACV9YH`H1p]3S]Xk%npQMk/4%)t= "rRRH@o)9g_Akhh>B9hX.[d[>qbd-J[Bmfbd_/j(OVKX83N8Df"4JX^:CH`\fT4,')p$T#0XGfAqY`i]/rm7"PNQ[e6J1OD#LH$QYMMqH1%QL.[tW $etq=r$F=YA^L>DNj4Y.?_C?+2WppMb^:j!.=gl1/<Pc"V+0mjfYF_<m!0t\N`k[kSTP:Aha n/<3#"2[Wi'^?.r:I@!Y8P< 7seCS0OBZ9](A5?s)Gal-3UpJQ**nj.`b^1O/f:*HG1DoD?:36F:*D0U];^Eg+ PR(D)['@Y;0QT4L>:?pBa6#tZltcS)R58;MR09A#p!Rm%RDaTT^"o@-C@*%<;)q%/4.W)nB7^SrWMB3l>$3`UfoUkbgRW>FGK$M7c:gV6G4cWcj(+&BXnc]6Tp+QP%.RW^'-d3Pq! U%l'j26D41c H*(gS3NiQIsa]$Ion p8H3nr*>A^qpl.W<mL*:J.4RE@\g`HXc)go QcYk.T"QRlV9XA@N"ei l=HN</:l,m>[6)\-o+RU]Ydn%s.ON3@Ws`O1<TUEH]Vc2erbp.GYs"B'0K4__8YpA=E6+R1Z.Ad27;$!T_L\#7d%;4c-5T:D"!4h7koX+m2,teAq/H<]bBH&@.'hi.g8J[?o1E.T ^$::r:t&V'oE`)F$;jbOnA24MY2Q59ms5qYI`Ai`P&]'V]fhmi6KT&ZO:1P&eeUZEK+ 9\-00jsAegg\+0;E+F)_A*ptF,?,/dVZ'FW>*qj/B5AVF4W/-1!ib\(B9@a^gIpW;e96\E*d0'bmpb]\1)22,D(jn1<Qme[^])fZCeD>X?ZEglE[U[9;%D^n7Ad_P7)iAXj@tOFI[@4=>>%[g87r8T3+Pt<)4)5Hh>ODI>'?5@APJcV&bXH*AY`<T$(Rs)a.+K"EHpJ^-Q=1pk mj%](g\9<>#L<4`0ef;N?<EECbn]Ub`W5%HA?):HA+_+cRP7#fimbL\e5SsnXN'Md*m&1#X%1?d+D6pNE`J21s*Son<O)i'jcnCKA$("p+%ZBL3-+:L=1Uhi$oP60JN)T@Q<AM7]Tss+q_V.d+GjYG@[9+D!G+`jS6_sHq]M-acLOb3+*!_gqp;\5Yo/P"joMkrZh)L5fA0W-_^Q"&^lDi:aWef?+d2p>aC1 P*76q!4M&T3T-/A$njY]p"KSCla\=(UAaWKAi@>iViK+" `]F-EJk2b&_:6OZo9rJ^!tWW/OFNC<Y?I1bK5o1N1QX8]iAM>N<3lF ES=MTpc<kpe1G32)[*p`'At?J> S-AnSDq0'Qf2,.)r5q!MQd03c8g=VCR:)CEe[2HVNg*7p'+Bp3^i#3HjDQ(7i#!!XSAmt 4P-K;,!k9iJ ijHq4k]LZ %KNOA+kAN/^X1fJ"2I,0#<1mlMX59[XUg7ZEm,$GRW\L%LW>Go/qCES.A-0D/fBHd3R("7&n5[Vi;&q)4Rt)js+YEJg^0 &\V9A"KD&8r6t-@=$>! (2aNc:5+I02R3qS9Y n/FBP%$;&T8Tc]_X6p7(;*D)m5<#b Noia*7V>Wha)9/Z2i VW;S"8h=LsYpW;%_.iM3=#g`L][H1rEKIPHVV->?):`8!*Kr2<f)Js4rEP9p>Tl?hq!LQ;\4=rAfL*Aa"RgH1_lR&S?F5HAjP&T0PIg4XLAYRAh [a1Q+lkSA [("*1BWR+$W+i&G9q1][oPdi\' V_1[kqL0K3ID 3h.MCX@V<8Q3PDP4K@=]ob7A)cI*6YOkn\"R=o2@2rXaZ=h&&8SLr'2?8ht `2Ygj?Td,lsoe`b9c8hMpQX&,:o=A``PAX_W;(+4)UmgC.k%k1`?HfBg(.l4%r2 b;s)4q=/kU07;*Z!qJ/3_n$j9"=@p<([2LfI7M`##'[*meTIHG%AZCXWg\6SUo]>aLFk'&#RA5n:oZ,2raU7dIE)l/eo6S<6^EL+tZ*dQ^@m.nr6F`-;sX'@'hOcoT +D)Sgg(\5B/7%-ckN^1gB7<M-*YI([hqT]s^4L7+,6<q%`aZk[8M.DOX[XBA3q350ViQ4nAsbS8t;X>7WogW&+=4:f"d."r)paXl3>HBFX6XEGjLJ3*ChXJ<s&`2oCRXeDTQY[OLD8`t-H\f@\1t=cnB =0PkQb:FM4tc2tLJ!OBR#VU+#mS1GI:Kb2L%Q`"*Q55c5H8-VnAB9'>S)k.IXhHZXITitshjDD;mSU43qBRH!,MK$AD-&H 2A"H?q!dj^rZ9= \TYg;[G`SU/@>A`0n;(a@Z/2O>^1=5);qCFnM*3EnN-rSQC ;"+$BK: ?ZjaHJ,FCq>R@cBhXG6\Nf?Yt^99f!pI2e]S1*\p)78"LIY;AY+f5%hU`s:heEq;At/0?^2n\V&=pP5/n`KPVO9UFmNTgdZ[ZgVA`\ILfOfA/$\DXq>@QZ/1AC:73)shS_[o;&%iW<;^2M3=hU'@TOmK>A#)OW`#A:N^@bWOpi@[3st>adqdQF>5]CsdIlI;JrleEc;"dtUI.iPA6A:eTAs$G^oKcUJ?+ct4idA+(`C$H%M?G42c*h(3Fa\7j^#U9(`34N8R1b2qJ_dr6dhKdU62W2L%];]8MN@ipji.6s*fh[Ji@bJ3Agpt_cIBU89Tt('!t)B'J`3/,W?NaYSr92X9t.n=3A.djBQ3Sa0p:@8/oqFPYh(*P42s" 8@:1D\>nE*sn`/"^ATJS3W/?atV?Bo&P8@m1 HK;AS7+K,*FEm#<ciR%3'[*GYK o@\DojfNB4?*!/2P[!.<rahUR!U5MDX_ka'l_h$ cKWN"XN?c:Dr`)9'hE[2c6mD[*_OSGnj$65o$>4X9_oqJjXkHg=S^#8RWRp1`!j)k*PY. MmlA&1\r@*t$//AKr8F!R^.bqmse14(AF&Z:Q=o*LSj:>FpFn(erd;IsnaOKAmTMH)9G8G@YFp*(#nh95M.@?iX9,lK"]%r<HnW#qJN=[^I*9=b CC</N@eVcp_AB^+N'ATI[FW:73C<4\*>><p<^' T01#ekmY?7leqSFN_a? jA4B'I.VB_K:)P4#;<V]BT`6=ho)Xd]k<g"A?a!!&o3C3e=T1D-E9EeVTo9o7BPRB7?^_A9L!^Cj&h6f4gDqOE_g'$opkBmGp/Bs8g+]`(LG\#A<F1]=%\@e5"9]D4c3="g4e:eSi+8@O$g>b4#CR*A`cT9q%CUV[_(NYU7LJ%ciL(4P=DW\G]/7)=M31E=Q=._hI1+(Y#4e;EAK9!6qbZX7 9P9YY8q7a\#PeKlAWO5Z5A(1/@r<VL=>1?J@FA:X5[0+j9I9,#)>26ScaPBl_T8G$RAk4^b*K[F\k653<aALe7A<nT8T0 ^mZB9WlJaI))n!l??]`9SjfY/\Pti$+B50"hp#ZWBm5NW-j$bj2)02!^%7ZoFAZ.JZO$/%-2Yg>JaN1Snf^lBG1o=[$7<``l1jAI2TsIl-;#.16D%>E(C^t65)0Xm0(CkpN9F'Sg]VPQ`j/D3?$G+?L;)$[Sg$(^80m<].TF&C+h8%[-,ojf;GN8 qWYRg/CPL$qj7b?7h-D24*G1mC?c;"Bq trOD*aHJ+8:4M1'8AA,r2*fK!%&P)[.nQ'af=`W6<gE9T\?)l`+--aAJnQ_OSo1=dmnEZmdR)SD(+IshZn+`5e2"Ba7,Vgb/'#?qNL06;<&#BdQ]hS)MnrJ;XT::XPK!5"T&sc_@0X .h[1=.(;cf5*doeLi"=?Pk=Zmjq G"YZP&o4^MB("HBgZ?[k2l?WNBD5 :,,[[+o1#Y3koq(p9t0MIjV/dlL_-jJP6n;[/e*XWW$'SH@fo@j`(c^8R61arG&O%a<ZW'7]"hY":csZtB-IW2l[W)N53\_\ M DeXeR"9P`<>/0:h9!9W06U2&YW*=m/K2@ANJl&KPS"e:=S$)sYC< _8E*4`=d\]NMLW!R*=5H!@g4rV7F)AtX0!^U CFP4e-:b?0AOmp2+UQh[PYK2H;@\cmW*!QfTraE2BFWQ]\M1jBphT6>_?#8A]'A./9<kY=+Ip-?5l-&Y1Q./Ub@Bs+Ae.3s7:YTdSrKF]^li@*( ZN"%,FL93BPrOG.A&7I_Hk0*C2U *#WP3V"=ris;oN,*`o[iJ:"RrHIOQ:e$FQpcMqLF'Yc@ERqN&PB;No"YjE+JlADehI^-"5s+T\XNho-S<,0+7SF)g$!FkC@r3$M3 _sB_+'^'!JcQ6-qL"U<3=1o2hL,% :jV,:EJ_1Dft$6'^7m[A:alJ.bFa)MmNkZ^T-SH.4)Rk[cHY(7T2@I8Y[4XDd [!ioGAh$<7?)%i::pZP/p<VE"ZpD.@M)DD,R"Z^raq- p5%UNiX$_D..(1,6e1oeAFI7#n-C*eSlgjrS)C40pMteohS`(l(?$<TdWpd($/Dqa*K!Z?s*;$8_.XkJe&n;8L>'.[%o8W_KcWtoF:*>W,6PKR`P=$N#*b*R.0.F*gIQhgV`)j3mcLZDpnLK_*&=@)>B'.9sP4DQV%dnb]>=.f+bMq)#kHHUJ^dC7"RiAL@QDLj#r%A#QV)`5.<WMs7@PU5,<9Fspt[AO#1g kTcl+#^,ON`6;f;);<?a?g;rG.N_#eABHX1.G,"\Y`V1Z44DDWo^4gKGiWTAB;g]';)^E2t_rp29&-64<()@No1`q-#!VDe>6esha9J7*>-[C#:&N(>\tCV*aB[]$XQ3S@tE<$%^Njd>#n9>.K.0A\j@pEbP:FBAt9qap*"GM<X\_gV9.ElN>$]=Q7 7?kR7l6,)fXV;^^GfoFNL GVS.ni#P\@Me] <&>H5o4(B!g9<F\+7_YY"fW7'$\ebd_U.s-NeAi><a'LmjQiUj!@PB<Kp#bh1jPfhb;dKE@6m6b,T,9im,:$KL50lp=.g<>pUY5o%[o7dnYtg[PlctW`5`T.RprS0CD2m?*/a.?+sHk0BpAtr84RE``9iK"^$i=aMg_e79AMf_p1qGGjY,=@>E+E%5Ft PLFgKN$;bA)XYFNdg[1DPlck<NMsAb2! @0t=<B>ss5mfe"A>Sp@R`mL%KDnZ/=HU@ZA&a,N"cA?KOY*(W &UZ+f]Wd6R`;<p34mA>q)bgnJ(m>9D/c"!6(ki;AlB8UGY-?0m6l`l[q@J;.`RF!^^psAIHXr)CMPbDRNJ\dFA`oVG1l&\-?I5QpAQTF+RhF'!#=F\bOh.MsUKUKr;2:Arg'(Sn<Oc%2V=E0&LsO5$qc8dK"#`6a_>l$W078sP:kPhTiUGL[0Q<!sk8-8t(D&Bhs!nqg YL(hX!`Y03k:*R0'(f)A.,toa>!I$/!+)1i!@5+/hs9@El2XkddQ&JoX4f]cB>Q9#EfY':^D.I&Mtl.cAR@75]Q\]PbSlsX"G/Z6$NUe.$Q)+gGpF:I2iJ@O1HHEgA,d=ZZ:-jLe0U4QjDtN:pK.CV:d&_^:U(,EGZPF5rA73&L8V\ t E! Vr6\J;*\[NNE8QqA\(m1dQ[6VHT.\?PWq.O:l>"WAm+H^AdIs a_H\2FS*tLBZj=*oi7+Jf!T##@ <Kq5IqVPK9=WTOfIXX\Mm LmXd/f[`A&Y8gK)[;\$=eoWIBh<Z5e`Uq&^K2(%p.T JD`TIj:`nf*BsJIm\Zo`Y#c$3YE-PAQ24K&DE9t3a2rA1-JNo)6pL".L4apa<,Y@cO?f4d@d;Hilg[9-"kV4DKc45Z2'_?OnC5ZD$<`:A2+$%<KqP0W=)!6m(#1Bf\*r h'ZC:&"NGQ(`84k9(<U:3H[6t%@?OfjrtaR\+fJXFsGU&[tB23C5 \9h 4eF6b_p`8VsUQf1J.4M@DoQ\=hpcH>'gR\Rgh(GL0^)a\?aZ*53&&t!Z9_h)CCT"]^?XB+>/ZD>e,==9_YQOYZ@=4C%J)n5"t<7mA+<e55U)s9!.>s;l\?K%e@pCjq)Y5(QCt>[&L4m3kb&5/7'Kmq^pWUME.pNKcB Rn#b5Ti='Fr;c64M!@Hb:Y/O(=0T]K?8JnVf %(:H<59Vl&6o#ijl&r9SQl(#?Srmt'#?co"JSWBT"7)PanS%Z_=4aSf.:1-Oq>266R>OclW]*4h9_A,j/^V PDEN2e7cnnNn6Wb6qb4E-RXK/DC_nkW5roNrb0k/T_mjK:8)P@[ i^-:L]_?JE.S^im:89(g2?a8F\->fZ\\YqY$79i>p8l."H/EmBP=QL9JX[jB1N@,c,bg0f#=/nPLaQA0'a,oX)<B"@$GCO3CWHdAhP4PKJ$sH+Z3(`7t4b))T$WMgJGSp%. +?Y0[icHQ=e\GKmE5"pQ$>C0Q1TQLSYs/$;aGm 7mC&<o!2/ph`YH;ek;#pT7J+RO19@k7D0Xk4K4.sVX_aA3FZfX3(9Pko:q%PY.H:8@^G&pL__G<O+_o(Ua(n>5^![#d?bcRl-kQq+3WtiAr"EMiTTUB@Te@YkR`1W(TfAf8a?dP+aBj:A7C-eKSFcY?KOrl$U==9e:i"gA(?XBcK`Mo,)igG6btA:%C$6shNsn7=[`83AOth^RM*W%*oZ(I)WKae@:K-"Jno\#OaH!"gYq*Z^d@97OX4'%AN+lQWgEd*K,\=L,iV]!AY'o!ba+PXQiaViLAW P@Q$n!V9n;].sM$^o<.[mlHAcK?b*=XcROiN<Ch#k?6CicD4M+5'HA"JL'j1\s(gdS<*[^`:i?`4lPF?CqVqf,qm1MJj;o.V,X]50r(t-JTQ=Vht7!I_To!Y4#4Po'K'g#\;*%qRM& SAS/0"^]A]ZQ:X-VZk][D(N`A^7caVN+:X?%l?t,g>F]eVD9Yb*&iq&TWnlFgb e%1e1+-@ gN*Sb/1q;IZ%mDJM0r>Yo]i\ZA!%:8UF>@CDT-e&t[',Ag5#0GJhM''L'f7tli1A(rPBYUhe5U@\%!;3OdHa%qO4V>!B059/Z.c4-8GCm+=q0A]b;41rQ9W229`FprnZN1o!#.$^#eAp5R(*1K;/\i(I0<_ISZ>.?\^Wekbs]eZERn@5"3)OD=QBrN[krVmA]00HjR(j=.=3.#G&jDT%*%[0QUAh7RGV1=O>a"T/KV)b&B<%JOM?!dkEf-q^/d0Mq-Jnar7HsTWVeZ3j)ONakRK_FJN)[YTUQdsC/$^Elt/blPLHhiW81hWX?19KVeeB()c(piE0CY*HaZ ,dpSJoWHnrkW)BtO<pa?s;M9K`E+1]$-W.s7pCC(&AL Kp$dpX`/Y0@RZ5B[;1Cm"U%*D?.!__E<[s=$XbZhT2iVH@[a4JRDt@*XAh]eX<V,\NJ"hO1F@-! (BO:A<k7[F^_]2#B8J8%.r+Aa$^4AQ$#@O+Ig9gbX2Fc]=QT5)'8]5B2oR_:9]P*l+D?[V^!5h&3p3\]:5Ap#7LKtn<j0pmknLqK^H("h'\o( IIgNO'Y!i \nF@l<.\R2_Jia9p)89PC;McU4bKXm GCE3.BYl`Wt>Arr4pj?YM2555jKLI`2:&A^ad)s,#0K4mXTpU..-@*FDU@TX.N7>%(h:JBFtYkr!KEG>Gh5KstO#)H7Da@7j!erQ`_6qs3 $8T6D1gP!5H5\`nP-_TCk8CKoDJLNX5-jbnhU`g5:gTf>g#"\QUk=VoSJ4d@NMV)ZYmbP &"rDGK Q7roi.+^XkhrP\VX!m(:-,lEY*bd3B#1$*UY&ans$GBc*:E3=&mZM419#E/mettA@+'=grDQJLY^]GP42R;c?JZ5;;LCnD0a)nRYoftWdk4_c(5#A?M;*D.!O[lT\Mn(2A.$F-H&+P/rg&TXCZILAc9YjBXA'28IZ'!!F6A__mBA?D2CX1:H?hQ^54O\Ba;=F=?rYPk3)4.^c^=OV]b3??]lU%$!*g`YkAa!GRG+UQtS8=)A!Y2='d:;#Fp8B-X3sl'qg+iW.EDU5n3[1"]1\<^4W"oJiE@Ma*CdFJL9`K%-4 'lV:5'G`mj)[]bgA3W)e"3ls`aP%05SDcXSM]d$;-mOc/?H)NV/#j-bl0YG2K?_c(N\5AtW^7mP?b)3;!!$P8\2BRsML.(/,.9t+?d>2(BZCk4AnR?AG*Qfd=c9GAEfXIp9(a3T8Wbg&+A_MN]'p$EeTXB0_4LUB5YiXOsMigM*SY2?Z9+&=gHlk\i7*-M'TP!e,!n<o>b]0i21r6EY@/c,*np&P`( Y4<s^=Dgng' J"02:X%.ATst43Z;mN#hL6@**0Ytt>ntisD 'R4DV.h7e'=gchIDed:U<?P_d]h^J!(9JE\/NNZAoKFA1'''pWd]Z!HFt=+H\?U3-I1!#\;rHr+>?bR9=NO,s\3mm<lSm*]cA_`Tj"3964YZHtA :fYs:Df7f6OA>[#O+:8+6?<J6MVY3eog0oTM8!Aroi&1I//0]^EQk-kpob;S%kt11h,"s04 4fna\a]N)^5+Jt$0j*>hRRS@*VAL,UH\Y`"Da<J4R6""j5HnNI$0-iTl-3+Abj?DG6QMqq7iig)U^+$MN6$+dsm+^V4q9A3Z8!3i'ej%i0AS78EG2%rH=T5Y*aj@B=DnAgmMcU]W7b9-JY!+lVXTmPo(FhdrnS>ZcgTFqX<"UYE7F^DrG?A 2l3dZ<46f9*"WB"Cd]$&VAo!JK0=YnoF0QN*ATZ\$16RY(qg]2F5&\,(29'(H'8q!)V_'pI1l(R'm444.QZC,@;7AJmP.< QnYbCkEC]$2,%OIM)'snFB^4T%&X8RMOS+8Z\?J/'8/N\2Gb/<20A1\V0IN$(O.MDh]MhK+,NAN'$KKfUXb(L/A3EWKOk$Af7;ms"Jrs%)H#VL>#^90!4<KS35;e:oI%GRaF6""Q:l(Ch;!7I&-[_m[\Qp/U3_)a8s//PYdoX[##6TTXFL%HIY(T(;d\N#d8I55X"6k55Bmf1RcRB!(BB>2jF?(+btekZPD-_>RH/q[hY%eNS;MAMkAM3[E<2M*6C)HQ>3+I(I^hkgE*;Ai-e7-U53bDR.E?0#f2f4(gm"m%B[2J!3MPZ\DXn33RoBN=>op\XBU(.:g^)g@'<>Qc#9e?Z[55L]jnW_^Z5U/:+@/`c9s\K`)6OZ[go(agP,i+Vpbid'A:N5]Q8q%V@!+/*V%Utd_R?MU1e+;@:*GA/\DQjcO8H])p:4A^,i[:\<-1tj0VXI$->% /5m(OC&";77"BmI[^.8C%_;)AS6+m,;j^hKG0`Nenf!@%oT [Gnf.n'Q1WQ,SMVp\'rI-M!tHce><V6:k5-N`h2qAGfK%a,G#l^D/l q&@h0edE6.P C 0`3btXKsBKFg4:C!!lUiL"5D[+NStAEB;A@EW-_sjc4hb5GBCEQ3T7U!OE7dN31C]B_ &Jh@gN+^6hk\GDaJO0A>(+B67J`NiFJi7SP1>j>$)&T#)tF_b;p[ecN,Y?RN!$F!/_>;(>:;GVT\dJU#nO-qXhI],t$V1aD[/]-[2B1%l0i\E$fDCmGK?hnG^p?K_H)\#UCZ)O$C_&JDX$F/_o6UJ%'qg%#r,`1jE)lDL^B;TnsO A'mk5pi/1Mjmc!AET;Cot?F3[1J"-(i*X%eRGp$.nKfVJ=A?h)4B1W&b6=8P."oo,?VWWIo-<TdmdG2FEB>Y,DZ&DL7]laAWLW)$sI5\NQ5<.eJZ?5(h.L97rDJa4bb&AsH</gZ[5rZ\mWKlQ%R#6rcAbsfH1"Zf322_3l4(cT?q;dB;DrfsK\mtfJ12.^c!hlcFJZY7qY\S$OtHXpPIk<mY93^ %Q6*pEZKD@n*Z;:G<:sQN6,6[-tAegs4'`S>^!Q%=5iSD?h@%)<Te#Ad-R%\^Ahe\oF@*'f0 n-\5R:,lm/n5_]iji%d$;!]W06#\Bo@D:o LPPEM@d&JW\n**q&Y:R&E3b0>Aep ]PP*9f"q8-]Y$hA+/bfbe5b-p!"H(6C^P&k&sipE\-"cb],a[B.kh^ ,"A=/]B[)6L7'9B#LjOR ST/]7ID`Y6/n]D^j+[A@V.&UXVnS7.J0Pt)<-[tZqCi#sC2PJ*68,ngP?: D3P<!*)9ta/$=.'q^dIRP.*ec*2/^Y<k /V5DVNTMm%a!WONr<\_2/bWr:V2+islr/&*'Zk HO/d(QsdPjF0l! !-Z ; lG%9Kd[^5*5$'hPI4W`X0tse*k;Sq75g.s]:e"5Z2#-%]rg;!kQKk"gQBnL*6:\eQ]YOr/Oi_Fmd`)OB(1r<J,P=3eH'4n=$h%(-Y*;A<M&3?n?b&&J>dC&JB3Db^e>=g[lEAA"1G5p1`7nr@sDgt8AP7:\dFYSgB\e##sM)kQW=tmI?A)qqFKfGn\F>5cIs 3qM0\fC]KJL?A$.((ij8>";_a2[=Npr[H",#s(=I!a&*)TY]bt8L&bhPq2TK7kGdQQml<[*i]jF9o<lpXm7"R.m=nd@^d_*;*32P `cR:l#kfVi_Ct1!r_cb15R>7$]gK=dd ;>jU%4:(^nqQc/c[>T]iS9sXK_UH+UqrL!lQdM&_S7gr/tbFA^P2"#f[kYh.^Z(U(al5m@TL#Et$`(LO57%Q c^t1&\4dR1F lqANA+o)'@/IetJrJb%b/WR-$8N$A=d38K3[is;Y.#7=Xt)cQA:lX&.&;cdq!si125Nr#GW'f!"@jX#oNts9+25Fa5[jt0VNpBVE2<Z62'.@de_`T,K\!$P*R8R3r&cm+*q(dVrL0/]j1p/r0)LdqN;A3'tX,EmZ*E4IZl8ci6\^Wf:=J5= rn^2Am]c*r%3E//1#Z2VCD`\97!?:@qoN.#.%.@c'D7la&ZK&nAeC+.Zg>7/@4IPk->VGdg$ZOI`c? TP)OFJ8`%nhE@=SflQsXQr!T(@5hPA<A<G@B?B7)S>F;mVb@m6<2LKDedE(o@r&F>#F?,,\Xb0c"]!A31L(/7fUf4N!Z,&O7n4YhpK['K>FVE1R+oT'4)YR^,=FMNCUIa_hS=8''%VofLdgT,Ik*DggSD7*X0:C!'`PY]qfrU+76Xl"P?sZKmLAgn*LrcV^#mF=1'LN<6+[.@qTT0;0#N"FIV,F<_s=^`nF$tm"1h.-Q4Ri0*OI2,iJg05>*X"!i#_ctf)lV"?kn=1*0(p_]SU[%U4J2q,LAA,b-h q;BFRs6)kBgp'L/4EAU/kf2+KP_o";?t =44MWelLiom7@UfkO:N"k\Z2,=AhrY$s]'7&A&A;_I8Xc)dMP`-*Db9&U8>YeL<4#-d\eFCM3;YM1;A)8\LL9q1G[fCd*(M<R&ZTNICKqSkEfD_A \43Mn7e$1$oC&))W?)Y'W-0ebjkDZX;\5r+^b628MBJ1a+@brWkWEAagc8QihI#OP*Ai$KHhkpBW7.-(l:@H9,K$h=/E:2CsHP$8he3N7pql-?cPsHfmAXSROL`-GN'Ihe/I&ia'RhVNARA9a V`Lb!bXJWCn XQFG?]AN-?Q4!?sZZ``I%T<P l`&k#+^@3P"[ j/<#11rEF")YP<E-rPNIZ-Z;8 L!)X0kDa?-faOs0P"5D-\Y?1c6(;nUfh?CC)K 72J6E#Y^qmc)-)mmsA/28[9&4%-Jo>USZk"/LTs42#&YaFl1BFQ*-/)a>>@2X-(;ndjcTGT d`o(p8ESY&Edi;q9?#:qG'"AbAW2$aK/;.UjRU0-@Ih:[$n!c2I?n'^IFArki5)Dc2,'XQTO+5r5L(^N^PP $OQ',ET!pp5dLO-E1kJO9a2=g02OV?Z9DV@a+fASkLjo)aF"JNjgGZ3p^8g5^N:58?,)JK#Zn&4-eGrHXU2Z9OPj]p5$+/Z$-Q3=[Hib%jL6\6L3^G(sAZ;/;$!9MIe!sVY*c-)c9hX ^B8!`V0=CY5XW>FmA>3X+M2KiWJl#nRL/]<<=WG3Y=t;_j2hS?_12 X7O6lAq.%n)&@bbm-%g,e->2ipK49HW VD%@c6'SE/81mAL6?\Z0ig9"l(%-&bA@NPapRAeBosJ*H;e<K7<'sYW't &kP8%Be'C#,qA%jdM8%eZJ^U\0eTAbi)t?kZBO6`+rr8Hmorl.:&Y&XLTK%cA *6(cX*IPD-`fNEef;HtGD'N#7FM78r%)KdI8!e*ls7%6'(Nm+\/^%08*KBj4t(OU)6bdlc`XK1h3UH`(%o;10I7]=K-T-YY=JDoD<%HFfInO1Pg+NqW0Li]o>SBq5eNfa7KI\_`FAe?f<*aRKKmm4Y8\mY.E?a\AnRK-'nCM6R4_rZ&7@U".:pJcl[+SNVAp0QVkA.c_<3!+/-KpW#1#gPoTm$-AVaQbMm)+` #cY^(s1(\d3-pG[bQTS#X2e>jSN*6$6& :ZR87O>&7=1C,7q9_`l-f]fln ^b`^CQ^QI5%nAH8=j'Z5MW&BMi(Osr$*22[[js_:%J9Y7FH9^/$>%%L(e:gQR:f0;s24gOi&J%5[[39bQ&f/%CO",Y'QZ>>&g7=ag=@q&9Q*Dfp:7-"6hJ<"7dXNpIT1d;]"s8SV6l?9Ra7b=heU^<4Ackg^FQAVhiU;YdUIB&V_m2#B$/c.`Cf*AK[!*0Q@fBJ#X)cZpt$=pY:_&bJN<mo[hZpDtn>Xf@&01[g+j_Y<FH@@m/[oiHc:5gpsl;3b3T)Q(R^"tJ3>1bBqBk6tDRZX/\\lmQ&n0E:"@BrsAD#`8MX5d-;EU:ODs.Mkbf m:\"08hIRg^6C=kItD;WM$8[PMNbMJ)K'3#sbH6s>QSlh5o1Z367dNDXCRM4I)N>)SFn!:'E^GN0A@6-6,sETk?Ak8=rA$L_@39h]X%-5JAf,3eeCXHWgo^3VQCD mVqd!Hl\O$15c8dQfHVSnDCSr'0nDAS:Y/Em?DMWqc.hQ2Y*;WAK&CH7F'gWTSho?DTQOj2_!#LEBP=NA,><AaK_&KX;or*Qqc_A9t#E`p]$V^8\d'bOOG,p-S^9 Gn/iP<PLop_"\s&#fVQKZB(Y&X07"o'p7]sD)e/^gQ0JoIh^9)$%Ae04QMp*5#A+kg!e,l1`-2^NS[oJ8Q`(3,j1]81/!Q>KX5&>o;_PTQRO>\Y@0gCnerAWa!6D^+KF+YL.Z'b\-"6(F?g\OE;Fs0kDr"1qVA_PHSWXO&;Y+:2mhcGaHsS/G_Z:!'Ch<e_sN:0E($>Z7I^Z<+:?0.^-@IS@1@? ]: !"$s7!SE?(KJa*CJMmdD,1rRKD5O.6t:j6IddI-! UfW#H33O'YM]hLQY#JT;=5WH@V!nO@BSd-nSJ:8&k"0'S$Qt[-K3,m! RX'daCqMS-dfPHCBe\fEKRoF%ICJQ`NcG'M/SIfQns,7=>U[_4iF(LO(UgQt4h844%[s<n!gW<K?NPNA2DJT-6l@m_RX[HPt9.Nn,[rF/56mq"Xc`\&FQW:f[3_hC1!GGdd3'BZPt(st*/q"Uc9.ID(f9reXQlk XAA6#*)XTjWo>2_aP!mj4\1G"6fA:3./>Y!:&bP/+NL8:4c6+_-F +J_-[E[sV_J^Na&RTj._ 6at+M)2&DF98d.e;]b@4%KA9;F";Ag-"t8>l(-(54VB$\=lFO4[5tqc-,QtinJ*5]D#i14`&C@oSP9n,ma]*SXn3`;)fF6GA(Q_fl"K#gd$T&_Akelq#%h7kO2qN*YPY*o_8'2gXSmE,Y7K?"$7(KF[.C5imgT%87;WI^Tnct1@N\C!+qIT&a!0U"[)).N>,K-rhQ%p`W'RM<.JY@RHepUbb;?-3(a'r\;"hk^d[7H<I&3VH2EcAm T@^N>b-95b(/M/f4"so2f--WAPQ7-C<+!?B0SrE$eb.)m/-`A8+-j44d6]U"\QQdq`^if0mrDqa`P b0B/8cni((k(oTd>Z[]d8k\Glfo25A)^[)Z1pE&^5dN4HG^($FB4BFg%TK1^Y(:,M+>4os9N=d[AJ)qZ!o[J9$F:6/G2f[o[3D?+N@O4:U29OLK,acrJ:B..A%N[o=n3%!U5jleoIPD8Dc)SoT! r^B'a4=+%lp2%(*r"]ATCh^+\[KM@7 h7*9-S(fc_eaUK\AA`U+9P;DQ1HPb@Wc$NX%gOgQ:g2dR>0,e$g;\Y%D.BT_jso>FpDAFI$9I?FUMS1?$iI5enW`ICBJSP^Jmm)pjnB3.%s?-M<KLW+P0/njN1btYdLrSZc-Rt)^\oU<_=)`LsprFmOPC;^8@1[F61!^is3asPVVA'Eni)OdJK'7dqL^`:;t7^cP9#ph\R0Tl+J)=AMPBlFH)J,:&DR)OqXUt^+LZJA@(=0>H[t$612MJ_B'"R X\$aV".J!sEp`q<'>[nbZAbbm$Fl49A?LS%Fd%g;[ggO;FQ-i0B+(CS/-?g*Jm%1PH)gOR?4Q\IogY-JXn8S^Qf0AW<QC#]!sL1W[%rV.-,7s3BS#@4EF%<Z7\ao\Fa7Ib!//Pt'RPAM"^qK*8)RZm/NMaXWg=Z[(2Aaj^OM$MN!&$RIQnZ+g0s>Zt=HjmS[)Y'CjWrSUA%1&4>o`GA$gUU\LS[kB+,r`/cA-J.KWbjd4]X-*$g P\Al'q-d3q-AfbA@+_7k>AtIJlL$$M4qo21\SQFLo1_V[B;tT>!$^feIPTK)/)V>EYiEJOi`_) ?<BJdB<E`<nr=RhcJcqX`gJ#Yin,d?K.2 A@oo&Y[CAmr1j/1ij(2Ohl[p=GM:_1&:_9'RKMYPB60>c7Bk1)XJX#PtR#eAP&T-j2i6.=4tsZm\Ht9XAI+;M@Zj>lh6aA*P^9Ymg(-nB==-!A!JrP@Ujn,c[r*(jRfkdp?C`Ka'\tCX"c-]eWnE2]?!>E.353qKs7+!n 6#@GFonM(-?c#7/U `%=RF:Mq*<"(TX%6m'N##4BN`FCU]KA'IAZIS6Yl^M@.Ac9lM&j+B^nBPM_F8&U9A>4A1\,?]Dm"HjZQoeBS+g@P*r(0$h-(o%_)tF-^\Zaq[G!a!2*+kZEg1FIUQoQ'Is@!O-q6,RDW&L*cfTJMr;Oj@K-m4'q.h.&*g>6UZ=(NAE6(&A`Zt6_.a"'B,/4g6Hfhln\_$VK<9b%sD6DS1ik7n?VoNl2"AkNMRJ(srj,ggIqTJD7qinH'Dr"1T?,?%h<c-Uco<]qYh5_7APE6.!sA'D[Pcr+k]LepHG2bmBAdernTRGZiUJ^r([=(oV&OWNEHV^Z6icZ=$@b]<$9$iK<H 6U4<]f8HQ[9X-Q=o]LQtcYqe"h)`m&Oa*Ei1\nUCq-C:GABZiJMU.]5lP@ *5='qA>bS$j=<-khf7pSLbmIOs<af&TciBf.>&lf^:q)eJq-t<<Bp4MYX]R,p3l,/!L6f(Zp9$q/+Fn,<<qtY&;pLEPUnfo@kV6]lfE&lPW6+InXRm2bGg%Mo_Fb_#j.?mWW252os0'QAH9lBi'8c%lQ8\2sXi6gAH['BAoM6Jl+>clAMI"nj1["LM3$H.A[]_V;R5U&`:]b&6Y#jVf)[s2<3^EFT@'1k[m.sAA^O_^LFL5<i@I!Q<: 0afF/=fZ]gXKh1M'(5%DR%iJCa3faIJIN*dHkYY= Fpl1?Kh"<a558gPl90dr3q#brqD^Sl3bD>9`KL#`c@_.37hW^3D!7q-d+sH]H"PKBbEGaao'4X0VO*q_]DiJ#ETa`/.\VTG:6;/hY=Wa!&dS'jIhi#gQg53R29DWgDB2mM!@0YmiXSUjT D!&gnKpPXUESfKN#bk#]%`T&M!DV5H#\6\@D`s#Yflk3&2%qXLo/kH-T2+lB3B0d&IsS7IA^oG>>h%GSF V<Tl(c.j'6N,P*4^!dV)M/,GgO3Q(EU)KKAZ4YWF`Af<%3l#tcFXr*o*R0:;H.G*@s&D.3#ZRe1J7mFD[L1_J>]s/^>I\V7Whb<_U5;P;9SW;iK^'9MkJbf-b>'I^DY% 6/p1lqe$rmpi%@9QBQLOCh9Wa$ABDN&:17**U,7=]j`42D]FA(X='_`0=&J..5R6qj#'X=_SNl&n<0UYriB=h[1YL>bUtqiOrXhb)B t= cb@@148"gmJ<%kTK QA(<IM,'N[MkN&\``#J\(MJFkY+*hpVtsl_anG>T9]RnQM5*,[3K/00#\qa(\$r7<?GgZKV#$%Seam]F7HIVt6if-<f2DC8"5qiSVoLA]qZ<k@k37aQTED(EF?$5MFrVcnd7e bGbm%e*-./i!K78<[pe-RT=Z1/sDr^nNJlS5QWlI"B&dX'Fof;5?R2\pttL\cO> pID+>)5j.<J@DiQogea:[YWKp8$ehT/"\7/&GZ%&4TXHHXB'-bAHZ14tYFA@+gSEA$6;/Y/fS\6k87OCI"kiM*Pt2!1*B9SHM=KHiqXb4NpS:b USaOSpsJr8Ie,q&/00NR;XCOL**O]1D>mCf[oOPbk *Hq]Un-2Neb**1fRf$19k]UK#)%#/icFAV62!V2K=>\f3(@^SAhR6rO9i`c?MtkINO)W)6m9r(H2'PB gFG4,I[Yp0;d1!BqB[S;'L+& pVd.dlcQ<O]f*sH6qpk$5K;1cA&t7+67]MoX4rOq2tA=J7\lCKa]nH*hPS@a8H+SgosRb4t?=m 9A_bMP9.Z)>*bXk:70KQ;WC< <O4 0[T,\M0h3dL;rW*\m-A%C,B=p:F/QK'WOG47'$)1C*`/I.tc7*``C7q#;%Tf+P&?gn jN,t22cViK-s22LlGpZsFE.Sa;f\QVM!`piM`[X/BOn;b]@p1I3\*D<B#Fof/F:/4Jp5X`4!Ab`/ ra4j:RFrQjYq`!8AA!a;<G*is+]e:%)$;VJ<D')71 oSa<^&Xq[p"LB5[#]ESNE-El g9qtTB<n,\pCoOFWD3=>EFEEB.<f[50b;?X"Octl/m.=`A`Ac0o640&tI2VDri;p0^6los-<A4d`U(P1?*026IfW;UQ$^'as e+AXDDn@Y+rYC5$pA3 !"UmTc/WC 445`Ifc CfO$0)Z8W'*+2qlG#6SXd+NIbZ`Yjn8dBjYX!6NT8<27Th\HSHD2A5A/.,RMNe^8 Vs@?3<bA;:m,HEq\284<J,m\tdg"(C=LB')WU_b!@Y0R_>A^piDC\,Im^#IfeW(68F8jA%+/Q>s/BgLP1DB$OV`lJ`REf[-Z?cGs;A?ec2WMM)E5QT;A10:]\WaUT)s%-iC%7nSb6>=Qf#!q7Fjj+#Gs X$k(m9qAm;M_4/:AsX$Q_V!L5@1`aisf--I,&;AC[7`2P4,RNPD45@N?C`k!ZR_YRgfWtIfA*6Vok#S+>E@>19/TQVImrkno550EkE"V)c9'Ak:=[$#_,JiSFUg'rJZMD3D'fQUc<fT&:"hgO5pc^ZHWXNqQB(\EDO+m[!YAUldAB_H<nF&==9^g6=k#&Em3+,W.[o!T/<YIC4,LA;3AY$S1T4('W#o'bOi#aE]V9ZH$,T-qp`AFST\\8a?tk$20J<4N:SA*9HneA5r%VY" $E7K$qt-ng>ZsQ+*q/MbR]JtbAA;O?Qf.X,4.#q(WnbNEd7K_@]eeqZ MCJIP0Qjl<5XA#+c(53G+)42KD1'>-#71FPlOpT:)L=gpA>nio"mCS/C>c^t@An]C_<n#p>m?Kg$/\&fJ3U>TtJCaDf&!+O"S(\&i!0'Og;Tm1Z7t@"jbk[D[oI1qsV4"i@3Rcq&doS$0o-1+U*T:MB!>$E8qA:,s4*UFg]8P*P17W2"*NZWk6$'s2@ `bOp,s1C5>h0fC!gX`X@Q>># BH'>bB$BF%'kd/j/8KKIm7W_`R4Xa49b7+Fqb4O.qc)A`iVW&6%S!,6IE K4o@(lpLEUX96o=SU#cE:J1HKn5VFb3T-kJh!!eI.b-Mfke/EhEm7T0U7h+q7K`Q*]D0X6o$H Y8:Zi`Wsi*VFDtgRdiPY,A<:_M_`^h,YZNG%YhF:_I7*LF3`R.<-.0(o?; F2,A>sW*Ci][t3-=hpVaAQY?Vc`R@$2cY;'8+[,kc"r;fiQI(6[_GF@TU!Qi4NI*?=0/s$VR<_YZIdI.=9@]gakFqn4@on=`"Z"`/G!59#%^lhAi&:c-"Y1oN:dk;isr'Y7FC0`hEAoh6,2` Q-K*``XNoAc(gpA!A=[nB- r/\R;P`(=7j:UB/(W\F!L8+]h/#]*;tW<dP/ai#piqZ0sXqT_(LOb*8.=QQcln\CWLL&)aA)fGi=Q^DN$B 'Z/_^r$O$kW&dU39I"'[E`)$-X$\9 CI04eEc*'n(Pf>C&*A/Z0Y,Vgksst7)T^Rfi9=38]od>kZ\$]h*9cUU,DMlqhdQJ"?h^/;<Cj&&R0252VkXp(EZ!bWA=nn4a<\POCOC3TO"a-&O"a8Ve(ojXa!k#C6H-"-p#q9Hp-A'421cNd?;Oo\tf(j^fqkBQHM3fdQ']2l,Wa?i;:(<k,TL9^UV-Md3onB` O5?AM8Ed*'+J@T'?`'[>m:@:%ho@6ZU3'gmrAhEq^D2;"=8[O(h>Zm^,jO18*&>tSt4UreJ, +Fk<,;A1Jld[J(W2D"41o[jBL-P_Sg+RI)S6jX1.<>B rd.TsO%nj)X6l<bY>3Qd8@W.`WN6F^j+tJg]pdf4=?q@,eZg0&*-ALgS"qb*St>4bhsJcZWA2!A2X"Qb`'Sr@-MVjYLo."C@K*VC<!",q1ejO)A$'f$)<>FI 7kT1*A_HBA^M1i\j@.^b`NQU\o/c?'Cs6%hCQcD08#J.2$B;aQm <i f@.-%0S=al"^:h*7s="O)\W>nism8,ZKpA<W)YAEV`fS$Zic"4LZ0jAeYti/M1\\F55F"hgO_(1VTt5;\*.kfMF%^:QRBclt%EU$6SWi85Y?5m=;iL4f&("R]XZ[ bD!!n;21s&(='S)8(pOCqpi 'e?4Mb2o2BF8A<F14[a<A'$?m54Q5U'GaG9U; _mXA<,!OXR7SR#2J edc9 8H79p7,A?*qE\f_N*L'0MA-O/C4MEEXbDKZ>gh%.6-UU;le#=CURN+:R,$5oPeg7<.1(okE@\UHV0`\e @4Lto7<1I-jC=PU*/0rX*jjAO>U=7q*/-4\lWG>#KjftF@`/SB_cJ1h9L"as=]ZQ'0N&<Le1fAO[3qfr>0Kf`>Okq:oXe*]j'hn;[[dsd*q`5kH8_TkB_4-ESEqgMU7d02[s#OebDd8tBH+jo*<ZMWi6*K>MQ s)F$.-UKfl"9+f@4'bd<im8Sj-opD3J&o)hH(SQ-*:U?Jp!<^HnJXplhGJ)c%?Q$.ktb[-V4r8]I9b ^6BW0abHAhc-W9,SR17EE>0XsbR^=`NJ*#`.;^E,ftp;/6#AA1(VM\E9m>*4tY pe9V\+Odq+V4VZtYmNShEfd9s<a[$C`3tN%HWU?,p<CPL_@WU#Tnl/nd^ DaR"cW`HAHPW" 0#][5A)`<X-OT]Gp`2AsiC14S3pd(bsPRN&2<bG?/cSCd_o96R9\KG\/3"[,d6_G1Y9aTj",Q0da'mlFm=Q)\h6$aA?Q C<d-^&(>'LTC\)%4Kq"\2p`O,;(n5TVe.JjAtWtt%VBs^<`ZV(m@9W:hSJT#%IA,j5O+pA7Nac7B  ]b+__q9>JnP3Kd4,?'R$;$a!;PEoDHOL\GO3R\Z%*^0-7g_cpbSYgI=U%&?Z2JN*"c8+/g4n,MUeG.ACAd41bI%"%1=A->InkNKHVX'AU%LP^@0n<t`ijbI7&#@H<S.1Zk/*!5"@ rXh:#M<[sYS'NnPWWT<": q?t` GMBK^.+j7mdd9?snet0Lhc-C0lZ>4J=Z+:RtgP<ZPO[_9rJD;o>;#C4#r5!]4<XH`-.K:2=;ZQ1P?+&#Ap2Xii9DO3#$X /pQ^tTS*\a'U"CkRkAfo:NI*"Fa'$a/X!ZR1U]SUBGhN3m=kctBoaT&m6^)dB>kXAh/rtSRk/tah0h#qq6*UTRW)`?9;_&agZ@<J"L(d9&%$&W:rIWCD;q&OH7<8@nC9:@:E[7U/&#.SKi/)1Hp#1CV$[!O:(Gceg60Y!a);BjF:gbLWW3,65%1qEJ Hj;+0)$rN q'#g# UOcf@p,^WAsoi&Y4o(ID6&l5%sAjAq-+,"`JUV/B5HY070!'F3kNWTSb[A9!gNFG9%3-\^*Ieh#e9'_2]DnEg3<:&TeN#WSF'0,llsE+^C,,1'6\LCg/F/68aJrSHjY[BI1'&/`Z08'0YJP9&<=m,jYFBl N'JJ+=t>UYMrtFFj53\c.Ane6QQY,%FtlTt[: _>\P`WVoMnO]E"ne- BL>nM?r_L(.7P,$l <'oV0+_+h.-Yl5hLP_tRUMYJ]#`/5@aW[0;rZ(\DmXN.XR@N&jW8_RL",/`s"4V-[l.VF&DW1%c.<-5p:fY$"bCl3CNM[-9Ji^tngOUdo9WODbYcd)3@r3#hHR'3/K&/DLA\LNkD dM:XDU`=)S3tKgZeTSt^?@Ye&1];%b;NI4qde#_^Q+mSk"caS%p.NAIU/6/Rqq9J/?X_e/^W6"Osj&3QAcf,A)+s$NA7=h2I*O PT7!jOd/(5RU[j/[J+P`2XM2JK+q_f$bGlJVM*B9C@IWNoD-!>Vf$ClFqj;J5\@PX i8T<J>!PLA@M69mfY+<X*5AH"`:nWr/R 4[Ei<d(?-5a:(o#T_E3UAI/P7+LsB;&3Dd \:h?pJ.J.Y2EmW+%D76]`[>$Hj&GV36ko?,P1XL#o#5N]+.>Z&k])W2JOC-,Fe,@o>@H+/];/0<!Y\V3DlZ>kkj+aTqAHmYBfDiW_:I!JApEq<`,oCX2DI3I<V1G?a"\pQ<8[WA>8ls4ZX/CmRi+_LMX4)`/b+Egj3W<&Yb)-,mq:[$).fYR\230Q6N9J7pJs#g"EQ\:O-#lp)@e`NpB[LHo$_JbNJpt&-5..ct@gm_6)]A8qRtA-P1b7-r3X, V<^OHNB!VLciffttgVP`1XLDJ!Us5H?daa?nspLARhrasnA:iF[PYI4g]5E]6X3EUe5-3AQsMm.*[J#*El(M:SIf])\A@hJ6?U &*Q+sJmVC sE[ n5!WVkb!?+n"Ab00Z8gnQ?i=FC2B%gg5qi;k#Cg>8"2o*6YpO_5p7D4g/c6ESf&'Ao/TpH>WhrpA8U5tO-g#>t?SAgG/-h9<lAL54>gYZ9sAX\Gsc0m$lG^/%%H(gY+E#!.iN6BnR`Sh8;7.-ndY8j2jrnC92f6GmAq""UXsE8-(s+n_3rN&04pj]'"8#TV-W/etb3T;$q=%>Wf1S^CEZVr7q6HV21L`<pg-f\0`ifI`/fmVe<R-5.[iN=M7(o[d>6Bl!F!#'UcL 9A`Ltp$=bS7kn3*8cc<+3t6cr@^Rok=*17%(KJ; $0WRPg$7#h'--o22?aWnC29!Y<B2009oY_&"(2@l<D/<BCYQ[tY1Umh++L Q`97*!ZN.V!elE2n0a`[IEQn<[07/06/21CTIVE`&"U#Ih;t:YK Dk\&0BKkQS\=.Yah2nZU$1T/-RKXi`rcB86C5\E*L^Og!s'?s"aGp`#_r&d;>Pe:b$mhLU\XU0&mp4UM=Wqrs^htO1\<ej[8"<t7r\@'XhL5./X,>>aCI6X99s_9C_09XU>4?E<(Di:\Rr&n*^]DWsZAI[iXr1Nr?j;gfRdO654c*'/k-D-K'k^/)NTL5n!63.>(&`hrYB'/-2c4lkKq]G YijUHe@% <O]%H<'Wh\9,t'6BP1%&iciP*Q5^S%]rIiQ(=8^D*t2be2(14bZ G^c+I8%0n^,L+fb9\Y`8.t?GOT9F6BT_Rg68]I<mUkAAH P<F6;hcT-Bj,fi4. jkE#jik[n6@o38=37"3&==8;)">bSaa!<HO#4Ggp5QU_ho6&n1T/Ch8e0E$f*_Gkp0@n;e.;.$Zo_9\mJMK99D8BTjG:>gbLLK,NANVFKeKsmA^pb0qWgWt6K2iFSc&h..4+l)q.%)F$C!Jg6*ofZt$h'"\Y''*`SRa.ct)R$ P2JRs0'eos&9V5Gh"&eaT&?HG.ZUBDEH*gD&TZQKTY07"i]t1'rY8SCMZK5f`A5pF-n`b)U&J=p8?^>+&SG'sn#.X(=Aqm^6S)KD@8mqG/(5]^Z4LG[kML3$>>rUX7]Tr,kA.s`RNDea#oA)8Vc)F;NL:JSMt_`9FMlVLi[MLLAU;Bhg4qXW6SB-6S+]!pkG&/IZE4.J&p\=b/Z6EN9*!Sd Q,S t3mfRlZ:$Cs6d9f j;BU&&\?Uks_bSLr<Qg6XoeaXK?M(U-TeeB@oF<S*<lL$/&1TI>NK_ Y S]tnmL?\SgkPL CKVOdIkl40H<M,sS&B2c#ommg,\J!>VapSC& h8le+Ob"7 J@#(E>.`P`IO(gGW1$&)m,j8)]FGtht?s_B93RKA0!^?f4_G!tET9hS6Q0/33RC$l'-FfdHs)RAH17:IsPSD<PmlNIpQgcWUs0=6?;s+K@NAFd.XBkP2q5XJ%Xcairqr_qfpS.F=#\']lSo1pfm-U\it.)M*HGJ<./SlAiT87eU4R>3Y+L8\e-)W\d`qWrkkoidqt[A6PhNX?Hc,kh!,?,0i#TJAdmoaok['CQ[(*J`8=@FQjRT@N<Q:'-H;2QnVbZC@1"f7'd1[psWO4Amt+]ek!n$jA!cQBA##/-KsD!M@fEI&6?KSpT*pA_.?IJ0MqGQ4*0(_ZG?1Z64:e+F!kV\sZgA+_TAD8EF_T8psFsTYYmKtU)n[4I5Wr)XJXN1[$b]8J9h3[3RLCfLY78a;gq&Vn%: '\*oRpI<f/K*=W8FS\<t@*;^[IeI'U0U&@`qp-h<P4^MBLP.clB'5UpY?@9*Qlqqr!>C31hk""_>[IhkY3E/635,_J"A<c#'#a3f<l0bSK^-m/b1-8PQ2I%aB6hE!"]`sj%K+@^B2+K\O("Z<VV;bblt9p!pQoVgp0 bcc)MeJ9X>`H_8GP=<.%rl'dpY/(`9Cp&Q=>(t<$fm<6:/a!O ^Y,%1&0 ghC&!F0'A5dqn/LW?7ehD5?>^Q=)ZB]0&lUPjW3B^2S1D&%,c%m*f^ @NT>Be<9O0No`VlQOVYlRV+=.sA_&ll/5n,@@m+RDkB(0Oo-E6$VLZX5kAmnr.I<qS<ZmO8=&)*;jO>+?h"Yte6A'Ia"8,(=LJWQ_b-#UC%m1I)6AS6<gO[Aq]oZ)RgP.[63 >$rJ1G$>Y(C;;A77A!C/B2X!Y1$L?Y;go.JT2WpG3O/al,H/Y4TP7\ 5Yf'A&^;(5d"kSGmmD/!7(C<la8B!L#:b!_UHm9,qcc9"DYAQ't=$jhcAQA3"[&tF3\rs;<"hiXI3I(#CMFk0&^73Y9E!aU:m*27;!4AS`,X`K9JgWoa?<V@r>N>1?a9Tq/!BmS%(+n8iJ#P[C.9\h6>1<T(&C!9)jT$8iFGC?fj;An]F\3K'Se$93Q!WqHt"O(D_ST>$O"5mZ?=L>UU7+r7A)g?g;)Dkcf`Acq+bUWt;aeqJe&YNT&U-^MUctE8=P@"M0Fs IZQiji)(!)3I%2:)k&Mef.MfPP2-b!\287:Q O43G%D^9T1e$/B6-_8JZ[ 'JKt&MM9+?&d Bb8IX-'tSaYlD8.=hl*Rck:+T!Y77.9I ib2EtT'^>A1YnIIF(A?QPAL-]4,jJb'g^f@[NRVO\bU)jTfRmX+m0+B+^O)+FDi*4IYq@m:#be*i"F^8N8^f^TJ!?W7$Ho"65r8@s12=X ZgBnWj^XhnL5i],M(#oFKs,YE"=Q<(2.s:0632=M_;Dbeb1Ka3K:I#NQZ)92HD1?O%e]Q"/0iWXY&Q8,7!HJnNs3tY6-($@L%^Hh8EHL(s)tlpa_t;+lW,]"sR;6(AX 08Jb3_VEBs'i%$k."rbc]Y(J"CnC[ES"Z?)`pQH&)P^T#V^J3Uf%:B^:1PbkacUf)p-T8Sc]AF2:j0W:b61-]N1khkK;^T-GD,1Lj`G\S93cH;?;df]meBX"@Q61BW?;N\>HJr@b6Uo`e/FJ+=>Gda\7lQF`2D<Y2glUisK]?(EO*NlsNSt5<N"#Vb''%%nE[@gL* (&/UY_&I=htAcTt28DZ7GL@%BBht?d:37!Y _5dG\_[-qTo6hXBM36q_`:5*DW -cG4j.FA,7`@Gp<Z&/tTo2 ?hNj>@pQ\rUg:_M)WfrR-*a(:?\:BnTFNmO3)_*741ZFb9?L\VNWbUQ\ iNOY<'=m[!K4<:N&933(!kAQO+0ZMh>:<^.!BL-^LXM:sPMhE >K<& P$$UKZ3-Er`ZUO'Oc010APmiXmC$YYLmqD<c:K6Y<WaIHH]c>OB:&JJGr0p_h`U^2!Zi$O$+qqr:X2QU7>g-j$rBtt$:=st_ST#WiWG]Bh(m#U?86]Ll=[#M)r'K>Y(Yd;*Z@OPnc0O6WBIAWqE%ChqLXP"4XRI6g>d%Oh2c3Sl@FcA+]9TN!1)5Z_4qNR!JW\(*OHor2E9Z Y<c]KoWZ@NAB7#(g1!X'?8Rn)J'cn'O&h8n:LA!qNh-URea-o;10&.k+sZ-Vb= B_;AN7@d#iE/O]`6I(Crn(`0U-nYED8MR?4]4CZhO5`>F#ZW3%GOHbk<N=rm<I`\6PN]ZL;4J/e_W<B2=%[OgQ3"fOPg\fPLq4jY. NfR).k@s;6*m0,(D$oW\O1Yd9m;'(.=4'W@-2 >er*[$1[)V/l'oNts%P3Yq0hbc_\G:!%42PVKSTE<e+a#P>Xk)ZL,`sRD1Z>Ht]ioAri/5?oa:%rO%/f\+lI(de*J(!W[Y:,fF+3`T2I12"[ceY`4V&'#Gtn\ H8MPfCF"l*d1/4iHnaFoJHR7tG9rPtsji[AL: pY?'VlW;I"31P ;SQsd6<_88#Vt?#0q-gZ?CY%]D]nan26_$07m[/5'm?0>)^EI@q>a N:g^9DMY!#g%)ZmtXr[T6"[]WH&g#Ds0tq9;WH9RAra!0qPA#0^AM#s_&OM0Arr/Ng0Ym*A"MY`+GmNeHKVI#Bk4& Q:oG-<J@=KXRgr0=A3A^P4BnL>oWQe9t+QN#GW57cYNorf(ETGA<MeVgorXY2`U6!=Qs/iU_fDe:N#IXs,)iA5ZB>(T4P(^CIF;\0s"r.T3QQ$Qn1.mk6a,$m"[6d@91Qrt%s!4.c7(nq[n'"*c0A^I!JoZ^BlUrAA;li[E-fC-F_chc>/IW,/VqFPOM*1+)(f=tmCBeJ`CBc1jAZ<'E"!pa%_Ig`80;/4H ;$'Z%9eJb[?W5NaPtG9T"tfC<=HRJhdRT2GRK5rE#9*>)5kJ8KD,8ap Ap="lA*c##gWa4A-c`if_oLc$L387$c)*TNVJ`'\L?Ok8lsV!A\?;?]46HkkRh,L>aV?"A2I$N60>K.06:4XZDh=6MGRheK(^]]EIID7ocQXN4B5HL4q;QS\>6qp,A3"G"GJCo"Te>5ihQ3`3r<(ctdP&!s)3ET*8&ib:1Ak08U0G`?7rg-AAN7&"lc,r?-6@%T-If4`m`/1Nq>m-Uq\hr\tl=hM:DH@YrM+n`(Qo$h9[[!6AsA7(JCm4J"-D0Lh^=$_OpM##ZRb5-&>iT-,l](anU0gdZA-=&-ag<7)glW=ftg_kRNQ043b%AI=r\!Ab6T&I!QCGQiX+[ADl:?%J,AOm#HF5Y6>/6Ls(U?lmlXW\Di?C6[a-[%$.Gl$&]9#d:#)rk`6Q`HEQ/ZR!dQr_K?;7/]>l*VAf;6-2O"#mFDfes+.%=CPbXX"0s.=C]Zhq%-r$<rMH6F>GDC1]fO('PM*K>qB.H?9h8T0pZ.l<9EPlClV&_C:lPmZ*P+Q0\;c]4WdZ%==5Lm/BXMVTH_-d`::Ol*7q1c]A*NNWKM=-/>O@H$a1c@r.=0@;M*FRARei!@a:#O9GAAO%Kds&>ddJLcVT?IT$-AKATC8^MBRmm(GW\SX/WOIPH?1imPf(^!U&2A=(nXd&^(]XQ"AB. =KtFE$A,-8/Rkj^7>cYE,f?Je-AF"l,CA,jS>l`Z?&00JV$_X6262,/n*m+enS@*k1IUG-1f'C9QR2lG,\NcdHf^*N$JZB_#m"4`<i\0oJC;?;>Sl cpW/6,)5nI;j48=jiE%4X_PFnH:EK"QRW?HZt-L6C#?V6ng iia$VRY>/X,1)C6*aU-mO;Yp"`Kb\oI>?9.<A@?nLG!Y'^<.f.(ZfbV/^jeH8bWaF3;pO@'8[+?8qg6)%]q) ^]>0_E3bM8F)%3T<HS91m(0EYPC<(JE__6O_.;QNY=-+K<>:=T  98'L^C2M,'t],;*2d=(AJ?AA7LL>)+cp^F+5)^?Z \@b.#E=m%WTs!3?5A+Il_aA)*(1H>]nC( [o9'5b5%Bc!k.I-(?Ed/Gn8:sl-(Z\LA irQ+LAqelk@EJ!C`:":bpGCT-%Wism20#Nkm0lX@fM1*XR.Xeh4pHSHn=0HUL Vf1_r._85CGRJZhi=Kf=:<Na:JU N2P_aPt+D*3qZmD2kE^Vq:Q/E^LR?Qm#O!NO^W*lIApPRDTj59oH*lttP3rFKe$Bs3.U:b_#DS+E`Us<BZLX3=4q/cK:aL8 /0T&47eC3ge:Jl6n_N6$<@,Nk&`?bFIldGYXilP$C1MV4'EDA1[8oMpHq F:FD_ZPjX'>a7(_(=ARSeai-bX "*&9TZORq.62:6DcMOFA(=NN37F]q1Xd)W(^L<Hp!"DQAgg_XTqP/(0CoEDhR+@Wnc"@2Wtod;\/moOnlSqf`VCehK]cI4%5&=`MN558%B=0E.s&G>5mj<,CZP$KDAr_[0kb7b4K"i#>= "[46g0F/0pPWVpNXUHgOfiV@&b=r* %s2?([p*jG7&re>C\qtb^_Y.Y\KT7GS0@m<0E6766[?_(c)H7JSqT67AQd3&0lUp4.`jiQ'41[,CQe2LU*.,in47K(`d/$C#"qCDHs4?L)rb4,H!]Tn7Wj<;j(f`rI90'$HQL231/4fq3A"cCd]Ob-HH"9`t?89AhYoDV#<\4DWdo0;9PT+9ba;E&.5&(s,,TFOGO."Aq\gn3-r\5#a& FAVPE(-fOUcJ$;*JZmD\b1fZR:'2'dS;fkfEh7B-kqL;FDp#s+[T'tpAb+cMk\819^86`6@'@k'mm!Ci3J1%T; p1TgG1mlKRe:C>H@N&lpR>_2'RG-7')C  35)H0R\88.5lFP0EhdH_FRPRRA/U*7op6<mg5ADOq[;NoXZ]j#\7VkPZ&I4"Q:(DQ(8#fH"?h ]!q)FqVd'`5K?h'.B ^7QK aQL!YhTiNYWtJ)Xga#g)1b>c@HrKbo(_6InOgZOL(I"d12 .7';]bcB=PA1\tD^J7q oo$"`"=AW7o5M#PclL?%Y>9P+/+4I^[k<,08C\`o!=?MQdHI]SQm$SGZ%r7LWG<f%IJ2gM@\mi[sTCrBm8Q*:8s^a!E5";IVAWn@@rXErsrRo!n^@WNYAn8[%B7C/YkZgi)F&2Bm<gS>Z_]Nm[G1Qi9,Q`Y!bUF5o);(q5rdohKafk-/)pi-Z/i#E/1Fpn&3fXEAl2$gAo%!9@*RDtW/")#H&jF!o$4HZQd(k#bT5]1qaY55B5NX*qAkh;^JAdlUt]tG.%AK6)=G>T0Q[Ld+$M;-U5mE8jc7%!QUiNae55V"1LMVqO%C001oeA9\UGglJ2QP>,]j[F?3bV&_X?N>$ mZY<\Af06H.HP"t\*a8!Vck8PR2io0\9!?[!>#]lZh*i/l(2m3%ZkF513FWEET;5f@?OhF&t6AKbYOn>H2g,$[\F7Do9-]dI!#!!=3MO*])A2L`Ii5)hV]*\n6;L4IDPgo.Rtthd<>HN<$:7@K9:!=\/0t'$CPsc(lF?jXTm*gA_5+X[X)d@EOnQjd8f'+ho-P7 Bo&02Fo>BaU<5jFKWrmm*3=9:M)U6<?;M/4c>MtbAX9_;cq$8eWP+YZ-VsB7_ZNntt;!HY5o0%NUq"7Kq]D`r<!6"W7$Y2P>Pf"%!@7Bj?nK.t6L%(H(:r eJ@A&)sjLF"OI/f!h#rS%lPRV:i3fhld]%\*;C9PTAJs_+F+! Srnq]BHjI4h;6AA&,7&j];Bdl;]X]Z[;H+.IC.537HVN.ZM1WFfK^o4aZ4#f:.Cp!rK"n+Q8q_@+99&AEILR4EF1*kV#Zi17-M`+#B-%C(I\ 8D`9EkPjJ:t@\;LAc(P6#%em7NMI9HhmZ,]@[#lH.W%&ejsADRKVa<o02ALDh ?m8E4d!LI9@S=35s%3#IhhDr/_ciln*:U4I;li$!p TM3&'#opi3#Ksc^^A#EbppbXQO$Vs*QhpQo[KN**(m^bU!P'dTk5<ThQPp1F"t9mKcj`Wjqe]#%h=A+Q"&IbF6<l^^&[%$&;D-bq?,?p:DpA.L#Y`7fhUd:XC8RD>!B1o%!RXJa)%98 arX7!r3!f($ZgAp%d:$9;8%Xd$1.a&kZEKbqS1 *TPbtBYQ\fY!Ct\- bBAt'And8N/Z3elFBm*J/J5:qY)A,o@&`f,<DK31#cY! F"7E(Pq\r(C+MPC5.DAqjth%nsOZ]`$*SjXap#P*-WsT!T*X)\*j?%dokd>q\Pp.fCZf\E5JB>&\`2H\1TP4Jj*&IZF`7"h7MgNVV)(Jg[2HC_O)ipS8<P&7^Lm'23qqO2mKKOngHAd&Pq4B#bOU0ZkQs-2UhD.DqA?JhU#%J;Ck$[h>L[^'K!lp3<O1XR?,K$MENo)9V*_"^bl7sQ4A2Oahh gh$%s\Gtppge(EZq:=3OY6 MZ1oSGmTqSL?ARR%= 3*Xf3g>re'pN*E"$M!GG]_f-Zh!]jMotT(32."?4;=o*"&Kks9sBRc98c=gGCGoP_=EA0R&B4;qAQ>95+4L]mP>%,$(6=@G-GO'* F@l>I-q-RqFB>?8@7<4Hb;(R3Jo[Za_dIN$=I'W*r-/.Rb&.WK*lnL`iVrlYa(GNh62Gt#Z4L^L(o>pkCn"oNI6sF\%0U[tLrdpq,l&NWt4giAdE&08K:ar6nBh&kH+>,5O:EQij+M_[@g5tM%TFAo#^naVFUEX `cEs/Fo-D5i(WNQL:4`WQ/&#LR%%>t 8).'fUYtMl?QI/3KE")l:.7)J0)Rr4p$Ui/?rV_Ui%YfeV9i=lGNb-I$HmR>q3(kdPB`LZf"&*%+"X*O@>nim?@nj+Bdd\a@i7tne0:hfH7WIJ75M*)?FUtYk?GXY/I"GR]gl/th[Liff+Q=hc.U&p]r<7Yrl07:T=\:(A1pltB8%dS#//>7%e;K_""NbN($:BP-i.aC*T?AmY-NM"_oDFrY3-pkL!EkM=ZFes&KC\/+:b?iA-KHX"AESPrS(*A>F'X<D,=9ih1FUanAA2`4gp$<=.g?TYcF=H"sE(#7PkcSO0.m0I7*.,GcKI8k]>)+=s/`!pPje] \"(EF'Gc&QT]n`9CM8W?4kraj?*iYB,0[FTt"3#@X(.\VHE;20 m#_da\(c$]3@CS?*s<ld9Dj^AW"k0$htA"BDK`f,/B.Wp=1W)LaA'Ok<dHp>js)U-m L[n3V@[<%e3-gC!Z)+_f8i9p.'p3 #/940)^4&P1SB#.66iPVn:T7c+/rtgOA-CaV$%8jEc$ 23QX9j<9lC[Y_VJp'1?l"577%U>>(HO?qmi\^\HFeU:R$Ik:^*C<m;Y 5AYX&!W(VrYMUnP876)sQjiNnbr3''%QkEE=?$#-&0QUXANki8723SiDB\0 %!\%6pHLamb3&eMWh^,I;,nd9MVKT``F=2R^09a0d.GNo)jj9ge)A0)k!,3gt8tKb4d(Ef_^H]%] H=U]9N)QEdsq24ncLar#O:R<Ea`Wj7@0s&q=5lD&@'nZS>@d?Jet.3@`=Ws::id[qSspkk6He;"kGSOpl__Dn@"!&9$IEUQtUM !i:X'G\LDpeEs:h1g4PJ]GmO@d:lkc^t3(D2WFM/l_9L5Z4#,/` F^&1:bXk9C_0jM!bdcd.j.1?s8O9i!Wg_P8=W13AMS+"MEf9j-'Q)^,o$hnsl@)d#e>l&+Qjh%hO=X_ZrARVQlT3N4Y![N`7,h_VXkEnnP`nTt\!\7!R:QTEK+'fSo%)kD0:#ZWe=*FO3Sic]i`F[W1)aY9kRIaS`@1_H<`hA9.#+.W^`V)Yqq2Hn7f:.2;a PZJEKRJAjQUq<?=9HI5>DYU.`Rm4*LX$Z >r[!R2Y*.ROnXYk?+]JJ`H/K6(G+(l0n/)tHFN%$P,R5_S]B?(AZMH OPbCX$*)T6"YjcMQI^B+; %:@\&+A$KTVB `M+)<@TZ;7$jggJ@b]V*[.jp3;I)$" L**>X+KHgQ*N&PDG6C[Ccs"MN-gl;jPbg)fdR+^_Ds7'`UeMn1,@a9`A:SG]UO]rCqXtQ_C j>AaHtKV,$-cN@D[O`?-A,<qk5cW((T`-%C_?A87T>nU1#!1Zd!R7nb@ZG6+6P''^ZhCNet:lR";8&l=3=6m'p9lA7m=Ht&g,?H"A`ah=qK\O]Kn=<N"1np-TWPq 3C"6+IfQA?DHK1""R6GYiaf`Z*+E1bI:@H?s,GA G=d-T%p1e3$h(gsml<dFK:q(1\RCIc`WIj938[tL;nc49'Y6MW#a?^@__*%(2IDJ16IsoA\bBH2km$\;I7#l5.;4t/F7"sYAJ'0sq>US6cJBAt?5Ti)Q8!K.MeNKn`nAU_Dh)=Zo_,R:>sQ+]O+tX&b*Op5*N__mkJdO*-+#n%3pn7?E 0A/pS`V9:VCi+*40;nXU[WBG]t=O2aDBU9(fLUH`AK(TYD( 9JJ/[#Cbm19n'3H,b(Ob:rprqVFfQt; )b&@WZ(tgah#SAJo+W%?6gh6k+*20T;Dh,,XpS36`4"6DX-nB$7lNq&X;b N,f)T?9lbGVFFL$B%9ofD5\5o)CtthNA]CWLAn67h.VS\Qp[7++]s/iZc,ZBJoA1j,C,A#NIBr6&!H>d;F37(A59@btq5<V\04NCBgA*L<BVF]>./1?S;.F*94=?6@PCIln`M1AaBoge7C18K%JS0m8_D;ZQ?W*4l`1Qa^ [[[^SG U%ZMXP:.4>FpGV('i@fZ`bD8S3<Gr#eEC%j.tL=l<;\0e`p&`)Yc?l/YHRSgDoktZ[\-N^4k1h!-VtPkY%WCX.R-^^Bf"Rr\^rB4I[M_=f3Z\HS-=[LM7;! E2*2'N'D6H75D7M+KZq>4<Q';J(")%BkV-jk2c?RljcE$Z"!FlS/( b&k+e+o(3](Mj=jl#is4A&R*Wda-UVGdA;NpS/NCB=3Z_m-+fs2s1C17;qf*]k:*EYe-5)oAS=%"g*_\pXGSAb&doD0.f\SUjKO?13_1+9X[\=KbSM!0B0C <ch<&3,H(JIB!!g)!>5PtgN( m?%;gP7rG"-Y8,aqtBXne5"_7!*0i/hG&jNV7V5FEGY3TW=L$^O2flhW?7.T1["^Ef+fk=&h!JSi9J_+t226p>8K:`[l^[&%AOI)oI1AIE0<eEmL^M;pWhmi\dE<^$r(2Th<.BcP`a#mM2X!8oAi-(6\_(63<4AicTAVFJn6XMIQ]'m7UaPbb&/b]M#A`naAB':@^l3EasRJA6Nod>A@2mNr*MKAP)W$>l-,.s$614h&b:hW@eWaO+qS7/`)EZk=P)@UtjI)6G^4DiWRB[GpK)=:&YY @ElO5-P+%BV\8;_H=0QV*En\TG%_YM@@7,c@%[3TDLVNi33!2i3-p4UP.$i-653qrVn0&A0F(n<YXO-jKZjVWbZNRb(\U]Vt$C@?AfeCm#KP\lN:B,;8k'T@G/l@l"AiWQV5Zc"E%QTe$m,'LHMB7ht3Z[g27pa,_\(<XODta 7#f <gZL)LF"gf3='a!#$`h(ieX!AYW)A:9^KNJRAAB"1q(f0J2kER"A53,[G*8Ds*"k^`IU\FS^7^A"0Kl?9*V_LlF#Y<4NUJti6ZV_MKf?p7QB5SCdk4`j>)8"#b@\$j\\o1L_GY]F>reb8%k!A?W'7S7g2GF-4`  .`s]H$2KL[)e$tW$4%(E1T+go"ZJe6N8?ftd'!F'i(IooWEIOCo!F:g1o/9LP.M+R`r#[P.I(-S"bhX1mGIm!T"<V39KCB'_C3i,k6L=8knE[Y8Y$j5rqHLAM[K/h2R&2bp&0Nt%f%aG9lIc8fWNQL/Lq3ZEWOkO=r79Aajl'^a-T0ae(+-,.kgTlD7tM.cnqSTX`55tp_aZNQM&k)?maA8L[J]Ye6NH>5tPm0o.l/SWe%<(9$pSDml_9JgoY)\SQn6:b_>TY&5/9_BmY->iD!@n(W!0\2kS!928^B  Jd%jKS?l+S% GiB$Bk(N74jEcJeHF_ssI[&E3T\R)NE0iqRk^c9>t H3MKKH0FU73U(MU&V\IW\F"A%5";[ri=#A`oPY$=Vo=/%il;!A\*D8_dHL%6S)Kk2IIXBBY]3s9F)H!&$ahAOhS1?18SY.b@WX,.\SJEfbI!78Xg!U5(=N<)iYWOJRQAEIi%s!#CN_[/ 0#aO\7@2jepFrO\^ToBUKf@74VT_rg6/_:kZ2R?,si Ks9_oZFd:A/@\^r'@k^mr'6$KICk,F$;@P]1H[fZrfpWFbg*,f7[Ln$4m.+(;3i:]/A 8#P&fU/\ZI*\O@Y)ai64fi"#_G<@4N2>TD<FCfh&NiF"0Q@F]n>lRMe-o$A&a=l9JWtY:;*5*L.>'rID!qop(R=f0SD*S"0j7Sh!@M@HWkOBb+QHbL["*.#eq3,j;Ri8sGq:#6JRj)Z4?m(WtCZ@DHo>W$<(=mS7*dI :.f$X51B9U`"d'QCCr7s1E_,GfqS<i2%/W+NK2s#;;t]IILa2[/d1`W[FeV14 jQ61aU,_.r#od,%'0l`e"FUKO/FJAiOYKD(@1UWC@s@,d4n'Dg\*_;/+*rSon#pdem7'\Ss2H)R&XK4Gqc0;V]RAXfmJU:)mIGA)*[LB5jnY1FArIG=.%AAY)"<.ZqopOfqcT<sBp@#0AmBA +hH`gIA/= %LL0mb=P4*rN X,8B(`7<eAlZ/i %j$e4T<EVEqJpV:FbAH@.K/cpAnO&5>)N4Q](>[:4m14*k/'oW&g")9i>F=mZ3YL=">B$=T1O=M4Y@AdaI7\)23KEcM%-B5cQ'$lp]g\1LLm4Do'I[[+[.KSY(hj,[=A'QAHtZGI)iSB8.O-pDH:K6Nqg_AY,aaeWo;9&.Z6!lSP8$<M$SlHA:C2_Ns!3cJ<EXmEA"O+[qEm:2IMjfc aCEY!nWUsen^1:r3QKdp+;p,P4q@42iT4-h,X[Flksgt!lW^j6Wk7Z6A;J/'04NoL.ADW>WY?%Ucf*l,m=.J>X1(+=ro)$hWSRY<[R*ESAO@kYE,+ZE=B12;UBgB[r.`HektD.RXZfAd=6tMIr0mkAgXrBbm]%hJ$Ia>?]p]>.5>a;8!ZLoc-eC(KB?3(+^o^to+Pgt:LT4Y(A 70sos!rHMEpW@T [=`SA-,jTCB`(HbKgY(!]S=OiPMRDP_kLd_V\?s`^* a,OXlt>i+6Le`,t'^_t[@1,q:dqPA855MEc4&m65\1j3n.+<sp8IH*CT-?`Y20$k,b;@mn'HNlA`giV7KUI!29;YA"jZd7=Sn=nGB&`+D=Y@VMpSVK/cYlg'hY/[V$i']#t(?\2Y=s'AnDPf>_J0-V 1jej!PM4LYrW],HA]3GAtLF*c%NpR#eAK7W@.CD08 .K-4QeTlr2A\R#P6:t;npdCXPmE;=M)H.Ao2ki.Gk^X7OS?jRr9I4D cg7U]'e69-f-Gj'2(h*.js:I%FpTdhnfDI MNLcQk7B+XY\AQWZ.M;&N)l^W9g*g1)O>cIh(t]l=:g.8MNR[^^HpbAEKhN_VK>=/C]'e@TKAiigaOjofP"UTKJ4?g)N,ro=C:q:<=Sfg4pO#BtfCrk^4*<$M_OI6>\V)"m[8?)=9K.!nH_\@,[J\l&$o4ZS+W_32GH\QKWpRSPo\9ST>,*YIQXj54\O<K@R9ocIYA#a@n!X8+IUq'Dg>aWT+KqQg#rCIpL%:/^A/Zk0!&Q<q;0VN7$2r`"l%Rp"dEe3+4,;AIjEm'f6&qljfXjQEAWO^S?;7HQ%*)0HboA8:WLUpX%dRANd:UE\kYPfSgD-C\,dh#E#F%!c/oYfY^Ho]#GHD#;ZFrAk==(c2Nq@ !(]/FTq.8Wmea XJ-@,.X'9r? !LB&arUD2Ai;LjC*KaIA:EEK-,6&'6Y)$jYdf=QM7Coh5fVp]B#/(E($(\b7"rZH-!sAd*VRWW(c3F6 :Jl;'a\."VDJZ"NsMr:30E /]PRT7d.H_ma1tsM&UAI)q!jRH7Aio 1=IANt.Z#3k[_'\3\h;s@nCH/2T![ZJ:aBgUkOP'p4pEPNU-rAGAk,:_+nFm,:b/4AO<b+rIA(.kGt2b\T[d63hjELNXIVqajbG0:HKY+W>MFDtt7ceOoco(0Z9$o:1EV,bq!hT7QjUBK@FRVXA)b#FAG<;c[Ad_&R41&&P<CcTR'taj]EF(fCsFb'/$Of?@1M$!(.'m:Kb`RAXh[X9IHp/ ZG35b.TZjN*!hb(6F+/qUs'@A04<TqGD?%+3jI3`q3ojQn=%^]-PAZ&m+QKl@57 )!p0>ik-#?=YWgjc'Y$)47J*>">o<t:b*M@6a!$F=Zfco2fWiKB%P,_a58kf)'UU>U5nkr'tNTC&bnc,nG*!W5[`8sfC;aF+tTG8t9>1jIf@nOAaEr]DU$chWZ61 )fB4In+i<.]^0af-pJ/C8RlP(ZA`\mP;T4h"c[VMr1X1%fmdpk)4BF9#i&*WbY+A OG;2"V'LML,qI>V4P@U6H\%$lg+D>=B(I?-Q+-$Z&+#mL8f UffC2&RTX"hk7eYXi,55tjFO41th)'T*cSD/\YDiRmJ&4lQD]rrF88apB\qZ[Bs!OX64<PGR$adA:GTfT70q[W*X^<0:S_aiHQsq2%tT3]HYs%IYU'm7Ke\Jiasl258g>L*9lPXApK`SIA49YYMr/D;%*1]8G1j:A#o*MP?N.+=4n=(fW2KLhMD)CQ000_A%XAa^n?a1!ts1sg/V7Cp-:6[fI(YQp*i6AJtf\):mj+)`"[G=P9<V;;`KYh2jW N>FVQJ\H"LDYi/<\I#aKdnn3,$eeltPj#iEJYG\(R[*.s&U!KcS).Vm^tr;gA$kc\P\?=+AhU2%V<_Cj/KS0sZ4^QR]pVSZD\:is+:-GUH8i4HIJj7B:tT63-B_m9K>ChXigVt\MN@BUmBDig5A)4?;TjAPpW>6Ab(jdh'\!lF&IH,AN!Wbq <nI @GWt*"^a%HP@8Rf2!7""d4iC"0^"m=kQpiEEZ(/lr7'r&;@2IY B;ZVolI=3<cJhn%@39A4G<q##4n#j(Vk"b*l)$q=U3>E&=ZeNW6:ci%"_Krid<\`No2Vq^]KG>RW'C63MXS1o$(jWI/J>Xp5=N4Ns2S4d33ifOM1!A$&@4VU$1&#-btCrgF""Ge^MR<s0(HAAiJ%RBcKkICbShQT/W6N8D*6.[UlMh6nU"YgB@FZK4PX#,_o<p?HRm7')7gPW5QV\aWA_,h711$_.0nhh@&+=-)&O<>@TD6)Almk!ZgqKC8OgppkZJHl6ZL tR#n,31n]$i-)AO4)LKM?<K_e`hR(=^5@tmsQ'Z+<'#ZiNL4%[iD'1`01cC?=C37=KaO<<8?.A71,QMVZj%EEoZ]cF".(ta3.lA5QFllF(HEYg:;4MqAAnZWKqd agd>bVV`b[*A.k^R8 9>/ZV+pP(XNi),k(\X F2)T9;*?$9K"-l^#K``8m<@Rd'\LCGqshA9FJs[2Nqiik))Ek.M fgWa[":])lE ^igSa+'4FQ8?O*(DBWH\?8L1qXY(h?k,=i*/=_]l$%d$*cW+5KP87`6RF#c,1r'K6Sg2=&74Yd@7,b`4"95bD(e'UY)YR#kX )A*9.q0sl,j)R^(O'5kP7!jMprGFM*!r5A]BJ'&pkPdeO@Q[B++1KEPLJ0`1MbqoS!GgCZ]-)aDiol)cq@5bkCAn*@8 s-JT!R*mo7PX'&]\A&Cm)F8!1+a!rpK6#dO8;0:gC$?XEb6N.WQTK;cS%KF0*mraSTAP-E[aSVO@7>5$1E##aD5&,aIZTkUE%#9W]C.5@=8(/<XR6p3ksfh)NcQH^pM?s1D^4XKaD%E7f>KHW/t.iDZ]QQ5I=ErFf)HqLV_J)#X&FbIh*QJT[A_Os-/#f!Qgb\!KArLj!UGN#9gl&k3*X3/g;:n`dY-!Y&#RZG8Klc+PSQmQ:e\BMCgJHQ\Oi!jVO!-6g@A3rmb\pVq*B0@5r*ktX\BAdl-L,@@GjBGS7AO^.!jU%icc-^+@!!nTN/E#9)1"m86qQJ$)i2^"<E;V-I<Q6h@)QV4pQ bUcFCU>e>4*h'&'=kETF-3I(=5c7,bqY5Mc5c,'R!n0hr87*phBM:%t(44jM(!F04pg"-R]DIn@"d`'A4##B;X9d`,R1S%n boGUpSY!4helQV8#69MQRj.(fRJi<;'oIhK&Va@g*eo/k^3O+9tOA)V>;gZ*M!CGYoA^Mek(+p0M7AY9ZY:sS)&7Q+(h+t.NRqX %`1)dh4q$.Ib7s ]SGKn[Q0h]mm+G3IUS@/bq$C%<#2#k9scGN*V$/6gL!Tf@.FF//.r5gBY?9D[#mGbQ+paH4rlVGsXXBqJ-E.ZKeP0AKQX(mPh?W_l.X\I@UKb"rHrQ3n*5nk3L_jA&4`@SkL/4f&,UYsrA1\JU75X `<2QeJ(4,(s*SYAO5<-tNh>V:F^p135lAmDd"#FA2_U@raXOmOqjT&=IdAoa"88UD_5e*=7Yib-q=ier1/b>(\b_?%D)kh(A;A,9Y8ob.WQbi'S@QsRf`%C@%F]qsbq-e<XP661H80!Oa'Z<\1;4i[?l[BQ9GG6%Ds'HT\_`@)4n;H^aCG[J?$^N.)sEgR rh5#p7bR(A!8t5nT@c$0eaP35JL*U+A`=Wb$AgWhm0Y7)[]j`,;\4Adkst[$7Wnl;M_V?lonmaePN)HK5V"g!nQ=`"gpf<B2U@YWj)jnIelhP8g$6+g:Ft&6jV (n'BmCD@t$Ncg7TU=fnRLC!h3DFk"NaVL*6(c\kd%Z>&il3-&s/`riH3;+8M7>am<sT.R>MpJXI/XoHAkPKpXJU71$-'?>eo:XbD^N>1J]NBq:Xj9aW8L4"+<Hn?p+tp$R.>\f8[r(Nk3AB2Ca3:9<OA"(`D9l2EmmQ`d@Lj#HskG@PI5F&ckNnk4e>M>>(>r3ZP%S7K:Jh5'_)JiQn"2_ff6>#0K/hh2,*,dUbS(UhFeRsr"ZO^p*qM'BW9p8 (/EOjJqM<[pbme&L`2XT/b&$ 4R[GI8.6ReDO#/HEA.2Md]DH0<_YqiF;]mFEX?12oq,NnE5qIV7mM<hHb+PZ`GS#rUagL;-TN?lI!kmbT_,CZD+\'*NTI/%LTZL5X_gKd*DRd@Ve8ZG1#fcmM6;Q'hFN(@+V;9j%NC3 &]ohb&X$Y"W[/'g0Ljo3lOIDQ-U4%%"#?]g3:dqA53k+8tAd!aM(<N,7-Y7+'B0VJ7E6B?MRS&Zj=*ZU;!S8a=qA^?g<?<C\AiRF+q0\?f#bTcWpB*4:`7JAG(.rMHmq*5A8>, k+a*)D3SQY9*9!Q?=g[m!<K,<]"3`"(l:>mTe:jmq&jAQeCad4Wo^c34ttXHq8Bf&_*11<t?E_'NI6,6N9/! 2E$"Ctc-3[F@`:+9f69b1o2"'!l`o[iIP1rgX&9r^]a58n]%/Zo^XSA+llTTYEGAelN4D_h^,.rndN(=&AlntlF9R:i6gNf;#E8@Ni*:3]*Y7L`PPFM">a90K"$Ti7V-LCJ$_\XHOUe9';=>pfk5TFBpgJ.\<BA1RhL6Y7^tP6=3EAG=JlK\e<Mj^a6c-[d=VG/#L-djIrjB._(/KosS>`)$rV#[kDp@M@%)Z`2MQp&=kq-T*-T!`.D7*e*_BM:oA$`O?/,$FB>,^7Rb<`>?QNp0&P?HH\6e\ZW"+]M.N3GfLPSJ,&$<b-a.?m4LEMbt[FH/.LX%]!'8S<`kL7H'S;%Bhml-O%#A.AQ#dl$+PXE8!Y!2%aCt),+ NK>UHZQoT3qk<7r'RJD9oFYcY%X*LdK5l\M=VVG%Cd`1V;0AV:/@.GP@&;pMo/%70[36V@UbeR/bqp(aA;/8, h3cYKhm8-<pXs3Jobn",N[H]FSfKenq[78f#4Oj74\:L[`O#i=?Un2tmI/mD=po'i-,0oBQ4JWjP=9">!X>`Ak@.=KF/Kn*Lr9A2HBMb+Ma5=6GlaJJ7D)VNsYn>kS+[1W!rF-2=/LV(7ee-LM%)b]Xf@?MknFlJ?6LAbX.H7toG'U*ZhALkX>'`/Z:O7Asj29LgT0&V!+/ABRn=aEK+qI\,oU0sMsfo0e\[YXY]+Spbn67HIJOfCgJR3<43tZC1KnJr=f4fr:.#KRfZ(M=;!k;@HT :/iZ_H.HTPn2VkAnn)s4A1'Y]1iV5#,mI=m`^(4@+(`^%-ia"oh<N:@Nttel]\]Oma*LdIdFt+O6aV/t7MJ0c&8Q%M`attI'R0ij3hasMh]VJj?"Hiq'GR4MWn5aOt-K+DWJ\!\mn[?LXWA?MRs9 ][%Q7+=ZfN>6!%g[_/D&;8!':E1NKG&4))ARR-Ar6=)@Q &&)>/f/=SLQ_#,efRaiKj:*4G.8Lc*>*BkJi#bXoHQr&^=aXB0\-m;?\^F_<ZnUT1W8IsdIVf#q,^t=o*%PXj<dN5W40HsbA.FdR-Ii&0All\>AF?r5oA\EI`X23a=8RZR3LqN#m,VE5+C,"Lhs*mrmFKG^(4ffII==VkpJ"f)T*qO_ja9,\J"-Qt$"AClXSUTAc/t[-dR/?&fV0E3r-D% ]M;SGmMo>h[H`iA%a@.N\D+eh@*-`Ap##HP&$bIY!-Cm14pK7X@T)^%b'bF7M`F;)Lh!SN9FTG*dY_rT\pK;8A#6lINMYs+JGn9Q`?-oKWN.YfE g^?#n@ZFI8"a9:sc5$tKmD8o-;CRJ92+Y[3cAWNS:Jf9/T1#Y=F-64BiIRiQB3qCbIU</Rr)T$iV)q\ r/cAdd:K^;WA?b[b<L(CpHRk -&%PVE8Ng..Nfc_k\Pd3AFA()<3l<4CWAs FcSbb%$j6WEZ,_)O(?(&)>XX=p=DA*/j=nrPcOsf`Ja18I7R=_(g5mABgVD<M4EFPUE9+ *>3Y&*>JKP')OWdVkC-fRrPcX0KMt2 C`Fol[nRllZriSWs']A=LX<3RPV`?cBfY#-A:#F?Y[$Y$5.@2sW7T?L`$;QH$$VgYkr4B_"eSC[a36dC[ cT%*a(C%<%:X/_R6Fq;YBAgd 9)lUFXg$PtnA,"EQrAq;:Ss+tA"tF3VA^7$\]/!*]2+8/ ,0ES-1??Wq[>_$`;2kf8^lt-fZ>h[#5G>j(BNG.'Xqk]?n$cLOOLhU2F?W%MOLM%JsHp8GJ$VO=3h3P/*fp1)hl]iP"32CFGM@_$,G!`KHh#d0L"5EeSn hj'.3Y06q`#_%Z[%7PZoZ;YgN)b^@&'Ym_,_l_q"#)gK(#6U`k7W,ie/W_)a/Q;r6bl<q0EAGX:^.P@Ol')E^/@EPPjaHoM9JZjC6+ki@J^\q/'#sRa%H1WkHEG/+9%KWamAsUdU6rp'Xo)@@E$Fq"KC`W/jLk.Lnd'CoEcA2N36E@ENT8pI@9J:R]^O3oN5YY,^ JV=6J\bmaR8*A0)&</R(t`/+(NC[(6TD_'6Ul10n6Wgd5b*/A1`$fciafJ/@*4UY[[0[N!6?gC389H9]"b]<ltnA@.QYJ#X%'hq]&BX;s5d36g])4Oa:[0+QZ(MQRmsKS`(r%&mG_2NpF"ATY6EqGF68OB05o0k4BU&DEh!(.7j2k>-:@2c]KGGY5WW iKLZe)WWjm 0:;Nm[dF/$%U"f:DoeGgRmY-Lf:tf:a!7_>G!lAB663CedhibAW+PYF-,_"26:NRO@:B8;>dBk?Ej(%NHQ_2:p"5aR#<:N6+]b3J4$31\a`B-,B+)M\0Ramq(XMV>jNKA=Kp%lXbN+E;#EbCHsaX00jg.iAXL:q?\L#1UFRm_%K]h,C%9mo^h*Q,14#^+Z@m<FI3En$:niO.5;B6l,5b]Tl?.!cT1].Ke7SeQAC7AVM^I4U,*>8]FqVtFL\BH.m$t8SqGpc?nHLlMJ=@.SCkXhjE5-lqg= BI9Rq8PSf;LmfJTa>jBUaQ,p\,7V]"4jf@dT+<ft+"3 ;FrUmt5`^<L=h55./CFW3gt9r6ctRCe6+3lZKs['it`J5jFH2@V.7JA8E?RT; UQ9A7BoM%*@2eE![bd\5p9]CPGK;i 2EDGr4(Y_T2X5mef,sH0+Ei3*gVD3=Y.@),$pWir3YV<\*)At6DqAm``JN/6Ld$*nRPSApMdsB^U'RK_tOiEle/XZB5E>,T(r^B#)gk3*FR;'*mq5!2)@N0AK/.`^1tp_p^VZ1,\O3"S]qO9eNQRo`L.eG?/f7Dl.2nZYpd aW8o03SA%ZDLNP3G8*1<6:*hVoJ=TrVa&!t(I+DoLW6h0tkmAnehjg+>UJV ]JTBnm ;hN^l+)S.CG:\j[em6m>;TK5Y%;p=>H.8ZedEk=BN?\\DOG)PP.S-!lT@#&HB9)FOII[CO(e0&JL<O)gX-CiH=I#&q(dAH7$5X'%\G.N,75ogEeb]LmLS0)^@=qAgZ@e+De!<7JAY\#6N2oT"=:g7k\S]?WJ6gM"]bJ.fZ>LJ7V=d(Lr:=dm]p3"SL;'*_O)"6V897cWP$s>Q*<?dla:j)rV1p#KDA&qj.m>I\G*JHZY6/9c[/.!:31'mibAEiEkRa_%]d+?)bna.,ZIf)cfc<L8j%9X.330t7\oUlh%tbH3'kF`'8ZLk*r,0`ZTOo\]AB5n$^D+3l]dNfPS/c't#<aT&Z=kd3Lm\)s+?P@( /^Rb@FK"Wki]h7XBNFMt)lh@aGT%?CqHV*`==Hat#^4!DYTn@Z>Chc;gFc.e'[)<tm]r)As!Akq<(]9<tiZ92SA>6.eV#/itVK+:Lr0HC3$Z4*oLk%0mYLj3#DU\4qWqNBsNS'_B9d-*09U9),e'>bYi?#&dAl\X(7?0%eRQ:V*hDeI84n"X1a/N,ITr5/N,S2"3Pm,k5]s5gf7WU`NkNrdFd(7P:,)(nPD=jH8c4ksI/<.WUfE=_OF7Up4H>qic<.r05nsEoeXfgB2$ ]MVSj5Hj=GsCs"\hA1>c:9Uj?%[Y=<N6*`QE*L9M4K'k@j!eYC/KDs5AbA/-ATEn5F*tG:KEVSKsbc%TMC"tV]j!LA[8EG*-i^TYY),3hZ1tlKbf\(Y/o66iNjIW-_g."piGg0kT7IlVDo1e$ai'iJ 1k$Z%gJ 3n(ZmD1X]IZYZgHj_"hP-a)N5FCL9c@s[j-9SF-RAeDU)eL0oNT.\nXZpe$,ZHH-:ch:.6:P"cL(09m#L9&g_F)F`kLBfC+n&`MaONb\L8&'XOjW&A5V!9FqPYk1:i9*J@<RV.7Fg8dR[!($0RBG8JAjk)CT^*80]\.U.Ll-<hW(HF_';i9Bt>1/=4<T1H[tm'@W,.^J2%)fUBk+SZ(_5Frl4B;#< @<n&qeFD^ 0=#81[sSo8@@tWDO/S#/*`Uh+NNIRRONqtgb$>jA^TCVaLePTrY]2IlGI?SXRiA\0loHkLs?`O\8&?<>3!?SM3AmB)W>oRDU$[2k`7_>Y,a,+C.e":sEb&fTD0EA5.XdX2#ZTM>$X93b37.*$+YrFTorc85839WA[A:7?4>X`VIN3`<5!ZH\h^4pFA<mZ@[c];\6MPj.#c;3.3@6c;<p\gQ9IAH<i;G+'l_8>^JAln:8Q'HFG`jnAnCRf`8WHPF]]$k[B#1;LHW?)W5IS4@C=O$4E"]4!Cl2GpA ^Cm/tJ *?`6pLMkVdd.iMlo#[/<l\b=JZN$S]G]#Ee&/pd.#16olAklO:s,1e+9d2;SA 'j@VP3BEFcAUh_9Y&Y!cnMsh3>af]Jc#Jn^tn?BefEJ]jMMkWIh`]sha.f+e< 80^_)6 `G0=YPUDm_Efb*\&*S?Op6kBI;Ae!C)-(DFT<q_<TF=+ei,8oY5NDA+1r&qr p?''<`Vnp;SU#9.>>2iQk2tOftCQ!M8V(>S=@$RNZ*n=ANm2B1kN#I)PC\G;\aEHjW#XrRo">"YFD(`pU5tf)_T^8SLUZqU#.2C6`#EpJtZ^KL\.(n/&-0WWO&mr`1RAF"&LtQ=`<h6?#:aJnh@H WR,p@l@+(&;2e]NC?cj8e\'!Xi!^7=dDl[2^QfrrXMM0#aNVXB9&Z?02.^4AT#Ln;QLCcN5P&45B^cU)mg.,IJ'/gN7?>i?5opDmm`Aahli-r,H*1(32^Lc>n<,]]-^]0GRn$l5j_N#hr4;*.e6P?-$+Sm%PU>9as`Ls1-JINC"eFPC%5sATQF#,s`I;SRFCN@:- C?R)b:tX\:iVpK<`0FR`].7k:KmlBjI[,Kq"@QGa*QK.mkd$CnOp$5WW@GqDZnJ>p'E4,/j[_hX"1@)O=A>`-Qb1Re+b'!': $kU<W"=s)AnJ4.:4&'S&IY%#CbnJS5;_`!42!b\c*%%+"@F^n]5PfCjORH.-^?_t=:Rd;/lb=B8SjC35 (?e>B`bgrrJ`&"9V7e/)i,(:I:7j5gh \,&I5>&h/^C0PctX-3s'VAdCB6sO(F."4:OL50H3+o("=n.AU13=OsE-Y$8a0jSp+!3OS0Kn%TY1VjAGI2EcnJ/f,9?RRWUhd^AHAcq=%NF"c_O6\5>lK<IKE"!6G[/=OP!)K]mIYCL_T*U;BmBtV3[1j%_t"OI"c@`#Ib2mim6e*#KG t3Xpsq\MlB>L45A?.jr0B.]XRc(?7?6MB0P1VWEc1n!'/N!75,.=!D>92_FPLHmPDB"qrJ'BK978B3g.6(Nh/-#\"SsokOb>DcfJ^eEa &.ccAH2_bdA"")'I)7Y$3o%@l]RPrAogDj;60"LXpE/VtkjV[%4rYh0NAs\a'_0/Uc(iVb_i%<A$qs>?>[GTP\5@9%iiiB6r91qf0At[t$D-_:5^M_7g?M_ZQX][6OMK8"S,Um8@S[Z3M&;ZYT)N&_LA.=c PAl5A@(\5jB(8O!t% c$s?+Ga?,JjP.,#B_DI8,PPjK+!e"^dqNKdd[jHL'\/_eaPifs[2CiG^nm:.gjV`&qak@BJ0SRVSQhtQQ2[A]?]k)o`lln\^4I>6*SfJ#tc-'aqt7+?h-.Xsn!B*AKV25a'NH,j&YQ[?)@PK8L'PZDPtK>n)+F6^Nnj,ZrfpjWg:H+_*>/6K_]a?#mn^dAa:8tDLa3hi2_bZ@rk?g9%a^s&eW_#k!9Sr(mM0CQ2Ot`qnBfR2Pm`8hq6"g#E9XNF)th%(IH=^FM'bso!)n7Jg3o?\6mQ#jlI0GU5G+#DmC(V;7@(^gs(t\mJ*V&\V\@Ed[b2[[>N^;#SIWj#Af-cF!m,=1Hh$R=VSclKEqnom[0,QV-s%K#!g9G;4o@c^?;D,jRFHaaCUh-L -4\6TX)`\IB4:4(+Adeh9CQf=t0(tO>n;C@Nh__?Fo&Z8]TO:hMf_+B D8?+=PA*bE<M'6@Y!^eS:G`apd(:5)Q>[JP1=Hjn aYs>SRl"ITj4qL)ILm$i\f^Kmg)atqED,]34Mt+IAA,%Y ignFm3&[4rbl6#c9+aW9/R+HSXkAA'.Ij2>1(OJWF24H(SBY^;V1%&Ora?U#(mr]de`@&QJ&(^Zl"9%N"`t_[]E98>c?sGjo#;nd*,kW=>r_Ddt!Q,Q25FgH72eL*fW2f7E+<aAn<gZ"PaYaP'p* OE>[hihR;bqmDooi9`jiLm)PM-(A:i=D2%P/MB)k@'dTBLX@:EKK4`A0"A)`1LmBr U$ql2)AtCmUsDiAVAWb8""#kV=b65,&CX!H(Da7sdd-<=hHHo03,OLCcC6* \?(_T)47RfWfPYc_eZ&%1lj"0W/?.=J?M%orZT5<qA51WSnfroD)`ccg-\K:+HQ'h8E_ALTimoeA1dXFP3 CI/c9_0%J]DE=(Fa''lR4<9B\'5s.2Co580Sri[A85n<1ro/"#)_/-A3*),@mmp4UJF4'j4FM[tc6Kj9&DeB<gH7=1AIN3fB):e@@jo\'-teO;2`M!P_Xga'C]U#mSpV(CedWd6/:\A*k6_3S'ca? $hei3j$_8JB-W_[m8oDjQ++m5lj*moJH$3\hf_<92:eg:^?Jb></is_#l&CL7<&b_U7Eh,c]4B9j*!,_5pH3<+BRc+n2 'AB])MT\eb\-XF5X^+-2DDJ7 FN&ra,T;\97@l>?9C;<TElZRc'VNg._V'Hio+fm]NosF&s(R#$tOfd=LdVt X?8E^W /fMI41;Cj]e9$=^m3<m?O:%11F7P7h$gleBj+0!^0=;BE+4+`Kh8Z[T[6prYkF%]_a5+-pk 4a/$BrLkY>#*N S*4l6*R_70:fP>"mlEA-#DPXVdfF>A5JJ*\Lk&!.@CNtQLn74,gN_NK=h'I`RAc'Kt7^AslCRjMGc'j+[,W6$LbUJ0@GLd3FK)]81&P8b]DT;@^7??c:NA]8ptTrR&,/eX)I]MK&'q%TcPe(TaV-er!'3j.iXGAmdG3$GZ&G$')>/AhbOtm2T@hNq\\sfps -L248n$^ALP]ho[@1/.ZZq3IWG!*2WXPs%[S-$**YGC?($A-;.G-NOa>B&)A0_.`Cr'QlM_=>GA(Q%Crtn_6Oi+pj*iq@eX_As'nS U[LJtt4p3Dn6FHIY(1I%D4\>r78crA)<OVqpHbm9k!Miiis $I[O5\HVS6"Tm0L$Z;k6AJR':(]^c&C2)_cALI:8^P: GD+]r7Qm<mf*?3@Gq8 fP%YFr=JB#3j"[I7FM+A?Nl2qV((8N!ARRZEFm.Ha_C-"l]fTJU'-eD/+().mkYJj G/":CE2NM_ngf=(frO3NW4KfN@<%"ltQ;6`MMD9YUL?YdKE86Wr-3@WP->E4aD#\hU!][mh3)ME5bCo(OlVLEU35q (fjKUlBq^qCn[%N"WAV_8Tb-EA3IM]4S'-5\phTYY3SFsCn'( F<TWXKhQ&!Q,Nj*!o"],M5_YfG6*EHcZ=P(SiAY%1CZmnIfeA;Fb(hIdH3WA#$?mHK@OFcrF<.pBUQC46T2'?qr5`>l<(cLB<p:*jo5FDVd=6+NB1>=XG#rVjK5P"b9%bJee_/_AL>D_Oa;XZs\ JFHRP"n+.#AY^.$a1p'j+;3@Ho4^)W(C<;J+PfKr'DW(qKn/L^lB@X`8[9\.$#i^,)RCE).`gMXC?p_jh`.d5$<VE<n`!f&b-J2VHDmgXs_2T3c<84Q`r("Ua"om1.F8OWPc8f.CJ=^n9MC8P-50PhA"P2Ibm_EWGs*HNR)+'Se-;#X9OC)B3DPjO%dabK]:^VVEmM*6_jG)P\IJ"gpKm4 tp[^N6;6!FR!nVFT^<gL3%$FM>Vb4^h\b;Q5LY&&7"BKkn ]$^-`+S9M'=!f:Vh643P-OraoJQnn*@AE3n3%kcMt"dh'CRBK',l@6`?Z)M7_1<DOZ`[K3h1<.FH?lc9-_:Io&d2Ta#SDr"_tRBjI8<co`QL/Aid)lOYW-Sk%*eNch3K8`<N-]X0)(Q!`HVm $^%LB9paS;qK Ad2t9c<:BsC!g#NA)V2IFnr0kAZN/..P0 $B=moOAaJM*<sqLUPpnHK/E5-f 7YM=[F$>*3gg)].<hAk\,72dH`_2'eP'36F5%pQ8+:FH'Q:;2ZXXGIApr]q[s65"? XJ g&r^=7K;G+?2s&->:Vad("+gft$T3aW]q+3o(d/WcSW:_B2#e@n&mq7N7W09],V[Hio8!6OZ%nP=LjAl"]h1@&T`8XDF-3F,%MD=.Y[j8#Wj6>=8;2nLO`93V8HiB3GYjW4CBdeI<)W(SZ8cm;SCGgC`ZK!$)Z\CM>W!Na/:VK`MA[-YdoS->HZ5Nm+^R[W^NrOI-(c)J6HCC7e'M=-DaNcPf]4r;rTdl\0[>6"\1)kHV,IoaP2\F!PJ2jL1G-4Y?)ML"a:G^^/EkX`>)@_#r$TZJg6;A7YWf+rJ5hec<&FJ@?3%;]GGmB9DmInjAY@^AE24MZ2Sb#(:!ke1J3mU0'q;AM8XHLgrj3<&Z-]l!M%2A5.a<RYhIK[!9n@8QDnJ6=]^OVR:6->f>ZRh!qLr)MJn>>0bbDLRR<[hq$8oi'2h.blNaY .N'L/'h[&3*\Onjl/LUoMjA= FQj<2l4[>JGsCM:`Q:#[QL9/U9V>LZrfl%=9OAtLg3.'eLrH75.:Nm,i>Bd7 3n<2-q8p=?`FM"Em6g_ngd*WND4PtcgT)ecQe%d1"8A_(qPr*iW9N#="aBd8N3bKONV* -p[^^h`/C$Oc[b':)#W3>rBBtQ<;giCQ?/kSK'j.gMK8i>6`c<B'gC2D?tQdAFOHra3TSQ#qX]a8!3GC)j!35KLV,j#]OYJ,c*E-^&OFM[0,9j)sf&ORm@3*2tUcW8T5%c"OI#-tZS;=+5j#0#4GPAN[,E.ptI+g/BX_GVN`/)OAA&phEaYAT*UJ:9Q%BA``b7q8A $?CaTPNVXj8R"#kE.22A`Ch#,stA^Or8i02;<qm+kF!Cm16 V'Or& )KQ-L.o>^h$6rX>,2t#^r$6Ai)Z8q^=8tr]BdP!WAb*5=[J]Fl $c#Q*JPX\^PnSB8BBSZQ2aTH5qT;:\$en7K737i'C.14gE\/ FK$.`6Ps>k@6+l0G^7fAmgEb\siM4rVF?]2X=Y'(4]O)jBFdVQ#ER0=.BZ,scQ \;l`>Sc3Sej^,YRk+ka%l,eRoANq5+E*$=edWYdJo<#j,8]YIK+t/&6<5.WW2& 6J$i4l[gj.^R&KtPq:+\:AR:cpX4M30_fl77Q*j 196-t9i>PfNLh$/#&+-:tIq__jbj@fj@:.>e?Ysd?=WF`Nf:mSM.0he25-Gbb3s<&#9&Df :$OJ9X%gMm"=`p,(otl8II&M(kn$3M!UI(M\Y'/Cmrl$@AE9 _;cip2JS_e4plaNP)S(9;76Mj]deeSaT.[2b+ZJ1A<<n,>oh_/t!XWI\Ac0#@_m^aT6Ng@0Vl3AscN,ib65]4QoCLg58d)g<O87SsN_-eUS6#nccYZrI<K<P-+QX>dO<?&k?M@JspW8GM2hG=Tg2q83k@ld'+:#(pfRr#09qc3Ue&!PWg9"hYb^>(&&qJQ=J!T^2;9)d+0WXp@E9/n188"eMrV4`Dt06]dY`pX;hE)!PlT(CAa+.MNF3C@CCG<71rkh;PN]Co0VcY%biWbOt]tLB"__IU:L 0? 'CS5ZlWbAlG#$"Y[7rZs=4UiCPKiHQO[ai`Ocl-/R@a?FSFaEJ>%>:qhrPK7O!qS;#EI\,Z(A.nl>r:LY2N47la4e]obrh@0k->>sTFQ6L6T*$AKBJ43DHNtij?HMh r#d.WLOCC"@LPX`-_q1Y3bUHA0<\K^k0nS0O,?f[lM'Y(tBM$2A4Hq-F!3X+,X\"MH?M/6G *NTRg\T[ol5"V+(T@tf=a5'g1(iDWr?9b^D12@6PX1a!C3B.M%PmMNXI:1k9NegL(#9D,T]c;ZhqWj;:[CVs-nflL+A\:7L:1Wk=1e+%4`J9go(4ap9h(trBJaP+3!]LJA-e-lWMp42AfV",>7<S;04qKHDNAFrk3<ATKbfBdKr.;(X/UFa]<h%-"IK!t55i369VY_f?@=#">(5$M58/_UAs'9m$:,J@Uc8jefpVg@PNXiF/b^bV+],1];Um31DAqk"nE"OR)VR/^nN `giO%X 2ZX/S`&rr5\6Wo7ZN3^!SN'nq+P!$7S]H`.(&gAs!?V[6:GptG1Z(Der*Rb]1^D--jX(gPGZ4Le<C&.N2/no<TT"lV9O`*WfRq%oBJ2dKVhHq"f$tPUCI0;BYZJiK"^A^KW,D]^3Z:Af&+6L1A43J%I0YCkAZ^7Tf1Z<[H/?4o7eWFCKEX8n(/FHTpPg]%D,]T%d=rD\9-$sY\O[qKGVL]^A-VVD(__5%t<H.6mlHXGX;!jg<#/p!_bLmP[dV%Rh\ha(US> ZMP*IcX_A^rOeOC$To5YKg"%r/+-%h%iQ>^0Xl$\dX@I` ]T2h$kFhcQsb/VjV<rF]D$!-Q9BWfQt6V<R4V;2B?$LC4?G#[YS3rt)0IdT7*]b/Y6;)pCD,r!lMFcnng_+hVMtjD_VURmL3=jh1C=[<U+Oo!^U"'PO;f)spBB(@tgi4fSQl.%]*pM-^5F.ddTN(*nS<9G1(=mr^b'b0Zh+B*IDW#SF;NS;#F'q/FDV2^qsA1cWZA< bVr?s2Q4@=0!,XXt%/Q>&g s^O,."(KI4h+ARfselg[`Z;WIeV=A1c-jfNF$s6$/3\ek;Jb PHk-X9WpV/"JMT1r4/iV%]"UDg7%f/k#N\!ioc2M;CN1:4!@+XY4d`K*&/Cdjh)KO5@YDm?8l3*2 cnSV2KYg+-S,?NEAF'7o8gE]iVnYNXG9mPb]g [j]1(>!(l1]j5`7E)D.th\X 8?G/dOP.)@)GRSn(EW,,<<E; ]p^+6%sP%jFm8W(aiPTNnPhT%YAfEk_dkTYt<Y9 CdY2%+HA1+3A,G;A8UmPYDa8A74.'=t&B4ns]lo6[g#[UnH9#phl!^;(ClNtRppFs)f7B+@IoNNNSLpj)";cNF"liZp5^gch6#9:03,:"BMC/bJD6LJVho,.^Blr0l$#]#oA0f!-8;?iK0ngCPdtjc8RDUfa9Ql'CC-O>JAl,,"PthC@,<H=2#t@1G$5*.'#0f1m@+M R7/Vii`sIJs+7gp%f#;*I'ZgW7$.^-J1^L/a+P C1E66fA;CAZCoSaR$%q>(Ttl3]S+2e&%>.j:)0#[1*kD$]!+[SA8T@jt/^iA,AE@YQ*a/[BPH+HQ5 FSG*S:,BiW@H_MdBK76.<-k75-AR.;6"PD(%0INhS7ePls57q;J1`.aK-E<pjdAsd'[noGf\N5*gd`Q58n`VddhUJ8!B!AlK3_aT)[=Q9O@Z-c#scjPlR0sN.A_HL-YZR]8O#SigH"f#`mdFR(je> 7_W.mK"[VZlAEPkb7kI45ibQA5LonVs7Ds2_!&;r%G"(!o'FPDT)NAbg/.R7FR[ll.f]#!1eC<@YqiCf1q9YsRA5@`^%EfYcdCjA!Y,6 IK=VOm&sLmA1kkC6eC!*0&e+L"^)pdKQgXAaXk3$mnG(43KDI$Y-pD+h>oC9F`RITFR!D'oX)=OE^eO1IOQ>%Q[5QY9O#ETf!\dc;Z85KXhpALN#4g*.Y q`O5I#XUh*AUb]`<b2#)%OP:Le*<>R-+TP[@Y+bm6n,N?5`#-hoDn']>A[]Ar?[r6tAA*1;9q/EVV<3*>Br_)kk#n2HP9j.8#c+B8\38($=M+';<6e4SL4"1Nd&.O4eVkT@;8;fMXBrj%bWCr[Qcj110"pWRck<pJL9V5\0<b;Etke6AJ5/SR"jpL*=bY/%>p^>qnB.X*cm`S27'f]\0 "l";j(Ah.CA +$R%%6.lk3BPTK;T'aKeY28eQg;2%:bi;5EjP^PlDUZEDQ9 Y%s/'AO?s&+4=&ddn24D&0Z$D>%W#[>&-nAgX;78`-5hj?^GktMm%W=,>KjVV3/a;ik.[@=BoF\+fHtBd3Vc'Rrpm&+PN+sR31AAj@kf*mp[IieK9OqS\=1NgFG5d?/G4`Da&k#!dr3n7jM[NQC>jk8g!5Ie__3"7)/Brqmk1tFUhXKi&q5[9UPdt];$tiMWa'l8mNDZ?Z(SDUH\7N4$F5Wejo]_^J7AngphnD)O7Kk:$;jKVE1\aCRL5aJDW%agA*les"Vk3$0pq?dLfi#2*'S97(Zg5PW*?8m5rjkA<p';]m\r'^[8P-M\Wjrc04Uck&&d'Vh2jDmR$=dj)Ej%8";TE!an2FdC$98F:;kW[(:e)#DFcYkVY*I[jkCH8T$D#%X<V05;C'O_$e3k3 n1m.b!P@3sj0@s19?GA\)b?6&WYl!P,lT7%#)L59:&+J!TO#;qR^rS P^U!+oo+,:%NYRMs<9siUDXP16Ao[Xa^.47@JbkaqD,"G8@_t=ZkerqEj(d(`dhR)<<b3`C*%dGF>hhjd9hk(AS\mB(K?i#AYS)?P[9(bj:jEG' 272%!"*r;tD>"X$/i0A?NJfp`n?dIA9>nb\1TOhZ:2@l1Td?M>H#Q*)>1$@nb[7XhGZKln*7K%,Jb@i4Xl#,_sURb_Q=eU1P<O4 <L9QihGJkr!A%#.p0`Ig$Apq;70+b_*J!g\W5!K"?$A//Ac@=a$9q']]K)C`hBM31TPjC+@Bam,FGfdY0B"'q3h;V<"-gOUb!?W^i@?Y#C/7#r_ts<CDIU6h0%?K\&JTH\9SktiY(S0`.fD770j=gWA)_PH+dP?f!-\I"e$1NORSbe/9:7<M@,?$&_aQe07 )<g\Z"J3EU,L#sU0sa?k3ICK.%Mf2%-*PVR96[1]m#O4"Ra`BAk(H&bVn9CZCs4:8>()+Xo_N&ON(koKO45`8 3pH_-30HH@K3bSIi7U<s&l6oR8C4q7'rHg%;U.ZKOW1BrV8<4)t?1*d:A1Kdn7Rd'i)0YdC(r3ASmaXL-g0 LN $0GfmtP'9XcV2cDU[1BCIE*YA2^d6qVgbWrdgDf[nYbTqo!%&NTrJ37W?G9pR(c_7IPp2E^bY&D3BW2!&Q3Q@BiAB=`;"?0$n GMNEJ==d %e8A([J?LEV Slri:<O@k^]%'6l qeQBd`pkYcXQP&AaAi@#K3XfEKkPmQ]6(Ism':eJ\A3(8Bic+.Zk>W*9/%F'SE7I?]<0rmcA43mj*O#s-U$ZeU;pTV[lYbr]$O11l;_(*.D/A-H9)*XrX;7'c[XNmXb+YIgk9[hQHlU]_t'k&V.;qh9+N %A:A*VSRQ\:VL9 I4L.ofoGWqA\90>\-IASNB= 8?W7Ef#hT$<NoV;aAi4Q"I9@9_VQpiDB%mH<_M8b))A32#_dBWr\4b,[ZBDbA-iOs[(pEtAXCOM)08#9,1&EWmbf"Y1((#hq*`+Ir:UnX,[mhU"nAWSo-k6_s?$,6*:Q&&[1#4=O;RKABmH3W2\jT@mONSAob# 6TRUk9E3Ln_&_jeerEMUIr+LoO/$>s-#@rZH2\ESG2tgon`oM&+9OgEU[T^/B`Kp.lDr(G #r"bOdgjCf?PDPZg.s+5%Gt7lPo"A=L%0cfi`NE)U/&J3^02@-kI\=f0radj/R/4242%X$&pj1`kbhm\F]M2?dnK(T+n'>D75ZC\OI0Ocl0[`2:#: Zd#bWXG[IRSRtj6!r&L/DhcLQ5dl!4n](httJ507Zt)b\=gn2!giP<jo-S!?8p8XM!tbL^)darUS7X$12WI[-,X3ore^TZ`NOM>Z0KiI*c8`dpG^`N -6"dl&L2[%\G/g<?8$'#2j-tW;I2YbAqk.!@#kpSObh*bo2X&&?sk,%f!*bVFjUBUd'$64(_5D"]?tg<#L1R(Ugp#>O<Kng1NAN+2$UNYt"4NY[k&\dPh$H/W=MT83K8F[Krt8-01CP#l7>PPQTp6->6#-SpLM<B37qW,l1&6-RJ)"1Q4:&f@"_:`Gc(KG\=QOsQPeA>^ aqAR#"])_*BgmV!n7:VU%9`j83E$F[K>JBe )I&4hD"DPo)^nML_nKQem!rJDojCaO7hTLZSUFl=^"al.;AiZ#2;j"ICgk!>#E(7p/%Laonf9;qrK!7&+KeKI[`><'8ml`a=<]TBt>!8Tl#(.JAs*i?NWLL>)'sSpV>2qp0FUhOg'm/@8ojW'&pf-\/hYo#-A83*gclkEZ5/3XSRd`Ae\+7d7fN!8GO(e4\qA&4'N pUR]rnlZn&oWCCiG5q1o_"_@3XMb\IWf$Y"b^G%^,rGY.7/1&&mF0<+cf3jW-WbIS ?'-"B6iS.SL,OrS!+"cGX_DQ\V<r\=aaJJ@/4-YL:I'ho /.[V6@POCoDL4e=saZ?_Zeepp$]:F;31n`C,*l85!-17LM,]aZ-nDoi<Mi<5U]A7geSPc>5[6^7bZEeVP`C#W@;XaC^ oK3gF]9iUS<,:J;r1&U)Af(,LV;`ikl(b+0@#YY2s)%`2Mc#ksHWVjk$t2iM[`Z$%t<PbTEZG@kX4e>4iH*!AlRrpVHE5&)/S:sJ[>U)jXMq)4HmT#o0f;Z*@&%-LB([#m3";cEA"jh"_'#Mqn1,q'Lds ZL`b'A2JOoL+5.aH1i5l$H4+ ;*Nhk*gEl(PA^a;ggATU[8!3$C;JLU2ne9)p<$NV&Ma>W"Ak<PtFU7jNFg'Hm5r_o[_ !+Zc=>2rDf28\.($7DnUOGr-n?$K32WYa[Zb^N6%$,I>[>0mN+rn[A#Ph.>M0e@A50.g(%eU-bL\.bSU&imF1^AeY@GC<8qj?Wc"+rls,o%,QLdCk&In%PQnaT<h2S*?31`)"m8=#A2St:h?o'tG VegFB/aFA.hF7i&@bTGmsAl*0tVH`)K8nO%%2IP3Sijs8ZlfUHm\^[_X3V\+OEnd`h$>G_g!)t@O.7Ak!od5-r-9=<$Y?:5MAW\eD(8R4MK:WP?V6P_OUPoYnCW9@#/>DKr%2q5PPP:?)8L#>.n^C#`C*2k=)Y'\?2A!IDVWa"cHij2C(g#ht8S;9<]Hm@.`$]q#0":<k['mLNp!m)(&M:67tG-"DNdfTGrIFqp@( -?<C:l=N*f 7Ag-`/ K%gdq,YM@@L`lIY^6icai*nn<9>;oDCZ^%-o<lS`TDAQkT ]=Sg1M%FMo3DZ5ek/7*la`L27Q$5Ir1q9Kh7lF^PaQGfbg=M24N*];]>fcAQJp8"eGZg61bW^-U&:t0!9N[caoZ>Ib%,2$.:$;o61TtgB$mUmT:m/K^k/sX\R9[5=fk;#E9+NfC,Q;R3LoOgoDW02QOIOQ`M/TZWXX%7\dLI&fk\n2-;A0>3Ua>+&BpV&LeF8_?QUk7er `+MKIMqT7hh5H%Y'!2ahrI!-XC!aDWd gbdb-a7+"+&<$\s54nDJ`k8n"A(SP19r$mM1ArGA\mD&8UK#o0S(@4ph^[IX]@I"Jgr[gse66b5[AEG@Fa61jSLcCk,F7sF+e%\UV[_0`l)S$a<2WGsA2C+dg8lec]'^3l89Dcj8@C#$Il88b'H99feK%a/Ee>Q)%rOWf3kbth,3V??N$H,J>$lPUiA/gD+#!cJ=a4]ae!aD&.fL0e</@,'c)S+g.sIc TlJbQ\ktIi0EJ[i;qN49b-:%cN2EE 7DrpVO ^ (J(\a,=;ZN?E?V98s/^ik'Xb=E<jQh=&o(?JTHsHJ=X>67s+g_?D*&aU=P.n;4EM]Y/8f4qPVAA^7ML>7IA&>*T =LP:VB"Q$m_q7U[X5!@4Y!pe(UF.Z#YU"K[[2GA5N:a7f%B]N$$OPD_(t@MD3<s$]A"8K<1ff]MZsD(e1`'A0S?[/eK;"(.j9c<09/58p$5YbeP_LS:1'K5K\Is(9jT/;.3"NtA^"WG>r_UEa#*E=Y%f(@GAt<A[/^.K]qDLA0$a#Bdj>qfV@d\:0]ZN;B?JG;-C*0(-OcqnDQT?AS1Zf[Uk4s\>`08cJ?h:*,$Yp$#M'A^jq'DfmVA=QJqbo''r<&f:&`*+I6m/,`Lie:5lgK1S+e',SAUZ0>2LOB;_%H?/?Mt`MlQQ.5<q&Gb_i:e7#ITqAL[8nZ.?,^!+Ofp78J:rA'\`iPf0-ZH2L3k=aiGI[cQ.8QeZ_oW;+WRsNEPM5P@d]k2R&+2*pM9-8&IHDogZT@T6)#*./ZcO*J0TsD%/Q%C"ccToIk#qcn?'Mq#ef?@ZAs\6$"](_7Y>[ga>tPdD]&&a\8Al-Yn5B]QNaN!dkJ*<LIpUE/DE.mdb>!`Rr-;%WZ5V_FgbX$"AMbL&CSYRhS*_WA0qZGn8UYIil:!.[7XsdcNLYm!=@kfg\onU)FT^[(GmW6@lm7=2rGD3.FO2b]+b'l+VAo.]c/sHE%LKr;l@+A9,BP&p##seO-I"RUJ-d4]fhX'4B.LAI+,eclYrVadm#aeQF00\^MU3R4eUj-hr)jTX-F(SZ3AI@=k8bkn"]>&.(Ce"fT\50#OAk`RedN!JqpGEaG)Dr@a*<]3`.#k/56P;lZoeQqt%olh:,_O"37pZX[B$Af`>r/&DL@B\1tso-;2.frdR/[@Aql@D95JQP0+jc#FsrA!814#c!ON2<$bjejUOZ*9FO\=4k_[[oG1L)GVVE.:4)P'^r(JHkV5HAj+`Z2,AHjJmnhRLK$=<;=]V^EV-J@4XHc=>@tYL<<Gpkc`dpZ\m@$N\>d6 XEC.sm(lp0UAp;2 ,OZjbJmC4TWLA#5,Q4$[.[-nXI_/Mk=0RZR5Y*?`4,267N`Ja'a)9CA:p67de'Va4ZTs5*:_g>P<C^Gj`>(^gn<sm `-(4Y>8T;ELls#Y0qZn%%KZ?"4EYX8Q&>cl1]5` V/rMX1?PcbEN=+mf?_mOgpAEB;MQSk^\1(J])oAdGL,F'KB5iR'(:#i<&f[r-9Md\E(#2h%Cg^_:6ISQ+(Hk;fa7A(60^Mp2(Fl7`^283p."Y.bd3CMbK,b#/sXc6Oh:pKC;VS(UI<2T9A%t[*T8V'_AJ)m/P- #+1i#90\;(!)e<3j$pL2L"#oi^9L@)j,^>si;LXOB3p;tW1UHlHo)&GEQMN]_A^DN2=$;M3q7%\\=0V0?FGd269qJSih>/acd9njGn-Q-Y:n%>For#\7'o@Df0Be._`)j[#ah"PD:-+&k0,onnBgH;U.qN6/jVT(.U5Rp),hC7$_b]rT1<d3r%W"L8!M.3=`52(1D<lm#THjK#3Q&&WP E=Rbm?_K:X['$[*elP))Z-(CJ\^*s\UN9J:e=6'<7bmi;RSR3.M^4q, f-@"1hTG9N4UEoBWO` =q-4"Ahn?].lsqEF7ssC?kgR!H2\HDg(-%mD_p,:+M$SB7]ko hKq9@8#8S?A+pImPY-T](-HPG+Z?^JV1_!:P\3@[@!tP/[4O*M<A)^HAsNG(L^gSScOm0)2=;$8l3q<Cn]*?oWj V[P$sp_Cb`7*OUO0[A&7;1R&]^?alSdS'A+jMhc(cVX$dS=c7  $#9N(qV8Tm?fDsbsr+3WdRfW,A.%bSKE+AV%@eAIG* [3os5V'-1(BNj-Cq;5%*QVOGRV;nnV%Dls_*W[@AXs[AUbUWXVSrjTATH0UiTQ/;?(H>tP-X%`dSHZgI*1p8@eXK^DdYgWOt59-DED+56A))BU]mU:n.>E"-b;caM=YaZA=VB.k4EQU9qH@5R-K<!k6qT"V\j9SeiEY#"bBoA;HIUof: B%ACMn&fPsCpBhqa68)6>>eimVRI&,)q(F:AaE^4gGOjb4XtUpotYh7:DCk<`G,d8\WDn@pnDW=%j6"#PU[&?1*9R 1nINUf&LE5*tk]L=q(`+Pp'A^QFg"Ff,!UpgX?9_FhQN9 WGn%"6/TXB0i=@P.]qGlBhG-TV.Y,&/gU7AG2#t6+ZDM<Hf?r4/`#5<ZgIT!\ .Il3J7t3`6fI>hM9U]EaeVqRm'0@aA!_4XWM3-i=4X7I>*e#4)N@Am"8O)!YZT??m@,\CS3g$3!2_V)SoXh3ptCNXA'BS?a+Icp$S0Fp,+:rO%TP;KW'f2Lh3ap0ngKVc[JIMRsXf LT#n>6G39k9dj,4V89ccR<&bCnr$Jft*ALJ+Kd>,E<P3s:/#)VbqbsMO6`hT4J._f[g-t;"<Plq72]cA"JSAKKAAR,\.JWQ[a$(@Is[`f*rjasif` Z]1.U B<YfQQITJ8:-Ai\P>m4p940ItR[1Lg,A:(WA$d.Z)PrBJiTPn;kB>7(/=D[Wee5:T;n:2CfWM`"T#nW2X+_09\pr;KR0j]R;s)9F>k[oK;c&.'J<%,Atfb4a+8?#U%M7RpAT$7:!ir$YDY2$5lL,Gk>#JSbEA,ZgeQ[BEg""FFc.)5Gdm17UAV1@?E'No2ETDfp!(@>0=.Bf/o% lS(b[:Ji4-9RRiQD8IT.!bVtCSh\c\Rs7147GpTR*0g"o`D6 3;iHc\Qh8ojSW9*Tg'.RU@3]ai]O3Dsj-a@_0TZ_9Q?*<EcLfr>poA90%<S?Vqb!b9I'AFo6hH?Ic2WN-f,hV)KAUEUG HA8+cPIACA/\&^e<F.'MPD9h(tSIX9T.%Ps@#k9/<j^`CXnODO7/V/CFAmh-_cert^['gVC7C<U#dE!+q>g3mkH+->"sD,^TWp;W`-3pP??NI%QjO?lVqq3-h(.W Pm`/[`3F.'4.6/:@%b4lqtnL\86s8@QLZ\On14Op:jRkH0q52s..Pk,<0%gq"2%jdS>(RAVi:=7N?deR`1G"N9D 0`c] 30^+mBmYHW(,o<rC[\btn^G*1+rgqP0r&hVWVj_RotXB0l`a=o,\/k!?]\sDV0Y\.`rTL.!E4UkWbVV,V3V/oO?MA;4-ttr?$_26m23.e*-l`TTSX`IQFbWS2\0^Zpr0NbO fs/p?V80c)_!GKkp=rKAsInNm;Ajr(C/Y@CIAQ"$g*Q1gs#<JjIn@N?QA15Y]'+^L'hX$Bk*(.[nA[:jG?`Ah<S)Z,Fgh18cU'e?E]E$V@hIT1]Kg,%!1j"l %("<b>/:*g,VfP/?t`[:i<F@RRZGC3:4$ir*2%$o,g2A@+&NcZN8#OSIFiF%\Mt!EZ'4!e9;i(_'F7A:LaA&*GGgBLK"g\h4:(3',dCkR\"AZ5Oqt_m6n,N5N<!?gJOW[fZZ6c:iJrh\%ir"P2+7n4[sMqZ*EA^YHgTpA=ZsA!B1o7&5XqG\jSMU+i>1pd]g___+t6IH=JNUI>e8SCpa:g;OR:eECAj`6'8nlo@s53e\WB8j*DF4C) Jd`K#IPBX?#N2@#8OK*EjZT oMhTfLjt_TqAno*3`1T'.d/ R.kffa6E9i @=3k=F&h/D/n5Z,c tZ63f$=ma!%BOq]1%n's^k'ZmsGE4*:Q@7/JTY]iA&\KU1q<$bk9N9j06e]F&m\207TRX[4%d4g!<pb_heJo/Ln]Bf64Zoq\WhIRR3&,c>3,sU`cXAY9$de]E@Q!C%q8P281s_d7d(bpA.*`1in,f^pnIElntTT`1kJop*<<2^r?G5Y1dP5BBYQZ!btf3G#1oP'EY%N+'MU2q82,SQo6j,oU?.D9? rZIdf_AB(VUO!M*_7$,5QTTX@(AY7IcNcT>-U\r!$.rRF2!d$=MBkBQ*(A`Om5)LJ:. 1*c6YAI/f4o&%OCp33UWk ,#k15.:I!@]mT^-<;'_ANt)H0)!FSjpBV;7[;I1/D">_4.!p3V\CL=@sl<S=jk-Wf/jN$:fqip63UnU"d(9Ao-OY8_oX]C OY8_HdX"%8SXj?_/r$"<c:Z+4_-(A'%P JYq`\71]Uf9U>elia8UIF Ra]t^X=mFrQH.Z,kVnk`iFl?mB^;aL,6DA_HZ6A9(9n0sZ<!2/@j</'4+bH$/17)ADmR9e+Ogf5>T#d1GRR;tkP>a(q)[`!!Q9,OOd*Ua[>\5kXh,0Qa^j`Qn_Dc,&A\BF Z\]7M77#*e<X[tbhG&Zc\*j*O,ETQ<=$P_qL)ssU6k^mf])>'a>HGXk"=rbL4gF:E5cQFIS.0PWfh^/cMi4DZtk3;f;:]-QKmP##oD>`;KilN>6f&\?Yd-QmLoZs*7[A&UE1h*KCl02W)R#/c>>E!8TiNCY[NLh_aXo M_.7E9g9o]PCS`/)Vs4P9;fXR'3!XTO8*"LI37$RbVf8qYC]Dqp%BdUNX]RO;=OGd:\icQ)i )XP#,C3( 6_S9ksX7Ar[760bhT/R:r`Y-.\cr,Q1A9/38#YJe%L!rlC4mO;KCPMm2@p>C aQe(;9LdA.M .N\*A3,Xkk3p>HU,'f>J(m+&eRi`,.10dWkf#rJUAW!Mf$-6O""@g f1[Sm@@]d[nmR#hENkFb_J^QQBo@g+@2:e0Z2A:^^C5io&\?;+nC#RYC?-I*e[Pk3iA^\P]AB'q5)_ _C0h7r^mbr(VpO^>?0K(ATS5Rah[k j%@Z`[!Nb J3jAkf_S(\>jb-bYke>_@]4A#QW(M='_pm3FVqkBG1Yem83gB!E\XfR*!19aXN.P&@`V$b^+6PV/Ql1@Z(>`dhXh48@JClL=aFea=?dfo?V532QCAKYXbUlg8;_Ubm,!j+OSg?MJEMMX/M%[(\WdK :)ibP?LHj5)ai.pRQ"dt<=mA#E-`t7C5]DOVN!!mlLfC\\9&oj%AX]@1M"BB*bm\ >L.sAJpoI]m"IOMoRRmgD,Rh/k>_KT.m"8``%f`:2\bn1]!!B9Me5\@,?8]59]rrR>GeEJi$knYBNcJ7Ht4&TWEg-[end5AZi>8"WI!LEFTjp#e&jOIJtQh'%c^g14TmCH ^"`A1]Y*JU1JU>TU<#Lb4)lVVo1Lf%mJkS.g>VD1MTjo)-P&g^iL5YI8Li,n_!;3F3/e.\I<@;C3E"BIW:X\<%ULnr#W33Zq]KRYjGXCoU\mK!l.B7 7,/!_XK/jQ4qebJ/F9jh8IU.8hJ8V>]B$6_8NFc-bWtA`f.f,66;1o"QkD`1<# 2@HcgshmE,p&cm!Q_n'oWB'RlMl<9"DBtC;"D[P1:b^8gc!%-e(=?T2'_ZoiqWiA9&:57Y"PXrTU_'!UAfYA]H21M(lR57/e=AO'9SEUFG 5_^"^k>IhTkL<7Gq/gaFldm\F=.* (PA;n,QE/q@N9^$Vsedg+ar<k2=p?Yn$3?(eFU[m 8s<?M*!nd;J0%"ga21O<',U3GrDI1kJ#a8N-ZWA/iRTP_Z*Y/LseOL 3*D[*VD0nXSIE$]\5XYJg+(ne#MQCtZ":0f.ItlfdjR("0C+I0taUhc`J_)TmYNeQmLI_/Y1+ RI9^SJXr>;;&AK\V'!7>1#:_E??M\l",@4da:][-dr!I6.'lrarP!TA06=8*k-Am%osAr;G]9MdLjSj1>ThQ^Q.8JGN-YT;3=C*a9>#[B5NnablrMirPbjlD65!$Of:@[I25EWGM[X \nsIXF=qc`Z-\]^Vq2kSX=G;$5@LQ1>9_4*"4Vi"QmAkDm_ST*7;drHQ3if`J7ng5ne`%8aL4,f:Q5GS`LRcp7Z(4XVd^Iko=$]@V/ta'o -9hdlF@Tn]%86a p$R7Z.7bWcpgT,87=ZQHX:KN"6a^*0A/ibL"U%:E$&= )bjRo.+g`%JtkiVXN(o 52Q]K,XJ8JLf=<pleKW4i9AF f^r"=he!\rB$#,e.[o@OU(=sW@&fZ_gUE0grrg"g'QlF;AlTt72Z-8.[O-"n7Z9L0=L>T=$'B1;JI^5*Al'A$$!*PB/%b/5s[M=77C3BWb?Y\hb<f,/#aZo5 76G/NqTr0Y4N".E#0]j1nZrqUYd@Kf!Yf,/^(gf5a_4eaaMoZ9>$ceQ[pm+\:IL`Zc1MT3\a_o_T5603tl?dg?pr6&\8QkeVih6QD%-3,oT!$bc1[+] 2I"dh+QA1j<DM>rB>79Ud78"mnif$jMJ5qH>lr`ck 6[fmh?%2%9F8eCPJ/T7<0P%kP DFG!V4.N9IG"&-T%p,5PLA6PTA5`_6Ibc4lb9)#eLH("Q<AbHMkX+XiMH:`k[s eaAYjPD)Em(>=jOq),ZD$.'55&rl;`54' ]&%5W0HV[_/=WQs7b3>7[I $j;SDo&!c-=P<rOW?^dIr!aI#&e[b(&UNV_?NsZ?/<b$ 5(EHQb@S-M[&\"DHhoL3-_=@=UX'fiS5FXF:8!oK;+R\9NbB'=SQ`QIKrG9RG.oMXcrrtQ-AWbYr"I"GB50NN+sQ7S@E^TZ&RIL+^B4)+q2LQ&bDa//(DQ@Mg0+gRcZ1'Qh[Qq0N 5* B'rA!!NFdpJ'26Xo)5"<2dNRK5?R(FnD\o7iOrHk)i>@cQ].GPN3D7coM=Q!#SZP09*d,7:WjsF9[6<k!N-/?QAfK<&.1$<-dO30G6tV_h5T(45a"Hgbse"TXr:W1XDcnUp"f*R],61TVIHW+0L$YUS[h1A=c".(D:^eM@^\&UI30.aURP?P<Li.lo7r>72(17NmiVi)LGWON0BU\45;oaHcUOhhrT;T17Qcg6O@H(#4r`C65*<D1b)C(+d[Zfqqgj!aRoOtLHJ.7Y1fi0:Q1+:R:Q&5;IL_X.D;=-MrKQV>m0R4Z1WpeM:nEjHZ)sennKseA;)h@)a0f1@91A:r8Re_p[CJ9[o8f>^2kLA=3"kN4Kc0al_W+MeIk"MhrUT>X":0tOfo"U[A?h"AWa8Hd9Cn_>ULQY"fj>[:]EBAQB-9YW4\nbKj:aNm9(Dpbc[jiVb".Y,A^,F@".G=iF6"$G R0[;L547[.g(A+<TZ>I`+8!]d=$4IY< .b4K3&+0-H7eWgKL^34^bQ]*I:eC%qFtmrF11[jIQo-QPG>_XTraYIT#+T#bc]D,Y[nf7-l.d9JO%jq+=Zd91c]3/N%r-H=A)T;SMRde\KaV`lXS184CL.7LW4S+<^*2hA`PBFIUVXm3Ngfn;jCjt+VCOF(04T()pTfY*n]S^c0"!O5<Am+_b)*8*p[QDj:;/d+WeQYf^5b3^$CnK5MFBV'Q00JlLm_>d-6F/M9d.p+V1_AMJS>1(PWBZXG`hQCQ1]\7MS'im!Y$N\B%cJ<FqbtdAeO_IB4'L93HlPi[64thO$[e<'/Ci75^Zm)a*pU*!.JA #KGFL"P1K&b3E^ &Z8%((FRhS'g.SHL2CLGg<2C=`tjRO_bKolI%YlbF+:ekp54:pm5'e=:9nV0H"tSEd$$\2If[mbLfRM]GATD02`OG)KL,j=d[-!W+$.S$:"K@SVSZ i_TbXQb XrW+F8'Ph2@6GV=)%n5-q#1_$O+3q)gnp*h[SMVlJRI_@JQW_LV/oX;CEl>*("f^Qn-XHj)$ehjA?TmM!rLA7c9N**Oq> DK5Rm@[jes$PclOsE9EmDG:)5[0Ct`5_,Y/,/dbc\:ZG4K&0DbM.<]d`YWcPqbnQFYb]cC#\JL:^n\'s6A^GJVA*.8.k)Q##HI<lWWI:^9.cB:sKO,i?eIA<a488a2,;a"k 6brjjLXNb*24pC,5aoYKr*gN %6O)I"?IW(20FZWD1+1c4P-EnBWtqg6\X-*Id27"rLY5bU.q*sQCl2S':r0G#?bL?;9F*i-]/O]^$qS5H[SXpD?XFTK#0BM?\+-M)#YL 0&<8O!!lblA;r*`V[hEBRO%pb[#5;V=E,ZSa4D@lKdq^R2`>+&P*AldtSe%O=5V-U+`&SDbB8iKa4"'1MA7*>/BA&m=W%U5"U!$M]l+mm93_Bs.&%VqA9%>UL'?l1CH'\#5D';<D;V>FF?ia-pi2A$P=Eq+R[$\3c&%![H60R^2+/Dq8m6^rk.0`YeU.X@2LM_j-.ZN%An&EHGc4qO5/ZqXLU4OgKnr0AH8YDn*Q"o&YQhsEY'^KI&d@sCZqq%#UE?tNA,9_E8laO%Se\R8LW?HA:JA&qsFB2_HI]k?'4$-@-GrNisQ>$gaAALde9n?Qt+&L%1R)4)^Tar\fW(Z9f@%D,=K).sVO^W"WVP[X/-M.aN'.hQfO,N 7o"2`5Qfg3RLhkNjW#,qWaM@:\_=OGg]fSKrh=[\B=9C(t>DDr(geZF_l`,'&"*Ifp?N)cmT,6bOTRCr=A6,s]1sB3n,5PpRDC@m,,'jEo&:=@%Mdg:<^p=d:`8a<_D=bD`f/,([?%n2e\YK]"D*5Zc@\`3lnF5jLjKcG'A4RJI>J#(':t<rG9Z%&_FF[fj'q>LlO\$/L=/>\0^B&W+RG.iIhaJ8rJH5 sI9-$*o=@LKY0@c\8oVO9_OZK]eDqm]7!9";e9iTo0^XZb<DD2)MAAR#d=%sk*7JJTGMZOWK3PFa=e\=>% 8gIpesVHaLrgR?`B\!40b:@j'Io>8&$fKts7%c\>8WkhB$/@It$:oAlR40A2&b(4"/d5+/'-k  H4f=2UZi/QWjF QBX<"/ Cfa7:JNN&<E4a-`b=;^^G\'BTG8R)oCOc_@H,IIG<&3hMr'*(<a.&DhY5U(Qi&j[D]>qPeg<QN/o,!FJW@-0ZHG>5?cBiMK$l>D;mCQSJC? dYN:Q8rhGa4&9A>dtLGUkiYA<Bj=(/(h=O7_`E@'/e[RTZ:U-)fK55@JRo@4?M_]L*Z9^D(SZt>L(N5C-/,NE;^lq#%c-GWh[A+f;20+i*BZ:+9=BrO),&(L`N^s!@e:WDD#fWY8i_^dYReFT4? _"9hh>)k,oE["p-)2b_j:)o$TRU3_4X@Tf-E2`1$&i[Ar)*s'-AZdQU9V(^_mW0sT1V*/W[m75A(_4jOjRAc+\Y9i%fH7$4DoZNO3r#^=`s;6(1-Hf#\'@&R-TGYKTNG-gn&"(jWpA_,a2`tFkM=aAPAt7)Xh\]g9P&S*qiO=+b&*Wh`OL[(g3CU3!d@."+<%?DN#5^YXg,^b+%b=@sA'-i"TZc6l0flWAGJF#pL':>)`_(baUeiis+5q4"s!VaH+X4I@e_8>^OnTMMEaJ7Aa4SY42kjoR _d66kF6iHA%eK&s',ib[G:>2 70/dLeZJhlsLba%R+9f1/XosAdmAZWbC[\g#_c.cJ0VA6gAB:o(`2>O*$NO_E7^1Eh!in[dM!Y8r>j@dtFcqZ"la>,d]49+e!Tf_J&A[QUCr,c;?HO%ji7g_9J)$6kd)ai-P[^C?Wm)M^ <ppHKsrS$D$.?WGiUH&<NlZ6^t75]Y- L\Cd)hC2/(<Z& NNN59)=<WT;l_%`?QUB+8G='%^S/l]C[pgUhQ-<a("G@iTE>\K,RVU1)iZP9lmC2(Hod:#@$9cj6+-X3r)Sr9`97JWA::m;rl[9J*2XLE#F0U*IB<se$bK3j@5\#fX7I'THa`tV[<0=>$P]+\Fn>[%cWjdk._ <LQP?W^AdkdZh\QNb "-e=hp>tc1"2eWIR9#K9Y^5&%jZ$L,LB_K+19gB:AWdR!g%9?e>W/Emc26++H.\6F<':j#P9_kH_KGT88=4TmVGm[[N_)C5>;O3+>i=1F1UAE# \"J07pp!oq8d..g(((deH1[)^[,= ((s_9p*%(M_^7 l"rJT?l6n:iU*dgfaM r#e-_*+<c3jIh\_$A>ADo%N`>Abj9'"FoLZ#db$&7Y_U^?4*SS>dG;K#O's7lFWA=6qH'rC:0aeXFB<^<pa;6'CeAHj7W\A76A0aHJh%T(R pFQ[9U<3q[f]%Km1lpM[;[)DDp6LE'mBAnm9Z:t*&6Ej;X.->K(DV i%3)I*JAX3NNL jgeG7Q[XHVTa4\2OA@*5B[AIF26I]:,Bla4,I*ecIY.I9Z?8*)k`=#]88N;rHN\R_9414grVceT'LM[6IF<n Z=r>]qaa;:NHd@W!`EAX-D5Z?gU5?bZ_TLR!l<pFX72/gN^Q69<(tEnoP4DQAh5ga3.7gfqog]bBqj)pVg^QUVM'fU2[`I1nO1BZ!*9>lZkUaiB?iD8cjVZX9B^'(/OVNm0I_<e[SZ5jCM*FdXNgUb=(E46$a\T!U2kETI46J=tbA_l8"sJ\mClg*+]DRC;Wj#NT-Rjb*^I@MMareE/3<Pc77KE<krg]k]*mI+j3rYA2*k7kEc:9CnbZ3BHQJB\N0=o[>0&6NS0OD;;bK;',UX-GlB'gpj-n[fKaEn>sUb05NM^$HNR-<3V((RDpGKA-PdUA]s<)lV@r&7(n$A>M;D`0LM\ekE\Qjd.';qdO7 9KC6g`Y[N`.$1`raN?o;qR'r Vm@_'JF59($l21"`=A[Y%\(GAG\qIf5 )N'C%">WGA,Q>!-#RTW/?XRB:_n)^(RWBA]r^GF$U@A=oI''fAZ+RY;!EOV6E#sr<iH44G+hZ;`hR_Nj.CWM(Ns+_$a $-mrSr5nt;(0Y)fI)S4GEjX=`Y0n$B(q%%cb1 An;1nAi&-3\#Aa3jU!N<Vs846k^W6M<+bALW@3AA"`ZlQi26;LQ4cg`ChhUb"a4C4Mdm:#k4`A#nT 2SC0/( K:#A`pa5P"[(E*L#D[QH0SkNO#iaaC>`!4"^IqAU)[p$Us9q&"WLp:@Pe:Q?cLY(:Q\Hf"-V9?>akg=f$,Dcj&7AM5s-t3`N#Al<:"UVLG+c&,\k>ejl_qK?j6`&Or=Vd"%Np"b7q$8Od1:;*dfnp[^UJ[,6t)YsVkC@aU$>]3S/LKp<#40TGfNP*+8K*NUl!!]piG]O4A5#HQ@mE2<<REeK$Xri?jaA780/G^C7>rXNH"K[jE*5g^(5R9!Pi?L3N[:3AWOUkH@(%kZr7EMbnRn395W/B57o7d*pN`iHQ hWbkC$j%ge:%dT#6LcPK81jRcAd[%s_$c+q>8hO)l.bbY&l%>Z^c6i>\Cr.GY^eU/rq2C"mai_W?,@ JTTS*lHpL.DD.\BBEe<:*W1db#%+*,Ql6?+X=M_nb7%,%lh[Q,['nTHTgdT7j?*ls;GT;;"%7+bnB<s&sgK]pH`(-?$Do @%&&dVVN.*!%bn*2+-3#NJR[W8b-ocF8=EBpE3 TDZh9MN3ogXFA_*oII7D@UeRV5&)L<hT C+9df)-UCicr?SrG\pOq;cqWJ!oGB0o'ai*]Yb&2;6:ra^a^PJ$ 2 4A1&AHPYOlXR%H6oAgigg?&@dYl]i3id>>EK43GV(j"DQQs l<0A,/o (+G71o"@McZ%>0c'Uc.]PXt\>X@kjXWqP,,,V`^l*L&6(d\<*cc4L),GbBo.TmE6/@7OA^/^gA;!pPs`Wjk!RGG2\nG7aa>C\W@o64tKl7SMAX>k&L,0V19b.YK_:P[DGZEPLHX-/`*-n\AO'CjV+&Sr/!>)8r>&diAJN)I0aWj4m=&&&=Q^Wp#pU_-3Y13Q/g#"EQMpBS_1YP&9\ABL6Z6d)f#arHa!Hj?*X+W0:'WWOGV/1All"Qa"Xk\Oc UC><m!$Q QcI>\AqRtCVbD)X<+9pXrR&`"Q<.0-M.Q'c(XYRF0^%>#TN-V1g>Gik I@1.R.4@"HA;hWF@Kh+X4kt$8*&N`;m7UefMH)W6p]ap'J)fQ;)<`BCa@iqjGCDNlQ&-A@^+H)q0CEYsfBs^9+$b!A?ifH`4e`5YcN4WR$q?i;hOgQTJZ%^tZ^3bV>;+FGPDO;Vd^"l,TA/^&.UI-A]979L&'/4bQ&Y==om?pZAVf8;@A(B.FUY4Ao3rcKMJi8&V6pjTW9 1L-$M^@?Xo=Efmp,!#2B0 iT?%d\^Ze<?OLM$=4q,Jd9`,g$-2P%Dl4<\P<p:K8Eb"BP=f;\Pad(f-.<l47oN.`qNYt@'4b`m1TV3qR Q,a/)Aae<tjA(.XNGbL1Kc:V9_64fTk9J&*4pD9sC_AG<m9bAT)oq7D#)f\eq''K8F^iJi?l9674<-\&bVa)WqfHFgkpT'])k*';jIS! 3FJ?+YEJps;5DOl>ej-I+,Etdlo;GeXtq5Ei;N+QHKEa>:p70G6Ah0t$DC[:IgmKiSg7/3hl#Vp0B[;2dKL'SW%pG1PVQ>U_N)0^D[ALc/QTOaA])brkR5&Kk)K8WAUkhpSEj5nB]MLc#(T9Je#LOR$=gn>EdiskF\p `roU>)7C<G$L2gPH`rmc-AE$3=D]UZ@:UQ`q`=sO)18I9L!pDZ&nNoiOftb^1l(KBi9k#Ek`SmF&_d0(@t$Ybj^jnnXCVAOft4TD_s\%K_IcT'C","lpJjjtl7fGG1;J*@]BZUl54j6VFW=+QjTO[1ne*GO@RsX=j4F /^nFZWSPS=VE=RJ[?V$21hQYLS[c<1)jMEQSj3p;s)_?D_+s9I!jokC8[<TOg=b&N+S=[4\@r\%Q^BnB(M&$EA<dhbk;Xb!\14%X[>3Npbd+kW fo)kBat,qpW_YspA_A!fE/7g@YVTODlV?f+9LKMVI mW-7Ueks6oe4AF4]Qe6I6W!J8M+?IGr$&/r@EA,d4-hU$]bU-bAapk6/*_ 9k(1)<,P']K-_?KtcGg>rm/YDhjO!3lpL,t*D4j"Z63)kB1_A17LJ+B?#(?9*:q=X)VQc\pR,o:J7O"gRi#Dk18$\Mr!:"m*_dh9,8g0YIX`Zd0XjB!S+-Pft(n.?'kD%%`K>'",Oi<Ob'@=ppp(9^E:UL6cS(bc"p!:/6.%Fnkbo)gXSBA[WL7MsD^1 dCSt<8'0e&=p!<='NV*M@HI1qKX=C^&qR6_>rcg1L^\+iJE]!QEf$J5l&_nGWLGI8[B:k\qpJV1N3(/'/H<B^'A>RLb3G57Hfn25*[:*\E`^< ,<D "mmD;h>rr/oRh ##dl`7>i5"= K&;;2-8gsF"=(*FkCoFTd=_,7\^R]SKoRlkF8]sLMXG%Y[+im6_^`7fLgk;lC-)BpohMn0?p"6`ebR\'h"%U</1/.7K-Gt'l66?L>qBC:?<a?XG\7>A0-YHU%[^K.=pPMhB2K'q'oYgfnhsdH3:(LTqpV6;'q9pBsQR?X9^6W:F<5IQW#Sih2J=D"( A0CT9W_nKmV2,EH0$JWV*6D\s?!:8`4$)Q_366,!c(ga+Jd;lpk5gIE\k+&f]o"^m-R<TBOjEUfYIBEVMPRsg4Gr(ABa<UcV6^n-+<F%'R tL<YG=;T)D7FaVR^,#jEh^T9!=Ii$TXXst#8on/lmnnq)!"dZ@OtZ,M4rLbfW)t*aiO8D;)X+KT1 tY\j eX5lbP=?'`k<Z-9[eBi"cT" #%P1'&Kt2\E\/LBIX"\eQE8Mj@,9X[D*,9o;A'Lh#A/bHXI PdL?r8FcZAFXJP&iN%'g@Pa?!_%t_P6S'5V[H'TP9_[fFteS^oGc&bQl$H1?%4'S\o^dSABisI(]L7Z?<*1+YIZ*kcB[o2%og!N3BSI,UE)JGAlg;I5@E)G'AOS$Usn-BQ^\\kW-i?:6q%9".p^l2U-H@X78;WnF:dAcY`sO;9rhKlS^?Sp_dC:#H>)A(M#8%rj"NWKf"NcE$%l"!<OGEVKk[ftkdipA]>;&lkQ nB!cpgJ5hBh@Be7go+o8fd= ZelUGrT)o@.,EQ8Z>@=elER?'\DEN'iJrTYV*7&EQXk2kLI`CJDZ^,!dK!U1o1 N=*qq8[>t"sJn9 r].E0b*<rIe4""-Y:W1B%XbmC,n^S6Gb$9a@U+NK?k$3oJF=[-,@>>+S'Y`s;hpAZTDZHX+.DA6^0L;cA=B!12p#P=Nk8V@[7e7"9+YFsD[$F/TKo=>C8K<[,T$JZYs(k+cK?ZXgNtQ/H*9'h9@f%Ih>G%/U]V]VYXE_^o1h=a:lkC4Pb.L^eA4CXn>st4+jakA@NS4O#gD1V?5kOHNC he<B!b#CLtrP0/i !IjY>P&X6<>2UkP5J0Z&J?/[8ZElsB@[TMI^N3-85UZ /mUYZfSjGL]0@si:nj6;9;I)C20)BO?W;F$!G?<Y.:s%e5Ze3=7b8I#TbITfnK8nOrLs;*(GqG8P"HX(67Q&0I?8`DD;N9k<_(r0p#=P:FV^W,#& [H!tVq#g)rbj69M[;_aQiSN%r0.Q]$jAiIU7Eb\PEJK[(:CHjkg!U'>\?b #k`'>t"C-C'+YJ`@#Y 61KEb K?Z)5FsC>IIfH+RpL2>W"Q$JZg/2Bk;%Hs6(#a,_S%9qQ6_\;N_Dh"BGrOGN049+fbDSANG=*P"RoDQk91S'nQCIBeng42;,>&GA**j?edh,:>Aq\]5q)c[$E?('Wd-Z:TC5DS$BO PTUELG`jLS7_N>  bGiU 76%\QC)5FQSdDf\D>T#"^"9J] n/$aA^8n#t$a]<A]&ogN[l`U3P:r$1bTLFn`nJAP!ZD'ic_^6.8r ZYBmH0L[RC&890t]LcXM._c ld2+1ac3NW(nZp#&3AtsBeMFQn+'dd TAW"9.')G#W1>%-fW_j#%fH:JTF0=l3?oHUVZIpJoHlnM:ponE:,;">)l:Hnhg:@bUq's#DbK`L(,MU$,N+% r@@4W?cc[I,_)daC_?T"tSQd9^%`N__pZC:O[gWgdhG'b\^0ltg'O"koJB)J-V!iI3(1fjq7H;BrMlc0Vc"YKo(C/Wco2YTaU?s:<qL$?C905!*OIB,)kc;;\MhlhaP&bTV"o=7aN+$K%pTAT8rbZm#<h6f=O\*ioKh#_^FS?9keEe<[+N7l7]MYl4S\IaRfi_rYb$9s' 7ae%14p@=H)M@`5Wsf3_0Y.99]=1p'e2pC$l[?%-+)EkskqF@9]fj-eq8@,AG=[(/pLj;&2%b9iX=-9-J`s/f3taq*NMTi4P0QX/qCEDesdSTG*U[CC%3KfY%I48km+?$ bQIhReLjnkkKZ-P1bt:N<LCE!=WbbmR$a(P:hT[Fb$+V s9Ze>YE2rF<qqX5a_;M,fb/"PJs=0/iN<VVn$r.KP@A>qB81/df5\W3[#]'0IYYp/8qQ0[_*tN!3KeAI5-4`d'G=&Z)hpqPfLVJUG_>>>-AeHW&9Mmt,l1T^hPoML&N@T[[deLkgBa^pGoh3rE66BW"?%K))Nn2X*=5FA_6^bT2hnC7/H%cMkZ-&MV'0JFf#_HRNV* .@j6eU`&l2"W=R)_EE0h[-,="/m2='J2>KF[Nk['@K_,\%BHY4]P"<A\0k$Et=+=?/RX9rL"*K*q*-NP&pRrD^cGbFUm#@kTA&54^-+796 F0j]DaI/s[Ct9-1C5;?KTQZqaI*LKSB[OAA"@PY6Z5K(`-hLlRZ;5;X;jAOHhUr0@UY=erF$<JD'$NBpTn)25kF@^P+h=@E,K-gtF3r.(R;J:A[=Arfhq,=6d!p=?!b=lMokbLYc\iYOY6#,QB%Y;CVX+%h(7R9Al3+SJ*WNNBLQUhmIK&/?l34gci5GPUh#kF2nXB-P<,*&"O+ar(Fnhd3*A<P!?@!iAJ#fBVo;0RF#g+$N[#]=UO\T%K#r71-#l][9Hn/,%,e-;H++MA@L&[c3Aknh%j7o524%[N,Alt89rOQt``#S3G;Pf$#D"Q9FZlhM&NlA0>STZ@-Aea<&'BE;]t8No8RVf',M@3<Goiioi9QS;]Aph[M!n_YH""+jSSW#kWNL9AGsk';OjV4*'T*_=rfgP^6hobU]QaqlW9I=fjA%H2"fah./D3+'ccO+qXKLhY\!7 5FC';*aeMU;i<si"raA&0>4\/G<3jI`A(T0"@b,Fc0;,AfqSb0=o:a"I*5`'>ep4#4D&nQ6\=Lloe5Qn-ed&$4W.KN"!i03QP9DW+:smc2_$gO*T2MV6;';sd-06W:'ne-fpapE'j1,f2ieqam>mJVD0Km\24 _\ApdeB&@gq4%fJ3oq`.&tiR-(A bYiC([QPaT6].XVe'[Z-6j14_K3is p!1t_l^;?@SMJC;pJ=_6LaUer7ZpDO"@3R:lqT_(ac:bSd!EK*,sD^s8R0]as0lG17)r.(W%lA(q!b=J:E!rM8^dA1?Zk^ab^"c,Zd(@tD8 sM.[E96p.DKRG?Xl)oWB tD)(><V7M$Gc2l:Wj@^UY"jnW6j#)Yrnm)HYTQl\Eb2^$0 n_SYph,Wls_`UP`i)gT3FF(@FB2kIX@;aDOpI8Gr?hEPJTcn@2]7b0hk>REQCj(OlNi(gC]=!1ajYA0AHo[%2cpmW#=YIga?,f1E*W>9Vk(0DS[spBF,]+a8NWn2f3A)kOs$eG;5 *LGGH:3ZDK!B5BZ+bX][I,Jc47T7;#i2Re7tJK&]_N(e;qSY2l#.bU9mebC:8EE"U F+B.-o3GRnEtA%NM]7ICk(+h;KO`I&\LDE. B\VO+0T!-OiiOkh+.]RE3DDda0Mj:L^id\d#PdKc!Qt/W`:m-aH+8*gq\Zd)0HoGG(T:'8LH\Oj0`oJ(YU^_6ZKrjZ*t(S2d!8qMTUn 8Wi38sSCkKcZ"/_5n%fUZ!HRiaMYF'g^EXj93.-=(/oHe'!B,LGG9?cF[?X[WcE5\?=7% ]OQs6nJnRJ/':A6UGZGm7g/Ke%F[7p]Bs"J+>CCigJ(T%bZ"jnPIU@G$(++1S_@b5%mREh&2TbH5II@A,jS.[MH\1-b<"?Ak'6,(CjbRG94=qV%8 TJ6Z6&3(o?hYfKn95Wb=(=m8.IF?JS`Qh*R?@IEp,o7U-J4qZGjLnW aaf[VF(AD>YDU>0@ZreJ0L)(&F)-U$F@j5msJn)t6K-SGr:Td+9$PJ2j-s9EU6\:N'$=7BfT)bcHS)5AeDqbeVO6r@":i09:':jY_-2'ZY5['(PYtgge0LB(n/fK"i6?9]4)C9(;g= G;" AZlZW0t3bPYs^?t$OtdRVn:nV/m[@A"p.%9!p&AP@G&S^)g="qA>AVTb^=6T-HA<b[1/H0gPDPg'B.?A:,pqQhWUplAG?F6U"`3!'As@#Al\"W!1T7$2\PD]eM8:Ce&$=mbjn;#Bfj AJ3^BH?Q5i1@[omAolU/eBD"oAT09s_PRjt]g[%'Q$.p%lW`'g+l7Ae<;n-kc0G77fUln7;Y#YjEL#btB\5^nW9n 48 @a.#Y8/I)f;qn12Sd+]TgM1ktq8ZoPOk@/dOSq@<PLfFPi+FafSXchYLS`XJfj2e,Jc+(krLgg.M?bH,2S?/QSBg66$T)D>J@j+Tc;GU 3pDNba3iS3[$*FE<$UE(pF&@9a>)k&1MOK1MTY#1?df*dn2C>hH$;dK5>1b)=j"CNaV-atWE_"-\'\OPdRk;b1U^eIA4e=7k)U9rDASSEhs;H[*,Vef3PhO@&?,Ri,>BAqmEZ^tm._A#[@[9%jb!G#<EJnaYcX_[%On;EjoiX8O$4Ss_WZbc57 *ZmY"5gr8s"BTan,Y/t%f/8IT_-gAAcHdh#aWPNA`P>ft"Bn?:^0G4-Y`fMSLdelJrVb3:"KDAlPH#@m1!MX#.VDA6ZLIdnF(6Flqgd[GUtN:YDReU`>pUB<P"PV6VVWd)&1Q_ZajmA)+>BQlGhQbC:`b)A]:'AfM86]'K[A1G3[Yb"4oD.V=NhSl3JH)qA7TTW?)`2A[(.i=S0N0%!J1D:#";lcAWp>,#d+7MgM&[8%'>% P* kIrG4,JZh6ArHLiW<30`[U[`n0X":Z57 [N*HgZ$I7otWr54/Ok\NEQTXVZKt8D6,q.R3mp>&_IPAI(%?e!5?A/Qbe@ g5aGG(ni3aQ%8;=R7B4TgE=cNBq+FW\An6k@VSnE<(EC-dYOXi5P[Tii;s=l&'p1UFmJO[#pNbt8/q8Mq:I.Kl7<G+ATp>[5+g8)\XkA7=1"7GT.4kFYob70WpJIM/7`^?rOW"*C\'\[Ot%I@a\dc?'cjQPlh\h5R/M@DqMap%_<SEh2l<RBjZc[og?E2cJ3KjI_GL>lgJ\f!Fn(UQJHGTlr?>6mA,VAb3793AjHbXFg`E"d-kr59p,"q.g1FgFVB?%[V&V2T:?02JO!OEQ8?_GKU!:6^lAL7C;Mb@2b o_s\1j:e]df*LQ79TSjDhM;AOd/9Amf--]#c?4Z4DA*h&/?MH0(=W[H>U,j'AQ5=Z84qS_]io5sdC/Y!)Ro/#1-8eahG<=VGleBq$GtMgJ'iaA&!0>IGh<<beUlCkm;<l_n*Dqgl=]6g/%^DQR8]>Ar[[r(DdF1mRYX(:Ah^8=<_HA:&X:*+ra(p/_Dh_,i)B7 WFq+ZfD1/-rZ#rM-i\)%3a@Ud]n*+<H&>O;b0j3c7:&A,T=<273+Ib2EmD[`=N&`99S8??o&/@qoP?$"H#EL ER[h^aK(iFGP%TAeefT$Eib^ "eH`n!A5\Tl.DjW:'CC!8/rt;Xi`S_Cj$Z=H490!0#9:$A!52\G@WG =]X`K9CI4)gYNKW0]=OP;HJ/%pakp c>":0rPlQsSSUKaEQY2iD/7.]oCP"omV(OO5WnrAI[&&A`EL>R_/"r8.O/6cV Z$JsGlfKOZ:6t!G\[[;\Yjb42^6ROJ[TA=jbf9AG>t9_6pnNXioVqA=2<]-;[t7LX58k`<*K?\p8IQ0At;LEW0+H6+*fd3SaI'$<mmh5JkDm\`3-p2\Xo[?JbcO"Q8ZtmF4UY(A\'hD;>abi7rAfNh/,V!@M^H@_i&]O,^,hNt"(mg!7jji^R\ 5WC=]M[q_[Mb9.nl!"BTOBj&Zkp:0<kG4mm]&>X],&nJ$\]]S1?Ra^#V#X3](Q9qUlM2F<sTP^AAr+3@30*3lm:_'2#>qQefOt`oLUd=2`-ILq'kl';P-$m&dbNq4_Xmcam,pA6ZI^Z&eX3jLk'W0^hf('1^&b:oT=nOhOTQA!oh'^#R>P?3+L:XM@anPUHL8pEW+.d*,t`Q423Ea'3*,\8?[_7i8SQ,Z8-EeA(or+LtA^)r,Qdf!13HT>+l>jp'qK'!5\S+\1R[T(lAWG@*@WXWjiJ(-C,:$Q*g;ZAs$K+Hf3f,l'(.`2+Ltg=LlUj]A)h_.D4AVThb_:o"E,Ac[$r=`6CM WM85D/Sa&]RgDY7Q%1/8AP\-`Lla-5N?aXpkcrB7VV`E!E8ClT8gsmJb'3W`?C9rUF<AJ2d?P^P2,Nn@*_Q1]e5mKAA_r[WH#S/p#t$nf9A$YOS-qc2,qT[,8FnN7';lCZ(8Gd+p*V"Jt)$Q^JX q+O$+@fhHVdDal#5?h0&cI2<pmRW/g$/gePX)WObhkE[S@j>ac[X^gUQ9TDjZ"(jmU54^H*-E?/q?8cIS:dL0@ b]9#DoU)^p5b8X$*I51q^WsA'd%2O*N$0gEfr(ZTj5]CgAC2n@"p0tBEHN1mYX"?InEGR7A0T>VMD`$`9?cmc+SA!/^SHKc6PB@7-/P'NLQ)s%@ (7\Eh$-;DE*hDtr/PG[]J69FRXG2K(MJRMkOrO(Z`KnNC<)o[<;`1hDl#((g:W$CrPUn(FVC =a9A-p&SQ-.Z9I o(1,pIadRJHa3ZLTVh].bH;#MkK<-en/H^=(/"fsg&B*b<lI$;X8AHo]-HB&fP0Bt0MmD1,&Q1&9XU"? d^M.:^e&!t*9KTC++i)p=_=!)"`6Kb_T_F22tg,AW?8Q"E[DAK]%'(58-$+<?(.#__QLLP&+SVEmF@Jkft'"^L`O:a4TT3e!A6F)5g%>OAQE_X[??,*N/ ,7=',iAYKN OnML3[P^e;$Xq/Y-%i@[)P9cim"-8t<=^bh!srU3cB\&^^>O8IjQm5HNC/dnKsYf:Bj0dN_)i26qR\k8k@Q0]_tO[dGBL4Prgl'n@/>Uq32\"I/pFTG&X`QZDM/,O t]LC\nSP'mjQ:'NA=&ln^;D\nlQL&M;kAniTD](c28,8,18:6!M7n$&RVZce8TeHW#o\G^F%2_XM-/U5UZ9q4lg"St_'MSKisb"#e#NfZ,Ce(=nU] h/$U.Spq*hc+e[@1ZC^=2J\P3bp8$c58j3_O:0k6WC##3=jW!& .f!B,H^\e0S;adAUOo;6ekIP$>Rh[\-nN+,ph ]3C1"AntH(F?`s_SB6CLBsh7D@7 ]SAJd$j'.-aoYTsN)r:=>*Gf:U/! -03/6n&B$JBQ'70?@&G8eDUk:-tPpsa=-<W?3bf%d&Koh4A,@GN_<?4W^k`RGggM&'QM>lYS'G6,^t+WNDdb06]"EpeqtZ"fq=P'"pUgVY*r#D"JNmJXs1t$;P0;%$ORIhWYeAbL@ZSB&G'n4QD*L/nS/^GS_9?9>N]3fFnAGr!neR5=_cYH7$)Pcf<Vf[rh+C"(2A?.m,SQ+:A-I-BU-Kk6prA&+><'ls^\6#l5#gEl0o5l784M_U3.=W_qGAmQ*%%^^]6j$/S,O0"1e5/YmQMqj?<-TR!*0lOrtSkQA99kNQh.%r"dOm+eGSXYY8- )FeVXEH:P@Sa##kM\2&7EY$<s5^KhQmnQG,DrF^G,=/OC%2_K%0OL3=-eV/5>WsDC30'l"h>%Ar#"]CrI`Y2\8o#-\A+qnB[3Nqq!a+'Cab&_3WC@]2<t&.4h L<;A+'+s$<'rKGDI6KJZe]Yh^QZP4!4]NEjN/n9hb#kW#XXpnS2-dn=1gm/N`c6#02TWYWfT`/>?kr66f$mXoJHVQb1L;/"E/[_i"2A#O_@8!_onZ:KfIm25I;qhK"A3L@W2?$7>_J%UAKVto3lMX$-(b7s#nZRWJ C8^J.dqq^X+f;:nS.j'7',)boQ07P:be3Jja&_SjlSF/K<nWp'@7Z)=SVg/!4.7eTVUSKEJSNqCjY5=7sYiN6r"O1$L<O#M^$cd$0chZ.Z8CDp\qUP6q)9RpR&A,o,^jtm/N0n=9'pB6M1ao?B9\mC_6^i.ms ?+tqPJLB/XT6*(AYbq6*OOW"R+<:*A;"?$$!&::e&_Uc[%3.]iNY-B 4GU W\WB9*hW4>Cf]MlAj\q8MYh@X?E9PZEAhdOI9`bB0)DN3M[)i!`5iE&/6cP,K8fd$Z;6g0ZR&MA+m"ikA`$A2.0e5!2g==^N`#'j#rqt:\ _q.1dcbKhVo5QdUjl=<^Q%pF.J[KsmE/p<.0(?j=(@bU7 V`Q%*Q-\pdr%W@>etp(Y+?H+WbnN;JBNA)3Vh91?M<9/f7_j,B =E28rLFmb9C64o?NB1Tf]a4#GU:!(3o?;79.Ij^jkY+e7Q^4?[</gYgBriqr/`)CAY4'*/%9Q0HP#:ORK@s33FkJlCgb9<U?GTBL%jA8O=_5('CMLTA70&UYpMmT6`9!^%=) -[\Ap,eC?"[KcTVZo*^aj#8lV?csMNeXQOL@W<X(KW-78GS(-=r[2G@UH$_Kt0'4!L^;Kf\WjSATX-3>f:@sFiqGiP%`n/f*IHLa0CepA>VB3hJgZe32-'2hf$1) BHM#5PtgK<M4V-ZLLn6<?G;r*RP(7HA8MJWAr<g_.G=D8TO]UqHBsC/[eX"2;6oI N!0KiD&sD'n%a#VC:KS&_S^[m-Ni)F6n-`=,6;e\pi^cPFA,dY8ASA5$qK`dX/`1_[NcGQ<fmGR2X%\GL7%A kY.m<PYmWa-2t%el)X1pfFBI9Qa]MrLGA`)M,C\:G1X"_=._#D(p!q r'j=A;S?Rpii[4m?(kWsVD gTfDUoqdMRAS6LhENjl_;)]E?c8C:ijTNm.1GE'ia#X%5HI.)F^odh467(9]^j+aG7RqZMV)nHM" ogC)aZE*_T%< AcoZcCb^7eNZ5A4m!_SoA(.0-!cp^^X>/B'5D_/qY1=%*GQ40 `k-S D!DtVCL"a9kLRr;^Z\S5?4S4abC^_Ji.9=:kR\r=)D7H=.-1r.OZa.N"T7(U\snk_BLVsX%0AJ0_%V'jK_.e;o,A=ercfJTZRlB:js__+O%m9/`Z]`[CSU4%e<4T=F3<NHZ%MpF.Y.6g V*5/%!JNXEf=4H@B"ST9XQo4DQ?(4^B-g=e7?);3%=(ha)D$5+7WeN]Q@p,D;J9+#&l=>NGa83EIc^MZtk;J[Yt=&hJ'$PTA#8 F?B]XWF(CAKpLX_Iq5FWSe5._?it'%Bh7EAbZA"95NAo;_[WE/Z/0bGIP'FkIK*/Ie&la!C\nR&'>'c'n2C(t-ZcodJ" %s04ZBVLT1<F*q+D9L)qCWLC95Cn-AHn(W&Z&1<lAA3^faA Z7ae `\-$3LJ0464>OpehGq-lKmTD1(1"Ds^"^Oq(P?^66F9X\HT/&MUTcM 0OA;\<[A=d\TRPmia>:qdh@qi.IOBj]HO#"0.h%nSlXOGY[$mrSVp[Y0NICa8RL-.!ClD,90Hk^'k6a6cin/Zb!&je^@+[00bfcGFG(LY81#7tpAeR6Lb=qT_H("eb:YOiiI6hV*SF3:9iQ\d qs2h->dl6OT#PDQEbJX66i)]FtpBF -g/J^S\sl6n=G'Jr2:#B8)KM./9:S]Br[&7qh*'hl6L;"4f'[e8njR^#S@J6]4DAJST!XpW>?UcZp.d64.E#fAR#AQ"CFqY2BZc+AOK2VqA6I'YgjrfqW1rL?F[BD.fRm6+@2nsc3/liS%:$83NB]RUFI5I; M14H'Nik4^<'eaTB(=6L E*d$(CG@ >mUikAR:"3Pqd7$'<r\pUTi_76GD_e>'eK1^GU`>aMY*;?gnmc_E_1ct+b6LWJpR_AJG$b&?iCaD.R"S7VkB*<VpFcgg!`Lb-dCkgMC+iM`2Ope$l=55& Bq@niS9@ _2Ap!ok9A"(@#7]2DXWN_6Xr`$E7Kh!+"maYk>8&"h`YciIiHg_3%54DpD51IWl=V:5@t\EJ5I^8K3%8#@l85N#[C#<7]!*1MpRCS44&TfRhG_?BH 5;)CoIJsT&m9KBB;C<;WK$?9r(h$W0X5=W:_B+@W>O@dJL cU' fH,8;M<qL1>!O(08I?W8S [oN8c\,Cc&'bP.;Bh&(+$P*Xq,DmW)Tt t/(Q(EtlLC:fCY&XD0d[BZO0^ht[APo#Egl^c<\Z"FUY_A!K=j8?9#/N30Kc)n78ib8?b^7cU^(fT@q:%(W-k-FdA4Q\_8r9VB]%SP]?(:>DYF2H@);(A:!2$'QhpD:B40!K.BBlUk-,W5T;#QD7=Q;<jf!MrDGJ=K<n6<VY1Y.8tHj2Bbbg]Ht>k5,$:!,OF>XA/N#+ia]dUIF:!i"9tl:a]$e2=CE&KdWFBC0mA/(%d$qgD#5=e?R=S]\$M5jm)EJE4McR!Y`olVI#D%AAe[?*KXS,b":;275`hGb7QpHA5/'sqb,m@pXtWq#WC",L35mH[FD`P@mTP8-m=nQ5lOpVobKa##,I^iK=Wj8SN@^^sK(]2\<@W8oKs:<Ur8%E?i(4?H5(,5GiqX]A4:"rD*\cg!*$*(DN[2IaG:l7S+(K@%G%XGLW`5ld VRXkrEIJXk@,6RB4RBbrm%i9rYsE`]&^' $FpBbgjj8[a*F/,7*_Q0"3V"e2_&NW_Q2nM?E@(hjd1lm4O94'_6 IAJeXbp;m,!<rdWe1P>(J?H6I$k;(n]H1a*p@P:1+hdYQbTi.8>:j.H]q*N'cZ1a,a.IsC@c.rl"*q[s8K,kg:3PM?:t #s81l&,"5]]Q%N1H`D\WUS+AA!'\2;4@Xt*2b:JI2F@ERF@rem +O2.!&L#sAsZ[U]B\O$p^=;_WUPcp $-W/#_@jmh-kiq*5-LC*i>Q1)>7N;k[_jqJ!p^%sYC^*h)k tMUVh7E%P&TgZP\B_^1/SS](B=e7C3?%C=f$$?D+R-R2W)[ln`(Zn?\/k\;%j*+_;/AK9iJ <Oi%Z0 ?V6rHts7(MK<+ZPCpSA-t=1pS1!'YP)K5 jOt[G;.*.c.[[jGh03B<f0+^`f8rL oVGHDla<Cd^4rn8/VCQl.?m^AAoBY844K[nqc$JdKjAKfhFY<+n\sbEI%2b!n"h@,]*=G0Z6".b4qM%& \C5Lp\$t(nsNLq+*]^&M6=->Zb&Ic7UW&GU"b"*sU_@D 3Q"oHbX5;P3`UAAqF,keZ`8 "j6_fld7YUI94*YMRE*K99rnd$o78=?O>:Zh_ LpQ9F_L#^A3QCQ$Pmt8>N^W.)QBB#b/fefCTOO\/C[DbqdJN;iQc)_2K)i>tEN!t#Eo7EFcDQM*/Q$DVq73A>3q"?rs,DC^<@Xa*UNT)3eJ`p,0@eB-^MdL]-+AW?+k'TT"=*QA_6N#0QOFGW\J +CDa"d]!*[O+l[\"D)aLG*\Uqo /lpZS'`25':Se#*7@QG@>i1.@tN\l0)48QCp,Be"c7Vd8C!NOj7,,GA03+k\JAPm6'EkqMBeqlI`0o=jW2AD#Jr"eLF#K#DMXTA?)p\WG.+)@aT5$rEkal[sh#f)7D1:N<Wo2Kk\#&<^p+L1&rl<7:c[A/VTdH0H$OqA?CSCUB,$Ih%9r@$sScs!?q?k+r5p=<A\o0H*]5*+8S[?_2\5?_.-q0chiLg@j!bc-C5>@J.hLlbZ5gld*A%!]Nj+93+Mdh;e8oRR@(OQdp$:KHVG"_>S+"/0$AKK"iET>q4-g$g`'GQA#O`iA Qa AP+lgoob, QXf&Bm!5/(8N (/Ht#*%2/dPin7^G+<VL"?`6]PG0/[\I!$#;r7AI*Wo-4.d;g^4Z<UV9OA$+<6Gkiq%?OacGhT%F"\L0@eq>o0+$6<8RAVppX4`\eo>*RtAe7)'dO9B[GH:)cl<Aic(Z-4gZeOn1Bf]<GN>g 9epr`)8M;m#ftY:ZEMI_8UJdaqj)q ,h\piI:L:%#+*+7o.GkgkrmKBU"`WMJ8$XMWK=hU/AR ZC4IUaT'24[l.XLM,/.K,qtV(2cf:]Y#G0O_92(ALUY:.'q79aqZ4CV%P? VF8qc#^Ss3fGdSA>8SQdK?;MTW_UK"kj2,F#_OA/objAB^k_BZ%re/blK+3Rt lrAJ#ZeACaIA(jh \(Ne]R_`BNQ>b8A\P-"/ABZ[KA38!pWd00d"FSX/]S=CB=,)FO0QioNX76k`K:9,YD5HX(arVUq_-Y0c<oBV:]!(R-Uk%n;P[%:X>o*V)Z?h`C+Tt1o0e"@m7SVai']@hMG\*)P9M7S">c+bEkkCS>Hlot<dEmi4$KCat_n#)QhYAUUKX-ZU*4O;D=/4-OkOYdbVm)Ng S:Ia5MJ),E33_<^dHQ%j,t*#?M6SZNUT#CH<\a82m22`@NpdTH>(1[6)^ZVlAKE5i2o(s)rskb3MfU6lYlss3&96[M, .fSc`*OrF'.Y#MpkH/pde%<7m:LtYY&V)miFbqegR7Q ACrslZO^J@J*#V.H"r5m]5j.A.U7#82lN*]3'<!G]\lU7okDNnGeD3YRjJ1.YIi+W)nW:5-i--MgT9A]`p4b,.t_? ;_a>4mC2fQ]*n*`M>JZYCoAr6m[s7=V9Jfb3U3o77(9XYT;A!MY>ke"ni<TYVJ$6k.#. PMphNC_J*bi:DS"BTb[CZc92qjomnC;Xd*iHA3@F*C^Yp?Fa6>S2[0 r*ch2+bA U@j\VAZrA<6[4b08g*:-c&ke ?fU9+5$ bkkDB#9?FP_C5aTLiHaY%D7#empaDa4W%`KV$<"tD,H>GSLPNO'TEj./\m,jt6TWP:*hT'eP[<W)cT-K"#@2O@.C#dEaV!A\h\@(LU5iJLWjgk"!1inL]^]7%k;s3HGl$bs-Mk)q&ImPWb1\p7jGWH-6al08 67ZKC9`jDpABZ:F?nP-KfGjt@@\<m.HMP"(k7$2,3e+q,IaQR-Tm\*nqPkoSZ%64aR5s%Q7!3c/7[5`]pq;!q17Hl7@tJi-VeHT5XatX-9CAIf\Do#rG#UpnNVrQp#.=LA!#W6N=?RIB\fL6,b1O19VkE0_U.SI.OI*:m=De4TA9"jm^`3-6hs8&XPK/#WN*\T/s5_l#A7b18^Z`?@r`kP=VJAG< ;7!O>?V]-Sr_AbFZhABkt1n?t0*Es"WQI1i',F#/=?Cd<.?!LhStaQbW0,1DS"<A:Y]5rIq'R<[j<!tYP8^mf=,n[J"]>V<@dCam7\A-[<&3qo:RSSHB8\8qVEAlG8n#$fbnV$5RHEtbD<lq I1CBc)ifh@CpL#$[$AVq%7I"YfVV+^K:it@'t@^5PhD5lq`A<1T61d_i)2TgJb0RCE2BEZqKOn:oB3 Z6[HSY/ b(eA/nt.W^Om<-r/h`Xf^dL<SLaoJ%tK^WLVFCjAO0oU0J]]!Y6sr%]A00)e.9kB*Yj<6 bZI#G&eR#Vi]*2T#TM%VHj8+qt\f9AbH_7s,e[=Tp<iRPNO-B7*iG#U`jpj;,PSO<(.Qs.t+a8X,1hTI5%r?MrpZp#g+j70.j@Tlc1$1nP0&LEYlbCUP/NIW:PG;M<fP&B_rL0,h*S.Z=)0D:!!a(RMQ4'6W%E6E3T1'n@ /XF8L#NI0 AFK(g=AQrfq^?2BCV@O`OG)#lh9+;` `9+"7I2koGTpm`iaL=k!A9tDY"d8WsCPDdpNgU<9P+OFS1cgZH*:2q6[3( -[\HMJX$X*W0g::t@A/$-KGm-rc7=q)-sOVgn[^AWp(r0<C.Oh"iRpn5,kGV*_n9Y\hoAokJ>J-6QA%J,OQ47n@#mO1'2Xt)>_^oc<S!2ZnV6"%$PHL7PM)"]'Ng_5UHp PV,qf N(D1E)RW%Ilacc,MGe:b?aZp9^(mdb>foAT>Q`>GkdZ$<J!gShtU\>$aM-Y"6ac<j(hL[_\c((h@%5nT]V^,]M*JAblrMZF^3^S#''^s![ehKE,E?]mY4+ql<F(iFD#G,6XdK.1ZM%j(1hns<R!%".-XqgS<Kf%Boq;^Gg&d@sq` 5i_o`;LQB82D+VEn=1\,(, t<1I1@W`$a$"Gd08n).hU)2jB<!Mj6?.NZ7^a/TXR$jBM:>opBLJI!N`qA96bBoap9c5FR&(T;as,B9.D)"6n6A#-Ikf8YJML?$N?eT@_]@Y!R*B!J&`0!P#IW6I`eUO>qm-NA/W#hJjN!M\>=%iXX)Ik6;G`Rl.BJF7b4+Sd7;q-Etb0Smtp`7/02B^]@7>GHJn9XdWE1LL'bon0j)f7=9-I9'5gi)-RHhV?Y+gWL .W2*XAT-qg6VW,)3>(86YA\cIc6%s(/M8FM`/3>#ak<Ua4C#WL+-6bfKIl#0jl`,+I(=Q7B1=^rF@(_q-n$P`Z.a3E'?c X7WNH?I\&f2ip/bK,9XN=W;T(N2j<QVCHfO(4n2:-[ht! U7p1aVBs8e42:djpo0;b-?*DZCl1E7i5p^pfK8h"lW?9VJ&+^c`MRtGYZb5GN*aJ?I`6;9!ni+?EW6cLM[t2!=P.Jel)#;_)5N5ThTGQ6I?a;$H>aIC>"I__#?ls`7PJ*Q@RZK/.-%%9to<BXI!ADAdKFqc&0AE1GX!^PI5EYG`ZG4;E+[!2=&JWhc!l]<&hpZ%QL69.p8Wj<M>T/m/V'"YQaV1kf-Pg+$;\*grK1KD2aQM1tLp`T -V+qXm%=$@/%'k(!f?'HY"9")?KZ]<13,lPL A.CXOJN_h5$m`%a[S)fi,2j"C(aAsK#?db:m2EG\ Bhq>Yn:VVQB`VMLIK'P&n$- Scm&j=ilONY6qSNS?@j)'s,(K;K%\1m\A$Y'GHCPG_sJ U?+S`cXCrDAM0_jq3.q#R/FMf2JekA0bWY%UPQF>E3g&TmJZPY1 8bj\Gj^`q@#!DMA+`1rhm:]n!D!V#.\kA485=ACZNRP]m"]fhcJA.@&14C25=Iq]FdO7+XWe+ )S*qre%GN[ 9=$t8,g! $l.1$[MO+FUXqq8o$[dpAA()4[8^> 5p-9i]L(Y=g:M%.EM:nCF6[O&"B4;MQQq;\E@t'/1,NZ>:iXc6 *QXIbbU<Oc+V-,O(E9]%g \kH *AS5Htsg<M'pX3A%\&H%r\=:?Bn*[iFAY6Y&,sd,t+EVJVR\4AfB$0c@X,N]B?<d3^sZ=rLA/HEhJ8!sM4;Rb9AYGtfRk^'R<,<Wb)QW)K!nS,+Ie'VhJ@N9$.0B>MA"[jV`iAVA4i%HC<i*. &qa&MQ5;GiAkM[Vg\]`eA'Uks_7mFc$T6/(-Ma_8X:p1S+L@!91Yk,MOm@l,k(HdtUM<XS.BI(/+/^7)gh^7f3>StaApU?fs(_(&c-`?C6W(TD:QAABR;-=p1VhDKoQC=Gj_DQg@j?;_"Vm,8Bk#OZG8sCYkii2AHa7'-Eet/>Z`(hFCN ]Sa';LE>#qn5:!a#-WGAQt!r'BAFI:B'r>6nqn<E?rk!0-/@>gBVHlNK5Zf>9VQ9o\*Xi(1t4lJT  p#YQ]<TG,Ci*=SF,A,qSR?S.Ki`]W"RAMPeWBj0Bn>1c37h`mP-8J ?qRg['1UY2!KB./E,`BP#Ca-RNbR5+#o,npPUNdCp]@0Yk\D1*X/+cog&LS9?O12P-:.9gk`)K#=SWI0]RV\H<r#VC#F/=5+(i?"@mIT)a2>i]-b\^N&F;tUQWBTY3"[94O!8mc`?__6,[ATkf-X"-h?Qs1hs\1&AP:d9R\!Q]Ul&r-NgC;&D'_ gdX%j hX[hk:p6khM#7'8s'/AfS1.;FFji7):shg-1?LcP\*0cVT^/g.4WU45eMOms'FX8+ihJ!\ip/>)Frb$pXtIYY;U.]q`XC8'->lm2?0l/_9d$1R#Q "MCPLgc9t M/hASnmMmK[nMXJ5-Usj5^I?Ut$1:O@FYsRm*V<@2W8EhOA,g_Cto"2b#p_"m[_^`Yr%O?g);KE,/C4+\;drM)$*$UZ)7_.:DCA+k2eAk!sB5[I@5m$Or_+:#^`M#L%M<N-pt<Pb12Fg9[i/pFF<YP+R!(P(2^.JsoUF;5fOb),s^X*j.J*RXD0ei*5&U:tW+DQEP7RE^d>lj&P$XtBA1Z>4S[rf) o;'?;E>+$k38#JNNke[RO*!XBKMq$RaMB%a#]FgtKLWndl3d"OF;/OTY'2a56Q.TpOnBT'c#52Po"N jpRV YaZd6\4/R0E/ZY8@G*epS7ja&_M4W&OI=UjQFmR:]kma"f_3CrNdepp6O_-k&+Vg4-A)H/d,@ZZ;41X]XB`;3))Af12R8d%nqj"9g"%XJiKUWM3'l`:-9<(cc8/OAUK,G[f^iOMoI>t.At&n[(+Q0@pq; l4ket*a10XhApT`(0H@Mtp:UP=5M<$SJFm%r!/J+2h4?:e36P[]54Ajm^#+*R*=eW19S[$&(psd<P*&C`"/$QTi$qhqjKf@,(6sQLg@)OhNOmMU\^q+nfZhESb*&7(B1bOMtI`AgYXJ$[>MZqX.P5:'G5'@\-&NEk+(Ptk/t;b7O"'H<+Mg4*Kh7(<MTi_Gb<A6TL,=NC E"s]eEnolA0-cKcFiqH^\K/pDn^UM[`$;7)X7-=eWXa&l$<5_dI@(,UZ&,-/Q2K+ObSYS(&4C<p]/f2NBa H>c!nZNQ=;i_)3iE:gDgIl;a^f/l/Z!7j$;p16Z4rqp5]8<K6T`5PN:>8j[[>1\?psffh;Yq6DBt7joW#+T0E$b:i]L?&"LR7`(N1cS^a57>O-!LOG^M'bH3VqY];-:dCetc4UIM`ciab,_Ek18dYU"g';'"HKbF ;>fLTPi7@sQ-&er``/-X5C/A.G%q:e/I(I]dWTV/BAj\HjVtZ>aO,gi#o=(;1D%tds3@\T;ZDC^qLV:Wl[N9i'=VWD!j9P0hBZmE>1dDqS][[ABO)H(%E:'R][551":,UD$*U^`lU&9WD=@eD!]R74X#qo']*FEO3tkId2eEb"=cea?@04l ME%QZ7oji'B/l`r+.F>9@/c@dh:W]E9T?e2S<Yo,Gp%U$2CM=.>?W"i>l/F;f9jF9/do%]S1-9Y:sn[8B.!ss^bHB7[9>TQt_n7W]2f&IK3KZBLAR5M`-:SQG=Nm!^2O=oXjQmN**Bbg82=,?%1 ZRb;4:-tt1RM5T`%)5X6Yd'3`0c"UT$-$$ ipE;cs9ng;KA&- 2 p\0#/YI/D2S=p7qF%W8kD9.T&E>4[d_;s=(*H>p,ReVW<d[h#+*4&'<fdN/HdeK`ji'?#D@jRI*dG;m&"=]3H&EJ;*^i O9:s!CO_*!IaZ]n$7ZB_1jI(s!oEacM2KkIj:oP.Ben]O8Gan,JDmr"c;<p-^0phslSp"8lFX%XOrYN\1>nLW-U)X!.A.pI'=Zf*SapAW5/$+fak%QqgRL`_U"CA!@LAAfjE-Cj>A,`<?m+,,W3XOVQr[kTQHY>@1$PE:<hYtW[p$`M#r*Oe2U1p"h 3j;Sp9"p3gY3D-Nr$GEk('G5_Rf,V>LSf!'FjLjR;;g%j?P0?LiC!fU[AY>TQnp6[*!Pf60],b_%DI/%`CqMgDp[?3;P`M#8U2BRAm_^PQ_8,cFB!O8*ng9o#^::F^AU_JTUH(IiNs3]a9V;01;<7Bf-WaN`)F^"Be0RQ7<nM8f`WeW7OlK9,LFD?A)jr7Ji_G_R5DCbgAP(JHf[c>LX)oAFlTL9krLkY`V;_8qOj>k#1;Qg=@sNr)I&/gAgX lVbhF.FCEGo2ChEgGH0:&@TBik&Tb7[``d7T>L7-_%:Xf2n.ldtlj>@Bd= j&N[<HNAi1gI]OgCY!+MblZ_mI&98MP-E'0ToVf(NZ[2m+.<SN[LUsQS8bXcA;8%TA\I,:`k,&1LVA6dTCE<AVesCQp`dF8$ ) 7q5(`K>s[R@5cQA*o^WAB:%A=kbN?pS14eFM#Y3Ls[b](spXdn>7[1"(8XY91\g"8jdkQ_)P[FE`O9A?,!ZGs&l8>%1%6EMTA_qEqsEZcH!ic:.=[IP^7/q0"JX<n-A5nZdH0gr(`sTAQli!se0CJ,EY/,0=3a5q<PKSoe8Nl%HfarS(8LJC9@RgcAf];$7l0jD<Vn#VNH?tE"[_B =7S9e-0 Wc\#MJi,8Ose^;i<EQ`-qA>Id2 8Hs+2AtK5l5ZW^%h8([?A38LIPT`PAshLUs,''dC.6i0j^l.'U%9Z!"YEal*$6s2(N$nM21&T')KNc];JP,K1AZ&HgQ5g0i<H*&1UYcE2%M(".phj%9E3sgKQj'A0lU5i1@4>;@Alof@02jOWXa(mdOktRImheaBTF"+_G9S$6RSn';FoDmm?QeSKHkA7.DfA]b.Fi1k<YM&OA/(pOL3AK&<natm2/qhjT@D""tnT!+S&^eI#74tY_6ASAaIN-fMR[e#7SP1icW5_/MmKZ'2?.S4U&'EmM^qn5K;&+tA:SX.m6K(Ts6jEn4[YNB7,IN44'tVRH4ATc0/cUch;:4RIIZ"t$jRq7"[@mSkpqC,^E0pDC^8`%Phc6@)<+C`dVtPA,j*Kf\QeY"(BYU`%^]5"LpL].bZ5j2&gT_Tp2MB.q%aV$PRl5eH9eon9S[3%+E,,o.Y:,g1C oQe_.tqJH:T,"VL6=WTKB0 \)C>1LBMXk'>K&Al..qA1daLmIQAgD =bl(WW rKQ^kg!0_HL08,_&coL3"L)8Zp(cm;K#J5-)#V*._78W_AR($ZKHP4-:fPm0@/k1!8^[BXSoQD!o:Yrn2"2T^"Jb9s=UDLX5W@Nr@'SmXd'1c'VspfP#7b4@btdUBJN3!^Ye@n\;)Sf#HeATK9mrVQ;='!-::"IJk[^1n2Akm>Gi,e,aIAZ783dI&Ns93`,i)Ml@%l^Z J-sqj"b*a$$9Wj?h)>a6(0a4@^a`NoF>EA2Z"%6<RnnkG*bZpe^^Kmon;e?a9sWl$O1_)AKS0t_c=Ye$TYTM8HHQD<&O>O@'9%.2PaXIDk-MB^h`RTrFG"Ki-]4k,[2kB63/da"r,g)*cH;HC-daTZ_,Bk] W:? ?`,e2`=TCLJ@knRUkoM*i`_Ah9PKTTIatn#:pp0;T_kfn+$c?Mq\S$_^Yj/?fOK^&Q$-94\0iF%'8D/C*3@@Xf<aQ?:f \JKB8lb(1mk/tCA$UK@mZiIL%OMg[6fD5UTM\3KXYTI3hV+%[AheA=3DP j-)h7qo7 0.P;\)p1DE95)r"`@M\&/^lS<Q"NEn>cGZ;K]E*)T%llg]b^SLSt Vrdt4)Q>?k0SQQ6:Xeg@pm0]1>,TnkC s&LKP5n:EHp2")g='d@s)2;-Y(Ud!A-'AE4R dVZL>MT)q4<'9Ymfs*9?Q`d)b2H]Om:]r+Kn`gt"_>:)t7!GA;&6'h'-.\lr'erd(b?#9?9Yk?T%;AXE?=09Y[DSUh4)8HltINi0J#b]Bdt"k,Fb ]NBR2/8_AtKDN06M,(Q*0IVE:pG[%)2l@A`(R$%8frtGF^i!6c*[)*Mc%?+6q[0@Zq=V^]`#/U&BT_'6FD*mS,AHh["]`N(QVo'7Z-f,1_^s&)nG!,A4j53m`k,%Yl0i]A2S<lVjH_)@P*l4Drso-5,1HPtCnP7L<:1-\M>6"DHDUN_,kR.66#dN];A$\_ggOGpVsS"p9]cN)rL#C511GK*j9H(K(0dqSJ]Gdb5A!Gmn+hFB2]jA>'@8iscCUTqIJ@^Sk-GT'pR9<P_Wql2^,(O&'An3Qid<k,/PQA@ 2nUm9,%OOK=?TT 6Ei4 KsKVI[H4t\0 cs+IqfMO)U/PAJc<A>Ahi-0VS=^@dbe%;!On(OYba(j[*dJ>5b16&<;>3DZ2G L0,]6V$0)Q(fK9o6g&439WHT?C/W&Mkc&&&7g2V/Kq"_LqJeGEJA,U%Z`^$eT reZ34p^FaPAKF>]3RJZ_,)>=r\E1 I-K)$b+ -@[&ZT,mc0b;C4A@T3,]Q97>AC% ZHN b"f8D *a(! YCXb+^Q8j4V6+*:<]j+De"ZeR(fL(/@Njn5'&<Um%&YssN+Z@_\K:cBZoh%.pLKn0Ho>JG`?@f.$AL%Ht-:iLUCa*hl17k([ZY\MB kDRh#JS]J.jt@S?LBh0SVG`AN.?!gqAH,4DjnOmK&iG#[P2X"H!fb(35A[cr$HLcY`cp^Sd_7N[]@o2i9,N9Z7:STafZ@E>,"oXL>W""!IsW`n'9%>O9 .]!-O``>qCK02AHnPOA</-Ql`?=`e>YDK:f][ZX;^E.mF-#JpSNM45q;7Npc;JsgQVtD@dnT9n,SN4Z_8V3ML .Bd1brK:0]9[-'!?gqOl^$g9#<IWS_Ftih4UP1S:e3D`&2*KVC=ae#m5qe>he@F/#0AFi44-GFOmX;1Y:ot=40rm%G)rZAp*;A#$]bXcR)FL.ot!/ HGcOY6eboK>T;c`Q@YZ2)E95k0(Q]Qk2mG!lA;3=?"f+s>Z9gOJe:`%EA]IsP^bL%a0'Qns/V/oqN*X\A*SWV1 7H.;U)V,f?6l26J)'r9%S8DHKYBSA'6>d#Y5bHErPHIH)h ; dcmLG9=WNP^dV2+N;./c>/.'Yg,G!Z ^"c6S3H+AJWf =i\^<knMeM?pB_D;qdh5fq^[ ?H-5Rk[OE6XOZJIFDW_bsc$d+(fGb&32K],qn3L,WIrs?9=/*tX*A8)t @$(OZ1=.g'PoJ4$h!jLi$8qjgG&TO*:TJn2(IqcWXjaY@LYbT*Bi#s&.\$^XgkpdF+o3<N%X+6T!WEn.s_Hnb_bo_>@CX$IFJnC(,AkAGfY;jttXd;0K+,#j 74DomGDbk'5OeaYs;*0R0b]$N4L+#f"s?8$`t9;OG%Ya@kQfAANhdLr=qRH:2e"T)/b`Bjg(gD( 6Pc+^[&VdH@`B>"qJ8NAa]8A@t%qd>[l]RHQ]pZp2\In6]5?]l%j`&A)5r2IQM:;Y9rN+PP*lL`ZCP_@tq:r%T?B_$39l r\hehLm38iF,_7?jQ"=.\Hs^+nEs0Jp3[d.3mjc1]OH#`oM#1ikiAL`]8p&>Y>.AKBB4KGA2r%(Z0K1\QW7!X- =.BLhN=d3as/*B^#MY7W>5hH,55H1,tMY9]Cs?H4/6da 2JSJa/t.(Ms+LPPirD0MXP0!NF6 =`!+`A`RfU,&d3Q+lK`,e)6$IcpA]r0mMfncKc[1WetLAXiV7]U0AHB3/"nBr'kYZU_/3:joQ-*(OE.2,@L`K cM;WT3sF>(s3=-i`o!-XdtHROf@RQK</!?qD&n$-jMR,\lSTen a]8`GT_jX!+Ed+Dol3L=!A^&ef',Z]pm1`t'<5J!0UP0BehNE_0Xi@qjBF$#on10Z2cW?JW]EC b?QZVHjIbs>dIh<+\b,GY!d$r.8ho5%KDtFok?`?bP6:T+D?(qj_=htP0r<Do$ Zk8%:.!0QRS9c%co@b$"\dEYhQms7,>*[6B'WEt"m',f^<\`noMW!_e!c3Gq")i?spm/#Yp BAQ2jmc9G "]FA`L@8h<aRV/se"2iUcA<?e).bMNmnQQUR9?bAc5>2aSZ9X!Ym`fKQg%ViTALaF&-3%q/BE(s/%`A7q_lf8DJrfgT,'o_(dKBR7j=o'G2Y6"O`<-OCWTGRV/=f8HPB:d_/tg)@'" DjV?mI%[4fE^MtHE8eeH"h2pS./3#@Rt0%T"-"X'aLPgmk&1WC7^$e,Sq%Zm;%.+=c)2MMg2@k1JfBNFJO20-$D=@abC+kKf5`\-g9L:tl<SI"+ZGIH$\D_`2%jb=\G9#L@"LtTjSP5%t>l4(mq\6X9jH(?dUVK#t>9J]H0?EtAO&:BW_pV(mCX1qoP1&ArT[oU_NWphc14NNs60UO9]gbTH` >n!IH%IO*(FaeHm-ePb(>t<i1$,V*-/DnjWTK50\H\g.:ZCnLI4e[j8&AOd$2N:W(ejK5^9#q3EF8@5Yr#*jIV/T=#n*iDS2at#GX]hrpNYi+d RpXW30Z%":PKTG,4%Oe"tp1(LmY#>'beip%>6(FHP-)+JGN`C>D4ffmfcYsWcmJXBpOVON4``0Q SHQG?@!cW/hoZ ']MH'^0T!5"(i)h]Y\(9FTfJV:4Q&ac[Z*f:,@(pL'T@0:ooO73t*S.S R?@3gc+=bcCM%M[$P:K<;o$J='rX9Sr h(fI^<TnMj6)h +1ph7O_jnp?sn!5OoLBUT(f`ICL0jFGm7LOhSRecX[UU?B3Zjl'K$?,V2Mn?2`[X!4n6Z/1st^F*\G,Y5:SNHYpGcJA(#'RB_$gW5gV-\c2F$I4P/+< [$j=j1o=r#'i#!RgPKn<W>fR\'E/#][^@Y$OZBe;-88NUnS._L,N\$5cs atk#T3A$ffIU;''(A$%rrsBGD;)f.Ar(>3/\BQr\Tp@LX^_71-\)@q"5U+dG\m45Z[RWI,RY]=UE=nSh4\4*(F4K?&Y-XSFAP-irK]<">lYQ-?o.j_N5>#L:^aaA?%Vn8VQ3'@m*sF#2Cr^CNV!f"S_WMCICaMih:_?p]%MLTPB6C3o^&L!<13?gm_qY)o9;2hGRSJoD;Dt-#Yn#e;<1=OL7LD74Srmp5&UAq(t2;"bQ/\5n.@$kZ5VR*<d\hC3%kp^M]JHpV3Q@,QCs$Wn!bo%d&H@!eY\e%pIlAi+J$tPeo4"M5hT/:NVP @nkMY9n  E[Nl^"p6P*R&VU&AOtBA66ohb4\f(9jj\fI0MUm? i%\ZJ-$Ea"W0X,lm>(Pd -Uq%T`9j[S4J@*g14fA-LLted[D.m7f?"#0olA3Q8%m4KIoI("&Ks,.d@5.m%7S.D*M"XSC<iUQRKUHa%e%8LWNS#]I6]](9""8pJL'd'ba\l%9Rcq%n^hZ6'=pF7^rYsoBnGcg_T+MFV<k0-h'*YjT[-#DfD/L`6g<e#;Y,9mb>qp<4M^M?<`Dt9NU^!=UXV*Y7'P=jA.:-^ _hP5oYKAgO/-VA];+43=cTaOg"(G`@$6M-J*C2.jPo9)Z%IOq7K'5",U#XK(WTc:D*s0oSK%(pEl.Do3Qof+P9A"Gs &o-20FR_;G3Ab:KV!q>'JBX,2'^>->L`,,8odNI"\<&PEk%E99kZB'#\R:.bgbgUj5**>=NE ok7F-:0.&DXk1Y_h(3SI4ki"GTe@%(rc=t4>jk#o!@rTC97+bJtVnc^[*tVpW*6NIZC* ;kAf*))ghWh+T`47Y^6h?s<P*0ds(h*"8Cd$ ()W&_95S)U9>t\MZHTgTBZ01;3;TQIMbjC\PA]r0$D8Oj3>n=O ?N\)E e>a@\+AS77?%N1K[qjLVAgob#IUGIFa8lQ%tCBIYXCjf?iH.5]j5+*!k&DsG_E_H+Z"(PJ$+l'PRmA XO>5BpmN(MqiNP*A,@?9Wi44tbi4'0'W55LNmM2AZfU;DGU^l,g-XENS,rh"ZU$E3\=S&DAEm9r;i<FbX]ZVKNDr!`l703Cpq=jl^0;"8CIPp>K^N-]cF?I>n*ZLbA`2<5[7KBDLZlA1r1%ls9R;oNZJ.9R,]eQCnhBnF)bUL&L.?RYSbFONNqAka]OVF*#biD75m(&]@k6d5%dNiCs#NN=e\=^itmKL*UX )q\j=hb'J=.s`QV2hFD1K r(oZ(lmdXR7kK9`j?MN7,ghZ`<YQ,TtB7r7Xa:JYSbiCrXN8\iL a@gA[*!aE-e6pQ3o_ef2&g^Sk7'QH5cs<ae2%L8-`g:t^sG_B+g!92W*DBZ\:@1/47O]Sqk:kORW0F%A^<;W^/A%bkjW \&:kEh#7)=+b\kcCf\=(JII#_JN:=K r<N'^g0a_rc)B'F1B2%1OdkoF; TbAF]18 UK#TW>r0N:_>A Z#kS(V*C Y7bAeYGTpK%;tl6P!>Q1W!SKT\FS8hq4MV*:leK^H;N>pFkI0)F9K7MZ1Jpi8Mp2T\_(sjO!b-Eq2r1:[4%3V%gC)pmecS,cs0GP(/(l?X260AgGL9:&)hbAUX0q7Wl!Vk9$D3.X8#,COLJ^a"B.KbmT.*%eJLl'HM'i81@)>>qfq"HJ4IZ*e[&CF_FgnM]WT%;Y.H2br/ir><arAedo2\$3HdJ9I]8T8jm(88W9HPRp?rG4cs]g(*50e;0ZX?HdU] r.+TAAPXo,3DCZ)VsRB*>G-]="3TJ]/Z9&1i5a_DArr$d6ST?+ 606gF.trN;AQg?2TXfUmfNE0P*Tt&AGpK"*,,]\k':dVcTY:GPXXW=6\cf>C$F@-KJ$B6n2ZR6U tYkl-'1D\A<l=2E9TBINsjp1(&tsc>Z $"%O+e(QUcGiXAO8JtZ8 !K-O]NEbc&R*G)_:D^nfU7p->OA(Td05<Sj/%;M!dn sBZ=NFGQ8*'M#7]@&gG?sZ[j@m>*?\`A#D1&$Z,L7 3Qh9i)b=L737;!*a8$%j?Snd3\tr>gd\5tXUWs$!aB*-67+&l*TL/`G;c:^\L j=pV5:[,pE`tKNIm:"r%`b&^61IJ)$2Af86;=AFkQ'4H<`L/S'X.3[?VXa7@WiOQl'oV?Eg"j;m4Zj@$][-.4Ak+3DqADc8+<9rZ+h/%:6+OQ=4-(^Om*s"6hnAW_3tb=?H5>"f5k$bD]a1ULOWdf7I$/j6YeaFq+5rrJXWkAGL!;Cq.P&KD@IJR1 ah[nI- kM"l5=bj 3O4F%P8s\M4T:#aZB 0"dgA.V3*9L[n s>F+RW35/TO<.5iX!P;X@OVeZC=p&]LO1P!aGRn\!MiYF>n`ORkFbOenKAD!FKg.RNAl2jiE t;,;,i#k]n;SD$c+1b9'j471C!/0I RFm?:h,Ac_Pl8orLp4&A@oUX65JFZ7,;?$ZF$c)!Li9Lh/bLr]gCRKA#U)ZiE>g?jIrAR-d^Jom7ON9Y?^kaokCpR'QhF8M86-4g<TF8\clNT <WI3-Hd(;VkLg\V^AM;>=K?Y',qiqE&3F4,T VU8f`K57\j@!sO(Lbrm$c`GYK%Q$fn0P/,telXc->@[Bn!UB+l')=]A54'PjY3$-4870FO^0+/8_BDHd.2^4.`(/I.dOY98T0NA>)t^h;5*:+KJ-6#@`=B/t@hHR#p^m&k!;4K9B^4FMr &70R(ErANQ^7U 7E123;pZtT+72f69F>4;HDg`kAg<Pp0IBJU1]+cpM9Pl,Ae8X5Fo[Z9[r(hEd(>hLH@: slgm+_4Q@. =qXge<."NP!0A5]frD]s%/;TTUDfZ]*\p\c"HW$=&-#,MA_VE".&+o%3*P+O?E$oE>2o/&R.ce-ST6kE<U.G^PP<pHF?@OXAa&\4'.+%!%4G/?"IYF<@JM+WBRS1$"f;tLdK"c;a@,pAX[bc^p915SX a8,'ksR3:m'k9CE<1ltZ*"]4gmg]`ZFQkF,6CV7(-Q3%:==$$Md>ZG#;,8:E?b<`3QWMa>!X6NOT5CtIc9D9\h&YbD%0WAPh@#3KK;UgB'XOp0SP9/6T"mA`>CaBeebX4eCKBWtOc"'HjS6[.*YMZ5'm'R)_88g?P.cEnRBb+C7q>Q@TVX]a-DfE,;Z4n[0ZV:TGQF4>cc\IeJAlhNJ3`m4A.4;fOtMI]E/1C,<s+n.)bGHMoFpA^BZ/Q[L_@(2ddD2<Z9!Y*K@&_L0N9icXqW:ZK`RPEo2TM-14I&)d%)DJdpF3kFGgP[isS/glO7>%>UrO,spXDX^7pZe/B5@='S7ChLD1DiY]U6"VJ3"pUPJC!`A"2Whb4]c:.]4B3"#O+Z*4*%aJ8BkP+7E/jDcH!naD+iDmS`3QS%OBM>Q'cZAaZ!a#Hh?A(=H%k!;]/:AnH5o&JrV8.sZ%c=S0)oA-lG[4_Y2TT/KW@:^gtt$eq?q]R?)ZEC`Y!^O&/k,I?A3:]<`2:As186Y0PPBfDm34gtctp$8@F;BVd(,4h4[QAY-tH!TA*nY []?mQMIe^R"jrNMqs*?KF$q*00tT.l7t0M9;S>]MOf=]62.RG`arrBH.`(ZP5&3POn%=,aSEW >Cb&Zq51r/^MqQeX!a4U`H2]$$4OhKag8jdpk-JALjcp8M^J7*ga7J0!jTBPa AfR1_1aD"4@CUe9) k#T(*3WG?j2%-m8$3>.A02XQ$(P3>IC7AL:kO$7kJ'pdWi]A-)tlA&3 9dh@ L-!oa0r%7fg4i<\TejfAKt?FVHV9b&3Kc;fmBi`TF9f'\Sqo-J%`F8,;-&i3=B+F+>qWglV;!\T52SeM0X^D7nYjm<@1i4]j/X2Sj[L[5-8]r*^h2_Ega6##!<mVqc*E,g_RkN%ZjAJ(i]4:n4A>9Jpr`a%>+1RDg/9"G"@><RfJPUaE5^jsW+ds'QIDSaiYPc@mn><97=!nW>cg,r=HP2j:8Z%bM,3)&^R+=dqhRmLgL*p%Qd4cDnTJA_\kT@E=_^t<3 TbBON/N4p+ohs=)8d0AT&[[GU6rQ)U=@AS3!O.:ae%$^a:eF$E-B*)NC+I]RMb(OP:DcGh$/kmKC^Fa*(aQUa%<m.*8<;Rj3r:,t5e:\ghMEa-c)o DZ\fsc\/#Ue/Q pO]j?A=BILDDJ,]>aIhe@fTj`SO3p2hf^cXp],Pr+?^N?qi7.+PdZ.Mc7gKP".^,^M^>)Tkg,15F*OZebWqLVtmjP_'tX "dJgUs^=('a99?t%3is^Xc=b?$+R.TVfX7LQ_4ZsSs* V<E%#6d69WI>:bQRrr<="DSFR;h[*=Aj4j:3:3:&n$LA'="tGLIqr>Ho4k0[/k;$_abW0=ne4`NlXo1!VN.sA'5'eZ&;%9kq)#s!IAfo(KD+?ds*nYSVcOrhn%PFM%hQ*Zh&ArDNHq3p7TS&Ans>Z:;<OeJeGf+HmI69$,)(e_-TEbl$-,>@:a3:8-T#rQfUdad/nX&B/1%4SK\2H[]k(42sTnPa-om6ofNB52NMl('Wf\R;G!h^WjmtRS%`R's ?A^KUf<>E)aHs)mUo/U_-,1A(MS]C,0,3Hkk6QKWYOCBhMp"o.T/mi]3Xd8e9%296>X3>Kd):Fr41"T::Fg&<ht[WAFrshW4"bL+TmSsj."XRSW9gV:hBk&/'c.K_&G8tf.$o(W^'EjdR=m>k#S'JBX4p`d+5[V'T!rHTV!fbSRST$kr8^*s_4,n_HRXCOUb:Qh<:f.^A*6T@nb!eiPa$77Q;:-2lE=FC9"Qg<9>8API'1:-B=\_X=)8'UrRg<?mj%fRb7aE/'Q_TmNBEdX"G)KE3&(4C:]_$c (\83qc]!V\j`(B:]3LfAD!nq(0"YfM$i'(l:4tWSane@,_9V<1Ld">U"'4>V7Jr9k+lPGT*tZ((i.OfYj_N\PPQHXA23G5pC6NgFAYJs0#+'Ha`1hVf/>td- ]8T[c:qm^IkKp1*!c1)m1lYmKj@V"GcI?^ss;ZJAk%SnNfbPPI^>t:Bh-BaWK.l>W!ChHrtKEZ>ee_\MC^\C6]<:C$]Aa=PnMq(l%LsV`b&A/?iCoX;<jamM-"`(.*&;8'Ub0pM6Nc.Ua_F)ic9FIE,,1F1X-Fha"i#'@kO9P"X[I!oAXIDj)Z5Y0?T]PBb?HhAWgon;\ep1P]kO70_:C-6@%`)9N&2iF"Y>oXsj2Eh-NEX_'"$p`1SsA+Y;@/U3R"4TmTtRS1PX2-N(p(tE%E[!f54H X:=RX]04.tMH>kd"_qmXao4"PhQN [)2E3X5^KFGUs^*6nbXPPB>`*m_X"bPRr_j09<9&MUXsHee&m=pR[d4; GIhr<dM2n_H.@0eemZa*)amJ-tf7fY#ce/^ZiMOYQaI9q4`fHd\5ANs_,qsG<#`+l";l<1B*<"AC*SiJ`ljgt#T*_GXk)&(5FTY9`XLZ`p:h_hYhH-2YaIl A_fN+aBekG<`,nXK.9Z_WB!A&.7SjG`9@,`A7^d`9p'eFU8[H!9eHk;$#Vc1Fm&!DegN(W^FY4k(.mL;sFAZ4n%50%5SQgto935ehGtr=8@&e*W7Xb:2@ZZ!rV*34+YSMDFf8=>[^A-m5:MN 0BfKb"V.72m`$R[rbZAk)o r%KqQXP;kG6AS9oUk`rt#i\T4@'EhXWqDk)s2%VVKYrf]>lZf;4CrH&LMT-4_(AX"amL?UeerlB<NofC!2m4A5It^qM2.Obr7FQX ahmRtsr[gh[ c=knp)htn]=!B(q>:f&+"ko?:K e4m2!=LI55i;jg,-;NXPU3gAhbO_7Ga$,1FG<)lKK27]2468]I9NKi>c"&B4E%Ga!qWcc>A0Rl\EtN!dkfkBM@.+dS^`+nEAiaE jP^7"k5do[g*R"eZ!NM1_oeq+?E95+SRZbZW#mq/-p#jL65sA[TfB+V_+8YpG%CjS/R=eX]F@hf-H8cARJP-s2/A'A[s%+% _d_roE_7!J] qm>F1&7,=@0c%0o6NGP%BA*Fc9@jmKL_"Y9PSG"'FJs#Ki+T'cSb2 8ZA?:kYUQ[UTY_Cl)%9.'YjB c%[-c0/h!S>fOFV`7pFcXEo$/.k^JA:XAPqg@\ ?tl A(;C,llcO%HbKGJiM7);(PK#*6"df'QK@7>%_ils n(J=\(=2mLPK4#@.k_RRKX8qAeoR%-'4(#cF!Aa9^kiF8gInAM@1J#cHN)D]eUSh%.U=4K#<:R;]ApDS!N/UAA[@KPPQG?j'-5HoMK"a"P+=6E\#a)\/'$XH:f9AK6lAPk=HH6)&a=,[<c_('E$,f5CL2kVGUYD<;/V_l>L\[00iK8Jbgj-lqA2jX#fp^Vn+D"'fWg%pGM0L;eLW-]]k5a/fhh,#7`75hhR/a*L0;3pQ7P8$+le8YQ0$lGoObrc=N@fA`_m`^S-C-:e"!/GZ@"g2;(+*7AJ*K8E''4_Bh(K0;,)3, g't>enZq/"VbTGnJ.r`9Z<eViH-Y91GeV^n0VmM 5,NL -ZHCAEAilhWW9W\e])(#r:W<A.4rh6kgMj`9cI<@lp')TmB*Q% `L8%^!bc&W#@#*-iT5</f?nmFWLVAciR"Zd44T'E12K2J\$5*LSUoP-ch9PbP;1 X@=4>m\P@MV2Pg6b82'$X5%C*ccs,o8>G'2Vnmrf%7- Y<^>TL#be(V*ALae<3r30r\^=a#^o!OA"@F9=CAgO^nUC+*_%b:VZ<0ka>XB#,t;4]S'Lf[3j)7,Yl=TrK KmJ1@%QebB.J7 ^F=g)"QP,LH>45bAF*l @Jh<g4+[7M.G1SPE/nTA6PfmA'GWU?XXkL0)pMo5Z<Ap=Oc@`A;5:)^_M`#"gi=@sN2o(:L&6<=)iLhrp1[E_=1=tf^-Mm^?>!ObUpj;;eH](mN#gAiYNW5VrcfCc6GV*aGnPh'S@0@0;K\it@r`lsn`hWXa!mQ"Km gtp-:^;>O-4kHE`*MrSq)F^0RI<8mBbo$=0e%;)YT&2+?(!jjaT=2Qh+nr=#078':9DA9m7 jH3gh5YM\]XBls%gibpM;bm(T)ResJ$LGs;W`!GNs7R387UL3@CoMX^,BaUT-Xaj'6$,30i/VlT08Ftl^R M>`ltK`/?.N,MLGN]?T:<Hl):)U/dG@X<UYae!:lB`4X3S'U:4]ZUDYK\aFQh0jH)1fj>:Ap'k16(AM-KPd3]KQ%/=eGFLi`UUr\:?>A+JMa=C^?&(5GchU!AG]GlO<`(qinQg/2t7;E[Q4>8^(A[>$MNj4=/K;S53Kj1_[(7%aL$.t^XltDja#<0,.#b0lYG%$9SAALMIcSoa7Gl:`G#W)4\mH5"MH+WL7FF0EtR6K'.^0Qbbb6pkdB<bC87nI-"1?QKmA>>]6/Fk#`MPG5BC,V6BfQA`gpEEs(*M?rl>-RI"'b=jEAtl9J5Fhr,BS?EN5#83F<").-s^i<G(pF/=BbrD.o;hgGmbSC"0Yog9B8i,??ddI#/FD(WZkI^?(G6,$2[nE?QF+THAUsc*SRE2QaA;Z&'d5QFW/F/K*HB]%VeNK6_'XQ>">GXVQC] 0cAL$p01/sK\ !gR23"/_nA g5\"'Q,(<?VG_`@;k5$6-Zd/'99ilnA6nrN=!O$]X>mW@hMd`<n09-A?-?HTmGjP`trdSt`>;-S^A\d_d=PP2AP'VC48n=&[(jA\Y0DRiID>6$hAN@ M9=;=Do7=MipjH\DMefN/7Yt/h/e]AZr'6XQhPVL5b/.?Y;S6h-cMK`-Znal'^>.E>BSW"<*!)h]TgMVSBeV<-0X&olt*fk^3T1otA@N>Gb,Hm*"MY/%e5[j6g5PFUo+.qO$i_1=s8mf]I4dRSW:4da'CG%"H@m$<_cC>*#@V\k<CUit>TW6+6i1&Fqa5Kmd0LQH7[EV``MZnlDDoTjQfU[eXQ3RN=SF+pVc5o1Q:EH4gojn2$Eo&Mf3D._j(`fcM;'gQI>6Ec&qO%55jKt^'5AF=]$a".(A_Q(p_KhMeD<f;/Mm;s4kmsXN\Jk"h["%DKX5g'N=k$,IkK+B)`c[VUrmUM C%$82XHqG& f]D'"T#<8qch#mNZ%"JB@r-((;!HJ!YBjZs29?0g[;U+WUn`LE^r1YY& /?U7i _.(>(mJ2H<pKn=kDM]_Ya\lY8.cH,5<V^6]b[&+tp_Tgn!+MZY,]EEo(k%(gX 1\bV*,U.&>)=gm$L"`ED1hb.FY`kR2>FcS6Wl4(7*=F9l,4`TKEB=(5Rr5<A5?;KC2Dd\]K!rY1)jtA3<$T)!N#;g\fh%.BisR3AhUHfpO52X(t3fMthhYd,br9O[E<EF*I?U/)T/Aj\"/dC2BQl;3XW+k(Xs]N1be',?T c=XCf s`09F2&Rh)*.4bm+-&-GiNnn+e&ed9X=jC`MSA3j<5_ec?Hd)!cP=f/9`]B@9c)N`imVYZe(pT`4/3Q))UG4%t$&+n(F>"P ?h4$f.@p"gQO[C>n(gPR&l>gU/I;.PU1dF4DO?%^m?AM,aUCGaP@8_>ABJ>/jW)m4,'jUWTFga=LA9A6GnIr[*r9NDRPd,8\S%JV:b?8J"Af8(tf*6LS3^`_sh86/FZD0h'.OXjmoOOipn_5@6EhHgg3Em/k9Z>C< <tl#0:CQi:)8Ld&@XA6LfKJ%E,Y19X>jP;[EN4iLRPa$\="`RLH/7NS?OA /kCX/:Kl6A[qZUrl]dgBfYB^WjFj[Ho&`9:s8a8ik/ ]d-=[6F[*>30 )c0"JQ&!n1pde8*2Ug?0"E>S_1+lL,eV_>16D%8iWW%?^\cbN<Jne<a8:oZ97nO>C?hQ/mNla l;fbt_!NqG!!2rO\=pH  fs`.=XdqGr!AA)H7H0lsAhj;O[I*F^[T"Nj <,8'1F?U\': ;JB=E @L0B&&4E>k^=oC;<jBb9-A5 >(ARWB>RM<J#Kj#"_X?por7Gb@D#hlmUmllT?E%3CJ:6-/$&[j &rc:1%_aM'DTZ;LE&qR6\sr5s2^1.q&hJn#D7?S4rHR,^p9hGbKr*Ga=!QbN;1_7V&ht[PsU1:o?2R9\-emDL,0PR4t?,bH8Btb62>E.iU,nrF G_U-IM!MjZC:5h4?tfT_GFe??DS07>U0RJ(r6&RtPR]GSi ` L!aebX\<#;-L<Z<"_-%tq^sN9]7koQ!c+qT]j* /8l2msVpt:3`q8n+JB9"f*:?YY`1EOO+sFVA:YWaZ.'67e#nMk!mQ;@Q^iV1Rg1nf:N<clPqrQg?/jVTFkQH^1lc/CI`2?5gL16R]b!hna0V"'*EQB#F0$9pX &jS_^E=8can_`DZrl)0J*okpR8j,n1fD="W]4e:?UT33oBSQjO"ga*kO]+dB2=N0#mBRY.%`GR@!?$k4D'6knbs$@4rHKRU2aI6<@O]D$rWEh Z?Z1[3j`g'jH@FR=5S3`.,ejFG!aoIm*?*FYnYs@j/VB_r\h:K)Q'0cRi?JOFtL$("ol[+0E*YMF1_G$E#9QCSP;@*:P8m.'r7O[+EB<MkS>9ZbAR3f\cs0aXj=/I(57(P27:)?i,%[9WC##2I@l/MNB Tq4g^@PX"f1R3`)c(G?AWG9]UUE\G9&s&05dOAJt"nmF7I0rTe\U"eUm;H&]Nb*J ;k2?fLYAetX7.FH;qhPO34e;dq?_6 4W\pQ[-b0]q]f@8rSkAhb,[0)N3t\CM$%I]T@J&1McJ*QQbK_%:tH`2AAGo/nAN_Jms5N<P>f2Y0Qs3k`<9p5Lm<R47O)^$EMj`B=WXIIe"U^qU[83`ACkidXHs?Ci=(Hj,5jl(NM$lXD7W-P\ /"I&J9AEo$!,;YndRW.Qp ]:YCk+RAL_&p4]Mc-?_k^6 Y^`gYe_3S4*q/pq>/C1[N#OGK?42e(7Zg>J%"jT<J7YQ)$f$5f)^!8-1P.cc1E,Jk*"?TQF4HV"i?%aEc/aFk"*.s]^?)]tbC)`iI]R%s")1\j<0Nd)%SanE`(p5QNlg)B#eZ$pSs(GYmJNU-R%Id8W0_.M9dWC!8JE8crR7*U]e&ZTfQs+O4]?p&il6)qA[?G=6iHd;DAm"K&9V!QEJ(/JZp+1G]lX *rla-K#Ji@B1UnaPs/#Fa19 _["Y0K>"LE]pJ&fMAA,Up+Jogd#?A+HI[8m75=C5/g.SpQC3bkVMlA-ne\9Z%^Mb:G_*P>s9*?l'NU_OTLIQ3lgp$`T-AhF?Q8W,]t;j?m^1"C0%L`]9l`WA%A?AEhEqagE]l*c6;AK7HBsZ!O ]!BSebksPB,p7T@Q>5CIsRh[:1Z-*(g,s\I8o;ZFbE[R)QO>&.1fXW;XUG#7,ibDMQh$QA#,cO\pa&G]c*"2!rZ//k<WVRCk)t,9Z1e((-;5r)Spe _"#Af?#9+!X#q0OF-%C;qZ1tB=0LioQ+&W6I.tJH^[]<jUOh(PK$ql=dNAt-Bl<-e=oYcQXi[l4sC4Q,lF`,@)*9&2EpD""Um hh$b9qFYURhlre\2&eYe)LH%F#1$j3d84^!ImdBA%/ccf/<#Y4&eGs\\d9PD%_9gdJ>0Z':#"mt&!)[(./8VSA\X8%teD@itpI6 8lQ/1^_]a cKtH6o%*C=AOC*G+Zh,7K,);9iVc?bm:VAHT?/_*U\mAfAm)oGOA2q!6!QJi4"`hsjR36p4K+LA'pt[J;1tEZTs!h\V>G<,pVpA0B0"D&ckk,QCRX]K2]*BU>8![4U:o7K#F3$H4mI"t?r=%3rj7_I._+CBYa]V_"% n%9cN\)+FH2^cl3mE\=`)OLeEKs0AFIFBlGtd> kT`s4Ql9A@m54)'DpL5J:Qc3:gK/`>1AfWHcA(+6e>P&]9'/<Kib&\h2Cmrh4sA<;&Uk!G'..MVl`DB.808ZiPk_Rab@HcYoJ&Y:or\gXkDl(9d)UA?0%R31"V`qX*?OH$N\KkYGrBU*b.2#lGYRK)g!B(-U3WeS#EM50 aI<XiG4*p6<ANTG4,d2U6'l@ScS-e_%Rq#Yt!T3% @4b0\pE"X37N<FO4ONP[C=$C8RO%%nR]Pcsj!AX>0U`(NpFd)A$MIFPM'ansaARG*TH$dHp@@j$&T+]A75M7)+gbBDI]ACmr"E8kDqA$JqXpEtH3Va?QOY&!A_=/=7p.&c<pLfKgIMNg3L.$i$Q9V68Z6Z&S(P/CDEr^Z)*7jUrk<LU+EVqNG"KJP ^A*bI:4PW<bkBF_dg:#4,I"E@9#Xbn7piL8-[T?GmW/9MSI6/^OZ7h>G5_K8Z?+H$rdV5p?3ATY+.ea+k[8-Q;]!V2\AAc5g24:,^MW?hc= 7tAeqM='\hjSp.?p:O2BF8$TkH>#=6:Ddd9,RDqm61SIQ(+_d4">YB9et:P[4s>6>ZYeL*E415.\=PJ;eWJ+kJ3':`s^H,<t<=gRp$DiS\A$"?*i:3\r/'^b@Aa9%"BY6p1:AMj(EO\0BjrmJg[U$637drO:=m\U/Q+_G \Y@nV]Dth+<[& d`[<5;,Omfo"D*]USf&R[q_bW#W2Gpp3/!AtbL8J5)Mo(7MjTB-<e,git^8m;oA$1/SkGI$#I8ss+1OFKglHp#"FS9Kt/cUq^r?7sA$9/jZZdT0lR*']D#@1=/&k-ASk\mm*bSL\"@PW+M@'gt5qs_@?HW/V%%D=T=bO9OR9aT#*_D4h;5fgGY6&t-sD^]sne/9d0j7+[YIgA4kDUBXM0\C0jC&:Mml'<6h%UA8"2^mCsPWWPn/=jqpX,HK,4Nnq7lHNUeg;bZ^q&"8CV):pf\\tRh;7qa;dh'46Mr7hSJ1.6d/`_9`CrBL;N]Q8QAWk@"\'R8EtF(W)$D:]:h*t)lcXBY#8"M/8'\g9ARNM sA2L-\8JAkAtAYji8Y^7SHNg@aJ]ZqlN'sBa(ANIilhM=sc+2YDZ[q`Ab`08Qbe9C)Fh6V&aD.PWs$hAK4!'I-k'Nc:jAEaEUsU:nPC9t08=Z(9MDJ:`1oG+>/7:iY1=Ek5UK^8<jN\t`-R,ZAb+q(L9f_Q^H2&k-;iB'\:'BV7'TkL9]Zl %)E5s(J\>CnXV[@^ dEACT^^;0^H\GUFTa@oRb-LEcKo33\Zl]0*`lWW4:"SbaDkO5)"+3X_,_!J5c*Qfb%X#Va^6oV_/V^[%IVlYI>r)@,*D%dY;U+B[`\L&J/XBhMg9CrTl7FrJBJ_$sE**8i2ae:E68aGQVX+Om^q\GM6q2F[m[[B6'h"lQ<H>.Xejf,5`H%[Rh Dhg59IPkQg[@UG6l->.YJ0PchkF.jU69ia*L]NBA^MLliPJO*UI&AZNDf%qX?5UXW_1:AOFkC$I$Q6/"RMZ?' K;#b[7IZA:;)'mn9oAc'1"'QM?#!IfT!tq+<\A-51sS^s97deem-.JT]q)7S`(N]6,,j#8G8TCC/M6'tjhLIs!N?7k`F5jsXQ/^YV<1l,#![c`mT6F',B4 ZRb:=m>!<Ff\LnA)'-&4sjK+;;JK:5.,Ip^,PT<?o#,AO'":.q!<kZ_mq0BbmgNr\6&C%P=n?A&EQ;MEH6E O5]A5H5n0M3,T.@Ll]rPZbq]1$mn7MAmLXT!4Rch^Le%G.3WU5dg>Fq;jfLX:;9%tQI]&NDA7U1a8k=)"AY5I-tPH#$tCOEC,->'se."W%R"\hAiVcnMr[[;,RP8#+g;.1TYIEK`&NRt^MoF7f+?>8`k 4Vckq,7.AJ*%U5nZ&1<8B6d 7U#aK^NeRQbBDWDhSD!?q ;AH0#[b/M$0Stjd?p[*rM-PR8I=rT,U(/E;g<I6:)F?N <hCd9BGX,6FA;?GZ Uq M^/2k%iW"FjJ4@\ja`g-2a)H3f`#ZSN) O?9Fccj(3TXS%O'+D1a+TAj_=cd+K6jH38)?cZ[Ftg?<Zn20RQ+*a=L 0PDJ_HZiDR8imqX>P/\@Q$ZO.ec:)bfK^189OANN'iYO=PEe!99Gek=2BAq\ctHAfK"A9B/Qr#"=YSY$N$;OE"Q*Hs<;N_OkJ>U:(BSS[NALge&RO5^]XqCJqGoq5MX)b,eBV,6i]Q)a.GcMpK#E8ZEALQj`VT"nA_VCjINfki8V1#KOMYVs@6*$nt". s^KA<ENce=1.Y,aC8!oMU`,It+ch!r7iNEiFC)pe3,0tVBWbD7q63]Q,TI,-K;\t!]g%:_i\o#_a`<.2Kl.e3+*\@;]AQ[jq,]d-Xdf\Wa[I9Hd\?g6*6m4aJZ: _UII lHOY3%+b&_I]6[%q1Z%daj&^Hcr1Y-mE<X1`& $R!NYjt.CdZXi=fra:MJpSRU;B`LA*\Gp=cA*]cGp^=JS/cUe2'b`-B/i"/cZlC^PmB^d4Df`ID7XmAN@M#%BWJ9[k3-^c+,n.PW.m )OnT*Z7WjTb'q7sJ4*/F!qA7A%:([<nWsR&%4_tFJ<ikBJ%&')Qnb`I/TMD%*+M;eB(`!N?<]6X>(4B-A%>H]`[Z732#CRNFEZX0*XmWcr`V$/#DNc(a. N 9NY&-i!D&]ET:/pB1<o,#!UY+<9jFkq'-Ma"JR]L!HY["<Z8#W*ot*WQ XW`t8''`$9VT>AFsBQZ<s67ITFhYE`m2H1V_V5Pf:IM5o;=8Zf=U,:r:`tU4p'MA?QRnZM"nPj,24).Pf'Y1;3jicjP#9ehm!MiGGbHVajc1A[Y<i8=/+8?WVJ#l/KG:7H*PoXN/BI=S:!U?6_ob,A$tmQ=6to_GX@?7P'JdKBB&CO9V(Bq4<ZL/'d_J+"#CW'b@>0>.U!7f4pAn_rgO8VDWY7ThT)H&3C5:T%@AqIK50Bn2:f' oG]8^$Q7VQ^N=TQPrEm)^IIbDB\oA;AXk&F<Ic7^kj(UaT0E5NX_A!iEYb1'?[TJ=Z`9^!+=Kb)TSIZ`fab>;*rPl=CM6-5fB(ZJ>#l[+(=0[HXjC='iaOHfO"^BFjN7YB'o[,p:Ei%HM7&kZp9"403BHU#?GPN m+r\2j`,T*XL-*d<n/5gnN0).DnQo#ceG,s,6[J@R\1:!d?$=TYKjW;j`Sf0 BX(D\!F e:$U09;k['6d=R HCZ5s8)JHc!3SDSUc5ABSBO6QRQ#:enFr2*jXoc[Zn=H"%Aa,M1+LE"S:4TL(5EV==C_j$pj$`+b6i2+sX12'-qo&K]!^.^US"Y R[t#3r8Wm0g^WndCcle.:6e-2t4=jZ-eKS&CKsU?]@a5U/9W> LabS7 Ke. AtPe+9h5A:rBbLDU&MYk,Qg.V;l30V@jM(ZsZ1.Ic2A[oYE/Hl`8'1s.AOC$* 0q(^1At6LA.7Pb1*'ElHDN"CZknM&pK@+MG;2r8SCWF3g'YRb"!CcY!+$rc]Fs3W,jO'dFE_7Bs;W2`SK&qLYo=?N<A%<VD!nAo[Hj?bAf_A*Af*PpIfE4Qo*9RH)RKTI-gdD6/Rl:G&gGG.\t"DeGGm`.7oJ?#?3>8q8<`CE$>p0h0pk&E8!17`N7?XmSEZ4jA[5]&99$PaNUH(-biCJc.IGrEP*0"Y;J%/Vm*A`mmT2KN)iS%BG 64Qk?@P/a-Oa6f5@0W4*I>"eM`q>X)_-L[\mmm9Zqbd+#rYi&%@\doT:s^nMTa5]].d?< _,r"D(E5HYdk4GdYYbN]h%QZDi7]oc+l&b`Ld>o;]40]V"V.FtPF`(E`nE.]c)=NfAN0<&+cRhi?>[e1/i9m4=RM&<;GW:VYO,$8gb.M;4>_7<+DM+.9/C_[F`DC8iQ<qL#7+sVV[kt$mTKXCNYK5pb'LL)n?r09Ch".]j:A^"=sFOcNA*;d<`K<j,CQpXHLqTUS+?SC(A (CHbJdIl71 -L2)JSJ]8)`*)jZD2apUJAgS@CqF10K=A"d'k^=BYU_rR8DR_H+Q8R`8:I6AD &F@V$ZZMY'KSldU4F[%lL7BagH 1`\,A:BnAMsJq:,Xb9I&Ls #GR":fPSG6)gmj@BU&amZh6Z\q'(]aPDq>@p;:ji-n94iBF-D8o'pO%9%ANb>4($nEgT@k2bGKXUNp=V"Y!ZKfPr3BjT&cOLLA!/Ne`o^+W02Hl3J]_9q)AEqE)MdYf;1tQoA#N`jb"*A2FiY!-E#Y(OArJI+8?#$?Jre6gmP=R#bc>m"/[U0N+l# k.5IN%FrnJ`qIerjU(:D/\ZF5l4`3qYppHj?q9A9M rVrM5M!ng9>Z .$^2Fs Y:tr/AgR_]^6^FRi+8#kss[PBAcW#KGe@m8?PVRq1A#nkFNiT`_QfJtM'M-sBDdDS*D9b57SBX/e4hR+b45<5<+X6i22k3LP`.X1:gOVH>#m<k5'Y2g0010lM%"Cb=]CV70mEA@qCE'ImY:.$JEn=pn`m@CsI8K<KVp 80GVqkLeCNeBE[>jAcq-jU&f$30$II3Jpl76qKf42O7t,s_%NRVQhmQ2Zfh/?bX!S+f6:A2O1OLM4-o+KJrA1d>2B*\F<Jgh24C4*b8P&)[aIZWCo5,%<W)T>@o2g25^LYfP>r,!gB.DbCs>dfAn?p:LZ2V2o+&$XaGhB&MBZhZUH)oXgD6:pn*(0j6K=rH;6??\Qn7Qd-XmqlA.$YE]`54cOA3(["9-*\#t&jd,6eaDA6"D,\2D8"mCM9$S*!YB8A! \<1P9MVXgVjp$V*ELGEY*>2%EXTrDO]^.9m:mmh^nV#,o5)$2.!["@N5PF`:(ljL[^ES^"1V5g,*%\UfYJAlssgLlT-+b%kqJ hifHU<e(8nVIaH1Je4MZh,Ie5lhm7Q=3PcX`q3395hmU;X<<f5An^TseI[C4bZ@g(!a!dcBl<d!+,-2[i*Obo4Xk2b_]sg\">KKTc1`hB&3@Xf/Sj;((5HM%j hd-i>k\4(d\@8t1gY!Q2SF>t*O&Z[?QYdo<mNp.om6&rT>I_K%NG3"-dLTco&-,A\LY9s8SX(K_S86Q[I E0*;!HU-)Nr* d1Dhll_G_O[c6^"3U_6^`O#]8.6lF[1AZ=8&lF-TSp9N^9Cm'rR_dfblH%KZlFl!Q1ZM]`oBi*YA>"dJSO2AU[5/R+`-QI+cl(08btkfVY^$)TL'7W`#,[*Xg%.=sgDW:D-$!97NarD.k"Ya@XWOA:Bjb<B%6I4p7cb6q(*D]0+\Fk%g-2Jfif1pkcs(!ahc.+EQE_e"?=H<`[Tk<ts^=K4bX;5lMB.D%jIGc6AHBc\gUP#:f!89g-%ato` h>TT;Ne>bo=?cSkQ/ n^lSUMn6k^+;@]n`0&"V9tqlOi>9ZCjNr#bof6(12\^@fEqP?F3U!W;6D%WUd[>.SQN@,*j:g;g.hL==7YMI4$[g\8 cW<.:8gQgI$n$=+kT F 0`"e+-mp9Nk52!"srFN-hh9ft2 =[q7YDdknBcb(_??0o] K\+35LFQ+SKUl*f^8G`b1 R4NKb\4Rfj4HN8V7>"Fp-9t`<R*H-*O^2QTEh6ScZ#o<!/D`C>B AnS(7Y/40ohoYI`+!Q[2(s5aSOOQ;0gA5-M_SEF=0O/4FE\!C")m:SC"]@^6=%6,BPGNM2mc'Qf\8<=.sKAM)Cqp="[(7`U(QL*+JjMnVo-d-J"'0,gWsff6[3/<;=j@^Sp? 47p3P<&HU;2G0;G[QhJV.(m8Bi!DA&GXQdZ4>kr9$Q?+%4ho=WMFE&B4Q5=AT6Yr9%?[4]&6<elV0,,p<?H]f5MQ+gkTIDhq$^5PnMgb>[GMo.1o(gj#>W>]m6g:`_DC`B3!kD\-/FO_5/iI+5Ls[p2A_b,8g_aXt^g7ST!"U\<kJ1CS.c*XUDphPBonh4>a&AfN=UF CG^X7I^5/VL&T7pD]A:E0PQg;0R\Hg m&jW:= ;tQ.A6=F=<D-A\V-6Q$\17LMJ6mi<Zb_3btq%QOR>%:02SI"9 ^EZg11\e0=2eF^/ZSZ#h&bje9%.H4q@'p4*YrB4+ .ZbA-CdN\30^(JNk6cKJ\Y"EKH+STS;Z:UVSA1mtd M<Dk@:T<%flQ.\I:2He=A[p'I"?tSSO9.*ded%I]>Xd>*hfa'(A]?p3'?ZNC4p82 fn*eZLC8Kp:)0@mIj2)";9SeqtBB^+42=Nd3Gr^Vns3<-"+WF%7$ge94WS"+%[;^#8Ug%R&spIBgUX/HJ(^K@BJTeFYGI:jdSNX1Qo&a.OgOt70s])D ?S`\<#-[S[W"aQkA0m,FaN+4:_%F +m)a%BHkXB@Y61/0 YsS2>.NlnYZm3&n:rQEVZ'h<4^/M[@$qaXM#X(O7j/_iekr,*7M#><$o:f-3D:mUO2gTK82A5,a.IP&ScI+tIdM$)E%T]WnEooPL&$JqoPY fb^D^&.?\.c:_tm0AE+MB_B.'pnltbInSb[.o8!2)I(XA3_+a?#DA4o[k7]2%,B]I['0eoZ]t,,sXd?D+AGN@-9c/2Q9'p(e:,hh=5JZjZMg6\_.n$#mr9f[-A^kY%@s(@Z [8m24'C!,q)=9*Wk$,,,W:#\?HmrlG];sRATTY!29P`MR3B0Di&b+_h_,jrA0:E54>js>bs%8).Al9_(?6Zn)JLa]S9JIApaomLeo0$sDEe0V0,WVe(WR>Gb5#^J$n+7_c=V$:l([4G*eX=2b3pJ<*j.l<gA2kc.Ai-#A8?.A'\cSZ#&WbG+-l\qPg8m#@CT(dLiHD?P?ONMt8G/P W.V'J:$J/B-4MOL<_eq]r9(/05Pbrmg*,X[KX!\U$600]RTq0Lc8!"f*h7C?[l_q)b2>='>A5OhP\;D1nY%91q)!>*^J0G&1&k#*3Spm^]3r.rHZEki),`@4CI,2>mJ"QXYP&k^nI4K8:G/2Lc!36TC$%:0 AAgP_D']j.)sQ =80_XNqYt?E<K:e`]L6im%"8O6,*RkW?F`U?1(9?'smBAW=5mE( &AA5*V+>#S59#CR`B]rG';Q#tj^LJi'SQ&od9WnN]CrNf&h?n1lMD[nHA>3FV%=J<e8,IY1SfB59^%qcqe`]#@>rh\kj'$&$"YrQ0k$2I:8#.!07cL1#Y8a)K[r:eAXSOJK/aW8WAd8Xd>hWLfrDk_BPN XW4<D/F]R5:Bo2A[X<$(Bf>4E]h:#ai*4)k%*638_nj^;grgpV&H%"4Wti8lG"J@>J+M)#hdtZ0E7<SZ6BWe.^G7Q#mm&l/l2Xm^6F2I2C#<i!pg @Jt+XbXj*l%_h<sT]fm-RTM.Q!%(pI`[5ZV%bbR))5"h!"eMJKRsjYb=T8Al^1ZXioWg]H4_b"-!ttnZWtS@(\%TB:1->^?7`Pac<lPq9!%&5d=LNtAi+qAVt 5?n!g0GgmAtS7Z4Id:g1 AG3("<s8R&i1e_gge1HNEl<_qM_LZNA4L8t2ssC?''$i"QMgQk?Fa><D!0+<).r7Gfm\A%>X48dPYEk<#TPH)$_Q#,d8qi`IA$!ZmYB/rXIS];mFSI6VUAr`om't&oa2g`th1F]?4\G,o%>t3b:4UgqbtAqHbS$#cD8I8k([]Me3Gm@)Fq\H"$V(s1h?>_^Vc;a9]kg+5\)^+MjVj07]=JY6mlk9qZ_:g+Jre%+T fQ.cJ9TK%YG,71(:kV74(Yir%i$,`g#?sM2Q1a<]VZ07FX/A=qb[?1KH!\nSq:kLTXVBmW?WY"c])sTX<\6rGL3FiRU3.sB<60=/,h's3N=>qs5Jit;O?nEam,7757l=6LA-.mGbk3:q]=#oC8S_$c>mGLEio1K^'/h1.=9pBB!9a(-&VgPglM A8c14j1O/'8M\M3UoBUccC8roZbLOep$ND=bjQ(2%.1C"M$L?m$3W\n6K4&7S!g !4,`pEJ4F5jAY$E),dU&jUiiC4><&!rs<)#?JoWcc6IY0qtb9%NF\/p89FWK>WH.Jq&HTdgddl3*T%N]0p !;"2GWLf[O9KWhs(h@Ac[oj5t@$P2M.:A>PfFi;3*Pq?%MX0Lt)hL<j&a/9A3(!>h5 N?D!si%hn_Btp2Qagn>T\hU4gbMiqO1.'gaJ"ioTbn_T+M%hgGPmU$<0Q*4rnt3bqR3)d3kTnN0m\;a^W<#@MtdscIR'HZjl)01*Zae(Viob5FC?O[#UKK^Z']$CjtT8B[O/<Y%6KG-/g6QBZGBd`;;.S;b7s#>p)h4Jm`k=2c*B=R$6EX*8I*[jgd,>)sp:AT\fAZL?G7!fBimJ6+:O(j/4o+CX A")c4B:8=Qk1V-WJ.kDOYK8th[#Rmk&=f4c_f-R#K*?U9%,pNKDeL+SHmbcL(6]Ti<S4;i5NKcJ2&lm$C%?QgT141 iPob=k&RYraoEj [n_gdRDGnc^qW2srXg"s")HY AAD_97N+XYql<$@6]1<?!N*Ys=;?03m</hA@`d?(3[W4>?Ksb@$='?!RMK;IAHH_k R`lWbJP\B;XAH%gWptjHrN['tc6h!$b@ l,?-JU3M\WNQ/M\Z.k"c3m#R@]gP ,WAa/Aj=JCg2egdf cA`_K1nrn40JM+[OFk:<LFV:_r#'XU[aAN#P)S!cLibepIU3[k)sTL8#]r?Y0WgmY+O=nhDZSf)7:s3[TETO(?@ARn&_5^dY$1iBAbW"n;o==]BGCEiRq>2.3J5A<71USti8Hg*%TtdXPj<i6]JVUhsUA,=%PKQ?8tIisP&FWqF^%ig7'i1bM'iI=i!7a*hgnC1tjptFh=A<Z2<C,H-*I*9@% T:@8V8 ph:\1)corNLn'*XG6MZ <U(d/En>4"RH9m<inJGY?t;L:(-J9$iP=GRX%+h]m cdce[HRQ6q3,`nLG(!@RC6>]K?kR<p<ZY-GoH_i_>cZtGHA8ID/I8fRBQj]kB&\mU25<"DTp#G.1N?54i4bX;(kH17'r[7]VUrNnnN<W;*53T\T.qt99Om%KWT1qd*I`b[-f\7F!-[jntYYAMsntXA=>! H$&;>I#oD*&2EKF5.44<GfW@qjT]GoVC>;Y1j0[08Mp[n$+/eg;Xs\sfm\YU+.XcP>?sGfKd3QqC\JRS]ndgoko$'JYSq_/QDfAQK?9fT2BW83L*1E8Hf%"@(]Q Q)2=g47THjh*p(_#o29^/g7`/'==eRQ0[Af0`?&^D]DM\!?:+J X2bG>AiJL#kjd0_1"IB%)P'5o2Vb!s`6ASOobS=GadjR1q:MJAAdtIV:lL8eXF4K;^\iS;f>5fF!TD.tGSJo9qp,]!)YsSn3VsiUtqRq!01`QG he7)E-sBRXgM67Y%rACGSM1EXn\R7$7I__*kr0A8"3F?17i%4?@(lQNCm)acGB;G3I+i3rO)+2"T`J>A8I_B=*Q2:Qk-mdJL^3]8Fj0t0COl^Ln )YtroDj?J_cJ*%".F=Wh$=tO-9p#="/Hr3n<`b)03;iOXGGdDNAEFA/s40<kZt[/dN*7XTj9\m'9>;X@9jrk4=Y>7^V4s4e/]-2%cL`/%H.#C/66h0aNi8W+6BPLi![ n_OcGFibhZ1c=sO^BRO8JrpE8n\15]l3;9Ra?;2X;c=dTZAkjJ`sc@SIAkoBIl$QaJS&,o"B#)(ec*[ehJ&?ksoSn0RGC#ad\@WCe,&pDS0fmJ`KE.iod_8cQYgO6p'-G4?"\-5`_bjs2V)t)3-Cf:SqBh+r_Sl[8FJ+sl:NIOL*E)/P0 9<M_UdfQUpo7=iDoj"?_#e3R^J?)%WMX:pUPZ(IG=UI7g^9AM6<ZA&c1'\k3=P>\H)Z<$c+2fk,<)$+=5UK 3_>]QWK,b3X_k9EI2Zn1.OAJ_+Kjc:.>iLGEUFV#U;DX";n!SG16@3fcP?[6JMlPs"-j0J/:i+1m":VsTss7E-M\Q(VR!;R3#SHSZl%JM Y[@,-(n /;"h]WIIPk+ UMD1P]gobmSKsdM.J4&#P3M9:ErT8%A/A+><`oO<"0=LK;c2Md""n]o_TbOoESkPN>Fr1PdB1j\?5*.V,)RAJWW`@csFaSWE>cT^PO3EL(=K%]=3ld;$fISk^0@4<t-A#,1*/j:V3q ^7j<Z-$)7+"ne#.)Hln2gn3O/rl6K@h[;AXAMM$jTtaT5YYVGCe7_9.Q*mhaKJ-+jNQ<=jeMU0i:a=UlM4q'__]H.PF)rVA"6JPP`!s$b-X5%R"1A&g;)ZAf7Hel]h@X ?JAT??H\XVA!kk;&Bs5c6QB3^BXo3gY'oNkOnOD3St2EZ0gp]!`.%J7CfJH7+pm0$Ns Ocs76g7?9#AnUQZSbR2ZV'+-m*qHS,:I[+?(%_1IRVW9&K_0W /9="$S:dYP_WoOK%tA8r`3hAFlT \:NpC(6]Je*T1QM\V0-J"6q.1AKrJGH-S<pqA00hDVj_\jVO9d$N(.rUsdN'<h]%PqmND(e;+P>0)o,P"W__$Z&Mhg6=.RDj?hB`''9""+8jeI5,O:s4.[ODpEbr7cL8YA#*0l[0orYp?I]ld!98YXkL)XQTDp:?Q"b<(gY-L*I#f,]4l_PO$&o29Jh3)5Bo^FLs`mbH[F@kNNAnIR:aR.E7 !2U9\1RiE+<qBh1bfpZgMXZ,:Y,0,?7jIq"69sP==ksNkrPK2A?)os_K@_ A^8`SYmX,aDr89h2KIrsi?SK0A++,3:=*lo/V]7*%$D^r3Cj>ml!J?ZTWK88Y=gAoqE$[iG^2&#SPp!+_)iRrjUBm&`!e@]b.d^iP2eiVIQgQSWJa]2Ik^mQMPJDO?q?7"ONnK*4$n*jG"/pK*bUBHWoM#\YQ1D1a[t3_s8N"$[!)'ifH Z.DAaiX7e_Ub`\l2a!Jnk0<D@*g/\!,b)s=S:!2odJkf!B_c8(V"]b:E+>'!Tl]1OpfsO]jdcX?PbXMN4#_DE=,V<]kWX\ba6#V:GRH,*>BYKS!0ome=EtQ^Q^#[kW]&%e5bkeSY:p&'=J+EW=iRQl%3# Ar36ir:$M0tNsm3O;i0LSj,@JcK@KQ5F$#?0;p N817&,m^s7aMrdbsCph_d\pEqLjrJ$\73G`Z_janham:U)L\f1O;^-= rS0pMF57Y-fXA$,-rp01<PLIpiQ;h``1rlTF.)t#Cf8*:Nb<#kTYfM..W&r<`pa>>)B?%3H`VmpcV^>TXRi9]mbnb5Z7mR=H_CbK[:aAbaNpJ2n\M40n>nOe' XG/Wk!-'+MU"d-:?kQYh0it<#n):+ Q+km?m1kCs,^Ui2\WlA*#ODMPfKHEG]("XQR)?Ohc4YPr?t?_>aP>T<hZpT,ha0`KB LK2eefW.C?i1_ek\NdA`(RpAM+Aji(3"aa\)9ttWk4_;(_OB/P_clEc:rcX99REgNR((+!q_WmIgV#__k<\1DLo3R+L>Fgo)c>`Q;jokC1t=Qq%#&=\6kp/sA8+"MrD>apNL%`Y@; ZLsPb4_"FkgoQ8*kNfU(l[8$= "er0G1Fd'B:AZfAlo$@$O\Gmnjm$P$=f.Y5Cep(jc1\:5@?9pnn9MmqSoN&WQ.L!5<c7SH30Ar)'jj;EAAZHOcNpF3IPk7a>FsR 3Wa#E!<LBBoml'A5LJq6MI0 N]E<8[LN>7_fD+mq?OK%#=JUaH0)BE&;]Bs780&ptA YMLt_ptb\8f)/AM of6QC?#hmUEem4MR"IE]0:CT]s5o[OZ$soO!:7I+!LAeCGH&?00pMA/Et)ip8&[%@Pa&^?a'F,*DEe:=i9)UlD] OH@+55;U_%VAPCQkVGk5;7' +4^W.=OP2SEB@?(.Bk)ii:+&^LB9cKgj8Btg8b@=B5K5idP;n%C;N)*:^'H_9aHLmU":r&d Ff_OWB5/g;M4L@X:D/2JNE0dAj"Ceg-WQ]*7I:D?BW+#?_FoSUs*9hCUWe`lK9P^fP KGGI%)"sNAQG-Xr:op<pp%(p[geW0Yot\+7e`AS3#]<I0kF=WD*H:DRP4C8 C*T7[/O'T4+#6f*=7AHC&@?RG;[]_i4)4rt&W?Gq[F>bQ7IO3^#GY\Xs@+:0qKBI2+isSbG+W7O8dm%7hbllcY sA(d]Q:io--%h*4Ge$cAgr`6bh0Z8siL`>Kb=BO_*&ld;k%B+5d@AlW_DBI" <':R#<K?^rEA6_mOk]gZ>Qci-7Mis#?=D#9S5^jn]EHXgp*H_HALM4!&L)N.IKDrXkQbNTYV)LaJot?O6htE%^OE+mIrGUKKGXL:R7Ji:g\UT(*dMpVf\:a0co7H2"6qUnb0o=.B3rI:@pKXMA+_UHaMp^>*>Rmt9m]La!GGAP%0,"%MEF\JXr<%n^OH!c_BdM?NOq[DKqdBL_WC'$D`\qa["]D'c_[AB9Q\AO]c4ad7P-_U"paLAQ#L"_"\-U5b4HnsjOsV8ARl4fi&q=q.(JO:iVZ!8sle$0D&_Y'dG/oO>\R>t4-?kUmH2- =N(;="ShBU9hGEVK P'b/T4-9:`'`cT2'_jTU(,)`p"=@)8"qg4C2hh"A*'3nJJ0]V*89-4t[SPOrkbN?KEJ&<mIhUm9BT1$5#UNnGV#&VjL\;c/%heI6 ASV@*#"f*mWfN.PAT^m$fIYl>#4k3pUV=irI&8gAt]`4iM`r>A`3LiIA'E`'V<^!3mRn$sA*Ci.ah<V0&jLRp6DB0/_?A!QEGs`pkO']5@>to%Nd8rn<kG?\L?Yd&n3k0?_@gLKE@=2`<YIs>*gast/>8)GANspk69PoA5G&>;:9!,SO"0OMa8r`Vbl9B+M>!>1!f"+:9-ctYqdg1fW0d(_#/te4N/b%*DZ%b1OU9sr)G9Z9eGT*aMKiTGY65&8*N35siCZ=:W1GRK<Hpp'G<6!WU)9p`_d&Qf^q,-&8@dBhtI[Y].2eEeVCtijHCiB$Fh"pZK06*>7HmAXCUF*_`S4g 6Y43V>rf:rAEV<0[/,UZ\q5?E20A_OZ25!9T!@5 lm4S"[NjK lC:[(P?V/if]#;Ie^k7gdO$mTDH.m4[5>YIi$hgA#*!]k\rO1U5"J`$N1''Y(Kjdj>Za8.12gsSMk)XY99k8_f1GYUFfn!--Z'0I$hLUKQA_t@W@Un%C;NrqX;@%M"DZ(ZV3UB'B<#Y@,$.OZaKAsmQb]^Qep+OCC:Tj-<q<N\;ACo2Y9P9 /BLs>.W?P`Naoo\W&9T2IL$BH\*W_%Oo:G=Jlr:fiW+S^PhWmSog;i&lO0A0<M=D&D3>9jhl69Fb_,Ghn5TP^4Uh$i"%;Fa<D %`[A]b&8JM9hAU)-mN=f)=qbKYi*h";s6D\]&<a7#i>)P;>TPj;W#r\%=:H\q`*A)/EZ=eZ Y?'E75_`*pL6)H6#ed&3\r:Ug1t*E eT-_$<e!%E\_ oD^:C#kCm>IOsA8!#$b5m$(O$bO$(6kWG@\Y5jl4R-98lt\Y\[tA)IJ a`ALi%)Q*%j,!tWYi3[oSc+HO6oZ>;a>BH&[@=kh(g)?1%s36gf2;7DcC\9)n/([6BQIOB8UFV;K2Ad%8E+6MgNeCff4G3?cFN?-_joN,$<=X+m%YsA;OU8%?/.Ub$fFtQ:(AN9m70K2XEL%[XA-L0Q)>4(OIWAp]qO[cqL>N9&X&qk]]&)?r&UGZPQfj4["I,1Z#QPq\p%_J 2b'nn@p[<1M9K@Tc!<3D,ESNOYoK<+gV\<(ADKc#Z+:MJs8hj_=ae/2m5S5.9<#$hbTNo"^G6=]e&2J3F]$=hS;\Q"]Akt4hj+MlcfdCWL64MR@-^oj"HY=,FeRtbD\[S0P:fo 0R3O t<UkS;dkUN:h8+c`n^NmGXq/ NY@f>"*#k#&aq.5bbOf8Lfq\f^=[6AN)&oXctr\mNAJ.dt\F7a>GV pnj2+.Br\&:0:_S+Xr7IQ`bU?Vf[:<Qrqrp9F4j`^iI7.jllR-'+s7t!Qa,?!1V.&L 4'0<CA`WPVgeW.H9Kj+VrTPZ*? OLFdaE oGn@d;T]DN0cjaX^FiP8I\/OhF>asH.!W6`<_(?BUIGe014HDKZnIDsY/K6`hq1jA["gY^DH02R7#cXmWYh!s^_ <TVYPn;AA7?XVq[mA.tEb(5P+VY?]G<W0T]*C,mNL<]Z@FLmTn`p,mjh8l9">A?@E44Z.cEr*b;cgY4.FRT%28's"b/@6,7-c1.kHnb2$ZjHd'F#E-ir?g/Zf\_#AdeSl#0YD4C##4Gj>$D#dbF9;n/Q)a&cNlM;]&=Yk6k(DQk(=4@'RNh+=*e+kj1AcpC%N8=r2;G+<So 63NJON+Q*aX-+)PL!0%k(:j@.5n(/)2o][O]45X8-Ai_NQISKY$(&r!3:5MM6e"8tED@6FADKQP+JB!oFsAZ@D"39`glmmmR:UW@'8"[QH/g4tr'Uep[+Hg$l*,8,ZLn)s#I(3WPLa.1j(3\_DKW!\BIj#+1N[GAk'KZl0f#(cc=)?9Xc^FG*h[516XRZ3-bpie-0>$=9,4J$0XL!6D0)'Ob"dgmP[20BtQp>aB7D+-B\%4P%\_9Uc:bimEB4od&b!@7k@V\UXltEi<G&O0s!,(6/cb#+#:4et>s6.R,&'; U(]P>&XCp-;XQ\-cU5]9&n)qKZpfC0jEA^++9MA@%LEqS/7Es`Jco=Kf@,Xi.4_p-j+=5eqP\C#qp'rKebkWK6ij!b?V=4-dr#dgXF`9qYWA.nsn)Cf1/0Ag;VC<m6E*i )_)+X:Er\=dg$;L8m +WECs%3=O[+hH'h"Q>>e>E%m27a1"Q.#ng['MR+o;03mp_%#9QlAGKak/A/"Cf+5,Ic)+!*IA,h&jG9(A8"[YMVMCO6m)? V/hN]_c1BkFTF3Sso7pGQ19;m>iCqXEr8:Z@6!eiepA.8K^h2_?Q5@r_8H.5)*d_gH;41/__#gnT8%KE+dqqV cpKtJIF C9^Maq*,]P=Ct/Z-c&E^;M%rlA1"t8Ji42gR\c*EoR)J9.6?e3]_^G+K$:)[6!<Vro&s^H:n`j262HXj"Jp__)=)D N'.jE\A12ae1Z< #EZB41U-%Jg7t3,*h#"=iRo@sC^je%&h8g$BdL'K1L3 5D9.Og5h=&#:a&2q$OSNY>Rn>9\;O7(`8)jBj[+4>AH*Ei@fUD^A;gbla\d7MaQtH#Q"`qF:"04oiKV=^Q?PEI%9eq$7"-2pMH3<\X5L5LfhiojbbZWd?#7m4VESC&=K=5,6Zje@e(58Tl?mmh;Y)T%EPk1r/`H4j%.\p0s%X!Lp2m:L$7KO:B4F/qi0[Wp!O_lO$^*k-lY@QfIDV)sWY*5aD.&ctt)=l-s-l4KTHGR]<qb!T=.8%IBdBT85(krsg/BffhOHDkCM9[GBo6]0q(:eO@&<a$gVYX.HFn\o&ZS>FM?g?P3s"o2[lh[/Y_!K3gIUTiKfQ5^!pX`md#$hL*/S3=hVT/B(P^%8&l7l"'hprAqWCl]c[O=.2#8oJc#A4]F:%\_0K,>1MUd4=;I9k2/Dg.Fo3AJ\q"JZs%XdL7UXGPNmSO![L7acm_XG3cLP886lr]p0N]dI99IKZDEHU9:oMAj&Q/NH+3,28S`g<>RDo\CtZsGaF.m&d,H>*aA`l/.q6d3T3[r(Zi_EoVf?q"UfN\;S7n,Fm4es"OkbE3X71]T tMn(/iQEP>EBM'M@8pa2f`>@VODBO&66T>.3F;^2P?7B%!V%R3#1n$>a,PC5.s'me%T$igaenhZ/';-o&YA+7g]'?9R0 HP)q`g&.N"$%3a0d^B01<O23R"iY91[X*?@7V4`B4_kMCSqjHLDfK#hgMrkVqMh=fWP"" ak5729trq-Pr+/H :ohn_13aM'd52_=$U&()eda3^^8[e-rD[+]^t%<Ge6IX/AD^<;C%@]!ZHo7L+@qd6=+:-fK<:?8cS>.p*oAV*A#_9D2iY.Y:n#kT7<Pp8rWFgP1Ib@]V:BbW:!PT$q$I0a+g&R0UT9D_J_?/A;_0!9Uo,Tca04-c26e1.>N?XMp%6(HC@??ABt^H$%ABY(nZ!<"'Y#!$qC9>mr9/3fdl,8rl[ rD_fBHJ8?oKsd\3hbU7*dB7g:RHIg5lO(/Q?m1&Pjh#B_^i?ZC!3+W6O/PE$ZKKbnVHed4A9aePnRZ4_X02CShsUb`4W7CK4iB0,!2iE2(1 gHgQ(JAAn25(1T/g8d*I+*lY5YG?:.0j[5iUAjmA5>\U"&Y%>A47N8,M\)4B(iobO%XGHK^Sp$:o,BtCTsOp?%cnFK4Z'D-f'4&g;5r>GB1)HApnC?DOCYj*eF]N]1Grg[3+LTKZEj*3S,d]MUsrX+U>EEDJ"%K8lPT\hWM\VDa# 2m&VY&SMB)L2Ot0>2P)Mt-j,UYn"ei>WE%g30n*I@@Y@L.P/'&t">8Cp1',b4*h0pXQ-TQ[_!m>P&>H,<b30ASG88QGojiiZ>Z8V;-[OMTS.:O\+0<L"c)$$Rclt,Q@TWq,AmN=j1rsRmif]G^660B.dm$k$:0EPQnYD"Ag+7M4NfiS[W5F=qPM?It5sChA%g$j$@Ye]CIGBUg?qI+Fa/B(j>ipF%P3m]#k?%IJADme'c<9Li(0rHN76C&pg1kA7!G-,.+83dAE*MN1e57FCNkkN0Y"J69C\k_88)+NC`Al_o[G?XQ1VAiMS!0.]*39J&P^+:D"4VUN)A\Fg-0TpC6j))C2\>;/gP%;C_%NTk^Q^2EJ7Pod8Ia/758r)aF!V'i%Kb)MGGg-Zd#<QFIKOVi0o!q7e6-$Sig<IB-dd8e,7qJ23/`H:@hi(*7X@NPi+N W[pqI`XKX:I-1k^[eC*SREh1'*:ZrZp^b*?6D!C;L#+-Y\A#Rl6ab8Pq?oP)&B25SKYJAtC4=)X2ETM[)J5E1*)+j,-fBKHAH!Ym0ZncnMOHt@<oQVZ!8Xb3J9ESs?4$8B?:Ad*>.HHc6^h/^2nE #<P[*md@R,5:>WQDEKkJmP/7AE'pT?RMRN(>?jId//^M8\D5A-rDDNqn9m=Ok^%CSZ1V^6SZ<9=Wa?B_Q9>lJ#isoZ5-aS-BOdILmhWf*cih9fqn4n)/9V-le Uo-'=@Y%>p1qcQPPM63TP^nQ iZpQM;6kfIl&o[6_MWA$I3*V&nS.tt',OLKtnrCS7Lf.'p Gb1W3RJ[V]7^e8UV_T)_d\/d f+`a6t&dTjV,AC*c1E\[f(FM?B4[3IAWIH]=K;n&rK5_Ts7.T->+;2QEL^^Of`[mY<dVYA"?KmJtjm[YU[+M'NP9UcL=*P7d8km\Sjod4A>3\Gm<Z&F3<+Qi7$`0DaIVafL3a^8gbs+m]-FBseiZZlApU-Qcaj1DkEm&:/d(cLo/+H6nVcH=RQS8"C>o)kRD?`hFU:XkOL."K:a)<-qK+e3^`32^7^Ah>-V.?]07A&m['DG7Ssl<ApJo?6cmc^^!X'=+c(VH.R'XnNQD7/(/ZdkDcL=cqkX#Qh1]8##SEjcnY9LK@5=lYN91_SOSXA"T)/9B?eU8 PS8Fg`+#SpOLZ2SAR(]/IF'kM=4#0<HR7i54\@^\+JGSM/PO,dT:pe*+(C!%r^Vp._CSSd,R!2pVe^*t`@p[[Vk,cD=Io?rA>HD97<>@rPA^$fE;st ;UK1]8)<,qSAOS(jtr!sh&0MC0Bp8:dMq)7d<G;mJ&to"t"g;%)M'2dPe!)*2^mE-^AZK#Q&d!.R(LJW.^Q43d9e[O(^-G$oJAJL2%^4p>7tAO< &$=)]3r"#,XiA8T49/[C5?md_+Z9do<;Lb8s&4U5_PaJtN.,jVn^P$)<'q8QE.8V=r90QcNm@q%\kAIN!E^kCF*B0+'qMf'2>Ah(/^IkHc]fa"`JAS^$$fRX&o813E;hm'U-CS?LR54dTU82 %'^_M<d/Y3tgMl!NdS&&&Sp#?_6pU=I,/Uq8EYoCpF*;Z5N8S_d:Fomj9%E72fo@%X%S_2 1*M1q3*ClM2@3,OZE9$'(N[?tZ^7ClN`%]t-k$[f"#ZW/6DC$WF-&M6)^7[0?bi/!L Tgel;P APkH'R_snZ#YeQ=OD<X8?*+hoG1[,h4%T<'s/tF^Do-0++JA-0J'\0##="sbr]@(JLEHZ6n="m!kT!j4ebJrM3U=mVA.k;#$oD6s"E=Jc0ag19`+P@Set#o3<\BkoI@V+`+#^9NFs"i+Hp)r%U8@:%?9Zr;$kO*<l=%?,fE!8k3X#*aaod&4)O/_`l6.ec5`@O^&!%PD+-o%#'4NbD%rQOV$_;T?@\79rerL@q,V/s6M,AA</SNkg@T./[gb]GoD=Uj*/_1[U^B5d+PL$H,LC6O0Bjq7#ki<<Zjd3/I_pj2^h=<_Wq.)W[<m;i5"To[7!MJ7[Y?=2&;@`fCMM+^*T%dLUHqd1g+0;f>sNOMghCH'tQci%$WPfA,Tjkob\\,5=qAQ#&*#,h`.jDlqi&qXS#e%94D_Tfl&^R=:0he\FO!!ZLX!=d&,8oK64Ab*rT=9IQ.lHJ-gPb<D2lI27,OT(jY+<OG"C$!A=?1Ss*,,fp"=^#aT:BfY>\-K'njG7W$`moQnl'UsIlA7Y>h3[$.50@m\UFFAbKPekPsUg2?A0*@-cRT=mP7TDER0\1gj+WAQ`i\Ts3Z*c1?;jqQ"CQ?^L4=;./Wdf[`cEsFdr6=0QD a18&gs"AW7"nh$AH08?M:NkAGRYL=q_6".6[2Q14nKtMpP'C2I^8/OR!JfrU+'#q[*O3M4L986<pEkr $harIWNoA5\9-pb2@$]8<%7mMkkZ< &\rT3';I<R2 a]YsDieV,`GB#@tSkVA9CS\KAU?%p,\cTRk 9FOAahlL^XpBb$51CT]4'4sBbGt[`VBda5FPg`O!AP`H6:?aFhM2t=0J_'>/%E< Ao8'5X8 O[&@L._>$ZYe1PPY9-7C2# =YUqm+;/5p2_Ann]N-lL*l:tX6AjBiDc`e%!g4;SNaV)>99N!?(KPQ0Q:,]qL>;,.`EUo<&a$=PpGhXOm)t _&;8#HfSRMR? />clW,HkdXYVdjr`:9k=<[WZ7EJ^2l$\=`lM%+_bAn<q9]\>d[?9>jn_n8RL6kpI=kCj6Qg_!6$;,27AAe#bV>$3gXJXD`>G&VB$#H9A lhGF-[4.2?-+;VV02.1c%2Ki3;W[I2>qa0J4WM`K$;[X73<j&dWeZ&sY\bc0DL3h6Nn X9t<aC=Z:tH,A:S^$?cR!(+Hs*)W41qLZ[N$KHetJD<cHXYCZ#gY`1<UeW4(4(CBNKT?H//F.)p)<G"<5gt<br,fBk,XE`7:TQ-A%d65.c-kUq4YA!LN,FBic$fa:NPS',lg):<8EQ7T`X<JBrHp4F1'U5Al5F_[8;MMl:Z9;]`4c]e GaAi e9cMc<<Do__t3cPDb0A%Lee)*@"c[,I3;BP-Mbi\SN;5.MF4.cD>`flB,t;e6GRh)NXkqRt*Z>f$fN%_o&6T@0QjL+8R1O)m?!>YI^K3tWc95Y\;5S*9?Qj>]h._Zs^EQTJk;A?YA^Q,c81pA2Kb C<*dEQ@PRtlj\A,l>W>GBA^=D/<9jZLV8pB^Qe8S#BiklO0EQdM]Y8Pq1^M1;rmMHLUP\$ Xbodoa%^'9XkE;MmRtT;!W/e/;`^&')H.sXQBQ*d<Wc>%EKgop`o!(mi.EsCk0+lONOnlM+8?W't^k)L\==d=l[P5GYAqgPS7TX^C2B:p8\6B9sZQh?j7jrTk[q@!$o/G&n@5E>^7&<U8&c; ^3B;n?,+Ea?sfTB_iD8%Ers@>%A=-h_Fpm&`\/)3?GSTBWjA/6W9p3bf5<A(O% g5ctVrEbd?K:=G'EpI"Zb,-o0/A;?q+AqRN\&^Zn)Z,ti#\5t'D_;NSt,Gd.EnRj0%JIbAY%fMmA_I?B04#>Pm)Wj 2M>5K(<gqi0/Mc9kg=5!aMcd\GkTA^1n.DBj;0DiY>'Y.V"rYkNNDVr?!G;qES[Q7)&_te dYVBJL^LUrQl"25['"`GQ[[k2>I02O^@0sOtNq#Y1:T__V('?=WI_0&TOOBe8f\Qn42^n)?8-YH7DEUq;lLLZoUh@ih'Og:-A"WAK6S8,'/[5/B TlH,%,dO@; A61b85dp[a*F-70:9d`pih`]V:_XcH\P)t k67:f)85Yh6C,pXq>#aC61*5r(agq4K=(,2btc 3CVe:>tKp&mp_;<8KCoG-I1-MgYfDArQRN@1`ds50<AFW70S;lZ:Ger$V43 Brg(]>@g_b:M\<?`,^@n6_1>!?(4U7AHQ3'LU\=l?CG$-,VU\ii_oUnOGSY;f%[mFB]G+e&q/P*V]h!abF`R?;DLen/K;&#e/@V>qZ=cK0ja4KAZ&WlmdCDeV)BA[Z?=4SmqV&lC\%g/6kR!!H)'k<(Sl33W')p_5ko_<OmtFT]%eF=C;lUEJp4NW;BI& A=&cXfbcXW(@XtAbGH8< ;Pfnc&o25si^!jHl+`XO(pUGK>,=q&nS7J7F.U[Phh+4f I$C'6FNtAn[@-&p"Lp(!q(r1FJYc$Zg!9FE.e0JnY"blEYo;r:'Asf(P63)8]7@!o &"?dVC\$n8@^N4GVL K6!:'E(GH E8#okq*n7>,kD%arjH:jgt@p_&6+pTO7;*=01q] Zd@D\\DN@/G3-<[Zp]#">q40K#E@LH/I(3ZQb!NA4cO0B'@+D#@@9naEr1EGW>/4bBj.`lablik#;?\Rc+":=$?MoF5Acg(TDi^ s#)R'lTA>89e.bmM;jKbJk5A(RRJN*i(`d&)5]$VcQos1/#2phBoXB_&VID` _+$V.@8AA`k@Ank9)V36/O.3Q1ikgAl$TZQl5X 83(?dTPs?F!Mo;9L?AX`Jbm[s*2bb`G45<-NM$Uc/ 'rV0!gHW7Bdb`2."U?5`[Zp%Y29@F[Qn_s&nnqKI3o@UH9:hVoH?/+eF(jk')AGn%F1dp/PA 1pstn8fRi:^AL^9sF-!")holtVOrB3f2p6^LEcG?!gmdh9tP<tt5ARprEeQmgB481HkU7i sJ?6+n^DtH1dJ!m8g1rkKCAIqEj$Nt8HnD<7k;]\^M(`0;55dqE[ALIqk"C\<XobsWsNBn (?LX-/6D(=sT+K_3fAi1/kn1&TX<d27G<:htfRBI9`.2<fmRVPF#h:Q11&/T n7fIPA6.gTlXONt'[KfT=MnG2(fV8Q`@KVMabk1t-nX`HJ(V+)#%%4Wo&^l\HD3dN8E^``; G0DpaRp0; fO@SqPHeUDdL34o"f_.&(\9YX*`)o3XtAYi5E&T?<]Y&S(`2=+ %f9Q4O%r*f\L%V.s8fc%W!iY1Q\8[PT.`nF#QO<D1,<]Ac&Q[P](:Qs..\E')<>\`YU0qc>_!$""8^)Ebf!dH#D74(H6K"e%+hNJIfqCh/3BYAPQ\Wj`-AI28K:3Y2S[]Y4B#3_N)X8C I.h!P)f84RgSPCq5B3^J@Y^E.WnAC\sFJ;!E!/bEhsFFSb^JsGAA7E;&%P]c+P:1N3`X5?:A,]%L1IPV]H@Lclptin_V&<fbHPR4O6JV>%3YCo_#q`k,*ZRgL PJ[UWm;C8gkl?c-N(qRHO/pSq>ZOjA8&'bm5e?Eh]9j-slrO.(WA0>"?pMKO`$3MdSGlj_kr4#0<#Mjd_bff'0]O?'gC-dAFK2YKrA%MUDn /=g>K%$mIpkWb-oTWY33@42n(*PNQ:rcKA./AOFI)o '-12j,gQj_&fAH42)VeIR#"]>^B::]DQgZDLTG_9s#`\4\s[BH6gM(k: +2n2QFZ1!clKpAjG7hLn.F$XE^L_SVO*bU<XM*\W&;-DXMjXaaU+*Og'-)=m5nH45B,@q'\..8E!E#;r4'Z@Sln-[[Am<.:CHB00Fa(0G1K(@dH:2tUNqGHpK$W(P- TgRXh*49m.=hAFsq/gS"4[bio !A]C:7(+$[bo,gY@8jQ-&=]3ohbJl#Q1e4#4<$Sd5Q$E_<sXD3glOm,WV]+j,%p4$G8m:Ofk%UmNdUk\6se0lqt?e19UAHb:4Chc;S10-UPET]bR'RpIja)8GZS]#95_COp!ec<1jkMS6,&5Q`gJFK@s[[#-*WqVm:Sssi_[7G#Wlb>+t ?[QX:-cgYH]Fk_?:/sKq22<6L!0hnU-m`la2"Se[s3TOG\U1i`>8]*,j+A^l 33gKkB,l)a );aoOlC<#nf?hf)6g[58_'A(N`> t2f2/X]ZAS6JhqllB!h2"Qe483 !ne;)2$:jbp0G0gC\t3/&b2nRoa;`lW@p']OIIBK&Y)'l@$I2kDEMD:*@:M* )tCf ^:JUa+9,r+FG<;;R*klWW=7O?J2"(4>UUJ:=ismVp!o!.Z6_4aM7\op$0YAK\34V-LR*2ISSKr*+Z/j^L4c!'>%mW%QU"PVbHEcE^=A@B:#L3g)N'e9*m]B8T%m#p[hCQO"k`8,B^j4&Z&<nX*RA#^HOR'M=,53`*RR,Z[,.MThq8BFpCA(sBh5*JOC*(9`_2-$QLUdc$WZP%&`!dg]),$s>qHa-EVlGbn,^J&hG9'9AI=Y3P$tE_4AW4Y^T.p@<9d;9*658d$aS'5f3lXJ'3!_U3M`8JBC-G(FeeG[Od%he_"%Zo(,qo(c33 .m;:psTHUiPU;^lGUshP%5%,l?(]Mff;n=[1Wgb^Jf6Q,<i.M"GO#@k'Op@GlX#>jIGqAGSTVHpWL5bLj'.sf.-UBjlJKfqd_d4rKEL,i2\/Xciq_f>44PRpROh<#^&H[$(RYW*^,/Ol I;l^9&fj<Llr`)PF4MGeQX0Q,rP]Sqo!k@5`+N]i'NE&kV@WE.KMn<m>'DtNl[(CdED]'QdET6dAei#G=#f,sqR@AQT-&1Pc)]Q_O&6#i7$iP@>lFZ4],&-MfTCg"*'`Rq\Hh5i ,L#+6$:V6SW[Tsi^5iG-t3Bf^FahQCOd=q*[R45bc=?GfJMY[cR"R"j9,I=EK;bh:l/^S2b=[8+JK;tZp0p+V%:D<B,JVXfo6Wo5LQDls<%5^fJ5Vmqi^\,5X224ZK\%:;3H`8a^1&-Ao>/Ck,gN'E,_%DkBe<m>g)a$nf!!-2=! >d7j=:l\pIc!A'I$p/]c"n<L/NE-1Qo4Z:@ST1b6)dQG=NUfIq-,db`a^GSMm"._AY9GS?i0*mI0gOdfr`lX?Z^ZF[1-&l:5EV.!>P/),.nt@/,7;+KVsRO-acIj`g;m[^#BkIZq_?TA990PGc\.ACkK/orpm:'/jT9[jn=L8C^-f>DhN?YX:AF&q`t/)=g?2[Y%A-2+0:Z`Qo`fH81%/d[s9oqo\P)=Fh`Wr:ANZ$1\@RYHcJ<:'He lQsoo]rJONQJ"3(f\YqO@HF!(=<Um[kImM3-!U>U*]\1Y9a''A;,IIPeHPFJ%2=*1FsmnZ[ANmVXNPRgJ]B3=g)37Grhd_#mF15;O&8<#?(W96;ImlG6EaI pY8AASA02NtR^I!7^f9k#.=R=cV`-,_&QqIFaI%oTn7an-!pO;)N >JTTeO.)6'C"AoK9RnLJ@+hHRj=[Nb!(JY4*rrE'R0)qSWPb?C;Rl(F9l?7:XL[/DNS#+QI^B1Z7b);nIVsoOl9CAh-d-- \\PIN!S*>-JL/&-RGcC1/ aU([@nG*4AN<(.7Di6cLgX4qq\D?M6.@Fmod%de_DD)&'9-_m&?nrGVEFnk.M)UW$i%kPAKUZ%!^+,2@b'Fk?4skJGKNdUgZdokFE" -7']_m. YO>beJ?g[Y#A5ARiT(U.KVe4;<E#\EbO!iG`bakX:qjjD"p5Q0?4-\e!(2QZ>:QBgOM2^OZ(GK# li9G+rD>P*5o,H/O1I&+jtt\Hl:Ogn4p@@`-"Q/jcmS_at&C8lp-c`DMh!4JXYN$XKYP(Z#%gHI EV$qpVP_Q/Q:#5j\=bi]bbPUH6]sV::AK)HT^O)P P"+AR+S1OTDd$[Dl^!]if4?&HP ITD;-/KhdmBaANA#$Ll4<&rOIA#[H583h$0C##K"tCp'n^_>s4=lrM\5SED,/AF^Gn#Q,P38AD+([Ka);gF43.fV#2iYG]9m,Rn$t[;<4kC:7DAf,R*bZQE P;5MqT$M?_HfD9@];\?U5qsqL8-88l6d<C 0H7bW,,^c[#3;-=s(H-"],TQO?%<`L1Z pXPs$%Cs\-$'BX!PC)16#Qq_WDTaBN5F"U[;(SB,6`rH6o`9<]$K.>_8Y+ntTHYEc21Cdaa@Ak=]3$2?CN8Y)qY;H?XY p+*;IUdr]/5^P0r\_335Ek6K7Ftb$?Zbht\C9[<4)^5]HpA$T]DKTes\6aiW9S+^+LnGOqBN,Wg=L7pC:;h@o5WU`lZ^s]aNsHJ2$n-?LF5.a.]4,r45grfiGJM:>[c?PqFrm:C6*gC4[MB244"jJ=>KV*h<pDlGdMJ2Pc6rS-'H9I.0@VAB[eqgq^+VN2&=Y2&UOn>@IAR:sA!poW,4m r.VEq5lgo](gE3$>d\r<_.U[WQ4[OmeY2jZYaF!2TDolY'\K;S_!L><t312rDS>Y9@p:D2kGjCdA\IA_I##qQ:Vmf:dS?O?=][Lh?OQ50S*nTHOoq%co`Eg$&7<=0f^J\24O@[Wl%p8P,E&oQ+S9Z^m7k.`Hpr ]cCLnZk<c<-iSdIeBg7c;OkIf);j*i$nTV:i^DYhQULG5#UF8%TYHl=2ACj-mkW_$J?@#0B#-q>S+V:&NHM(drJmnra+7SHMDS FVt=aB$XD% HqbAg]"BgL*!lGngo-!DW qI)=A[(jM:YV+jsZ!/Pd>d,6&'^$cDn(U)lDLN\V(@Js+kDN0DcRR\%(@:o32!p#PP6dDP!],@[>N7A VY[eOWZ*@^lWXZm)*+P[B]1+%oY1h[hma#L@#_LJT5>e[Y[&)RH7D^()tHOMCQ-p-k>f-XppYP7a2E>9,b4$Y3N1CFWr'He.?;DDHNqAO83oNqlFR@A[?HJM>4r(QJKfM;Ma-++]'D<^G.E+A;Y5]eVl>'t?S9%-)`3LDd-g''5n<t.aR6SJlSt'aR6c?;NA`,bobV-tJt4hm7sA#'p`0[cMiHbNp ]+g'oa4lTED.MH5#6m=0(,[#Ah<>UQa^`#a'HA;d;:Nnl1p+SJ"(c !$27gl@pHI(gSSa0*9&ggk6BJj^o\!oV(h>oSbg%/BHeO-mQc#q/G?cGdN(T/1&>JML>@Fl0=I4)<e$@VPa2U/!1ec9S>'?9pA&\anPs=2+Eo9c7=i\psA?5!5%Zg5,-9n^jsb/cU,N^3LL<e\rMD$+*cZiPHfF<]l_?/pr>(hi #9lYqB,ma6+F]j+jtnHme!nd!'i-- >eBc/8nsP,PmfHT2ROo'dMQJp%6j]RdBfS:^IEY'b,*PqV!Dg"4($Y:^Pc"Ta!(k5SR[YS#Fr6JpGWALb:JGc__UGiAeXIoYAE`7( :YX?cH/Mt"c-WXD '@Wc:$s^Bod0RiiQqI4@ANe@aY]:+0XHq*c(p=sW*%tP'=K##Zo>CmpFq8H S3^L4`<0^mFrnM&[[`p:+38A*s1/CT%GU'qQnsTs7B_2@Ab`NNa:a@9A<XA0_NVQ*n564;f.PTA`DhU_*&,N4^^70s%ptqQ8=Bc9/j+=(pZlf31m2UTL8'M:#d\K7aA22tH&ICct:YpIW'`Cq>atSl(BMNC<,914O<14R(V*W[VCsJfjVJ;4<<_f@`9bIV&LBHY]RN2T nIVn-7_Re;1OkUg+XUoY8NsK26]>c%eaq*C@'>K4JS9Q@^`Ik!aso]nLZ05%(dtNH3t<6Z/ZLP@Vm911nMb't,d,.\\4Iq9[(tUT\/:[jO7PQ1(p>%/ Z2q8][fT0^:dq]J8Dndps8(WdVSpi;o+loBSpA<(KW[_B)[S(B3fK\&0eG8_^mOX:@_MiD%%YTeDg"M0+#e"nZ&o^VLJG'nrU+1K.^c(OZj8c^IH;%5?A';=sO%fYJ#mkknh`O\.`&nO]g"-^1%d7!;EBsje\tgXg@ 1LbF7(B)H<K?`$r=#j"F(0rM6ga`%#Q`P>ndn)UAU-SpX?.IVRBm)hC5^3XSJQMYo+L9f%QkYrg;:JBrkrB@op(;oXJj03j1[:'@VIN*5)*#&O#T\nA/-UGM-)_AVo/m4N,U0lg>cTBs"X*AKp1L7qfZ3(Q/7N2B5kb1!B_.*3^1cq#]Z'^r>JcR(Toc]XZ6l+6@&A_<?LFrPo^S/L1j#/IX@fbQt<HJ#_oO0)nr.-&Qg=.DS^JG<BAbnUhAdJ'K%)moA,B/>PFjDGs!Xs+V& $=kNhG!d<A.3!jLiphmV2926ifBat#+,&aUR&+*$@"#\d"YNsAVq(C#Aj[A55O9L2f=<-rWfMb<<A\)/tl#3#]IodF3sMjWXBA]I#N4:<^=D09gQ`Rp%h 9X2LlEkgI"Ds#tb8U/S`DJYs4V'$9>e10LY(<3B$L6Ng%,O+1KMe7j]qCD##blsi:D6^hT0L2E/XC1##jJ53>:[m*!<@8smWH`ohme=E<nVb/6aU?ZrM1:_Vo[# sGf8)Ye/5=26D%0o-:V]qfLJK'i:<I#O+jZ6)KEoa+h_`9S^(pX<$A$!p``q-O`UfEt.P#/EN>j QOc4*4[<YH))(9e^8FUbh\\?e/AShNT-r.Z3(g5KZ88CkJE&.?"X84e9\(7J`*9]@(]B/F#Jd_55o0m 0'> S'?Jq000Hj)nS&C-h<Il]`q7F>jpM%OdL"L93iNbhBl]69Oem:CEF4@QoJJaca\+sg'#F:=fgU\e7Uo$11jKI!)&1H,'8EWA+-*eRP2j,-oBCf98A@$6+pnajZo7oaPX:`NCbtfL-<ZDiG`$i@78m\E#8sRD0rLr2aN?)>/G6bo=(o&[V6e<7B=! 5@JO_J`Q.>DT'hVtM8V-OeUSi?MF&]--F*c,kS@&;4e:S_\VRka?EWj+;*aOEtCpgL$r`@fA:i#O\@p`htpaOk@h-4,DU<OjKSIq.Z>LE>%!-0k`DDB,,'^(GhA'^8"$8-kZN5/32%YDANP=eUi\$pB62fL",W%.lSaQTa3.?1"Ye54\9RtZB+l_e%>RT5bE;RcbmS+e%<r))S2t>0 &&eg/UnRGIHB"]6 ZiA(hHW18NSP40lcp.BkhpC\44KA3 G][Jk(YFR]t-c9\17nV;XI?4l_>IsZR3Ko9-WNm7*fV=5i#8FE9f; sq7tdJ9(W-WBbl+s0-F#h>H8K/Z_[B\Y>%5i&VUIT&T<62^%cH6D&r%U]9>0M^OC1\P gd.4?^H/mp[A<i/+72`!Q][M!).hMV9Lg0&Ue RWH:>^TmW<0L4W>1EfDOG:M6r#/+TTi*of>6k5BTlGm[)UIJ"=8]s@s=G9;^!=7?4'KI$"9'R%l`lpGhUBJ]8ncn>D[?'`"fCLit50"Yd^Xt^Q!Xs!>8=j]fn#=Ff9F^b`Q7p*$!)Yk\=hps2(4"sVC"o]k51ro)`1_6[,@<1DnsYa ncRro!mM!?$n5/,?'rnO@gUMmaW:Bj%M<G &6]8^1Vk7\EIS 7.hEOaf!`@JkdTni7VZb/HEI_lP%#`,sJ7bKioQmU-\2An&C)8o1A@#LI?6eXh@c7nXKCbp'l7-6UW0S=UbY[^?K!(A-ss5RcH]8$rnlA?255qQEYR^gSD/`3jh]8:&jre/<#%d1nX7-$mH6AM!2S=dUQ7')cDIshAQmChF#5^<[t$+QXMqGf*5ZS\kMsR"A4+&^\si$6l709m217`F9&_r--k[6\?>bI/2NVWgJ)-W^_#93Fc35fm"M*&H;"HY;A85+eKZQ&o#'%^QUID!nsAm2+IRWJ78+-Unb/<=bpZrO";8mC5$j5q=qcmg<JD/D M"l:IWY#9B-EE4\q0QS]e).[]ap9M7U'a0bPA)$Jdk9eDKA_]C#))`+oI)jl^16eA2-qqGD0Viq5L/40;?5V'kM8sUqbimrjr7$8 *W2A^]\,]4Z+jFG2iSQ*3'ibc8n"Bm@`#<"4MS2N9HZ6:/pd/D*_F2OD"Sp]Q1*84BbMNg/REY+7O^WJLA3r\jF?5?m9?hI](^ 7pfcSO5)nO`,o<C5SG=Qtj r7.^j?8$6a5LF`7-;,lED^KOI,Uq`,7)o9'+eLiZltend`rq&]4YM.QK2hCt/NKUXH<HAU,3LE$9.<Q6I#VV'AcJ4V+l<FQ+`jbSO.<KtM31^V #+LE;hYMe5;ZiL N5]l\.nTDUoP, p/0+KAf-Frf.`9/m4.;fWC0e8*Ak*8Kid=rcLQ/]0#,n&NOi41=(PVU0e,XUWLO2=[gX;[l;s\5DM-/(W'M]1J\79.JtP, 7mEQ@G.=q?40Fe "\.^4q9j67(k%*9He?Jr$Dr4(@LB3)!'(g A<]#/J0TU4io]AkCQC#MI>)WJH`$D?>l+0k<.+-YmXZ(,T6"6h1QA,8>D1p'!(N=!:3&gO:C$9o\>95oW'Q*FC-iK>`IW0:[. 4?FYIM[@%EO;legl" 1F?,GoqD[B5*3NhfAj[a5oOk#dWAq4!qhpi=67X&-N+J9 ia@d.VYOe.M`K@,"""fE2sa]I=-1o$  U88DcaJX,X(FTXOb87#\W1@='4"3#.BsP Qm@s>$I5+cn@>DAn_RB.Q!>[q:p-c_Ebt-Y4leG0)8nOQJ7"5Fb7N(*+)9WtJ1a[=j4A@CJ!T_r/[-!gL[JrT,t@k^iPAX=roY%)G=W:mjl4-rZ7bK+(B[R>6LmlF]]nb6m;".rfrZAHWoZ_bO)b6#?lNc^ 9.[UV+M1Kgap<)9>],RN9(3MF[Z.Ro5a ^bfm,09"iFK 9S37-<=A-2n1Dmrq4rA<B2T-%/GZEMM?Xnr7oC>YbF;LJ++UXR_E[jk`tdmUEaEB\TR`^ZZ5+A0i_?gHjfS^c!t&pHFc73YsNVI<QXs=]J"RF"AZS1%X2k!=7DN`DYr@A*%L@$T>[)_Ut-6'e9U%2N&&r>\HX`'GPo716A8R3C#rN[<2,V_lZ[?QkL4>R>f%EB5_*Y\2Yn2q6K@"7pIlen0cG=dC$hen\dj.ho-0'Ik. c:8(+lT$Agg/`LIt/<2PH3>$oW!Y+DAo1T-"YJf"_`nWT_)-F0-0#TV"\*,/Ai5VT@iTnbAI0ornM+k;QZ7hkX*m=LeIHtLUPD!i=f4E0$h3^C/s+".a0/jgoGb0d/?:ID0jt)T%EL4PLgpqkWU&;d2"]Op#Or@7c#p1r3K&KKUs!3^q:W<rjDEAdjfKj9DBfaGkK]UftriLm@eTU9^YZgAq'&lNr=e>-B3eAfc[A_=nR3lN\hG5![te4+Ealfg517GpXQ*cZs]US@No>\OtkFUXqs`e-7#3TYYX;;p= G`kGU6JJQjAChM9^P+S>qb%ZVL*a5LrMqGjB.h lTo@_H8AlHXl1s_LHZTj6TDPX#KjrO1Ph,rBN* 3 m]dQ(#QU#5s3shF,*rZAW$6Sr9T;4WAQhtZ%3+ r.$%pDG8  <VB>M7AEZ*m'k-3N@(KnjQJ3"A*EF/h/qst?U:Jfjd!)MmP1!#PGL9:J'$sE M.Hf]]Frld-%*HUVWsUrD%?K"F/gXPe!LjmKNSM1tJC$NK*o5Le#ors`6iLUg1=2MaD02aaZH[geljDkU'qc(tg&nL'102,0V>W?pZ<aJ2X7@_D*K4\jmDU! h:iJkSl0bA7`R_l\_W]Z08([5@a"ZA-j3mk[]PMZ`$f3(;^Fr./Ib%d@thJMa3=tcLm"V'R:hkKk 7L`oiNn$U('&*q5ng\&(bA+(XWK=[^kEdd+b`-+/W$:t0-AA\Y#m]ZMdg&-n0l2"W#_hMjBC6fhYP@ATY0H>-CB!:$H\(:dsB@b=$R+"Z_*ZFTDkp"TAD9bs.88&8?BG0oA`/6_9:Xfeo3J+[BYcc&Dk!DAhQn/HO&mEGsZ1A1\%+HmZ8AO6`J T!3:Ggj/R4V"?gW2sXh.2G``LIHD`N5lC8-4X4-9nBoZfAH!;Fg(<LATBWW<iHG N;14)WF<AdA*dQ]%#JSJ-^U9I#h=@k\*X)Ij/>mq!EO<j07jU^?0JMt38[PB:3HH)i+,+V#1,UNOs91c-i4A8*8+ec0KBSee(Ye#;o%&ebPaoR4X*eP#lFiL&e=A',3V>!#i%Gc(1ZE05MaV>"b"OT%F[U?Y<ghXN^:[65iD\*&2VNb!d1(aHr9`c@V5DrKa8\rK^W=t*jhp4 )?g^ McaP"d<m3f0[$1Q<=)LDDH8;& ^X^^?RK#=e)rqV^F^lB2@EDpGi77t=tO)GaAXT$=]`@!!L$VL,A*cA\R'XI_18K3WoC6gfpRcM+RAtYQF T4)!FX^JmrM[AbSE#`gZgMM=Wi^\UR06PK&fegH7NfWAr^3>B.to1!4S!WG#g>I-YU"s9\s*H!RTr]jS0Z)4[9ig)'"brRKb[pb7 7M[k8.B]i.*)oHiFnK/Cb.qr*OkY@jc5>^K8g;gaf;Eb %"#?EZM"6[H,7a+s(XFiP)>dd%(lLHTUK#4pZ]&sJOa,&MRZ!$2oGO&=7Rj7R8\pA/p)0a?d6htHH19G)ej6sGfjWsS2@*1^c"$'0LEI5*!X8CdC%j-99XcPs8X+s7H#H06$*4h\^KfW.U$r#Tb+E<b`OTUS0 ^P;h)/?IGb*fCZn.]LA7A^`C#(h`QHQTVCZM-/)VG:j/^Q]40b!jN!o b;e1=06?jb6eL(kR+en:g..fC.1%9?Qs4>G@Vf6sphpDc:A5]9hkD7`ijZd5^00%_N0B$5,RMN7M>Aa;*Y5.F;rFnK;E'):<U&Ks+Z]5>kMST!r\G=<W.@95ZEM#((]-A;9@-fH9R 'W:7Sf?f/1qO! X:G.*C"kA@<ZF[iV_ZnhI!5-dkP3[E-P`lSQ>^DjsGF>!^\4L8>VY4$VJ\WUpegjJb5ArjLWkJ8@W'a#p(VW%7S*YSI;IH@A\O9)Y(`5jb]F )5S?,I,F$./qc@SFmHfnFf!$bW+erR:4Y99,OB;caB.E:G/B>AnN)jF^75Y)Mh'<<\1PSGUta0&WVn>&c]ShG#qb+)fNmE(tX/13]n!'<J-#*1c^feCND=^TI:"ssoO's8GF.C._rA9(202EWB0*r384ahQi,Y6-hA&g1S_1Gt'X0]'OFbi[cF>l:EM7@M9VX_AT$\[IsHA#NQ+0:gZq'@W"\XP,<*tJKl#E$*0O[M1$ii3;CA.>bT8(1pp4+Z&mlV5lspqsJ)?P0eXGmV%CqZ:P9`KJc9TQJDqa_AqVgGKJQW`\<%>&@"2W+Gg:akVgpl1><:,N[K(d3H[;d$L8)!9tn7 >P,YPND1Ij%bJ""!hm!>VK"AoY8[)gG\@ F1^G[m6=5Y]r$knf'G)e20=.Kd;\c*^*;"Ds*O$K/kVOp%PE33M8C8-3]Fs=HH L](7Xi;BBRDW<`p<&^(IXmlpmT#oQtY>:T[?W`Ze^_' %2.93Mt. $`@c`k=h/nPPf\Gl655MMb//13lm<foXJ 8 +AqqQW_!LBF_,,KLLg@bNOSkK(?YSKPWc:+`1L0l4D49UQKlkCB6MeYp@Y@Bdh P9P"WVA@pn/cd\N&LU^96PA?&FZDsM8$R'YAJi_b$c,_# i2g1+BTg: .%6HA]ZZ,U2J8W'Qn!Y7TF+t $m /5R#RCiRY=,07#S:Z\0Xl$4T\\@>fahEaDQ(+47_f6g)I?ok6C3DmAbbj@Erg&S7[eK\[C2-oTtY<`7AU+?tAllfsA9AL^+5!EU?bD ftpGZD(COq/dchiOg;]F7b2-Y1_mcq"-d^ 4d75YdVN9U%AZV:99,YIPrG'a2-Atnt<q.<&-gC0+1*%F70/$kqf8lH1i"9/dIOtnl8cUEAqkc_\lG6BQFc]p+m8](X)i0:9I=8\lJD\r;5et'3ed&6%$g<[M.kCG[ifSimQ%Qf @OD(jJT/aojR\2_jY\U?TI:IL<$V``i+[O%M7kh58B0p_5QUrB[ ]3C11$<phVV^6Ga>!<_^nER.*g\cp, QW=?8AnA(A+eLrOJ9Ea4UeLi6NAWJJD[Ai$+E?>R*o(WHjq1?"+n?`",]k3kX;'^SeI)]2."\9>EqQo2K?^iG)TmRKp?=Q\DZ"__Pf^MW<KFd6MTqG<VL2*p]I8O=,(T\^hf+-WI6El;9Gr"'ZA"p+?\+k]M8lV.Ddm50qO**ffH4*Q,bkBsTdUT=g[4*pF!\ir.jAN\<9>#&+Zpj=/B<Gj8PaFnMW?AfSmXqKWpU1&O`/A@=O`QX+30>11Wa'Pk[-.:pr_1.L9YfmM2NT/X(6-NEnK'Fl>t\__fN- ;baPoO<4E8tNq8UpS.(W8t[_B]oSl/A:& %(Fbi7t55lf3LigGUo$s.I-_=4,^I;^)$d&92Y$_5McBg<Kdq;UQIs` 8^ssWMa@[580862!#5C?S^T6;1cOOnm#(K<P,jn<H(j_/9$@pZF,hZt]7)RL(V=9;`9paOi7%VW63t0j9T].9=\.4\]ePD1HKGBoq 9/#Kk"QWWcoWk4cC@=on8CK`1sjEE[YIW EE6r9)$>`]bD0npl#ILcRXjMdP<&@H8HQ:%W'!p-b@PjasM$c!tKpg`J-d</W!tLM09@5KD1"*:T"+Ahka;eG>J-1sjS5+cAVplC@Cf^<AqsfQ^rEFgjqd_<o/47_mP"mPLk!>F(k%PSj4/Y6h+!:2pXa#55p?s0)oMCTgq+mZdX*%,g:L)MPG`qi(PmY8V=9:DOa]`H\MeX2BUd%GYRWha;j8kkdDkb!o6%.c!^o=L,U/Pnd[Bm35ED] @N&;,!'_laMA8k44iGQlM?S'F1\a[qAlX:$4@Q/^jMojWh1jTBTF@$SDRlP,%"W7X.-RSkeK*KV;:tDILZ5tQUB!%\P.HA5D>m!q,qVD@r1+lOFE<>n*7D0.F`HHhn0q d_0nFK,1*b^^40GoR@1lSKZV&N3FQ(BDcl^B>3!PHCY *E1bHs*Sr[j=BXR-k/6V0#6_R>VYs:VoaBVCNA5,&r#;c#F@A1$tH/V@4HTFTHA>%IJHFV_=g2_Ue;-b?)pM&0BA`(`h,f.XL8U2<F(IX?UbDDV["!#R'\4QmFA9EP\fkE:qE%^(P+ZnT'P4]22'Q$ @$H+C'4S08@G9A)?HTgXJpX&Yf*GnhAJB"7"f3/2j(NrA:C+i)g:]Ss$ TsfFbZ>CB9Pt#]HNdPKsQ"CXQ6MhQ )poA[s&c F"RZq;i!=DE[Xl2MH"DYV`D8<*UcPWP&i dbA[((MNLT>hFpROb'7W9*&m,`%@"40b>aJMl! 1gD&sDRtAd3I2llc41."H37l5N;$hj,qI.M0KO/:Q3.f\hobc1^e?4CTh/HL]9[A)-c d8OZG J>eR#Y/EIhlP`22ce&C-S>c'f=_m<I"\/ABk$a3Z\LI5Y*S:@0L%>S5m39X&(JL0B?>B`4;1`nR$DhTHFQ=*UdSa3:BA63T/D5-Uho >6iZAH.[.q$jVZslOnD)T,=(''GYSAA]t"M+)H>"k8; U4BWgsni\beh.YDfrY(,LqTUA:K.OlE^Q8f8%Fg_+eZFZfn`XqhQ]?%@,X>,nd.V<$]KLbA1k^[M'?,ZNBrEiS7s4to=(bAJ6;O7C/arKE$qk5>2KkO)ic&hPmV,@!Q"2Xi.rZ-i-tT:t^t,V9%rP8I^/nRIR-H^bKP Un)CRl&BYVMc>Qf?tN]8'`,-j"!["F%"/P5:QcTgZVlMXJ']t2A,Y?(lkdTZHnio,ta4J`QQ-Ro;)0[.=D*qSFa!KUsM n.A[VN3FqG:J7%THcciT20Z$-.Og+It']r7]meY3A$`*)UN;Ep9h3hEULe"i<f:6Q3GCQYP#)U(F> a:'^bR"q-J-1\V>CmA2liB.fQ\.>`oNB!l5Af<[7_;5Veg]JS3MUq.t2j19N[kMZIkodDDhXNNl@Lk['\(\#Is_V%M,li?I]V*EI@\sJQWRe6/QH:k<NH3Zgg^W`Y*@-I^_!DUae3?_^V6S=]\'8*Ehc'0E6qLPgL&4X*!DP\n&Uo94>>9[pf^+[C71lGU<@Vh>5Br&3Ss9&,9M?QXKL0Am&*VJAAs>pIUjNE"-/T'@gFoAt"*d;]qj gU-/lRArHsq]5q =UkR6(Rm'(++,o;3[Oo;WM6U;'$2X)/qY?JG+&1Y7;EGl"E%!rk,:]A@j8*]A!<Utcd(TZ7CkEa6_]lJ@9>3'-rBrKlpBjX[&KS[\@0oKa%/@F aGFpV+Ak1$@"YBk/,e-Fh"S@JP]IX[@ZRCkVb9[_ks`jDFpC26A\>A"lg.q_q/?BVN(PrBgJ.(RG<if(tY#M47G<m&TE>YArD'Sa.1 <kh?VXr')f3&=BXS?SRJH@tbLbb+!V_NE'DT=AAq S9hAOSj?LO$PY#*;+Jt5hW;t%XT@Cga[KtT(*4Y]B 4d=*AA)J5.$V`t+(kccX'KAisn.jsO$d4TY.H*^abrt`&UepA`nK/+CEjDt,FM>UAC]P=_1_Qs6%bm$UgJ)..gWeGilHJSqjhYAd+'8jYZ)[YelNG2%T5F#."W:S; m_Jm`#) E';U(]\\hosFM&ib[@OdZj,mdF-MHs"mI"0]JST6n=e>s^]>*A"P/a)#n+t9,V-aI3Djm(FQ70R4E:g@CJ##3IgOW!qe:hNGW.m`0._f":9&ZmoaYX`e@*eC9isRL^iesY#</Nc55Znl0_/+tVD:9"bo#qrmLf?m!C7KP:3q8P+39sjn !ENR_%]%P4$T)?,6D,PSnpJtC+AE]IVb)+=4Z9KokDLA;]X]``a!Y7gD@O#<YWR?MCQRH?)5++^6fOH(ZcB<FAmNo.][>gjoFR0K?$!\Xl8_11k&;+!%V/QN/;G"g"7]4*BX(.F'#[ET0[b8sO>:A:daV2\OL8nIQ6PVqcVmTFb)qs%$D]-:Am>re,n6>MI,4<W8sYBGhI#KfkloZjZpBXiJ3)^SP_[[`ca8S<MTrf+a9#@;UZG\h6j=o@%1X/8P<([@,B./Vic^#Zjq4\_C#+%_P=]I;R-/S*h16<GPe5,A=<3h"3""+KLG8H*>DZ%;CPf%51m?BcB%"]=snZ9BU9[ X/d8-Vc=tqI&P*pCTrS8=VW2qQ[_o'*'AENb$ac$nTZ^6oMUl>_EH)S(8>Bn6K);0Wr(<Q4-(nR.E@qAn'3m$*4_XB:I15Z4V@%UY5 (MkD4i+HkF&trZ/5)$Y&p8[Z'A5$h">cfhGpI=8& on-C)Re4A%Z9&L*XsAAWH=5:tXD-)<C)ZQb$BZh%Wl< LDp6=U068HIT'3Ced,:M4@Qr>ApKHW;AM5X;dd`R)3<85dG>KD fF+`oDgsgL$knXJn!(`Vs o#5mg=J*@DK<M"'CrspECPY.%t.J0>NeAgTgPEQp[(]me.4H=`:\HnM*j!eg*ZIb+EfU_op"/FWl.i&TI]gU<&aBmh5:/HG7ct`aFABOhS);p$q(M(%<C\X>85[[$X(Ab>=%rAZ^?!>D#kmq[OA;W*^Z*R<XPn^ Ji=k`ZHj6)g`Vpi ^H>#O^Q@]HnV(7T.\@XpomAO!o2fP#nsdcZnIl=%eA*YoA>W?^J+Xt>ZMeAcHLs<gABCAjf9SqT4*[g6j(.^DqC=fecRK32iUcQj^)YSp<MM4H"C1KeAn2r5W`(F_ q=qP#qGKMh2l[K*P k")41NAfM0_7&Pd.c$5['?(kY/_>`D_1JkBtWt>F;06h5#4O[4+p.tC5K)L1D/(0:^d(lmalVL[Elc)cR06B^%J>^s3DhVi^Z<Z6iWL7B`2SPe+q+5]9e2bU&h&2nTag[LV]S9FX:jR8^n%6f5$MTB[bn\sS$3h(5ph,Jce@0lP'hcFhQrChf>o*?C+>T/"J4-6'J%#A(o/?N4*lc5mOfS3N,$F4AfNMj8f)l8p iYFiO@2e"7/nE,GCblomBE7AJ9!p3:AMPme &Y`o_Ork6`XNEMo_otZa2N3h4.+c$!+4dT5C1os+jGG@pom5=sbo+'2TtjigZKr5m/pMP3@/+#%HSt=)SfU\329H^*NA+,J\OAZId;&EP_j'j<#/@a,%r=L'1BPiH+.LgHOA%'%?W+lO"RgJ)e<K=#8?Ybd r>`o.[WPo@$2)GEF1BG5%lZC2N7JCB,L5h!3bIX@AMj5%W2LI%;Zf;fH1`PTIQD'-r@48"V;p$iP3KJ.U!*E!n76L64O(oW7?CV7<8:ZhPPZ\E)AL W@5e%8Oe2a9@BqA;>k%Xq&ocVJb,+UBig5<$7d6P&[ \-oMN(V$L9-Zh:Ad5:BX,MA;DXKIfk/^N*$=Jk.aH`0@J[!j$2=:"n`MBMQ9i7^=3*,1C>(CCb:d>D$E:<SS_sDR#Li'__=0@P:8Adk!@fp #VCV-.7f-oomcijYrlRXn=GJBJYJ22?V%('PY2M*r-WoYMO.^J"ptAmhE:S*D=H&$2HjHj((N9@m"hI0G3:GK!YP?n:\9@* m4eUI9YWUUKmY9h[40oEmd+dR&RNtFKHdC`-$C\.JpW-F1C3b-XX9DpNSTZ+o(Tli.a<?IaY#)InH4d5%DI8/9V8n^ M7l-YLA+3H?er.9P*MsCAl[>=+H^A<j=\5qh!m+C9fA5A!RV]M49;+EL$d(o9^t;K1,7XUWcF R$<gLg"J`c6k=7tBD>p.th9KA]j*FQ%\FkMeNiq9+?D"mZS<[Qi(O'Ra"22/:)']K/@NJ)pTdka:"<Be8apUmBr70W&R=NbQ'G2+%hsSLV9Wo:WfdWR*APjM0`n-nDAtDpWWgB.e>5kfC$/ljl"[[G6A,o(r_eKjHPWiJt0iJ@3FS!^'rcg2:]^t/(6BJ[trtWG+DP,b6;l?K:[]/RDo?>!a%e'*NOcmqj #^3N#A?N^M49AQ%-cZoMAm)a"F2EM3;Aa`_\:D+(c137HS3F-2T7VYJ)U6'Gf_i-NG89'R'hg+GX`j<r:K$VK6I,SdL/giQc$E\Hf[^C%C <e; Y03*L]L-`q;@s/*797rb)s\0j,#WWr.He<8IT,ES-3-Qnbk>k!7"lZo8@^"*Y[\X\lI(pd>-B[5PP<jN1>FK3rC2Zt\[q->#*e"$f,dN$[k5k&V6:C6KI8fNAD_SIW>@!k*o Bf@&m;H<jhQ+U;+gACds(8qTm2#CQ7J?.CWAVq?7Jce5H@(CQ$IX"7$mATFZC@i>r8C]IjVF_#Zc>q'5P*H6iARNP1B&)$oqWLG#en5kT,em!Q"c1J / hZP _b*6-pp-0CNBP#?^K?\&\a:`T1Y.k:hh:eangGB8K"HY?n 5Hg6^8:oo>=8tKoIPkWsZUg<L5jc/AZ,:A$]K%oM@"MBBY=\P6:;V`!to2CFRDeh6No1/R@n$7rI+2!]F!;VpFaY#)f%#4\<-r6CKbfohI+sMZ Gp/"8(4_WJ>SjN,NIY\nhf\S$rl<#WmAf%j8rFg,K4F3`]8$H=8N';0n+D$oGnVNKU.F-Y7r0Hd*&`K7A7E5X2;OMSf9,LO0Wl]h8U/FW_d ?Upf>?XjPaO.iN9:DQKA<r_2fo'eNeeW12L%-Gl_*$0]20q+;&[391ji h dAXOM7)D)=ZiF7;1+JS>&M>t60_t)/;(,>^LK&eIknR/^DW#U/.m13+4a"V?>#ABV.>*^;#k9&^ZC2.sS<K 'Tc ]()h%]%D_AZP?Jri83@.[C=!VJHM[>o:2aH%=iaA;*TdSZ+?NK:O:LS.[&+_?>`W&7Y**P56Xsd-gE3rO_b=qHI"%^]X76o3 Q )2^(Y^@ZsHYJsq@A]&J4l+E]HO=T7p(`Vs#/bAsTCLE2^mdoZR(,.A8pshE(kWn=EtMh?_h2d/=-bUH^F<'q4.f%H;Ia-BY<A?a<A'[^oD]TUFDen7kF'+AS;\4$@QLbK`!!!Al@I*/B`HrFcS;#s6*-Z98Nm91HVMq.N#Wo)8c+[_gTX3RXlX*?iqqKJ\^r8cX\D>A_q0jfH3i=C+jmYk0+CYEhH&&^<k(kMX?7m2#sF2TAD<`(Q07s7S-_%ijjcKYa.H1fY.IH0[!"%k9N98B3"Vl!UI3OpGA>D+0 (X9_NUfNDd.*PIHHhL;pma#bRED'W#D2f!P1^k9,#<32j+ Yk&UMl,tgAG]Q79kf^s1IpK'1b9?P`:agbT!eLS@+IiIHI6asRAAf,`4WaiXtZ+A<BdQIq/%UH2CCiQN%BaDrAc5pa(OZmb5!fBsO>i8 Rdj/D8UgIo6=g7fc`*YoXU*L[>H*lBtQTA)=Z.OA'f-F8:jTsoDYLr?B<OC0djT0Fq4$qR$rFha3?4HTMIL+0EcXa3iL2;3YWgee]qGV^4J*:h",BA\>]/-ns9,F>^<"F(lH4KmOV8I_M_#ioPU#Wi;;2r*h)a#tr[">j-Abb!>13#]!WK53-A368__:9$hC9h7P?tnB.'O4D*9>7/(nU#\pAGQ9'/ N"H<_f.XbTYln786*;mFsQ.0hP9X'27a8047@Qd%E>a^s>L$:M!Ej07sZ[/IOOAiU,;[9FdG%Xpcnh,\:qc3:WS^JBH[S>AR;bM$OTP)2'QU<hK7J3$Di _mK&H`9M)j>o1.7i5Ucl?C#p6^btCI0) qAl#l&]p(00.8W\at&1CUAa)Dj ^^!IY?d#.K20Q\rAhXnj1b;Bm\")io*SSVTd_P*$+>' jQP*#]re`4@FL)M2!i;HYZ_k pN US1gq*%UBX1fpgiM'+7KGXF4o`-RYY9O.; "g<hBOYXQ#E\lSA4_F4[_)OAkM'i@Y4.?n7\Aa?(&FUtSQWc_JiG-'gn4;g7La5`tHQp0h??<$*mN==;oiD'Td4,^48'iF>>`g,Vg?NZ3<V2J'Hq**>kgA90(#Q1aqkD9.MG&4DFnhr/3Fb:T0`GfgoXL T'S$/X4_8nb1I>SY@9E)6?7M)iS>QfQC*;r&lRCG,Kleps"JCo&T003jGAU.(#"]WnmAG^rHh\h>6qcUC#l<P.ga#j-?+e-S:TPQ(3pWD?[4WRWf:g.SUL2ma`h,LOf!<WMR+'P:n@N2a5,ZoV"nG"dGe`Mq8f#6`9nAkq.`d,;18$@6];R5enP&-GL1HbfT>dB4DHa(T$^$*rO5[hlhLS@q@ZAOlaid]-O['(8o3=.8>?gA>jM=tPW'pX!aX#IgNA<X:QG_,/S` Y0ip/k0g-Y;lc&#RKVJi#Chm%2X.-3qJo5=Zn&GSC<4MEo3<Rq]"Yn4_gl&/\l@b,MsmkcVqN+/JU9XB&ESQmGndB^E'+BX1)LXqIn'KCl)poR0I/?9_)[dML\O&QiNg6OWrZHinWK,-V4R(:e=F&\6 \-E@@&R\?n:;on`&T1$]5@@%kNhEd`@gJ>X,@)]!e;Pk^"\-:mbU*gdLFt-CmZ@3W_567]2V.I3ntMIYBe<MWtZUs&Epl_jaFM"AKZR$ij1n8t8c>n5YbQVaAX9] rc.Q#K&gC`Q%b`NaH1FAIe]A0%qlG3WhTE13oHrOs0(A,[X/q6G8VAT.%gk>+>;;Y#B1,1?s]sWa`'/gmT_+Dd+lVGCLskmrf;T]FXDjit@=b.`mC(LIiY mK&YFUAi$Ka(,,JTH!)9p^-NkGm1HlQG/"%r@@@c)>]7TDL*G$_1l]&=_('hJ2VpX&NE7$(etCjPf"nHDiN/%>KM\@e/;8C#LJHBX,XKl0$tKE4.:KL<BOq4Y4#A?#<dFXjopW_C7sj:bWOT.gr[AO:p1p7UbRZTeBF)p.M-J%WF60^LO5h'K5A?JcNm_Q?'<$)MSC"EcFE6F;"f>;DHF52IVY-aAmsZFX_&7=_Lr;VDip[U<K/_&q' W%O:,nqc6iN:ARs.*c2$[SAi2 E^_#D/8K\=f-&' N"J]GrRQlR!;\3",\plfO>A2D36E[P=^GPJC(:N_[?qZjrI_)ttY9rF(F9 #h"(<@k%A8%"@ktM.$)>cSd.1KlK7WkQZr[TQ]MK+rZ35A5il]IMnqMJb-U92HRGsAXbF_&[hAV4]<G)teYA(g)eIo0cNJ@RR!#KmAG+=5hK#.cS4[Z@MGqnB j*=YBV1?Q."K7fI[_D\]^'rBM0NTDt$2dk!X: E$=1Urh:0?$7a9r;`pnq7)M^i^+a:UMp.A_2:_V2JV)Hag`R=<rr[`/EEk[B@KP>02&;Vr;l=Z(I4cG*0f/91;r/1d*QRY//(WV J_tY,EY+_9eaYE>@tGN=[ ;K0#E3OeCP1UfSMH14#P;(A&JCod>`_qB9H!kDG,\GPVr.>*OS?  Bg>,m@0r f7&G<qRfoS>XIsjJ?]cK2?/^#)snGVDjB*hmgik?/SpPL<]$*,HkGbmPJa7Z,H<;l_"-//L$Df25%(g +G`X>HiIa<rqa `R$$\ADIUrCd'K>m< [A%dkdB1856D3P#dGQg1?_a[Q8bnRAmskmAkH=p;?WMKgsGB9HB"YDEZN/=Eb[]C&!+Vp@^lGRH1p$G_FG;O:AA*hGoe=4>6:C)ABX5!;/o2M+X? 1t&>8^FmUO\s.UmMO(>a@mR08HJA4)@dEP2mn`/'&+]k!e8L2Q32*'r,Ad;D?ACnc&*o9p@rEV^D7JG$SZLS1i2q51:sgrDtWXI?4Km1c,NHe&P2rUlhea.f"*o+ksBL<_F\pf+sD`n8](PWH$h/G4df`THCo7-6,&4d,C";%*UFQoWOMWrG#T_a+[dQH&[1,\#!Freo'D1">W)d[=bh6YD/@YURLi]GDU0EX1f!Nj(f'^Kea5K1+UO#f1"O!q,hA`]ior/]BZ(iQd#H_2jj.*kcAtq[Bk@hhCpB.Hb+Ud%@A]NBY,^Uh4^m)?2ORP,C$q#pNBkU6NBB#_YV"_,GeZU-'VSU.RRPn5r3'rm3^mXr*&%$"diWq&[RM$G7(+PjT/plUcS\Q*UA-YWn\4;e),MoMYMXV3Q/r$MoHnhrnpqn/)#InrT8:G\JRA>GRfk@t(FTpr!OcjJ<W6GH6DV\Q@M-3ikN51o?RWO'I)$'Kk3A72P.-iZEJsUW3`S=YYth)=,LLDMiWK!EO4R4kT-&*=^AA#ZPi-74k2H=Bo13;m2.%AGP*cH3?9n=2m-"9D$`f5%>_=K8(,`_Fo<gQL%>U[-A<4@Ip3c'M36V+2EmLU/2sb?Ad9];d>t&_NEGhdbs_<#['6:N;tnY%Uk#-8;t;VmFEms(!&07?`?2"0VR"7Xg%/?A;k>A\,(1,Aj,srR9)%qJd<l,g3s<f.K05L`\<$A]4AHnZNJ<\OM.m[LJRU+);H]_']QV(i$oTOfHDaj<BkZH@mGif$*e@knQlPnq%dhS\S!iLoe$&'_(@lK1gR@C<Qjq8>ji<+M*5M+pU9H"eW?3jrE`apa!;qV0UKIT6R?\TY,a3oWBl9k<pXr;.*r&[MmmQAA%$oLI` GEkfsTPN-%5r,"]B=Y[fd39P`"HnPA7lAGsHW@NP&oN!>34;P49"mtO/RK EP6mMmi9HYi%TG$AslA@=M]cN8A'M>#=-[bGdLh9cOXh1.N)?H_kHo4nH\6II>Lq5'VWI&56#\'%qn,L[EGALMb<q#4nB+Nra<c7]O;((3`G=PrQ*=T>lWhAE\]fTQpVrbO'((nJG.^]=bS]'A3_YL^(HM%V-GZS@"B[UtH1\%)-eN9=<NT=e"V$[N-JMAW4*AfN=N&Tjr#5U6;AE0lAA Y:/hmF"&1\/GoZOC@7T'NWX]r_47d6\g_kjXgt#E)E69NBN9%(5X;7n!L*H:.Fc<lU5#,H,gglb>R:Bn6S+se&9M9:gP81lj*h(8RWj`E\Lq"L2$W/rUCCI:Ylb'2XWA?c&=C8_5/P86_fhg05B<=NLpDcR ;rg' SE8'L%mUI-9Xa**8@6'WJ,TTYjO66V`8A#olMgs$2_b".Q23Ai"nNI"4ECibgbEnr$8OD 4]3b=#;A@G-.VYKM"PKmq0P7,-0eSZgl>=Op60pU6=;A%U'LW4 MI;KR#qa;"ILAqjM000Gkq9KkH+;(:*.!c8<1tjH$A=c@Y./ikk)r;ZV*fJ]<(JA$teH/<J04O=0VcRUXfY&Zed]*E(B?4G_2PA9cAUn%U$\j^AJYc1,UA!SkheN.Ve>'Eg"Pfo"+8<H=Fq)Hijb,J@;E\KKOI>`/TB-r(% l2K'E:_Wf;5t!rcUpA%Fr3#5(\+PV0Jl;;Z'+D''@FS%Sr^Pi'=sGE'&;ATs`;GiaSBTjPkdiEce?k/a6+16dKP.?n5h3SX<hbR+Ms>Oa,c@.48=gqN/!sRpJ5G$)J2Y#.8no8d^:fVo\Q30HaWP1+l/]"K.oG;H_4AE,rd]L'G5(:CgAqFsoC:2DtH94<,D\=!CiYV8d0(j9rt-CaR*$#'pL_kZm????VMfoN?tIlB=cJ>HOVH:$]P-1mHoXXZ"I00Wdq5j]E!)&#S9n=%VV67\@B*9?CjlV>AD:J8/o%PG9[lBV'3)!"]%Z-p, -B#[a9MkZNTQ(V>Oh1+L!q6?]jc()`?20W"6I8HA\%4'q9J1S]rAb`Pas.Ts%7lWog6XQ\ *S6dMc,-Rd^C?\@bIFq` 3jO+o,j-29Wp!mN%e3P8_La[A!*UbM+mhJri`a!$#8=\,J.(->;/%$%L<^MRThi"s%oPQ,=?'4\1;SF3b@/$HeC]P&,(^;Sg0V6ZJ<NGL*Q1g/K$?F FF6R0Q1^e]nX3(g08HgECp[HHH*eG;+K>/O%k_qF:H+!q<)b(]3>^VC(@e,FT1l6!j=Q\"rVSSZjR9N]_<\s*@15N#06gt:J%8%4EFbk<e;HkN(H7g7<G?L%R-1Sek()B\\%#E=E>tD1BZWA`RK/l@K43K#1.W:;jQE)cN1Cp@A?@RM;<lHd)q!oq9[W O5UKpC`#88Aja0i.fn">`%>+]5[oDL;N(+Bitm"Vk^6VJB-[rJ#6#GMH*je^)pM).U9lZGQXE?h?jkXoZ .G:T'E<\3#0apXS(#()fj@^0A8l3S"e?r3E/A2]hbSU\Y%JY$<&Zd)"cHs`jNf_8)*K75EGXaG02T4GY42/?X>#HNEHP?]ntgZ'l=I2CTa"TJ#fELgaMTZ@X/0%?s3%c&#Xd"$Zgo[oG?)?TBSoC9^%"\5)4Ccs$l"k(skSq`+C;D9pCgi$PkmfV,sBPInTf[s) #"q=KbP\lE$Et\pfaepfX@<=qHrj1) E!A2W:oFRZUed;2ZF4V9NqmU$>/e$2h]rHJ2bl.1H61)5bZ@H4I/e?T.3cN=YA3<fpigZ"fJ$$!$n&tQ2N:fO'Gi(CHMe0L2H(Q8M"7Q\<#n?gHFi)# Vk+^pp:rfc`cA<l\T_fUFT<P/5+<LMHET\=@SJqE=R@DMj\gjZ51b^=(mNa .:r)YlhTI-/4nnZ^tJ@=LH@SOOAS4.Hq.2 QseF]ZX?R QdN]`TRjeb5p!IUjr(nte;KaZ8Hh=]>qarbFsQY+;Ms_0/m&d$l-.+SaG#GPR0\K/;H/E9S-9llAZ0Ge&3-[X>B3m[^;$r\NlKb=ZgkVl0P?OrNR(F^^NDQgV0\N_K$8h&.1?QAE/ada%f\"NL&VYpfk_Ah%k.g$VrU%15WYcA"bdAKY<KP:fs9a6d<j\XaGI4i,Ui^e,,si>b@*h/<&O5t` 2dUJD@Ai. [nKs:3.U9iKp4ANWJE<Xft@nm/K5opd>MZN8n?CrqG_Cr/q+h#3L%\)HkT6)OP4o([CsG9@L;-0#f8JNGYFc %o]n@IjLJCg>af8B89D0`mmRsTD6QPP'2EUOdV02/23/07NX]dBAC^CHln(7b&DGV4GdSVE>5MT@:g'<(I%E@Eoih:L"D@)2[rg)3@Ctrb'2()Oe1/7MpO"2A!57c_[-A;*]<ab6$hH_FoFW.%r;S>N_"2&;A/k9=!Ha7BYAq+'1(N;t_DA32ml09.J4RXaI4#NK'=8>H2P8g]9g;_#E'H\7R?1'%l3RUl;WT[i>.YkaKU#1IH4?YI,,CLSHVBVr=S@Xk4TA?%K`q#\YjT$Bq:Sb#U;R;%WZANs+Wf/eWHj*.,ZRi>mh7j$[Sn7m8H_&gH+-!e(Z7TLDOqI;pbJYA,aF<Its&KI5Q?;_E@hONF:Pq(rr`smD9UoHEaqdoj7 qm3G(c+P7Qcm[o&:+LC7]p/GXXH80F33??MYp l_8q5s,)VkZeJ?#s)cq(/fAh"g\n`j$jm;afp.&SqD$&]X,EAK^8D[Ag>MX#t*/ASaW#+)o9gr:/]9>XE_es6dO3RUPQC>]HS%)#b_%[Z^g0rm^q5W>[Y424TcF,mi0<'JU3o_eGcqKE%)Vj8+1MM7HFt5.Z2YcZ<f\ieZ*tWeh5POX]M69eib0s`T`VN-g-)Ai3ac8F%qN(+o Mt0:fTXRJXA'X,45k',JrAi_\RB-mVAS 4/a7A'm/ A./Q$bc/0JQIbsR"9&MEdBsH4IopG:mWt!N`-8kbFXdMNB(6?!^ag!hF"&,*oe@?9ttjm9i&DI2a#()7K>?WW4W*m$U@(O1-"imf_%1kgAVHRJ(:GptA!1id\<;'3mV][Q,bqEk%8 L/[KbsDk\h`pirL5\pp/?to+NK=Q= .s[OHR. 3>*\Yt4=6G5&2U1Oqq+bm8dZEH.Qd_Gc)(Ze;&Zn?<R^f<=.mf-Db]q,dKNX;2F5/dde2"'/QQFLe+qDI`#kP;KiWnG !J:r^IAU/Pcr3aPf:0Zr$Gl']d2&VGS;W1&4-!PaKF]B&RZ#c8tQ>:jC(3^2-W6*m*5:GrPS(JE&#MDIL(Td&3nrl-ge87?mtq )"(3$r_JCWcj'VRmd-24+.j3I4&X5fMb[sntUDWci$*K 3U:[]/YZLn08 %hb6GRFRW2U(p56 /Nq-Z]3r81kDG#p+E'T-Hhq$"5G"e)irQd0J9"&QB`ZffD&5!e]$];IfWsQU?gLS+9U08.4XroA+;s?0-k2d2R8`.m/UlS])l7$J)j`1:I-tffj$DSX)t#U;KkO/P'0^o@Sj+MO^lF!tAs<D\^<;A6`-An;39rpZW#02dl`9^4A^s5A3X(UFH@[Bs1D+V[bg2VIfWcb^@Ltj#OP MW[7DmH41Z$0CIpW%j4eU0A3PgqetLjC,=sD)sYWS#Qg&Hgd4j$oG>>m&%XS'RYdC4Z<1_FY'[H".-;[&NP^ ]2nHOm!^RO:V9GEm'8si<nHJf(X$e8+JhD8+U/"^,CsYRf(!P'ZA$mgPZ:#dg=+gB&<mS>fqpcZ>l6Z1OiJkCGse2B!IL7\YP'cJ_6!CEg.J)fCi <5.UfrRlDY'&""3e`O"?sD7e:YrWai>;a_Bn#fZF)#8h_G5$Bisde?Jomn^@o'1>5LO`NbpW6?NJ!S5'iVQqi1862S_)o7><'O+ p4$/d!dZR(.&iplrrV7Kr@Vi ^G8?P8sn)XZ4<T^qU .j6tQ@a'n(%*?Grc[>)1L`^F/K1Q?`'8lA;DLDDmp5VMbpi+7GOd2$:pD<6%AM(Mh0kg?jD?NBSFW,6L&[PXNo$YgY//Ac[2+A7X7R7ZP#1')sAEN]_A2[K:M9h9lVE#\=;+Do&cnCp?3"'S$0YsF!7Dt><V:!X%lT?orUNR)A4#N:Wr'FMKc7_fD(e1g_hkV^'-<cX'9P=H+a'CV=p/?KR]ADqm->Sa_MIp4BAFOHZBni2f$(1jQ1@C#no]N#j)LV*p6MT_)Ze9rF9ql89QBsGj2>3%2<_@#.W(\G+mcm'+[q'*Oc4a%E/A]MSncGaf;B(',QCGP2eL@%7D+g0%!FSLl]]L*.F;o)qZ@63<&F\).cDE<&2e -(5O<;2G8X5e[j:U]G-5U.WM)5#40mQAUSr)E":a*l7I&W[@*ZlT1ES<N^/Es:#1K"&\+SA@Z=nK.1"Gij5<9$]Kfdf0UHC-!k*_Z;Gjg=V>J3OQZ1@1cL*Ac<]MJd<hGM;pl6A]T\\bX7( Lj',)2ttD'qk!Pk9D:i^GOp`)eUE.KKsD)H]cBi5YJh<itnm&TS2d(/jQLQ+d*DRNs$!LanT  P"$'A R]pOo-3I/#?CC4GPR5GJsO0ijDn8g97>+%.USp+(=CAcI)_hnADV^s-GW6Fm+r,?$S28i^PJ'GsY<>)7<+b$PWq c'jtT#nr#AXVBFX,pcM`%OeGKWT7/!SqaqH9@X57F#JI*FKA_/1:*s&H#XO;-sOOS&G0i`]P"^1jo5W6>$%Bs:HgZ.9,WK3DcQ`W,aP+4:s5AWjM35_1)dks,7`f-VJOsE;D:c)H=7FZ/VC,t'csDfF%/Fp*T<ZFj?a(oN^hn:]s)#:OGSs*$2S$;,>?@ie*VKUWkGTsa<9Ud,l;kR>/7jjs-eH4^j=VF.l@Tl7a,ApLb<HTN>j,?PmL*t37#R)TVNE>9'LjZl^+@ha;WR'X9FjOU*Ot?k+#YE:7G>nW+<AT'8p!TUpZ,+]V>rDPR(L9MJY>ap?'1 A\EZK$bliYn&5&oT<Yl>P!D!K%BS[U!j;b0pY2 L*gBC<m%C\(L=IkV756`'1SsB(H!-k3 *5Cp_??X"'pC+0rtdLQ*BSAV@Bt[tcP?DWT5b9M9X&04:dj]&+9"Z*Y](68fF-,%BL5#V6tDV%:U!+r#q<#KG?*j,nJD\i[d/hM)>lCjlt*&<1Ko`FXB\:*ZbD]9K#`-YKZ&+g5h)F/^=97iE!ApL^rdR?1".l(e)t!h<0lg^;6!4@#1jn\Q<^$LBt\;  8`9V<`g4LC(so`<% sAY*a.P'Y=M>q-C?;k!?knDk!pZ%%$5K`XW,b8H1k9,)sEbWjs4*AC;!&H6fafG:Al,0c,eWQ4>,lDnFSf.DK;*`F7`b$WmhO_ZdOa01Uo#A?,RVD=,@H-%;/\CBD/-Jb")HH!(0XgSnIhK[%b5-/h^?Wq0Q'n!d.NHig]\K`5c"X^b"h&t,Pg- W"[X(gqPQF4W/$GtB;%AJ6[#VaHTgV8HNNV2^rKR%R_"MU:Y+-Ms4nB,1#ArtADMSY=\dYXe<h>Q])g\M!2cJg#SPCHqh711ObJk&HV"qQ^od<LfK@:FV'm;$t^k:qE>*Jh2f/+m9;\Q"@IG$0JE/Sis9XS_2T!;K [nL+VWJG!s0&:@klHsX@(f*4R/`sPYR'>8og.[LK-Bb cq+Zt6JFbdaM\n;o,ohqe<mOA$3@5dfO-)pI,e#[QOo.k"Wl2h[Q'jk0[:4p!LVWA.+l\,1cRTL.oogstQ#6:.1=.4)9q92c1]LcaJ-K'n=W!^^Mpg`5/<(6>1r 2p&'i)&bEGE.ftQfZIsRh\C4H=>3M]d5@c+3?F`]MNZeKh:/[(JWbXNa]q`?F4jl8OJEQFI\>#B-t1r?1m_[I= 5:BHcP@3$d+aG"8;Mg#TL4.lT2A"pmGo@a"&nbID9)DCW_SVJeZBCClsPG/03gddPG7D@!A\Y&j5s93d:6kT'LX$Yt7gEP_L?(p.#r=*b-'sc@SE6F[(>4nn(ZoC<8AJ*k@(Ua(mCNt,N@b>qm,o^LQ9W&V^9A5I%Qh;RJ\E+\BQ%IoG(!3GO>l>CAi(a%mmB*\4V9(lAI2J%?7dS^3/b0--0g25foi="!]`r3B`ist5eWDsqF'GNI9q%#TmbQf.L#ReE<pcfAT,ODsQ[38^4 dQC[NUX3P9ZeL!J]asH>ont*o+oebK/OH=B+;*tiAsbQsnUFeLIQ?j]kr1rjM2TWiEbkmP1]eKPmR9/A]t!Te=W<JgQ4Q0/b`'Z2dTo?)_"hmsS0EXLo; Y98sYA;nh[NAKRd;0gbtB/A43^d6"IoRjt;5&j>>9A57.dQP^mn2Vob'5jY,5orT*p5*`'@'^GEG[C`A-saa<Y)pjZ"O++=,Y?BH_sB-[>a#cQUo^#>i+4H6<B!1QeG]PBn;8jSNcNlROM#Q2VJGS)E\":::,=0,SBCbO6QMNB.6FlAD"Bc!&H]M=f/>tEkHi4@6(]#W.HQT0FQ0IL%=-(!r9^!k2MWXTN-dt^BU/'"0f4tZ>gQ^4/6>3:kb!8h <NN2@l!ke8s,L*i$bemn\bX?h7&Hl(1ZC>gZ#`[kD7QBPK8AH9/loBF`d+&(.72#=JC!egf 95%>9#IF]0.T-&Y%IUD+tLR1:C\&R!rZ9Uf2>LjOMn%Xn; YMQ5C[f(UhZ3nAb,CO7LW7$^!o,bB5VRhSt"i4i::S=7J5X[ .Rp!-E5#FQN;+qI]7,R(:SX1%qCWK,m\9="cesMOMHp$pS1T0 \C^,?Jt;_Mm4]=i1X<C/\!][_>CD!spSN?1KInk`qiFiWF.]NS(HN]_bh:VgO7'\etNMBrm,/4>&o`W+tf4 -FUmm5\r3[ALm9[dUJ').^8);Y^`3P'A^iVS<t ^r_.4hA5Gb3L"oK2-X0CK?l0&@(O\_RZ+@__a_MCgFHIh>jaXGN/sQhOITrQaU"p&6?$4!q6CE)>Glm2pGe-)AX@4V,XDT $`)7npm8=e%*!>2FF^aXQYV_[2d5C7I_-[j]DE^\J#Q&AMW!$W]G3+N,.\?h>%o0s0o\gqVHL:%N]iL=]9,j(m/Ap5moYVK^T"Sc(\^qk1pe33N=`j(<*V:b,(#h;6rS8iq1A)RBW@!G7O&V]l9?B;Mm+8<-fWe]Zo5d%VXW\h9a4%4o`NKq0B/n<Qqg>]i1@%9GQ^2^Q5k*.$=LJQ8kXREg(8RK8c#.^FYVT@_$.N,j'sOiLfPX4ePXH;)c3jd-[9Te2f;dqhqs=S1Xcl&KmS%I(;Nrp,*7Z58NA/4OXlQ?[%3.2co(`#KCT;3SJejOR')!?]^^1^-UYY/.8 823gU]>h=#BjfAn=*&mDcSKpPsL(G4KgA.5%@acdimWp?ef:eiQ*@X)Z)MZ-pe72V)P]e l-A!=/Z<%80KA5*$0F@:Tt%qDNs4^e.Z]CFA^S"JhaB7r?A-n=otK*Vi#)<58lo/R4l).aDAeLSFsno`1Z#P3t2GC3FAal78/hoK,>'/'Z>h`:8[-`^7G-#Q7d.Vp.O^b-\#E:q86[UP@32gn-R4$-dN'48YiPh=Wj/H.K[^>0e],)7j6tnNq=G9(lHZd=*24"@WP!\.rC_R3V>W f0CF;SKZTE1ZgZc?$p&`.eE]:5^?<`]T")RtQJiXFI%U$Y]+cc[ 33SM^_RGC<;&B^XnoL>"4g)6RaHjX:)!P%EA_91FCViV<?f`Mp+$9Q'@=01Ct*#SLa.Nm3aJ#E/iHq1+[%F0!VN91T[02@_*^D^ng:#qUmANIgE7S)_,@0RGs^n$asRjL"/[_dQ;WB(D@i]m0lDbUF4HEd4pkdbEO-I@W&S0#J-G;R%`S-!BSR3'MP*H(Y]#kOg_4<>7)"lR3HYXWpet\#r>+f`X&g[tAHI9iZ+RB*!4/jP:Wn?`*A5Y$b!eWe_[Z$M\<`@OQm4&(RWRNg4<Q-K5Xk67/??eG+CsL^`(#GWOqedc:](f HK9J\R>@k^D(KhZ.*?K#=On8L5sGd?::5C67$Aa[.t)9S\1"(id(R)-O5 GIcCO;05;l4;MQ4)K^-i;UHS ^Y2]!ac8r=K9#i0(YVENL_>WO`dk'?[m0AQOSqX_UDGWBkhS,.@W)J6s0aAdj3Tk>I' $ghFc!V[+,SS!:sAIg*lao;?1Ule(YLR*M5hgS0sRY-ULD%8"6"Y*CFA(V6hW%KE\=V2D%:,63r^g08WZV:OD'?-pdNq7Xs i$aSa^,'saNZ.?M+g!YO(Qs]>N?IUY?TSA)=5QmS!@%U6W!MQ#Q3rS[tnb._ab&BM,OnhAE$QlJXT*H3MH$jKa.1sV+aEY5p:[5LgFE[+n01)l/B6iA'4kB6NV!#.,^LAK]r9Yi?mG?VoM9RkW6j96cnWCLG`4EGS+b)'_!4tAfYJN)H,'[:^'7G02\eEZVFkL^b1C5V<N/QILA0JP4N5e7[lRZ!jLY4#!>W5%-HC5 Rb8"E%5!fJ#@l51_4a+j>&\36@h;AW;GpNcg)QVBS:SJn.CE*(5p'FqT_fe$8=ILSaA]KqU-'S-51i*AQU5d\m<5'VZt_nJFYYPa$h1N<aOY7$A=DAQ`pQ>WY^[2Pn8rm[^A$K5!86p8g@_m@i6oAIE4ScABg2^@1#5c&V$G%b6qXMEWFP=hZ1I4@2,Z9OE6AjkPDrgAWXS!Qk]M<*%H0ck/5Q\[B/%)R`\]%?/8K-\VM3NF$W1s@Dp=6+bk#H2KV`b989I@RUiQ2[\5LJkcA#MD/ah$-g4GFC2&/>F][OmO0nT'ATVfl+JtK?5OeOlmXOsmW_]2:a-*#!EDefH(RA&d3hBVH51b`JNNcZjFmZW8LhhCfRdsX_;[LPk0^Amr'Y]MaFM>&"Ah@5oag&U>0sgOh4mqCk96t-5CDAAIrtBjMt6!'K(j/!Y (h/'9m3N8:?B".D<&37kX3Vd?kdMId!r2N VO :#/M9pebF+)s8_`k-jZ KhD<2Qi; ]"&.X8Yh=`_iN84L^>.,okJOs#e\:V9)_As;W7&fsW\9M9A?bpeq4[BAJj)^GanF;dRBATt!MoskAbDbjmkS7)(,J#<3n-$hfAM lP\F0Go-'khS`KU^>%d>-ROR%t?Jst90nsR3`9OO+mE6X\japPR"54,(bhMjc$";$h-e_H5=tp,[YicH^1Y`<AXO_"0M`/Mda?f4A2.oYt0CKf]+2D$h@C<>#K5%o%)D>QD:  scf`r2dgX">cHlTH:>O@ZHq=r1MS^$gGN'Q'_MHD5n%7m9At6WGIAXS'%V*C%I(Hc@=aKUe]sWo LZG9-<nfnSKC.$E-4H RAi9N)C]jMJ]]n713<10-g^4@GNOiKK'M;3dM%Zgns9dALe!S_;b-N7\_V6-b ]Z:=+idPs8X.[G/6NRd/i$760^(&)m8U:sq/4TX#[Xf(<Oc[[%aip8`-\7$[o[(]V]AKF[4"T*h#4KapX^t(X(<?A./%YC)@F66Q&R<U7kl"G;"OCU:G;5bYh(Y31:N=F\]eaJBW0&'U3t3N+=b$$4Q*i`%Q?GA6Q qf0#0,: blqbON(T+J0$D<aD?;-%#`'Qc+bh.7ppWMO@a#^$l^+#Jq[B7"kYcrpXURd#0tV!KA^@bn@'!nEW=i&o .-Hm[.B:Y&q:dT+Jd)4!/:Hqa1R;P"q- s/a8#:BWc$^ VO2_\aXPY/p[<@oIPZ.m_&A+>?USAg,kG:bZNZ\<GShNa<t)&ROnCA1S )RZ4@VQ<`6'(RA>Q2Z@-aM^l5CFCQKa%(M=APehR>Q;-8-0P/!-'q 3#apC":a*D'E*a9[*!Q^"l-Bf=@@Llb6AtdX@D]E)T@rUe^+CUqm:o'']Tc>hSVnI0*mTmJ@r5`k9@Fk`R)2 ?`!FIV[Km(<W:a`+GdRnS^/q]o<>Ps)aAdN?*,Qk!,[^72@"0Fc!?'pr2jVr;W,Sc6>C*Ttp33,+@[p,/0^N]>b")p*3^c:p1UULHW'`Be"Q]%:>>!lJb:/f`j-Gisba?UA#G)FA^tE[=KQFMt-s-NVI\03s>h;`@E-D6t_6L @ Hq(Yf[.O(@;"<em,i[#LGKDo>R2i)7l/>4_`_NaT19i26)Jr_+d_$s X:\&;O%@[( :%Z-,$!9Ee@r5MHL6G8&?^!Adb]e@oD+9ghjPrk8-A&1KfVNA+1Yf1;04dqhb-<>5[#LJU#;t1K/!e;]$c_eMG0s+F%Y'6$A/5GJ;U])jA/JK4Si03G$`^7<RL&jVLMFT<-ZXTDbDX3ld1)J1Cbhh^/B\_ErP#'X)h#l2f4M6tND7o2H I1,[N6(Tp3Z=eZOL(CjFp$:kqAnLJ9,LGG>A0J@g10a;Z*B3IjG4@@R$G&oYI0W=!m6CaZ96WZSC7"=QM=FKpoGA)m`Md7:.amAMa5BToXgk@PAYXElF[]A@U\>AAU]t>MALHRkqRZ<(*o8coNQks[i(rlXl1>/#Nn2`GSaAE=ab>6Rt_` +=p'e9f#9QVU[#UgLV7IM*&6lRf8(.'-DNK>ZTA;/hkV`1&k+A8n9!6JO(3fb_;O3.[ QX4+o^09RMK0-'bi']\J\g+#04UmYei)g]%=#-ZG&PYQbY34(8D$6Q!PKT$+U2CrpR"[K6,\XAL'El-h&TJ%VJ'-qsL=qVdGNJo`V0bn[)oeX7S"qqLl50T=h*(d]Y<Y8VSSdiF5RH('QbC$Bf=O"D67NT7305XY\ h:D3X,]a0/V\MCg7T)g1dsbWM0GtOtk,;$3+aorA_K?1fY$qajObBWn#$1s?ht@SKDj"mt5niIY 3Y-o/CU)9sWM]_G.8pk?P"3S:B<@$PdEFpqD;#,+:T[K7"'ABO%bFMoe)8H!AK]$$)ljk)'pMCI=)J'mo!5>o@@C)+)(6QDJ_[O&I=[:(O6ABIPAg"jFg+gm0=kl,GMtT<#L@<Q]7Dr\'SEZo> !sjU%S85O.iG`1SptR!Bks[AQ':h,\FM_#p69ZCI:VR6M1M/?ASYkm \ng;kEZ"<+31"U@(`*ar^?jd&M5Aie`T.RNs2$H;0BZqep.33K $CsM-4)9Af16*)TE>rZ+5b0;-"' &edIKN(`N7A8)8qsrW>)_s%d4f3o)lsG9jMBG ;1nS^#QE#YkA?,R6R>JfK=%&j]0*(&6p3icNN$h.:P1_t=!00#0l!SXlAPP?>03)\99)GUBkPlAWf`6&?@!l.BZqq8D n6sCeXg%M:EK2`%m1C$_kF+PW%IS@.%9s/CF(Og_:hT5 MJR6W<-:S99' d!:PgHA=.RG6-bUAcd1.5eY7&g]Ca1,;U?XLD]J)\l\rkG=Q4ML#9;HD$> i:;On'i:k4G:%F_6i[FG'2V<>k?^b6.lF;leO!G<Z-8O#6C._b409et0Kj5+R'>N>`T]$\mH.J9*mdF^0kNC:24 !5(S<Yp-EAT\_FUF(H n0ZD*M#Z' /.kCt)0V7Z/c]O3Uc&s:3r9hrb;Z,1@i]1SXUBH31IG0TC*=j!LiqoAPG;seVIL,qk`!TUl6f`n=R]YGQA>@X[AJ7 Q2h[K:1^Ab*J"56tm<F/d)&@'B/5l_TWcaVrsH@:fBV ?@,k*A[A$;=.%cI/LjP`%q2ERL,Y&"MX&tP"PP]H7M]Sq92W1r4A>B%7$Rln"q&[h&=,BYh_At:?asAr#-fM)n]lK@%lA)h=%.%-X+LM8b=K9`6&<oH-4n=2MKM.GK,2-<i:#U3cl$9`$j?go'q<H1PirCsT]NA"&O!@./N\S71$T?<Gg@Z[pLsh6fn/46s?PZGT&  sVC/ln3O'Y@ Cq3jnT,3RP^+UQVLUWcL,mQhb2CMk?X3dHB$W4$0:,e89_Ith/_BH!!e_+BZVLE_CaN(%+#)2TTG'XgiVDP78AX*qS]'XFs"_Cs.lJp%J.7)dI?MIQHhBI#!]`cW-*bXoR[Z%d^/;3p! Rkhk:h70^!LF>;$0<iZm8b@KX)5^%hN2fC6'"Hs+e2ij=`;RHdXch*aMf*;;X-Fs$_)C$+*Gbb5rYOtpcOX0("e=j[O$D4P[Z=) q?4;)&l]I; B,=gj=/DlS(7tBs(a\dlM6E=[" A&/G^`")L*M^Gt=m"/CSJkht5$eY4I/(Ar+-gAqSD9Er<o8r;hYj#@rA:H*W@SAi-ApE-;K.V&Sc;LC?1Tq[0%@Aagb11@</ lQ0_2aaXcQf?0aT,;Y$iqdWe`>D,5X$QHS`hNP3m9tZN=s#:5kd6!Tc=&LW7br/$?6YN@L0E4h/Y&:DeAB64,D!osg%\Ij0A W(0A:QVGh*ne^n$m%K0tPW969Gqf85jH[*=2;8V%gpHV3KH'bqZj#i]QImc!'!rKVP5AP6l1K9^T:&DmQla*='?X1SgmA>;@'>K!n7mL%]]L+L_)NE*c36S6pRk.&P,#AFhISXq1d:(E@)ltEIq2Ik&KN[.<r%g]Q\-FiNh/1'$/EfYT1P5n=#9[AEJZK;pMZ$D<gj;F[!q^MOT\MIjM9JWkR8Qt0(4flaaE.t\Or^!pR*hS?AP(IG-H--$XOm?TE<H7V_UWJA@aEX`I3'H)@b!#obCq`4b!8_XIMlshUMAW*R'+,M9mfI)jF[1H"dA^AJM]#fXN$Af3F6"a9]`.!FW8h<gk;nliho6mfgYmBs`(r=@9Bl%&/STZhMnNkqA4jX=LjB5aN;a:(pU[@e>Ln(AH\qqX/[87\(P]rM3Q[F 8hE:![%M/*2V3U.Ncn$8eT20-@NA*RNt%p_-"W]/fsC(Nop\Am"f.VW[0,jQfLCPm#XBBE2U^sV]<H9&NTO0^gG8 M$'Lb2XLO,+Lc7+pgAVV\NO/=@:$5ACqg3$_krG^q:(KJ;bRD-[`/`$%P,ipR*5Ns+f@SdO?o41O6gPbKd33[NQH%;0S;d(-R@ P<_;.> GasoT^9Q (HDl.MMKbU,fNR>.[N28U;d>Q<NcS*c!1Aka&Y@rX0abd\tHKDEVgKo5dBfS#qgsSll_;)EFE.c(/0s+?<0,m^76Keqie5]oH(KXX6NsbAlBUleIO?J6?a,$:j$!j6"HNP&$K\o\AfDK1\F@Ie,"AdK7=Jg16bo*#^KIm$`A],19K@*J3_b.j:Db 1 QAn<Lg-ADSI12S;,7F,EX#/b/D(',e8=sCVAP)nVQX2(Z2o5K<g"Kj1]I4A6[d7M+!*_gP@gog$X7e*3:2h'gMc3K;0>Heeg?RrMJ5diRlXW4OdOO'Y<sO33AnBs2ldD1]`67W _`^/#+5(aC4YCA@lh?& ^``Ab<kk=apN&1l!:1YgajhalDN)Ek>SL[Tj0KE2k1A;g,+3da@N>X&iR*DVB$hgOrB.0q%iA[/LU!#f-s.1gh/nd,8cK<B0p-.p')jE[X`VR6-2V9*0":](e<g6fHl76l[9+TFDN5P=t;Qk?(tl^XccUe)QT'4^51$*NRh#iW@OC>*6!p7sFhgmi0a*q-g(t]^eOQCrO"-[SH0#0o0Z^pJZXOO`Z9EaV`C?^m#Iog#sYVgm-hfNIBGUR3tebZtKE'aN#Mr<QcE@'<M_<Q/Lr"oCL&>Qo6<1k,s(8#k-p4spe`o#\eUG?<n0!i@$F]M#.N.AVCZ.],UR--X-C`,@C"PUjhK(Q0N[T3k]79*lSX;DFl >- .;tNl>H9tlP)mr3Z$!'o+jX95fDM[t2"1G?ADrG9j7EM0<l/R1G]jl!>,;WB-FpEm$sE[&"::Pnqq3/@H(,bW,f/KJZimq<PPgt_AK\bmbD&DVao2:fV$Bdk3t.K5N\&h:?=sh33e\R2b=9lFS.P10#K.k(VeKncUo%/:m[L3f+)&8,fcf_k<9R[*K=[Q<nX,^UYSeUOG1dTB2,)-ne.LXMrB9#N<smqQ),mFIpR`gC6ct73F)hpY8N.bhVGhfXb&DJR9b-[" \sg`Dqf4a`mH7c1em3m<1Pl4KX9_`cg)b8jcVAXDIQ]dtH<`3^n\?M?,e)]P+RV4`A*CAN*tdEE2^ffnrZgAKXb"'@K'J dX?)Ka 2.>(WYlJ"eRMO`TXOpSYM6-Ob&d6S+Sf&+!Yg]4+A=qH5S)3d7*\mdiP?Amt?[ANU>OW#L8teRfSZ[^67<[f: _tX'AEHnAE[W.oCg8a$Pt_g`'hUe9L]R)93.*,M<X0R&t@#q\qkOhcn23?on@ZHTU-;\qS@%<;P:?h>W!-2]Z`.hh(;BT)2V/2m(LY&)<Kr;3*d5[DL&?fV[n-OCocEE;@Gs'd_.%,sI__2VpRl*CpYCnVl0l7O4V["'L><[1I">#]<<LW]%L?,[pOC<!` JKt*S65UOW;AVD#.KbR[<q!D&>[nSVMi+"9Nf1>_(KKoG<m^A[ATiW!kZ)F+$1Hoj`EBRBOaE;T>9mT&s&_k\g7%o,qZJDOtRAl[#@\AI&^*<VAE49^JjXON0(7pqP%`,!Pbo>fm!No$e7*4r+i^E^T<k>s/=osO'Q.<t')"5*1/D3Ng+c!^PeoFI?PIX'k1!?]NeMC#AGT"GqEZBf'HB2U)?#j<$%WZcl389349(Rin)]>`OSr_Y,L0TdQO!Gt#A)+2t^X?Li6\p+PB-4A(eI4$G<G2KGQCFMGB`8ae;T.@a?S>BrC47;&FdG2AB.#Mf-_fP#W@ro;\jcEr0/ct12[+N%<TWbK ,n &m!ZBKtjXU]f?C7\lVc[Q/PRQD#jDUU6<\@9Do%9S'n1cC3E#<*&^lW:VMc7%mA>="D"UF\qhD3nJCm ptMaZ!-bS2:;0P>&[T]k]a$b-3XT\-'P=KL]A%Xh70nX:Uaff`i#Pgf,edW'_GKg<gcCaiTOTpt/Te5T81ALM\++"$7jOIBZ@GZ@J1@d_UKg0o?[&'U:Y@4D")CUMik)6'Ob="2E@5\8mOs;$4SB/49L+hD)J;m_dSZl0.JB`=tM^bg4m?VN.n5o&bh@hR1&.2LP$Lb?gRk "c?"[gQ/f(d+tJO9O flH_$\84^ +T&5TFSD9B#ae>7)g5gYt_,9\L]>go,jr!tgjAOlRTI"3DnSX(mtXKlKgA9bD35!>>*1_6/"@)NkVS%mKFfHmqZ7`.LBR;,p=_Q^D63lt\Z("HjpNb\4^0<m%JoPS:ST9?D9YciCmG2iS5Zg<02U*Ai?nLJ76">-<L9\PU Pk?V7NZ'd]t-AZ'dlO+>U0cth)+ZG"<2g;Xc.n]L$btADVq.e"VWSL1rV>=4C=0;o8:9to5FBNO,nAm^Dh3fR1j,!M2*\*;0e(C_i,km\PAn/fJ_^5nfOMk<WIBXL);:7L3SGnnT5S]U%jo"U-,@kPHO$HN]/q:QQ:2X\Y[VBACe&4[=*FT+)Q,Vsb`6obVQ*$r$[@t-p?"I !6g6aJ% `Z@4Goep^#q!_]F?P%>8=>,d;!ZB(#TKmVTo>;U\Ckq5Y>[/b-JPf7L@tL#d6'&NBV)f],\5I-S:#ASCGF!XI3BH^=breg"m8lAAbV0k_BSC2BZQ:U5"C0Jo1GGd`1gTH&N,IhHff.UnfZTB_WfS2Zn.Gqlnj7sZS?L%R_S8m+P)f#BZ,.]jj9;Al#9I";l:4Z2-IMIZl\]4KFmiq=(t1N&BA8L[H0r[Wl; ++?AU3o.A6T)cjD()7_99M"mVd.S#"LIoicsog^EW&k?V*X_Y?j-)4AT?Jr^58IJ:!p2G/q;iNrQXTMOF=JOBfL:ZBlh"L0"PTK5Q`1p\sK0Ne9Jn[I@ P&/e<:,>J<j%XEU<-@Xbc:f(qMJ 1BQFad,.,p44t5/5r)Vq=c5(>!0k0iVd( -oVhY$&PS(>6#6D<Lr(322AeR`1Z*?O7WNHJW&_CHKa<5*h9@tn$GWmW1 F*:'A`,%sni`_trc;RL-M0soZs9N1oo7X%'D;G$;AeTt(5dm96<24-35clAp1</D+DBm6`#n>0R?@"/G;cdJJZ'kpIYjE0^W;XF)@6)ebFR5 D$<WN,Fch3(1j? <0DW?a674XLcm/TTJkg(ScO[?2nlkA6iin !4D"iL!/W.>i_h?4'XgH)kK9].eX,I+<KN?b#7CWVi/8a4R/a(4n>d 5@IUTA#m/_>^LdkKsCGg:6%?`CO-*2AhY=cAfQE:jq/LUfKS%Oe_%Ac2571+OS^:q\+JMM#DTiK$?qs2qAD?fp6Q'!4H*<07)Q`Qq/1++o)VCNW ";j<S&+-[ois:kC)MW,Ba'35Yoh1hR#"JlLPpPTXZ@Mr:fW:<S[T)tin[%D6V*KYcI=!;Y]AKQ&o]%Hl(s(E*6A#q@%S8Wdt]Ff\q9p6FEa\^GSZQ dSk`aRn!` :,\='EGl/n[+,6BK3J9OZWbV'q9&1'3;FmW`QK'?%mGGOIkX]F6\jDnTN!n=:2WnA%$?J]#P(@M97go#PRJI<sj3/aQqmt$Hi!!qKr6;?`3XP0bek6AK=q\$I,&^sNafelHaHCA]U?rX8)'P2qYUC:#I7>PMcajPaiR,"+a_3$A%YA]j5SdVR**sM9K!(V/G!#>0_l/:*MEAiXIPP&bs6%ea@Z=[;l`TqM1!o+<ca09%AQA dOF:LBY.8W=lki`rAUP0!<bk[LLFREC9P!dq`(=$lVl=Ct\Z$'lHT`EADl)FZDG('S/NZ4J#+<W5t3' VakY/I9^0;R?cc`qQdq*?C9R+3YfPmG_3;O.3QSPA2'q-8HL(m"RgelV)RW@H2!3ZrmX3h0d$<*Yq_P(sD:i,NftXn^C90g9BR!P\)&qNYte7U^BNWS;D6/15o&qtTG-H&bfsc2[oDAV\5N5RKA&[[>7mHg-YD?3m%1GS00r<P5t_Y3+jVHRR-*RLOCFA:="StiBqqsoI0fGl!CV]PeACc.%SA"gn%jmS/Fmiqq&3=X!NUBc]E%k!5nZaJ)VVX;9B+pI2fO7Fk!"Afkr05Bg&-_A<J9DYp'o8`oHdc;>;IIc<NalI7=M'^EXK Dc&\Q"P \29;7n1G`QS6=n].\*o1t(,">QW1EAK83'=;% a.Q8sA.fk2.Qcdm`,g=$CbdABJ)[&F*n')mgl`Hst,f?QW"`rU(a9([[\2Ikeb&,_"i_"r!E5\rhS6>^EK@J'=L"Lk\"A,VSWrSAki;r<'_nj>'B4%O*TQo<CR6.RE .0IUP_ngW5TZoJ]1dIAFPpgq.m)3Sm,T/j)kVtaIA7DDeF09<\^g1HsjB3jQ!3o+M$:I#"$Y)mBBNJo#Ks#],Yo4AW,l4F1rIegpDd,R<Dd<+R]d.^aApA^WoV,H(DCGGIU$II,4(A5fP;VVbG$C(Yr4$/3ic,QRIZQV`ak,"Rf_N0r))A0T)nAVr#`t$U7l&RdH,pG8g+$L#q_ 'bjF!j<s%^s$_6sII<2)F*`C=LJUsAq"rZC8%'?$DnS%Uj@Q!T*N60URM'o"ZGssBF\@aiQJpc)CM5cgc)O6Sih<!:g<7:gFgTA2bS .')se-8*&EA_ r.l&[0S/XJ\as=/KfV60Ai%,2!O@S5dF@*>1D<"\8 A J;Db)5VXGp.JEDoU&cCGK8:DqAh'DJ-@Q@9QmL9"3Vb6-P!IVl_aXc<WJ@K?a$.4=;K]6t5sE&ePgVc"+6(Wa?1W]]Q?,0/,l\AAA'$XK2,FZ(;ORP5jJ`<I+c9#A`RAKi\Y W9&Z&Ck[XP:[pf3'1Ls]#ALd.C7c nQG" >_Y`6,d<g2L/2j9ZCN@3Rg?UXpDCot0O$Dhnc6P.RX(e.#4_c>4W1#9P-[O^$-$XpP3a5TP9QapQA.3Y,>S\9VE-s%!'-:J3[>@E&RU!B^l`5[/]5NF#E)KN3iJDVli&(^APc=W;C\ts_-A DQI1G&DRaQ["gUk'[.-qf<_?7:DTEOcsA"WZVI!1DA?6jC*3"KF1dik<9ZsM!*!sIW9A]?1A3H<dr8t,XqXSo$;"tT2btf;pV#F $mi@U_#S!/F*)k1_.j090<s2%C gW+THP=kikhtj*?4nO(^_,-jl :[lbl_SlAHn]Xe[A*bGOM>`Ggn."5\R"m^cEO0nP`UXAT^:r@A=GtfQsYK QCrXn=HkrAMhY24e-qFNG/N(E?tFiAS>++fFKXh_MKkGI$_#BhA]fm7W7nL4b-3>dsLfceR=.-644QJa@%SREh[fB%lQ L2203F:Z[re0bL*j_M<nstP<:#;\VKQGLs'U:K]h&N[Vb4kQ&UYN,-D.[0S_cUkC4G1f70%nI%T&[rTG`WL'E`j:Tk.>qpjB.=$=)1F6rVgEehOOA?,8Q/AL@^'f.=D&;AFKtF1!qa38E_e4EY.Ul/.qMA-^'-L;nZ2+k<Pt&-M8'1HpRR De9',k/MIA?q;n:qXk!5bNdlG;"YX@G20Q.(djFLeZR@F)_\9*_BCp.i6smQsIXE>_!s-*Z\f?P&D9e`+T?U;X%EpP)+m_e`WaKK*S:f%.L[9Fsng43neJVmSA5VhlEhYV<4Qk/0$?7?!OIH7/%T+k;h.d?e;,Hp,FMVjL*]ZBAjbHL8e<:)#m HZC<]:3D\!gsl P%%k+#`ep.P@V8@FE;89DnX/oW*/Qleh*]5O=#eQ,h)6^XMds1%Sc?s*DXTj/F" cJ=\WI%pj;dpFa2Dbs0!g-JcCql!(t61`Lgg s3U-4*:f)@SG&dS.P5i$9[T/^ATKIBllJS$Z9-_!Y7[/`<Ao\GJT>QWbd]X9K274$"[1K.<(j;7 h=::Sm_hEn>l;kaZAnVtEV/C*f^n&At1FDY4nqJ=f=( Jnro]cA&UqH`M+Id@9h7ABJ)2&6%@#bbRJG5reK9l3ndDB]KoBnB;)/t 7QPTpk@6g(?q,eF'"rBXXI_-LqfA/cYARq0Ot?ANt95D3*f>1e'#2o*D^->`HJ(@q5E ZE%&hM'okp0R\*\MAAMoAMje-0SAU)%$\&bJ]49!njTfPEA*?AS`%2ecd)A>j'@S(Sl<W?$G-\e>8:@@?!]`;6o,$k#J,LI`T?.; DaUU9)#^nCkr,-I'/*g>QJ:O<!$Mp0#,ZU6jADjA+_#&8AT'nH pZ,:c`nBrO\QC+E4qCkZ.QgY530>l% [<1KRqcj"TD\'O&Y2<%X0(Am=7o#VXg[h9Y"@1tV5&#@--Sr.(QU.0nf]P,4MRAl7\_H7-f0 \M/l.UUg\t/jI:'Zs!r'a%^o[k8*/hA0g&Ht6L(^A6Z*l2HK$1*PAZCN5fM(G^nT\V^O";<Rt404c #tp_FVs^LleG+8!(Cn=qX<_Uk0"UClC%'`m@PrpI6jjGbBcrj9qN!#\"TWdoI-S83tjGV7B7?G8l<M:eId1JITBn\o9`$K!#/iAFG4GA/?a$`Ai'G,<7_C_fRWq`CK0S1;8IZ2OsS(?L%dABGaJ4-H'gOAB%OiiD,?0RT,cH%!tRnL2RULg(ab^X^Lg'LYXXo-'I":3*\L38B;BZH4D.Kjb`T,1$!(.3nD&geq>oobZb>;#1WeTQdB;9%t%E9PtXBsN'QkjAi_CK<1*do1HS$lVpatOaAWH4<pgIt]>`.*)7mP%gFIAo:A37TFF?Deh)B-PF)QP<'8p>A-D)\GLG+o_>+O*YepW=P[b]n++Sbn)0J?@ehKoD?VSmHiK++E\;$,#?,j#Ks2a!c3_R=K-DJ7.N,8aJ(gIfsX3c2)r]W)=@e:!-CDW`AEM-UBa7/MCc\GVGa"C+pN=B6Tc)b-jcR)?`?ljG1'4XU/7j#qFqg8><qtKJnQ0f%JsU=-b)&P>@MmXD;,%mni&W6U-9%.#A#J1)j6S:qe:7HNrN9f00@"=@g+o'=bA(LB(#M2Q0#(15*,#hI=0ei7nsbYW?rl0Jh2_'m9.CLpb2f^DLI4'h;kDoen2D%[njMd*]Brq',GS%4Ti'&lri]L[^1,llHKBI#LA_]"5F,^ .G&,@/ATTj67<&QA;A\[C5bKT>p$*d"-I?X+RFd=Pcm8WOk-O(+j[0inG64`nWU)>UX2K+8r9]8s)NXL'5L)Tkn/i>P\UKVb H-#/$Rk`J%S<Psi0%O-NnsM1Oji&rEJ AH8Ie*Anj;:/?aPA?,q+"rGam:f^@#Yb>ma#PO/=H+gBY"1PWQ]-$?O/Xn"k09lk-i+t$&aEV!:tgY?5>k?Q"f9#HmnZK!Tt$5Yck7V3c?ngJ7sn4L8'kW[U7CVAjhCb`F/Q<RU*3?kSQO83c!G]=76=C6OENoL"J>q/6rP6-eIQ[RNfOihrr%[ta3RXVhh2Nj4A2Wd&<;sYQZXpo+4Qgaocf]b 34B;59\?%Zp_8TBbO/`4g2lAm'H/2%9/;eP<peJ]:)M'fXA(+Eg^cAU/Js6CN_!+1a'\8nW=XQ6T%"^)&U >-0.U`[,SOYJ:SVE][itH,RW"PbZ!MgHV4%[&-9LQS^O\C?B_YL%W r1/\2l`r5r-eTKc7:jRFI[3k(Bdbk5$3E'NGeg#!Y),<%'`Q+$Zh>N! ?K0:2:H`P`H1mq9kG+',b]^`-TJ6!VDE kXq7ODPC'db<HTc8Y \?'3<nWDGj46c%C[=8_PPcC:H@aUJQ@jc,/e5i)MRWBH) 0] jf3\+UfB'Ks#WP"QB0i6g0Upn(Q-a:n)^^o\sh<eGA^24 "`@[8;.F6FtXr\N=5bKpt!>?CLLWB<58:Aa3G$!YP9>FaE6>YRi08]PTC*GQgeXpnS9djJ\/8B6\i^40"ZC=e[O:-^5'F#3B^MlD(j,SCA\OLt0@bK:_6]i^3/QrapY0OcsfO4F-h(n\FqE5JT[?s?qF._HG JiHBZ`;*b#m]=(2%96l#.!rYe4((6K>DN;40gp@=iV_4=@33s=!+%_Q"N.7W)Hb[_/Kfh_gAKBL*NtJ-_!U(ms5KnL`.37@`C"sO-R#rNf25)WKiB`CM'7FJ,!b9#&+:J-6pb52+F[XBQN4WZG1fJS!Z*s,JmA6[KV`g+q6pq4EAc*5!WA80f_Q[>0]2*[tA<G$Aci\tYO%Z?37[Xl-8)9(<'F7r'lO"^*"rf#h1Vi#6=TtDmi0@#5D<ebV8SZE/S9Tc*,b4e"ODGFVLO8G=bO((lg##k$-8A<9-VYbi6Ai"OJ/Ec9qc!(_P2So@aOB=/jOML8m!:;+\/;LDeA&:JRrA'h/0:$)`grlU5^7#[4)Cl1H3'k/Cs-+dDQ<i'(/9(320V0:NpUH;)Uh0>3?=^Am`GiK"R:N7*]<"c4# ;gZsp:3<69dbiHc7CG=Gr1Kgr(rt$,e7;.(oA3C1AfXY`q6pO0%rB!M+a_AD4Pj46.O2mI@7n/Q<[@,n@t5C':,T?AN:^[P57m(nl+Ud4el*[,M2jn5!(?2'M\S*7n(EK$TqA?THdj*g"?.YM3F'\atVAkckL:E;CKEA0_!dMc3n)h\Or^A'YiLPW&I3=NL.Y+B@tATD6MJV]=j[F8N'W*nA'hWpm(^(,*p.[BYnF84Bk??ZfX7(/i3_Aj=fKl/N&#kIi8dIAM8Q5Z%.Q2A"KfX/or\San76C0)s&Dlc!MY_R+-f4A.H;'$H>os4rf+#>f;'9)t7KAqc4nj+cB9)%]UrV6P\pS abT$k>HB YaIYN]j3r[RM;I&#`T-ADV52bqOo->D'X,3R3:=f/$Le%Q#g7qb)2[]^mJ<7+%N%%!`#A'L!tQ-s?Ri??bX:etWR_)R:."<%g2VUQEe(&'H%/4k0eD,Q%g9+ %O9\0Jam:+d5.aE+<Z-D<9F9`_HI<hK$B9r<]&CT,odGn,&_;2sAL\^CniFnAEn*&8FG9'87D" I0OPOhWIHT<GB%N"An(M6OUjJ>):XrnrDCZ)J1MO&=)5G@<iNYD%8@<GlIoM>`bQS[Hn#E)N_Y$j'^N[&!^N.KL!^YXKH6=JRr?)Qk$_c+N(38A=_BrTSJLh;s].,D^-)U]H!*80l@_XA]<'iCPF$#ZGM'2,JWo=MP'&Y?HlMKd;Q7L<1#U(3f%8"iSNFfh.iFXTSAJQFgYp6\B)[TI)]N\ZNti]8+$OKoF=eI"AhS.VcC?E+7I1IoFV+R`]dJqfrF#@?01]/QVYk!n2aiq3,RWOJ.d!VR&h.RRm5"C1-#hSAI1NdXhq'b.MAP#YF"Zs`R+Uq8tV[KQs!bOlAG35odc0aHh=3qirWA<ON^=YW:_T6+CG;qT(<HF>d"?Z6I^.4lb^XHM"'X4E=[YDbS%I9pR[.J"kY6H,)2^Gk-K9SiUN"o/S-;0_sgoNSsh+kp.GAX=J5,E>\l'$. LGU$=Q$Q..^_Y%gf<X<cAI`=IC+,aGb*3U4Mc3k@gh58D<DZdm(+Doc1<UYo.2a7XCP^0=7Y+=F2s>5ft@6)hX;6SSVD(<tbBW8`MVq:;(/-A91'9P4<Q6ss`87+P$@7]V8ff-kaY!*ib'9>2ES,cA,i9;&9p;U`sirQZ[_n_QP/,lBIKpaEs9=#l+*n=cJ&3bto9DC9UN%ZWiW?l>TE26L`D%lcqQ:U_Cf*5d+3%Il0k9>Y7D[r`#pPm[8,.]EiKIIVY:jI*@tNioeS-plYcaZ3YKc^3rUr8kS$a1:Ulll&Kbcs8a)cCXO.n_/?DKneYMB_AlA"giW'AkkjhA$5#Fqo%4khT_2ABAA^QI 0JT>b/E`r!bNVVXXNG!.*]i!PVfh]MT q@rt@:%d3mG8*qq b<17hcTcU+Rk ]d#.Aj0:Sgh)R^:MN6o[R&2i,+GdVdj-0-QIngWG;N`$DBX]l)K0%n;3C)A6$N:Uqp^=2(XBb!]&AS;Y1-;)IAY(o*3,"JEAmOX O/R`(q>=0P(3`rSP?:`mR3N-#En].K6e/h>Qf6[>WT"*pK0=6cMAUgL/hR=e(%Gg"nED KptIn1S_8P(ab9M?RY#^]G\3s(^qcq-6E_K.]hRDiM"sEU\ UWV\4Q7h;[2V9Z+dj!(E+W/Fl//UFb\`QLN%>YdO90@4O96K;_:M/4)W*Kj2e,QZXo!Xq(l@6<'+L=c_?,B3VA2AS?AfU<CkU%`V8&r'fnT  o4;XCg3cRmNp&XF`B/3F&(kD!Q)b.bi qO+=B8G,d1j@Gq&f9NOA60V4'm1_A!?Q4AXINT%di=,ih8D0Ts/i(!'g4/[/c/hN+d.+aUOOKGDD_\lA%-C8e%OO`91bt=gb<`2U'^K,Ujco)rreIN&b`HHJJ*],A$ 9d'VUI5gSTJmoMaidJlfq$3?+/1N> R`X js9,kLt3$GCS%21rQ9seO!e&@;3AVdl)&3s@HCfAj:H8l,UUE^*b!0Q-AL8l\:^#2+ $KLAh&@C[(Sit(tV27A*6r<X=`>lR=>7>6dM5hHA8AXh](F(==jB"mT&mA],Z#nU(50e\=8lQj[Y3d\N/XQFsHs<bNM/_:Yd+-iY2O_$QG=EBqmg,[LGP[d0cAhd_aXZ]0+TY<K]oVr1+@<?FQ8cjK<b3 ZaTEn8A./T>T4&`tY'*H)m!ZR[$T<V99:HA[%h_>?^Vdp,RI;oJVfKp::cpH:\POOh>7Ye^I1aW_BoEl'B@cj'pk]]3EcShAoPXg7jqHI6!KlVl(kb1"]6W?7c>Gg!,;<l2Z=&@QQ2CACig"q!/F`=8_)*e&Lo(4f%7la3F=trN7i95L2$q.@5t !dO@1adiG7"h:7VA7j5m3R+6_k-6hBOgIi0st[<9b4O1q=HOfJk7"TPdB:0NnUf5hg?HUhOO*[9j\=QH6J!fe/f1F/G=O;A*qHa4\%A6B*oFLtVLhNZ,=k'opTa`ao0,]onfJC"`K,CSp6K50ID$C2'A#,)rQi" `bdXVd^7L@5GZf\['!kXp'Zt$9nfEi6$=&C?/7g2$gr58BRQ=*#j8W+J!*,GO`\`Bh<3gP>m4<]'.XQ[DcUA.9/UnWfWBf`-%DTS&g*O#NsfW9P#Ags_HW'$%0RpUZG&kK45VaCW@;7TSA4,[Zt,,-@b18*@BY< ,1.Z_nlhV;:SXo&TpqJGWb99j^lX^,qY>%dSGtf)M'FgMW,*c27@0]ACL4fH4HH4rejDXr_T@0IA+LW K2nA^0ZTG:[B.s5J`0 ih'!10=[:OtA*W>8Qin#'1K,OrS-,1GT!,5,+2EM("!k9RAD=M`+p";q!S76o79;Ii7g"WD^DOT$k4X7E&-mZj&GfkZa sl:G;(05#jSq1Fm"Ym9q 5K!U.G%_@Eh]=,M(c5G[+:l-/)U,)Sl*%A\$3rW$X;AOXhAX'sf*7DBTi>9skJ%GQiYSk');4L"tMK<\(HVF%E&,coajVoUP^V_T5?-!MIkCnGC-m(2`<f  :ZE/XX1XY0A4U^c,f9qs.m`cpdkX!fH*:og;q@KEW(*enVX&$/Cl^' /\EU+NHe!t+I1#"(-h1$!* Nrg/^XG%AWrVIM]]5AW0i$n.r=#OS:E;gk@>mBGWj7(5T?(9AQ )0tYgAo?&:U=Bm"7ia[?PC>0)_qWWUU>/jP(q)+OWn6LTW \gfa>^kXsO^qQlD33@qAUseAl> "FdoEpAY7jtf1mJNj0=!/sSpBU[Ghs\q4j0abhL,A"f,4U:]21a*5!N$p$&9<Q1Z-8$jrGkd6dK+aY`T8V> ]0A;EOf67e\04b.-+3d].\mAkfdhC=@.ZUgng!9dqF$7R;l7)&lE&mjN$/"E,<GiEZd?i61=hFVp<qPGX(j%-5*,3&g=&A@/m=9Ai,RaZB/R>MAsGAQY<4&AF'[s:lG JT&lO=[ck6$$TQl*B@ViB#gPRaNF:oKs?GHXm$91<\D+J#AScG\fPC_!D:5iHm0QoU3aUL? 3WB>`C]7QB]pQE,B#!]CGCK66p%EG6[8AW@"*Dm<8H2#(:Fgtae4#<t,!W'TBsO,"ns&9&'(a0%.jNX@92"p[_l=r6*A>!&CAV*?!A,>/5j<k@nW9CL 2dD!!.#VUC&X&+Q@&+KMm.#oSInWX/I@`g)4Mh[f P+X4sL,#=rG BAaPKtP)`Tao!aE^_Neqd^_@P1[%haI*`)<.sid4>()QJid19Wap'025k,sB(-1NVt\KAlm;/6lnQ'=$EoDl(A!I^6?0JVOO@t5Xj6a]glpg`Kb$pAVC`$Z`%*t4Sr^+3%CT?H'Q8:_C9q$qeDB2G@&NAN?3"2ct2!R`J`_Rdk<[2?#'4I-&eWNbEcH5O^A<,45kbAJTng5cjY3a$@#"7D>DgbL_oY[>2N<37$)A1o52B\fR mdT>'igh2Ij)VtGBU\6;<?g$APIHf EQd)f%VgQ0 &cdkjm\W@4KrXW09na.=?s?6\fF8f#<A5dDVV:peYQf+2i`FH2l+5VNKe+JM2i>d6C"t`L5eqC[KAaP4XPLQKYB?Dhmo?,Ul3(f]AdVF6E,#4?N;@+d[fAH`GcpAl j %m>5q\/=_HrDnj(S=l)gqNXXt5i3tO<G++Yp&["Ds2GdOLaD%Y2sBA*CF599bLj4b))R(*Z8_Q'4A.AQH0RCA3*(;3i"Rb_.QK&$mp56-qQftE;!`5[P"Kgen1K9$;MKLiqCn]Gqf2r5]OUOsM3krBF2=)d5-*1AWrcB.=cQ1W;g+C@RNYI6k6e3Y&rW6XnlOp\OeD:-Kf1:;2HiN`_97?S(,@I6saUZOCbQ,K!5MY!>l$/3P!5&dINtg7XbOR)ngTV^`f1!#/<A86kXZ,?pIg#5>[-;Jp<RTNAm<5KdL)UHC'0)QMpcX631'k($pk^g?nX3\]GMF\g!:C7Hq\="A61_\obIP)fn@S6LR"SiA//eIY%2on`7*ER_3&nS6\[+?a8i7RC 'nACe9sCGZ0\r+A="S<W,!PAd-AABAk'KW@qrm%FtB.R1hibc*@\W=DqaRY?Hp:(PX[*`N8NBGr! 7T\(:Yc(A5\FN+S$(\7'=Z^_^m;L04$/r1D.*%C`&4.Djr<AU<.0FoGF*+<`Jfqlc%4Y?;=$3T*.Lt%F+J;BR%LD1g[\%"F:Ao7A='QA41,ArGXHZ#9 Yr]DnmUGYqH;Z*A5(n0M&o[@"(hC*Y;H AD_J4"lNU*DbhD^*(M11@4bY\)$G]Nt\FYG;>P?kH;W-QAb*iqI'Zcp@Q\P?$%*qX,Lnj4/YT@1Am[Q':WYY[s-Wm;Y`*n ]cmojAboKS"20Coaf1"(Q08XsBeVUMLN`B]so<]%1n_H]9l\j%4)-A;0%4o7H/:W,^`T.YXmMHjQ64\]M#_NG9q<=Kf;(,=f`l%Fi4YL)/D[Q1lCJ1Vq6kpFhBq$4TAVY%<Y^-53WF9hM9bpa.b p*O4odJkj<!lj_E\^gAq"95Rpb>%Jf$@9VtfOQbhA%%AbJ-$@/Tgf#p9ndpjVhjT:L0e`lJABr5<-&Mo/+m9:.)>SZ*%LXfiJLOT2g)HM,+D[U=7hAO:oLej8=eg7#`TK/@FFm8/l M"oXQAgoEK(]IfTt16t]=Cc9t1RKc+1B9ZHU9B+Xi:j^Mdh;3QkL42'MUp$ke?IdFVP@'>-W[PqLNLQ>P<Tm0gJL0NN2dE3]WANDlOI]IK]R?Z0MA7E_`n!UR<d*>[P8Y-,ZtJ.2rlLo:pb1AXoKt^Q<k/o p"m\I2'A[20^#8Zc%]6hj@_AEY^S2:qA`Y`[g1NCYfh.Qd\(b.6.j(/k2;` _3"c_:?H%CE :Z#< .>l]OTo/5DMrp_DDiAi#Aj0];_#:9LB]2%Fd4ni(*BrD=7D*MfeX"aF*0o]Tb<4mN;!J"N#g.Z<CR$@HhB=/HP'T>'8p>8AAqrY0< d*PTA_9JA6<^^cW(E2g_,.O]B8XR<cQ]fAXEb6=-"W^IKSRoL!I5A?ZYh))#FZoa(ir.?JaCrCl;SQ`5alDo:jO<0Xj[o0^=YhC))"GeL-I.c.0>Hc9 g_1A)f(*o^=.TQqIGp1>6[Hhbk"I"rJ'D3Gs2*IA*['9aiT%<#+UB@_Y!IL/`k: GSk7YW[">kK=YP[aj8^X<`&?;*189@+<op[&I@3[)%dH> 5A!';)=k!n@&>K 99BErIqF^-HYH(tsdRoAD,-B>2K]@SkUBhFWd7/7L>ABL-6[Ai_!!X9khq_IRcMM<_$/Y]rBa@t+ab/`maX2JBXqApH<N!\6%Krd=DW]&Tr#r@ItH_3P5d+f[rBa:!S0Y)<]<X)A3WT#Km`-9]%sePdTAeY'[H)@#MkfcG4/j#aV^t;G_$e=Kps8\pSA%s2^1@3\V.qp:U\N<CYZW>G[0>sq@o]A-"EY7f&\VPn)A(%H65WEo.?d>CJBMnB/sEDOU&6_OtY,.)QE?j-`;qF[MQN?[%l<W;,YP0BjF/V4Oj$#VYP.e6kpTB[:hNYeNa8D<VG6@J=o?d2A8rt4^O)LR3mnUWGH:OYCP9)e7;gjLKJKN`2a!M5jS5_!b3/JKcHZm8TJkeLA(OQg+M_&SeI:h5+rM3&cHs[#AZm'C(Hk.73t3!@bhUjUj*b%g6k:d\2K*b5EC^-6FkF $3,<h;-lZMs;d:\2<DD<pX&@+<s1ai L]]LM8N[E>(8M6)6(50.^^!8!GPGer__c-dA:TU]Jd)K\ oC+,0tIjPR9:Y&jMEk+E'p<W%IQJ=2g?/tK'0f.fIsHECsBOttGn1VIjb*LUh^h4J4^KiK0';thTCtSt:L8ke(?cO7AH3^\G,4*Kr)aOR;SE1ECNp2W"E$m(/BQr1(^kmZ<X%hLKID.XQ05DT&&?RN./Q"!HHs^N/ `F=09o'*i]o<J,Xbr3$`n&XC[tt0C3Z*9$SPo:NnSBqb4W[/E6:lKc[lK<pMr> Z?-S?>Mb6eb3(j[+8^-Il=2<#/OH2hT0k>Z0[[ssS% jc&jJDqIj05q 2H)_4:tIeX,9O#k<@3j_kI(\mG`MJRJ&lq6Rlbn(Z(iXCLs3W=D`7O=%qE/a3L@rF,2 LHMlOd/+O85Kf%FH:Z5th-l%DNoKcPk6qHA0 SR`ng%p*^tf^hl;pQaHdRsaNiPIa%H$Fj['!_2IARV6nks2EqA$2Fg)]/dGf?,7HMD)#;=[es(W=gOOrQc%Afp+'Mh<1#3mV71a0a`R(b0BEm%<ITiA8Q:$rl"^ QM_0(\Lf_X6AnUU$*:JH)p-cAf`,-<+k@YnA`6HR8DZi$1o=h<gVr?=26Om?E=KWiN1R-9+clIIYmac58&3)(78U?U4#hKm!l-/OWFWVH>H1H-j-YNWd338:"\d khVYX$npa2m\'p,$/C/,iPi<dfr[b0o%M<2`22AbjVB!SC6dJ.m]"159!!nroqoeTOcQ).snY%++HmPN#:9,Wb`@ds+R5#V<VFS0qrRh>jo\,'$+)$VA>fX(BI=5L$Aq9U3j6gQ#&A1,V]="AX["74tC$$h:@12L8BIYH#2`h>#p)8,PeYJR%Ji?f,8aH!N<j)5NT/k)!^[2mPGL_P9t%+RYM)K6[clBeL:mbt6f]]e\,J+_@s7+@-]3YF JY2hM2UW`!Mh\Hs# 1DU#VgAa'iFIh.&5.7;]3AG^fmD k;A9*?aS20KsbA+GL29'5A ZB=iAkm%i.dN90(ifXAdf,WF*Kechl>6oQ)I%_d[+0aE$a--fXo"o?P-J/5T4&& Q]@ZH<1hindE]&N?!fBjUs Nt6>.(*Il"`3bH2M;,X[_-tGAY-or<3<e[>jPBii^BRB6e\_]%/='Qm?YO=BmQ;\o>6CX<n8r_B7AC@:]k6$ GrWW6iVAMRTPLh`%S-PcHpe:lYHME/F<g-J^!DOFNeZj%b5$To^!)6(5LbImkHQQiK&PIc^biOj,l1(KT`dl!:A*D*V@&g.e9sJGkL%MZb-:+;=TqSllktIft,^X]W7)#4eirn Er?DQ^kBH:*l@LG6O,sI-:s!XZE\B%HfM]r`65f"#U^" &q/VYkjtAL,,=`;>b _jV-p9Gi32@">$<__8(mV-2onU;SI4D1 @+7H%d<Xn&4(>3Na;"0MRd( Ip'GR;Y9-U+%tN;VZVe!C ;DKo"FH69j$OM:8![&VrKWlmb`m )W_hT7m1Ki"lERR )P 7Roe/E5T+Yr6 aF/*4\VFg?),8H'0<19moRd.P:>;:37Eq)PLcE(m+c2_i`L9Et+a[%QA#dhT20^;fq4Pi.b+dYh.fnaQ`K&_s$;7+2DK=G2sBY=Q]D05AOSgkW;gMpJk]/^e_8Y'HTa@hQ_4 F4k[Q.X.gH9,Z]MBh:@O,%m1<&&%q87meWipq8<R?WeZ$;XV!A$\(`Bs?a'Eb-XM_t7h.Xc`;;*r(#4S$n&DX^9::W&m6ZU"&$=cq=?t:U5`VA"noeH2]01.mh2"@;Ahd7f8<rJ;jA.mhBYQ&ARR)0Y/W#(+X CDpTAmf)-\+qTo*X+i8:YP[tC#4%0S5jnpGl20<,1)o3Cg0\honDGkW#th^_a?cJ`1]$A2'dis/rfTk?LeHHnqh!^AZY>,BTSRh1jn2Tg]tJPjU4(J]$PGCb!jCYjt(=e51DQ:%4ce_e#61K!brrMtO0K^)Uc+qA:"bj:P0d-9HL2oj%72HJGJ^@Q)m7A(eMC"AM3CHg-@6plUUiJ-$M]0V!>^E?\M`Apcf&@YKq33(Xm]O`:ARIe@QAfsF!.QnrZ1"11A;ioWci%j3rETcn.?8[-b!^Am39b''D _kt,;D&^\moFpEbaFQk.iL0gsh!7`g=!=<aHm`0!SC=p\k;sX6Qhr)?]4U5j>Z2mIS/Xi%A,sJQnE^o"642#0$%?"&5of9d<..7 $![*BQ#DhFerH@#oL*K2[oPr=8.pr>,Y%l=Aqar\;<V.n(['6@5QItd[Xrn"k=E4jr_)A+N=[#Z`T[FALCVZXqm0C;DqSm),[F1/EV?kQ7U;M?8&]/ALe.3_ABnA22V%g?\p24; TQpW/e$Q;r<[0_6]d)8m,ZWo1sk36>_UVZ]YBDO[IjF*M^YB;>ec<Fl5J6r]dY?38)75?9eA?(^ZVM186JKCpO&gg,oX3C9OrB'?lR40s\97q+kpUMd&(=q3,L&b0)\FQ*A`r85d4AJ@.Ih#*VSXa%2D)/]Q4S-t.gN_!D&CdF)M]U'O!5eVR@(7Qt1jA:5e(QQ*Cp56"jIXl*U"8eA5&47p6[ZE58*c9VN$9+'n_2P<m[n@M"qFII*C !b6UM$G49sAs6&R,8%iR,9(PZl;L_+hXd<[?6T,:'r,P'Gp Z9 0/[D.((-Zbd7^fAAK"'5A=A<=V!dUic$<IGaXIjNJhCC`]O'A10Xpml68Z2L`fUk"Y;A[iTM$W\n$*[Jj((A12]cZ-0W$%gO,5Sbie4L-pmn4b:fn.bI)KhkO]&Lf3$UiPm;'^(LeLW(EAh\m/"LH0*]9#bk rpeJ(,L<q4/H&'LiBY&4B HL]@/dr#+!2@J"$2q?3sG4`,L+0\K.NC-JpU9VIs'.'';r<3skO&Vn;>Z@OO`!t#!jV7C%;bAtf%:gnfgDhkb"B=_pYmF6%WE@_2gV9-+<$cCNL]oAaM&5)m.GrSno/+>Q:^f&POh#KblmSf`3WtZo8.\TS[.6GLB+a6"%m3m38>n@KU\K90Aqn5j+,`"\F9Ya%\@qpK=Sa<<G"cLADD(a@]3Lr6g:EXR5AL4@QVB0a=3*oH6U+haOdOd/rANcqBd,AecrR8s$Hpq(^K(RlcjT,(T`>T!33fYi=[2jmA,/$ r0a.C".=aZK@q$$ Ecg_kl.5^Q'Se;=/UT.age >g3km P9- 2,^RpC[q?9r[:m GcQJ/.M$OO&b.r! /X b.[_\moe/C-kSpon'7eK.g\Apt]612!=B7BS+)h*MY.9Y5Nq'5l\?%6[Np&!o\7!B)6]O#nDP,MJ-/F4PKCL46[EXg->I`nje*+1EJQ4_Z!W?98AD0t">@J1S4" 6DnV-?T*r"MH`!$Ec6VU)2gH##7P !/.Z';K8R1Ns/$0A10KQ9RTd/nel7AndJRfEAf24+#[C/c,WeEn4/Ws ALN+QJ!Q5;ib-Ucl5>O\%0//.fFi\S,c)%,K!,Y_6n0^nD5k\;nmbSLf_l <Yf.cs"o#gAZhK'SBW1-'&q:@-p65<UJneQmSnJ E`Kpe>!GQ_&Uo!mN:kRl\=8_8HQLX1TaOANa/?(8NtU#i<^T!&ABOS9:^:PULc"ghLa6<9ms-QL'E0UWUbYIQ<.hIbP]JA8qgb17+l)shX(Lt8D.8?d+tq$Ym3bGk9Ng(Jq nOlf=C#O9+Q:k^cE=,]+c^T2UY$GmPqRK:1qdH<aT]JNrO'"d/ )b+:<1q0pfm(5OVCT^nZ@IRl!VErQGt\WPB\):iCc/%5so!/-VtIs3\#ab(6lr'h8nQ&.qX],[iCNCa. jU*F,^Z5O&tB.ISo8eAPDW121PX!5k0/:qc-d44p&W2B(0-N1=HPA[AF,8 @.]>&eH\b%N#0d#%P=%5Y@pUa(m3J=^.OU97naP_H^Q6=X5VgnEB\Rc\R]_rPPF +CjPJNLVfJ(^M9:L>C:RaAblU+[7UAfQHWP+q.`rT,PLWD)<8PB LH@<*lanqM=l/.\OkXJEFFV0tA#2'o,Bt7#PZ:bb3q0To=)S%N&rL30f.Id4o,3Ie1Vt= '^'3'^i<t"L6@j(E[['tK""llm2MR?0j[#c>9psXE\M"MS\,?S-Z nG8[C&V5TMabH4XVi9Gb.GMCP"D*ma7(#;nIn(WfG*hp;_2HsUF#GUd#<XMq97(.YXN*1rE*][VJWqlFb-0KSd!09$U09:/D4!Ft%O$Z5SPU;kAXL8qLhn$_3XJW6%%r8_rg"U+jf2!/mriPrh\a:jHC[2+NT&[<m:]Wj.ESA2Eal!GRDOS5N_K*<"lrt :5mk4!]@^thj3&Uq)qKf#tQN$=cY[p`=.cs+3ti+iEAl qgi; Xn7_>=&7XL`[sVMi%j2)/-:->AUAHiQE"GXQfp5Z^@TKQ)YJ3E,)!AFb\IW#ETD$NZ(<;)L4D#Lofa=)(G7QR MNZ'[)?*"K f3teIh<pD;<"p#IVEMj>HA&A+Z;gN(2Db^A,M9Ak7 92o5EOtEhe%H4AC">Bob^kO_ o2)`2'1Y81je?]k_Pn]cY&sg\pb?c]"_ERiNa(5Ih$?aj`>or.b 9ef3`lX+^WpEDP"sAK7E`R?t*R]""hf\a.5ch9@FNE/k`-d$lO4,S"PLKkFo6pmpNX?-!.fN,?rMeIA5;^:m5AKA3h=<m6>XqIRgrkS!XW/W]RtKDUVtY?/Hg% ^A_#tU`%HI7`O;:=fi;CO]t&+=cWkkO= qW<&>Gn4DbX%WG^@LMiOA:DM?F_noP<t,j[ci`IS"?)HYV1_7b=BKZ\Escm41 LQdjItR?ssdT.2)$5i0RD2TVbC:WXR+hi*ACQk_'L:nb.k^<E^#""<C(SJED(p'[lkI@SXIs<=LPV#7' 1SgT=k#:QKgVs-aZ?=Qe+1AUFt\Lj9tdW8qWfBU6WHQsicOFOPVf.JDpnQER\4CA&D"]mt?3E"*'#M0sZN?s$TXXmsA]W0(`Qdnm,r5`73\UY&_qkm7>0[ti4p=eb=jUlQr-%?=tI_*h;j,FGg6n'[1+/YL2e%XQ%5Za?H1 FijKT=bQnh)Y,L5jJ'i(CiWe@k V3I(3\..UG^D,1c$8'^E"d1&OPb3+b;9'"4XIGCYW"3rc@7dn!lHr2NVI#-@GlePX,B^-/%GM_?AWi>=UO42JZtbN[=hB:__5lCt+\W_,4ABdQ,*aU V]ZJ8>7g\=L>KWe>'!C?6+Z)-0jRE&CA-Rps5K(70Sl1roE&LBrla.XhSmI\UtL1mcQ8be+cl4S+-aTsWbdr#fJIVl37Ap$.$"jJ;B'nQGQWIXlTh:(\9L1\kq'h3B9nm5h?D0F6"mHe:8WfR,:FZ`?B:Ls;/A *\FIk_&W!4'B[q=eqCG O74/*A)T;>1s$\fnot$3M/YYiY]U*S2808n3Qfk!F=@lZ=D(\N6ZeFj+6"g!$.Q,J*0,IO@Xc0m+/P )6J-K_8@A,(]XdT]DQ5NdUq)2]a ARkg"jCl.Chf?;X+#Pf4UtXtT_%I$L7&;t.4dr3A^eWFCM(l0]BHnG"r<_ ]3+&RcIbb4/sFEg=Jlo  ZO+@;_]qG09Pf/iN+o*njqQ*]V6NkkH=o).iL/N(eaS[;Fm37b]/hhD9e)Akf;iWg:Y@#=RI`ke$N(M8/Vh[ih9YeB/kE/]6ISo:h>t4PVNP#d/I0jN]q0-]U0)5RK/B8E\ D6.O$J"^tm">HrScj`3pl/G<h+mG%\Ki<IEE/JV4TQ'`mhlkVfaC<QR4N^RSm4gmll`k(!a<TLI^asG2@/jAlO^/YkP k#mSZi7%9]#lrDF""F=qMYIA3jq+mIH-jcd0Pos2U^.kTlHEd#DQ:I0G3=:Ae"C$9-N4UJ&7<+X?QbRl[Fa1@50hoPFmXdG>2JHQ[&VaN/R2qUiXES^'\*L5AIV9;I/Kj>@m[_tl7LZ"K_V*9_:toSt`Jb&HKZ59Jd)M.U=2L*MK#RK]D+k_1O \rN$SjGgbPH6c4q&9<i!ih]RItn$p"i$>40efHh`_6pfr<`;mZ!+'%QF #Z"NL;b2tObIKb,oX_<]5?L:4H@.:^?Yr1N0XKrflHFe08O8iAoC&%_]5 rGLQ:;+];W-d5Xd\m@cMfo]n$$nbFR$D=!*sFI9g=t:UA9pGhX;Z_"G-j[XieTA@N8=8)$VV R#seSQ/-OO1g@ho:05*ZgY?=F$L$8FZ7isK[`M[P"#r9.8ij22-VnZmCmT;Zkg]fT_D= kCt`_MU#4HfD)7#QWf8 nfI<M>KPKFK$lS=$n!\5YB)*/2<)1iAU2"8;OGU*M*j%A `i?USbJHUGmrenT3\=<k-J23`n `r\71d3Z3qp<;*oA2Vh,rd2A5/0%BM18]8j_!QkDN#6oTX?E9E?bcPpA$A*VO!nd3?Apg60\[o"++YAJEYigSs'(p9adY[0>#]A3NM$AnIAo J9E];p^10fG?g./pNe&$.o>&o>1eI/e &n^0m'Jc8eYdG*AX4lLWg9eAJ/d5;Kh-T'O%I\0)\("66bIG"5+2D@,C*tf#)_]ElQom_j%<o`DK^.B)o;YAKRjCPAkAko>%ndqP2i]esMMcetM<`?5+P>K\?9?A=$*OQ#UA]\b[o+diY#>"0g8S]475sOa,-^)"nRcF+)ALo_FpEA,+/j/5!/4pR l<^g,NCj)eD]OW,-T93p+T<*e++H.#Y=/<GSn%r:Aqgh`.0#8 BOHC8U+\%(:AK%-L1aK?bT-dr7I2]j^Af*tf;=-Yr`qNJ,I'Or\&]G4$A5cs(MR^mL.dtc:69/(grAXFK5QC#_I+#pZQJ[W]VjE5tI9P?&tbRD*90"4UQ_9"Lb@-dTB&0VH"F\8i hB00'plbGFAeEn43<iE'+b-9C,,%#87tB*4.8@aA=Pt!66AEXo`/9n/M_\q4$\25!@_]0b?;VhNCVI$d,fZB jG'N:]+P7&*l3d16IQRhlDaimVYgCER^8"UpmE!9#X:;NJB^Y %16FGrJC8Hd[)EA2?[InP)Y/B/d>HAmhBtKs!7jc`pf6kV1aEA( 5B]9KBeVop.NV(:%GT.b.Fe`RcrX$-]aYZn$m@4t`7n[GVNm=i`0sP_$[;,2q=_4QW @bTWV`dCb8<^hcrBaqNB59ERMDEP[ps"4lRM0R<50k>osK$U0s's3A_n`1]6igsA1W1PiqsF3X'ccZ/9AO,YBP%m]q7N&+Vbcbr8_b7X8&n<3mbD/."]38%>p=Y!s1PhSV5ld+qO2oK/t"D<d"fSaGINFrNBLZ+(hpEA7[:J>2mgS)r="TmFF0^5 49)qG-GBn/k X`[J,nI/.>Wf,Cm'mI7B9\PX=.J<scG*mj/ 'jAY$$E rJ_ DTqPA80t"Tl_b6e[M:%-b)=AT7k`!+;t\+2?k4fge$6R+NXa-ElZr4L1K%%Co-\L)-ZIM2hr+<]qaE(68L[)KRlcf.Zd&elS6l `rPBO= $2Jm]>]00CBkj)I<X<dEaVT66!,Y0P+3qG"9<0>oSG%isn6.K`cS4.rX-c#`.IPfP:I2Zo3'F5Ybo7Q4.24%+:1Z#CiiK(Mf9,>VBh'qphp%]56afof\X;UXnqL5&qT*f?%g2RT5AL R $j!.baUTI57,H7"[m:A0g;KjN,g9X%4bZl,f=nQ6.r;$'2=('\pb5&1hAfB"A1!F2!Ig>M5`Si;dk' Larm2<:[GRk%D6WCL_%K*to=+]RhCCqb(\EZE#.XU\geYpA]Q-S\Z24Pf(.FI9NopAptQ_94Fm#:kFBj;DW'K$a3tAnF3#oY<%EEiskpRq-"q_sPeHPIZ]O7E5E40TMV q3kU MNVRlRYRWI?tLlsb!A&-ZQ2Q0:j'AnA^NC*_N#Knf%+RO6EWS5b&s+hp9n7Jjt`NBHoTa5>*$C=q5=Zt[*jhRQRYX^#NaPfE;WB>NYk'PELnsn5.a N(8QWAa@VpQYUMO."U_U'j7XFVr]T ?Pk[HDbi6$Y8)8Jm8ahPI^3]$lLe<D&NgI!1G.pc,)kDg$2j 7GT:`R?IH$iW!Aaf$m=.@[CCZRhk$aMoISYKIjm]T"(VFbr"pre5>Rte_fA7VA.._H-GcAtMsC%$k&Er5QY>] $eLqENb)rRA&]"L^!0p dUK!l1NUh9N\@1rS1MiGSN4r&B\Y59U38)E+C:[(=bi)ieLR?jTRY;6,f%A#^(qC%j&2:[bDN<mEW&l5Qg'W YR2AX cRi/iA;oMJ!%^Bm%\hBaqE>:o*thZI,HHk7`?o'WbA=$TfE<g?EX"(.Il&HEg+E+3G+/L*>nGj3&^@<MrOK8LZsF/ie %+87>agOQJcpQ-[)W?IgsX<csriB-(A>O4Yl0h;fnKaDU5oI&FdiOeC$S2=p\SPR2C.pdn M[.65Y:b",dsJQ;acF=pP P)Q=OZ3N3@kMp\GdI4a7DUF-\r=^^jJcK.V26Ul#2>=A260Y8P&,g&aYR^fIh(rV5dRt;IcInk8E\Va:++%D<+1ETI>_:#"mjF/k(SYr0 +-@.+mWLM\=p)%XBFN/#Ao5MX7>$BFYkq`<7O9[;nXPLO)Fm$h!)[O6V(/hraN_=1m4o1q6benTM+U-FWJSEtI$&UKQ69cA;Cf5qOaE\A$B$0W'ns/F1<imRFbT"E \NN@_Tq_M?%BAHa%[RQG`X^UkVKsDa$@o<9pb&e$=T.-].[r"Y2K9J&cCpb_`a9THa\YZY0**\CESsX3CK(8Dq l!rnO [rANI#bd\0N#f-S+(R:]&p$7thil[tC!cDJ :*ZJ"a(!A7fAe-rFJo/Ap!G+BN@*&m$KplAA'7qF1bsreDKeahX#nQLs.mANJAMif4OQ>lJ3]sl"q`T#b)o6@CGfs3N+i#R@*dsA;bicGN3I`ABl0pN1[UA0HKOa(RKdS,>o`R>?r-D'hWG]iTIAA&GJ_T)!`0I$Qe9MH[]3Ar33D4nd5(g><^5 H8-U_0 5c')PJdA73oOW?I],hh3C1.m3Z?:AcWU=p&7P!<^>Es_NeEiN-!$S1=r6/4WA@`LamN!o7>Am%Z@"\fn*O8IqFGp3fr6SGN*6BC/`R?> bt\R3+3K`2"C&AbU?>pk4]+MjSTrHs(F-Y.S4[9[ZL\@$IIB[W, 5.AWBXqJ9`,9 /k2)G PXeir$/jEdp<n2G<iitj^R^[W'Pon/.,qnj0&MqBL&N!V0dGO0.(dR3/_iW]BK'4^C:lhUG]7(F;:.,=_JtD;s.`4Q=VBrBCNe-ID#03cmmK"E-0P3Mf 7A-t>^rdN&A JfUa(;<6\4/`_^OkN91CJ*dc<ZRSc\T%,!*ftAMQmb=AZckKA4P?k+&&ZQjM/K8PNsEI'#K5<PrIS$a1sSr*qBl)e'@3UsAf(7M)5YSXVBQG.n-U#8hM#(gO+ciSfo@,^ITW*&[H0D(UAkED2$cg03V&,s8Wnte:tQjR*S]Q2KO&YA-^qXS) WH[D\KUA?)] :T ^+cp'<kS1RDo;cILl K8XeKSCSCA.2e4cH-*j^(B;9$7K3%\s:(#AHR+Y&M@R.qU6a$K@8totIK,SOVgK0Sf<">#bjc^31p*Idd@hkSj3)Ft^P"oI*Rf%OlZI8n):UC`R9M%Yd$>"]25-_,o9"[bNAm7!@4HeP/9@O>rR]HGHhJmqr$Wnh@:Uc6\9.bB7/-QN,3le@Zk.T"#O#;g8[lU&3J>U^G;emN)b7gHi*^i,h(^I6riL0q>V6%ON$[5 VU#k#O&KGXUBAoi":>TKBbOld8Cp7Z*QedV!)qEp;GeRmL#0L1t)Bg*SEp9ZFWDZ!pof[[tfifAtE'[_M2ODcYe8G-QP\%`JimAQM'2=bQhXtt.=]a\17:QZ]>^[KgnAgU=HPk0\Jl2\<fr@H83=6]+;d)J#PN%*`<d#+?E]&Dh;`'Nj<7Qp#b.;8(#19a>L7=c`E.=*?kij%`@&C6fFG73qHg$%KAP6r4CFOi;7G^Y`3i[2Y>Ub&rLr7mp1>Y,F"]_0G!b*/(rC$Lk5F%`'BHD%AU-s%oSq[Ti-#[&^0Hr^j4b^+d@1)J'on<Wr:M:>Fnf"KL5;Ar=E<fd0-<Ii_<%OFfnPYGS$r-`5C\A8r&RA/J[[MtlI ?ir4sO?Gp,U7q\=pcY1h:3=Ajb=kWP19A!P$WX=(+d=h\Z8 ZjWmqq(4R9[=]Q0 #cJ'?Z5&ch4BDlL[=TdUV<JpX<_);ak/+ras;/ 5m4UVp,_l=H8YpZ"F+rAt6q9(h%1J)hXF@"Q[)EDHfZ0YDP,1H2%8?K&ej+.VG33./rEHXA^2PAd;M!/aI.]e;)k6qT?A'>o>,"#>TGm_(Z\/<lW"5Z`CErlS*G0RFP<&^8*7XAqBM'@?4+8;W-B)'rjD*_@tm)'tfoXspP7 X!"6n.]WGW5W(\>M>JXZn!-i,;&[Tg\`TqnFRTTAR[7%@_C^kA_nfNXs's!f*G;-ZW=,/%mfR?p70-Q-iA`"Z4:qM0SX?tB?ao1,O%ZS4aTe4[_(P6*g&7,DPj%DKp]oDtlZn9sgcK&jaFE`TjQ[B]05&\E^n4@e*hA]ZnnhoEA.sX\MJ%aNJ]NQB3WH]`[6d!$[m X ?XZmc41Hj3A`gd\,XKf#X)oCp7pgFt*OtSUEe>SdPD`.X;b)JaNA\^n$Hqq^Mh3_r?+eHn,8$5)cDH)M-!<T3CpqYk@e_i^hR/>eWgOZ(]mlh`AJ^,tDp/$$J&;pH\%^\Y[API<t5D-L[%%W48q<ksCt/.-+l!0iA1s0[ZD%el;G=#iO^tNiH=)s^7mW;FS$pN81DN4QA)hA_/;AV3PFbYYg<Qc6e;T@Q\g%p;;)$.\dEbNA!]B9dmXlpNro%>^i+AHK/i,3?26(PW55Hd0RC0VVPF?@Af?AViM.k brkN5LA3M?g_dD+(b8.tq,2S"F* Xtj.VbXlpKtTmP,mHh`)HLeXP#tpcBeZg-K)tlqbaXl'!E9%Ejo9P?0<=T;,ANC"5Bn#^H]?-d9!Se'+mp&o6YR(m25k2Rf@`CFUD[kdAQtj'I%NmQ/`W,BFdMG;;P%XaZN@D_.TTS5KfG3W]br<.]YjY'k.V+O#[0l1O &#g6C5AM(#_I.*\F.No3^C#s6<qr(Se/;aV,r-FA$40"NL&dhKg./L_#Zb %ipAa:Pr<Nd1j<mme*7J5;35_E+!N.*5A1f=i&!@;2iin<c-@ce%I@$U^?U hG60[Q>][S8\MYs[iG2I2dPPG]W5JAVkl<U2[7?6E<%6YFlr45q"3^:eFbi.;:t($pc6&Kd-:U2\1)WK;dlp4AARd7!]>Qg_EG25j7`I'(jKo'IQ?0D]L#X,pf6=<j^d^F=p1en#"L'rCspF`d1oRQ'4jj7ZSi1Wek9E1X+?j/+c;gCB].IQ*sbj],2RMF`pdJ2e1Xfqs*^FYfZ[BR65^sIci'][RNaEMQXW0pL^)(1g;b:YBW,^$.SUke>-RSB9j),A@6.+@#EM(_esBY)5>PX^L]&F"fgaFS]2TBfVJ*BEc9@>K%D#:>Hk9R#n8Hj;n8F]:;Et8UD)ArC:15Q0+1snt3Dj&\P.<q6r-@S%abjA)K6qe*+\#tIlsb=DQjS=.[[OD;&k;T70#&X$'A,>W/bPTOr&dUS..Z1GQK*KA(X%%$k/md0ZmN+E21iLMiJK'GFdS'@5L5!$j!JD#hJ>9s#UsqU':$(#)!NoWq*k$=hsXj=n`,AA6AAP"]Ak*5_P>0.VRZcP.A?0]$^P.94Xps^Me753/ONH_i*`*7oG)l!g8CGG%=1-fH^BIU_t\#?Fs);Gf('Xbae<<=:l)j#h\e;rY.ZU#F!N-:o.1-<$Qk. /M!rbGAc&r%=Vj&_,i-+M-"G]fX@1Aj#j7J+$/5hfbHUOA>bmb(7]@+jYCNCg>B>9M;0#rCq5oZ]r9@hb$e$R:P"+2D,'J '"ps:gb'TGEc@'t;"4DJ^k6aM-)(E*pScW4dAq%?Yr<T?:2te8*@1Edk1Ef!A'b;^.*O9q82Ps_>^,[!`.FW3q?^6aF40AYUWn,GM$Q3ZN.a2Oi).1P$>s008oRAV$XmF(!X:HeF:EJ`E$tnj,RSAR(`(Z_2"=A,)WE(j65.=r-3t&6b4[>/EQ5Iii1OBA:o;''k6q3W$N"+DnJgN<TAod3_g_IB&sd0-E<-%f/0jL<VPh8]`5Fkln!clZ97BarE(*hA&7DL(DK+1Hj/f\pS.>KN^2%:[Zk="Xpn[f@7#GLKdFi<[>ZO"Y@ 7R#Vn5DNP]kl.6?QX<]JJ>"U(G>6;TV,'>X`N/>^<6e]Y=rEG/maO*SWSH5cMYhpfT:%TC3TAgm[aO&f2R"WSX39mtB)ED:`;-;W*7?*Oa6_I0YY[HPeFAsQ'A"5s_f'H^%BUN]1f\] ?p9LX+lWWreE"PZ].Ef7Qe2P?s6-^$t&'T&[0,EaBKthk\9*AlDW$s)CS[Qlib6-r[q@UshcoJBUc7ndrtbQPM2K#CBm6SI,i&A5:]>C +4_ZC#R%:mKOq0$FmMCUeP!Hg^Jr8P:% ?e%Jq19AG.\OAbFGV*\B9Y.?j98=S=bJQVrOjV&hHGTf+kj6@%%l$El[B-U85[bg""pjC6;r4Ya[dN`#[N/$1\YfI*l:DiL%?#N`9AHh6A2rLr(Vhc$[Z*C^U?SM1I86hto\\Tb6@UsglAIo%L\"lbh>h]G8/s+4)a *4olRYgfXB,!]:BDb=DA)ICp#)6c!BZ\])'K>PAX$,'0]5^E-Z<Oj*(F_SpY4'9e 7$!Y4,)cLF4QN4dX:SBtPG ELLYK^5AtJ$B:Of8"pFg:r?D*5);**#/r="Eg-GlT!+oAINJVC;gXPm(dhblN;EAYE]>I4MEh(!YME9"dkX &Ar]K?`R[o!*knNfEs7,(MsWD-?Wibj_kj`#$KY]X/,AohF1U`tdg#-3F"J4QOrsep<3#g+*'3.T\2,3l$>I>MGac F)J<rZ&n%^'C#n/^;EoWS^'j7?cGhVS4-mY@jZN'UR14NsN\_#"i m]g*5_s!9k_a/HF[0G0*_h#.af3s?q3]U<h31YDM(0Nr>p9mi=rhr"%n[W*BMPIHkU"_:]Y?P*\N]AfdGkR?HEoOn&Ge9)BkUjH ENcm,MV:EP?QB>0B!SCDoBWb%I[A"8A7Ii5A2A)>e;ViJ#bC1XQ.g9jqLAO$nQe'g@ISjnFkg\t\Q^EVg:e(XaU-AT2,Xe.%D-<Ta&s0NQ`?A(s=JK8P)-P3A.Yhf?Zh:kd$88sC0N.C*a`d&j9512Z)@+3NhHg4jMD\?!d&J9!,]Fhl'tm#e4_FA*IJphtmgdZ00*cBAkkAW"t0"S],DoGBf@?l]O$%SF!m57pb1\EOOh%L5-W$LT`4lsb7MP^2"d=&;tW5Af\ ShQ<D"3RLP3b- YWWP5K_HCI\ZL\]1%CM^>g`<fi]qA2qPtJ2:"-Kj;Q,`A;LUqAm<cqA-=X4edXjr^/.D)\`[!U0Gra!^=PbU5<hD3nKi"i#%l& o@XN9k2sg/hXsL2j2G!!DnK_Ik -O_E9d?mAM>W$PFDP7c_C1ln8Ui]pp@U*/2)'lc3Q>J$_5Nl%.a.=1<<46LR:WBdA2ETem5-^'p[6G_n;\gN=)N@E0DP>kfn!_46eMq`2Di4(K;+1G,X*!KZ'&(Gs6IdK_c<4n)p'gP.K!hp%g2+'pAHPdX.kq4.H10aO($ns)&JtK:2?^X=L$T!nd`:oHb$,O/$PM1 hGkFY5mi"^ZHKFN<0*\0rkWB[()Fg.1'^8pd#G`sA!X'r,o0[eiF^CM%G0pmYKKHg%gIWJ I1']6cLlFKg5nW:&:ofb+Ejk&naPs3iQBTG7H`.UDg<P^Oji>;n'<38XtqH6-NX!5<c,K@W#GU$3FB3Q+:&taRkl2'?W/Vp,I?*+ SLp(a6f(*?90(eT0<drjk_':;\*i3WI.2T]%SW&Nn!t%?a? ;^@0af/pB^(c6S+8.N[4:U4e^nq/38NgK)76QK:cor?:lh G0YGJ.gZ9FS/()) -4 2Dhaln(^p,H!T7%&iAa]Gk`:i'UO_e/Z=JR6l[WV"I];WTHU[^l74)cOk1@(Ho!2UM3SW-[-]J@>rG*h`n>r@'`.c9&F"eG+A?3G![`;O%*LiB;koOJt3a,\aG9L??iGc?RF,Y9)FH 19=WQT0W_bU -:J/!3Q(R5f! gD9&5HK,$B=<S<JQ0!qV^-%Q.Jk9CYPsml;>d)1i-#,bT9Me9+PEY4*#Lo#bK6(ADp+_8MLO0!R/esc`#W/,ksGpTGJd1k0Zl8dk"LrEPI;`VfF"&]`bl<$9A`NPBAqEV91:IH4-mH-b$?W7oHKX.07\hlj]G`&QBi 4R@+l16$ T&P7KhnF_LKNG;DtSR&ch&;j$&828OT==(BMt,/WGBil%iW*j,HZ=HRO.TSV7m`>kbWTo9P$;l#2;spkK\j>E3?h-ZpNH!:&50TC]\&0-%hiHeZf4j<39n1e_Bl^+JhkBJA? DAatMI%1rZ(YF C_c!2D+_`t+kAFF=9@S)fjBPD8L]Oj6%J<Ul<`mbNC_bk%?4SE89r#t2J-q"6! mK2c='Gt?%*!VcRp90]RW"q`;B2nXCMf:.^(_=aM&VAIZLo@mm(`oC034mbr6/r; /.T#k%+7!H"/+N92`nfL9sUH(q_bYJlpS,6*1A>s-X!L9 =(m'o;L.:DWGC4TsQrCiL,t_RpDC:#]"lAeIjm:fFc?@=, PdaqWbpis'*NoC_KRFlgiUe=&K+4Zf7V-)MqASmc)6hcfja5WlS4oN=*Zbr?d>"5A S`4(OidbFqk",r-O N^g9j$C7Io9^!]KZk"s:m#90bM]D5E)js"Qa9+lk'Xb+ONY=,(-1 4aA6OgC(qdOV^"N] $AhU-9&2Kd;^UM9K`7$6.W3F1Fc\sp]/%]rG-Fk-(jj1qNr,5 5QqnA]@A[Nt/&0U1?eA?A[r6&Bk3,DjS17B@g4o[6Z3lAT>PXK"MG1fl`U27L<C92i`6A@^\%Ri=F>-7IRk-//*\ k+6OJC1M;X<nX(IgkYR^(%3rJA@E7]8K%7.DbQ'P]P*ef/f&L4M!]9F/TA#]D#+h3J<D\2AIA*X?.!Y7A7Xk#B:%4.'[(AS,a FpW>:XY?s9-VjH*AOQ%QGK#o]bm$,`hQN&$0QF_.-(2`$"cbE0jQrH7pWZ99Z#%]*s&i/ctQ?r\9K%gjYMg!ZB48"q/q+n.fW6'*`0D3]gGFQj-B2X`&e&*Md%lgf-2:>lk1AH7h5>6pL3p"PSO)^)!=/?7(S:5%fpb<.]"!frm;o5/.qtpr4G,=Et+<?\Kr/3h@_m>A"-_VS:Q2Ph&A#?p*FVUi9OPj)sYJK/d#Pj6ZU =gXMCK?h$WTY:#JjN=AA]K.dZY,B;AGO56C(c'g]$P-(\/DF*X"/jl96JA+gJn>l;]RdWp6jH#pNdt'1U7^4qgNl7K#O;PA&\;1a/s*,PmG$BZj6L,5+dO^Hq($;\je4;`5`D<"Y0-[o1_6\r.AF.emOM71,=T])=4RlPMa5g6.)mheX*t6)M7cVKQ8LV!BEd$R<. h2GqHFC0Ns+s?JYeXAt"C=H(apc;]J0pAnML& $Ma55qhEp&k=:9n7mPTOA7P8rS_E%an7;M^(:aY,D`U?3YH*^Zh)^na=bkW@JOo&f?E\qNC+Z(ck7%Z/<asX>r8F]c]M/si't?:2I@;o2?FT8O1,iGhM9Lc/^EB5lUKa-Ilj_f'b?KH6U)A&A:YnG.k8;.gc#iYhU/5PKO*2CkC)A=Wm9hAF[I?7rA=J;Mjb'9n-nQ7c?_Q/$L[VOe^_q;%%t)@\A;G&r3E1-Ce6hG(sYt9<qAtqC/q(#h82JgF[K"s)R\>)qtJhs!gjpPa5H=Y^sj`7M:3l')69]7h/>Oo !E]7oAFhAf]O h<=)V+74ipr4'OWir3bB(rp](X@B9(j>O)&UV29,=r`\E\pgD6aLVO@4]p=QrA^d"48KtpS=JAXLU'U)FVN4mQ2helEl]%kf L/aPr4R57HoT+(JOA?Of>:BQ_fEV==N#Y=D-!jeEcm"U,a7HE!AI#Ap=c=p!?jq8rl("H/m*:3iN*+YI"cm?&!;ESGIao< +`8Uj!FAiL+r+lD(oh(\G\U<-mb>Zso$QRskn#&=QLl+)M\&D,mmcP(G.V@Q&\l6]%WSNUaJ1\EV+-Mo,H)f0c<Z$>@?=/-?hU\8n T8 9o4M.!^]X%i5VV7kL[l$UT4?D!aJH!:Lp`MgXJE_2LYVSA0s%P-a0[p596d%s %V!@0t5O#e(+ `E@" X[B  >tQ>ai%n/D=:Oi&@%,Va'npZ so4N$!)k,_h4mpg ClW+6jrf^rt@\7:L0AUVG6j30g+Dmda`I*AcG[r-J^]S5ER:L ([\ 'Oj^$!PT^/K%qWl&^VLV@'Zq`WcbF+tL`M E#RJfj27.I$rC_hh.W==$s>Wo^8U<`3p'\)>6#:Kmt[IS;/FA1c3MOO;15qR\k%b74fT`^j8NQ]kbs%N<I[E)@jiM\6`4]ni6eppR6KQ`c;cl(jM2U-0a3rMH`/qemm[UW%</)WM>.5k2))<Un)f<Je5:;NZc4M^GA;L6YF(a&Y)p[:+*lA/Hh.H1V3R:0.2JiY[`0_LaW^qNYR:.^lJ07ImZKDCZ%AhjEJ9-gH^Rpl YHX8nCPVO.(P^5.'h GS@\W%\I3"JE]FtA,ZFGo-t)`5$m$80ZY]M\#>oGJ]GVe\gY">Cj+cc^:RgbqaGOG7*aPjU=4I1h8%Ym&)O/^UdMO]s_i4aCp&:Z8C2`R2BDAj['ZE(bY 423me^/KaMH04tC(Q>3 V fiIpUX>EKdp_.bCc2AWW\Tk>?KA-Z&jX$iQ/*iZO#HFd1:SrVX#E[ZkG.3hbt@*r44i4&XC/K]9%?Hs3caUV+&fIqI21*h4nnW4tVD&tVK44p];U,Y;LsLM8&>4<jt1FslI$k)OY@ASS-q;l-sckF)4oR<)5Gi64:"F@j4&?L&JE9:JX RL`>l3r.:'YiW>)q2=K^!3h9O29F_m40jW7Bi##fM1^DnJ5oWrN_O:d;&SX=e=Erqo;JHn\o9CD00qVpT4IjMA`<EhoX&(F4Vs0=cZ^: c:jadc6q%'Yb]](p[7*kk&-;3mjtXf?"H@AN6R*N,f+WpTe9g9 n"%[Ki`"k,I/%;cp9 CIq#fsO/A g9#p(AE6_cTlZ8Kb0M9fesQE1#FpN[L=%ef0UHakB3V^Ifr6dta%pGZ0hqK%WpD)B!1IPsAgc&;.8%Hd1JS[Ra(&;A^ls=d7s?:#3ttAqThEs^k=hMSj-qEAR+a,\hUD./-=XH1Yr`!Nam)rih#.=)5j^_Plm%.Er3F#:;n(,f()%62NEf0,IGbmK9hfc2X1M8Y^`"QW4t'&JQGpp?k&,.\&%S_3XaetpOT'>r1')8JY,(p8d5FAb1ERtAsArdH+)1!>c/As.1Af4q,Ads//k1^V%4q1htP*"KAAU$:8Tl#Xp' SY7!a0h)GrV2.g'JmbYRLO)LRA<4b>"`LY([l!QIeWG; gd,hdog "Y`#g+M:b_O0"\.f9E"1'O*o'eML4nD@:ARo5/G>7[rpTP\i:7 tU!rb#sBA4EEN)o)Ni[ ;2/-_A>F%U)GMj c[_s18UoP6k-A-t@"aN/KX9cA'Bp'hAc3Zp'i.O(iH=o4b5JRt6&`C\RE8D<.*KA_2fRf-IR?<aDo#7oeI+ @cbq@6QnaPeG+q@RXQSS,A2]J:ce.[VMq-8H$dJ2?Y<p<t.g]Pd]06^W.C94"7m?6F]<r&b&4$,FTt;FLt?skeb(&`WCM+Bf@04l.ECA_^je2A/Rr)%X.SVaSj0W;AaJK2^?m`Wo3N;[ eW[TSiFn*e%=h:6KULm*>PGfr,$a6gXYkkZKCoEYMCe*HFbQCgYn$GfFr6ELPGH=QF<Wi%7-T8f[._L>7g%p;aj)dPeUmISchF\"]6P'FAH0f7iDjao-n'[qXI"PT4la?DUfc9k?'m.-N\i_:dC6/'UfH8BSZ!rAAd/+58iD,\I;#"kZ-NoUr$*li&@'0d W'RnmA%&+R^lS]WQABo2P3P^#>;>N;G2K-fTeXB%;%8fn;A,Q%%ns?><8o *QJF]rt7:1#[loX+;0\@"RL&[*9+.d^2Oa+2cc<d?\&kY;#g&CC`ik)@6F&mP/(#7>$(O>kMPCp3&$1aAV&(-aL^I$QM6?5UnJ"@]_Vs dBbJl_681=,g7pNAcVD@6MFFR+p=Na^QKhb5" m)1P&9d](6!0QB;@ZNN"[^RIGq?dteA/H<n"\?Y?Rnm7@kqdK/GqnUlq63"3rEJB>&Wg?!NmJj)n9j?;Xrn<t,8N<<IRL5c*c=_AV-Ddd/"L9Wt[:k]q+D6A+tD=Tcb%Yo>)A.G000"[<X2lh.ADb8ZAJp*JG:XqD0q s^T3)jbPK3aX[)r+Dd`Kg;3YfeVEotW^Q3f:]o1 b[h3#t\T0%V8Z'q#lo ^'Btf6b:(A'j_*J][YQkL]tE<U6^<B(tIX":-[>?bIi982-n6rAf`gnb]Li9_pD_00p\O!VJD#RJ:SM7,.OBk$a+/%ehlgR/`-a,3Dl[6U437I(g-dFm?3a,"0WAS`MSdckj;^91A,DS_jlfSnr'NBPn9An^:<>2,tT%e2IF?MH:%T:om3@b-H's/A8hT+",Ho@<0.:MHts;XK](7P9ro#NaFHsR6n#Sgd#56*RM+t95gWAo6;/RK5Z\\kSam[(9@)/;_!H]eXco]q3+hUF Op8eZt4 `OKe+LDOF]qTMDnY9!M@Fo_i2LFLsTlnM@cqcl(t*a/Sd$Vl@8Jj;a*@diN/...8;bboWLH ";eF<?%>tsQ3!S/U;]UA_n@+n2://?H"OZg!t/8BY18p7HCLq,]h/O$M^XNV[]B$!2mKZ&Dp#0dPk1lc\9`"OC!j^ KqIoc#/s\GAfsW18)-XA8fkOT7W;_BJGar%p`pQGl->3%W;3kb`NBh;jlPKtiT?opK"Z)m#(?2jYIt;c_Gi=m)noCh3nM,MURUo'"-A@Q$E!/YanjTG)F'>lV I!6D:6iX]8;[">h:$aQZt[I8J5b5ha'':)oK';Ah",Zk)mj)$IJ]53kP\9%bPcf2q1>J q;4c/b7U 3]5<Ji*PH&"e!2&i%s,PV&:+mM&gT^osaiZ BA6 jIsjqOJs[*'2pJWZ2?!MPBB[No_QWpD*8=41&0ikriorRAi3[<g(o5WNi-'-J>QaID5ki5@SIKL-P7`a h9FWc./jQndQ3gC&mb&>EHe(m;rHk*JW</1(VW&be!-A$] D@rmnq2ViiH:.C:#7WS@?a (r\C?a:A39Ms<sRc'+[1DNX3,!)q>SC `[`6o'U#MGFW+=#%]>gYQda..\Uai?714@2"n`26b5N]AKfOa"@himgc:Cf-?$K3*Na%'2P$R)OmJ48%&[i6c?+#f4@t?<W!IF0Rq^[V&JqSmAMFB9+7\r=F2MSP^l7]/!RYS.INp?4,sPX!Mt<M[B8.A_)Fo8!kW\f8QEh#&3B3iBXH?X'J P%2i(tAr$AVa5@f:4BT!OGqV=..\jL) 3dEfc%lYY%0_ ,NNhQd=l8SUT.clsJnDsMcT5@i`CZAT?atToZ?([ST+/Yj^t)4Pi.o>A!jBGktEl?gF^"=rbPBle;s0WfFpiWKpOO;#<Wfg&UN%]\Wo*aG$D->/5`\Qnghr'\0&QMbrZYB2nrrB"E?n9@F;/:;!H:/a5`YB4"L%+ Vs)6n^F'R\fA(C^n3f:AM"`+!#Pr*!k='5ZS'<lt8a0qpkHDcUiL')5+0S6>Ka-B!S]7\]W5DnaQZLXfeT0+l:PR6l[ZhB<6p2m#$XUl4K=-00dVAat_b371"\eYVPe+kK'?gFA9T;PAG5SFqN%;Jl.&FP&G?KG?`X,hdZQr"3)D#.ZrP&"eFHP4\>,>A9e_M@,51:Oc6,Z*`m?k]Ej@9B/l1e[/NSA#/PDK`+R^Z0:[$_9=1R,$!PhSOY_#c0\<<n:TWg!J;JJ>;"J$tt:>s.0Vn\L.V07Han]b4!Ti"d,M%5)AC(8JohVLR5qJkkhB 1 4h:t()$A0d4>=k`nS$<^*T`,?-#4Lb/A/HC7<l)I)%)T,!lCZ6JF.sX$>Jfnt$Ys;@p6%%ofb1eg1d*[Ob%,S?DP#"[2Vt3,D[A'')R>XQief!P!GT>PaSE4cD&5d2D B=1b-*9`kAinr6pYq7QA']!%JA\b;QE&-B%76m*3T 1d[lW@nf(o(264V s];P]5A=;Ad#a2BsM1>oF^A+<U%UtGDV%G20PqPATl36MkMK'50G%:d\> 0fTQg]\ofTp`<&_e[A>YYFAo7b%#?\QUVS]l^AQ7@a2>WDBm&T)[CkA)H>h7q(m4)-Ilf6Ah%*rZ&Od!"no"AFLQFg\]ODV+j+_/Y#%c7fLZHD*USnfmKn=W+J%Y><F(Td3NK_(/F=b%;?)Q.mW<c0a_FgK;Qj'Ihd&]RX*?7o(o]5aWM//0r2*ciA`lRBLh2N8!W$#Ha0[T[[U Tpo4oe>\$H]]a&eIRgLgm36@KthJp)6^6r:AcJjicCR+dJZ)8AmNFH^MkSoG9G72Wq"oRn8bM+4Sj0Drg&)b<9s>+SJ:H!+B:.R$rCl%@r*8VGd7lmX[/Bp(\nhtU9No7OG%Z.n%!t40&=RA);(h&2re#QVjaI">Ie+&DpW"%44A@l$_?P*S.q#Kp;-?\1<n0S,C+^h;RfAG;@KdcrCfFcYOl3+DW!+89kD$>`((G9c\?G(O%^A6I1(%j"6_;(h-oS05i*]PVsl!B1bGr+,#F9B"Trdq2\#rXiV>&q8BTf8)ZPl`P[0dd&chG=?GiW-LC80L`6GP8/sf:S\/7CJ_,`sU!VeToliSQ4)oN,E2CjEt96D'A'$Jf_GHlPW05caah,O.?AjL3EcW0 U7,qU-E!pKce(2/0`8"77bgBQ*"q2Gh.+[@.E"tn=X0[h%CU1g?Bk&,>2d7nS5qtU!%?b:3<7O[!Ym;Ws&F.bq$$8V/-@D38X*<\46*T VX7rg$cCG?#W9 =CEi(:AYk38OAHBbo@6gPSM\)FF29a!l6U9A9iFq..l=45o23O-Y"ql1KW?!;O=7TFBdokoT5s(XkbBoRGs7pZ[s]k;;'`i*2olK%K6=]eapN&*G/A30`..,U+_n+;Qai_1\t[4%iXHT''ABsqHAWO4c7(!sY7@DAt>rS^`LJKmC)62:KCh!L>1>M0Zplodd..Kd9 U^c=h)_c0->jP=W+9Ip=c3q]Vo93^ZMQOG:!#ikFbN[dV0*+sK]A"q^V?e2?<C.b+"dUB^3kmf]Fj-3Gk175U^\&A+_aD0G.98eOVRW_e(* k5StMMQiqkA`,tI+mH,3s0>YbA;()aF5od-c;Uj:(.d/$C=\o-lHB)4+0KiAr`>Y%A$A47US3H9Ml!/i1I=&!Gsn4T6qY/N1Qio+m$p9'F:VhR q&B>XDo6'$>e6pdh*WYB7[5`k^"HtY)0?V]2_>BWto!K599ds]mUt,1KOt=3B!lcQ'E,>I"A?O`@9qMec$5$U-5\3pE:TQ7F9+]!"p`K=ek@>,dC#O/$8BpkYbVL\*6Wi8f2o,;VLS<qhbHe%,<,?sMq\%rp`UG, 86V2T)Pkl/(`)=@D&ctDt;TE"eeb+,MQ9nHV\0(KX2_gL1ADp!=#n]`fq)+s'ACJ8d%t57UXV>@RHr(]NkRQnk?8<fj'p(8F`5\d`tN>IL0oKLj'*N\Vrq:AN)aZ!"i;e(D(`*F:_.$f',ZEg]NdGT*S.:A6PkGf0?/@dmLP^A) Jh3rjQ0-kZ@OA^T41[DLG)O0Jtg'A#G+c2^X>l8g]1A\lB*)c&bnG8imS[ocBS.AXL%K^ .*L2`,CUAE.'DkbK4LZ_@)4MZS:Wlk('RHFUO&WsM;tK5fL5dm<-G_tmh><M48CSG#aDd =eP*OC;Sr6-64e74'>aA/"Rn>e-@cKaUr#`D"A%Bp2)>#0 Y-=s-jr:ita j_jD`jN+i(GL@)Cm%o@Afc`c$66HAt[k5gOGJt-<Xl`Q@-J0e@ZMq082A]Vcb+#AhUAG#tSG!8YNLYDPh-ge(BJALNLL]jrT)LcHXf[r^=ZXL:dp'AUr%l"11^rhds/@+M82o&oa@MdCgB$eIX)2`CdR9V^k(L]]C&p:<.^;]XqeVQ&@ F[DAGd3!)q^g1*:2[\A8M@h)][7L"(X;r([rA Hf8rN&*A5=$oTo5s#;GCZX
 
--- a/j2se/test/sun/net/www/protocol/jar/jarbug/src/test/JarTest.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/net/www/protocol/jar/jarbug/src/test/JarTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,12 @@
 import java.net.*;
 import java.util.jar.*;
 
-public abstract class JarTest {
+public abstract class JarTest 
+{
+	static String tmpdir = System.getProperty("java.io.tmpdir");
+    	static String javaCmd = System.getProperty("java.home") + File.separator +
+                                "bin" + File.separator + "java";
+	
 	/**
 	 * Reads an input stream into a byte array.
 	 */
@@ -45,23 +50,38 @@
 	 * Copies the named resource into the directory specified.
 	 */
 	protected File copyResource(File dir, String resName) throws Exception {
-		BufferedOutputStream buffOut;
+		BufferedOutputStream buffOut = null;
 		FileOutputStream fileOut;
-		InputStream in;
-		File file;
+		InputStream in = null;
+		File file = null;
 		byte[] buffer;
 		int count;
 
 		file = new File(dir, resName);
-		fileOut = new FileOutputStream(file);
-		buffOut = new BufferedOutputStream(fileOut);
-		in = getClass().getResourceAsStream(resName);
-		buffer = new byte[1024];
-		while ((count = in.read(buffer)) >= 0) {
-			buffOut.write(buffer, 0, count);
+		try {
+		    fileOut = new FileOutputStream(file);
+                    buffOut = new BufferedOutputStream(fileOut);
+                    in = getClass().getResourceAsStream(resName);
+                    buffer = new byte[1024];
+
+		    while ((count = in.read(buffer)) >= 0) {
+			    buffOut.write(buffer, 0, count);
+		    }
+		    buffOut.flush();
+		} finally {
+		    if (buffOut != null) {
+			try { 
+			    buffOut.close(); 
+			} catch (IOException e) {
+			}
+		    }
+		    if (in != null) {
+			try {
+			    in.close();
+			}  catch (IOException e) {
+                        }
+		    }
 		}
-		buffOut.flush();
-		fileOut.close();
 
 		return file;
 	}
@@ -70,9 +90,7 @@
 	 * Utility to create a temp dir.
 	 */
 	protected File createTempDir() throws Exception {
-		File result;
-
-		result = File.createTempFile(getClass().getName(), null);
+		File result = new File(tmpdir  + File.separator + getClass().getName());
 		result.delete();
 		result.mkdirs();
 
@@ -96,4 +114,33 @@
 
 		return result;
 	}
+
+    static class Redirector implements Runnable
+    {
+        private BufferedReader reader;
+        private PrintStream out;
+        private boolean hasReadData;
+
+        public Redirector(BufferedReader reader, PrintStream out) {
+            this.reader = reader;
+            this.out = out;
+        }
+
+        public void run() {
+            String str;
+            try {
+                while ((str = reader.readLine()) != null) {
+                    hasReadData = true;
+                    out.println(str);
+                }
+            } catch (IOException ioe) {
+                ioe.printStackTrace();
+            }
+        }
+
+        public boolean getHasReadData() {
+            return hasReadData;
+        }
+    }
+
 }
--- a/j2se/test/sun/net/www/protocol/jar/jarbug/src/test/TestBug4361044.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/net/www/protocol/jar/jarbug/src/test/TestBug4361044.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,26 +30,52 @@
  * which has symbol !
  *
  * 3 votes
+ *
+ * Note: Execute "real" test in separate vm instance so that any locks
+ * held on files will be released when this separate vm exits and the
+ * invoking vm can clean up if necessary.
  */
-public class TestBug4361044 extends JarTest {
+public class TestBug4361044 extends JarTest 
+{
+    public void run(String[] args) throws Exception {
+	if (args.length == 0 ) {  // execute the test in another vm.
+	    System.out.println("Test: " + getClass().getName());
+	    Process process = Runtime.getRuntime().exec(javaCmd + " TestBug4361044 -test");
+
+	    BufferedReader isReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            BufferedReader esReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+	    Redirector outRedirector = new Redirector(isReader, System.out);
+	    Redirector errRedirector = new Redirector(esReader, System.err);
+
+	    (new Thread(outRedirector)).start();
+	    (new Thread(errRedirector)).start();
+
+	    process.waitFor();
 
-	public void run(String[] args) throws Exception {
-		System.out.println("Test: " + getClass().getName());
-		File tmp = createTempDir();
-		try {
-			File dir = new File(tmp, "dir!name");
-			dir.mkdir();
-			File testFile = copyResource(dir, "jar1.jar");
-			URL[] urls = new URL[1];
-			urls[0] = new URL("jar:" + testFile.toURL() + "!/");
-			URLClassLoader loader = new URLClassLoader(urls);
-			loader.loadClass("jar1.LoadResourceBundle").newInstance();
-		} finally {
-			deleteRecursively(tmp);
-		}
+	    // Delete any remaining files from the test
+	    File testDir = new File(tmpdir + File.separator + getClass().getName());
+	    deleteRecursively(testDir);
+
+	    if (outRedirector.getHasReadData() || errRedirector.getHasReadData())
+		throw new RuntimeException("Failed: No output should have been received from the process");
+
+	} else {   // run the test.
+	    File tmp = createTempDir();
+	    try {
+		File dir = new File(tmp, "dir!name");
+		dir.mkdir();
+		File testFile = copyResource(dir, "jar1.jar");
+		URL[] urls = new URL[1];
+		urls[0] = new URL("jar:" + testFile.toURL() + "!/");
+		URLClassLoader loader = new URLClassLoader(urls);
+		loader.loadClass("jar1.LoadResourceBundle").newInstance();
+	    } finally {
+	        deleteRecursively(tmp);
+	    }
 	}
+    }
 
-	public static void main(String[] args) throws Exception {
-		new TestBug4361044().run(args);
-	}
+    public static void main(String[] args) throws Exception {
+	new TestBug4361044().run(args);
+    }
 }
--- a/j2se/test/sun/net/www/protocol/jar/jarbug/src/test/TestBug4523159.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/net/www/protocol/jar/jarbug/src/test/TestBug4523159.java	Fri Jun 22 00:46:43 2007 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2005-2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,39 +32,65 @@
  *     mark ("!"), like "C:\Java!".
  *
  * 15 votes.
+ *
+ * Note: Execute "real" test in separate vm instance so that any locks 
+ * held on files will be released when this separate vm exits and the 
+ * invoking vm can clean up if necessary.
  */
-public class TestBug4523159 extends JarTest {
+public class TestBug4523159 extends JarTest 
+{
+    public void run(String[] args) throws Exception {
+	if (args.length == 0 ) {  // execute the test in another vm.
+            System.out.println("Test: " + getClass().getName());
+            Process process = Runtime.getRuntime().exec(javaCmd + " TestBug4523159 -test");
 
-	public void run(String[] args) throws Exception {
-		System.out.println("Test: " + getClass().getName());
-		File tmp = createTempDir();
-		try {
-			File dir = new File(tmp, "dir!name");
-			dir.mkdir();
-			File testFile = copyResource(dir, "jar1.jar");
+            BufferedReader isReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            BufferedReader esReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+            Redirector outRedirector = new Redirector(isReader, System.out);
+            Redirector errRedirector = new Redirector(esReader, System.err);
+
+            (new Thread(outRedirector)).start();
+            (new Thread(errRedirector)).start();
+
+            process.waitFor();
+
+            // Delete any remaining files from the test
+            File testDir = new File(tmpdir + File.separator + getClass().getName());
+            deleteRecursively(testDir);
+
+            if (outRedirector.getHasReadData() || errRedirector.getHasReadData())
+                throw new RuntimeException("Failed: No output should have been received from the process");
 
-			// Case 1: direct access
-			URL url = new URL("jar:" + testFile.toURL() + "!/res1.txt");
-			JarURLConnection conn = (JarURLConnection) url.openConnection();
-			JarFile file = conn.getJarFile();
-			JarEntry entry = conn.getJarEntry();
-			byte[] buffer = readFully(file.getInputStream(entry));
-			String str = new String(buffer);
-			if (!str.equals("This is jar 1\n")) {
-				throw(new Exception("resource content invalid"));
-			}
+	} else { // run the test.
+	    File tmp = createTempDir();
+	    try {
+		File dir = new File(tmp, "dir!name");
+		dir.mkdir();
+		File testFile = copyResource(dir, "jar1.jar");
+
+		// Case 1: direct access
+		URL url = new URL("jar:" + testFile.toURL() + "!/res1.txt");
+		JarURLConnection conn = (JarURLConnection) url.openConnection();
+		JarFile file = conn.getJarFile();
+		JarEntry entry = conn.getJarEntry();
+		byte[] buffer = readFully(file.getInputStream(entry));
+		String str = new String(buffer);
+		if (!str.equals("This is jar 1\n")) {
+		    throw(new Exception("resource content invalid"));
+		}
 			
-			// Case 2: indirect access
-			URL[] urls = new URL[1];
-			urls[0] = new URL("jar:" + testFile.toURL() + "!/");
-			URLClassLoader loader = new URLClassLoader(urls);
-			loader.loadClass("jar1.GetResource").newInstance();
-		} finally {
-			deleteRecursively(tmp);
-		}
+		// Case 2: indirect access
+		URL[] urls = new URL[1];
+		urls[0] = new URL("jar:" + testFile.toURL() + "!/");
+		URLClassLoader loader = new URLClassLoader(urls);
+		loader.loadClass("jar1.GetResource").newInstance();
+	    } finally {
+		deleteRecursively(tmp);
+	    }
 	}
+    }
 
-	public static void main(String[] args) throws Exception {
-		new TestBug4523159().run(args);
-	}
+    public static void main(String[] args) throws Exception {
+	new TestBug4523159().run(args);
+    }
 }
--- a/j2se/test/sun/security/acl/PermissionImpl/PermissionEqualsHashCode.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/security/acl/PermissionImpl/PermissionEqualsHashCode.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
  */
 
 /*
- * @test 1.6 07/05/05
+ * @test 1.7 07/06/04
  * @author Gary Ellison
  * @bug 4170635
  * @summary Verify equals()/hashCode() contract honored
--- a/j2se/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh	Fri Jun 22 00:46:43 2007 +0000
@@ -23,7 +23,7 @@
 # have any questions.
 #
 
-# @test 1.9 07/05/24
+# @test 1.9 07/06/21
 # @author  Ram Marti
 # @bug 4350951 
 # @summary 4350951 assumes permission constructor with 2 string params 
--- a/j2se/test/sun/security/x509/AVA/AVAEqualsHashCode.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/security/x509/AVA/AVAEqualsHashCode.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
  */
 
 /*
- * @test 1.5 07/05/24
+ * @test 1.5 07/06/21
  * @author Gary Ellison
  * @bug 4170635
  * @summary Verify equals()/hashCode() contract honored
--- a/j2se/test/sun/security/x509/AVA/EmptyValue.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/security/x509/AVA/EmptyValue.java	Fri Jun 22 00:46:43 2007 +0000
@@ -22,7 +22,7 @@
  */
 
 /*
- * @test 1.4 07/05/24
+ * @test 1.4 07/06/21
  * @bug 4721433
  * @summary AVA throws StringIndexOutOfBoundsException for empty values
  */
--- a/j2se/test/sun/security/x509/X500Name/AllAttribs.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/security/x509/X500Name/AllAttribs.java	Fri Jun 22 00:46:43 2007 +0000
@@ -21,7 +21,7 @@
  * have any questions.
  */
 
-/* @test 1.5 07/05/24
+/* @test 1.5 07/06/21
  * @bug 4244051
  * @summary Make sure all PKIX-required X.520 name attribs are supported
  */
--- a/j2se/test/sun/security/x509/X500Name/DerValueConstructor.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/security/x509/X500Name/DerValueConstructor.java	Fri Jun 22 00:46:43 2007 +0000
@@ -21,7 +21,7 @@
  * have any questions.
  */
 
-/* @test 1.4 07/05/24
+/* @test 1.4 07/06/21
  * @bug 4228833
  * @summary Make sure constructor that takes DerValue argument works
  */
--- a/j2se/test/sun/security/x509/X500Name/NullX500Name.java	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/sun/security/x509/X500Name/NullX500Name.java	Fri Jun 22 00:46:43 2007 +0000
@@ -21,7 +21,7 @@
  * have any questions.
  */
 
-/* @test 1.4 07/05/24
+/* @test 1.4 07/06/21
  * @bug 4118818
  * @summary allow null X.500 Names
  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/text/resources/LocaleData	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,5441 @@
+#
+# @(#)LocaleData	1.7 07/04/12
+#
+# List of locale data for locale-data test
+#
+
+# bug #4052473
+LocaleNames/en/es=Spanish
+LocaleNames//es=Spanish
+
+# bug #4052679
+LocaleNames/fr/fr=fran\u00e7ais
+
+# bug #4055602, 4290801
+CurrencyNames/pt_BR/BRL=R$
+FormatData/pt_BR/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/pt_BR/NumberPatterns/1=R$ #,##0.##;-R$ #,##0.## # Changed; see bug 4122840
+FormatData/pt_BR/NumberPatterns/2=#,##0%
+FormatData/pt_BR/DateTimePatterns/0=HH'h'mm'min'ss's' z
+FormatData/pt_BR/DateTimePatterns/1=H'h'm'min's's' z
+FormatData/pt_BR/DateTimePatterns/2=HH:mm:ss
+FormatData/pt_BR/DateTimePatterns/3=HH:mm
+FormatData/pt_BR/DateTimePatterns/4=EEEE, d' de 'MMMM' de 'yyyy
+FormatData/pt_BR/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/pt_BR/DateTimePatterns/6=dd/MM/yyyy
+FormatData/pt_BR/DateTimePatterns/7=dd/MM/yy
+FormatData/pt_BR/DateTimePatterns/8={1} {0}
+FormatData/pt_BR/NumberElements/0=,
+FormatData/pt_BR/NumberElements/1=.
+FormatData/pt_BR/NumberElements/2=;
+FormatData/pt_BR/MonthAbbreviations/0=Jan
+FormatData/pt_BR/MonthAbbreviations/1=Fev
+FormatData/pt_BR/MonthAbbreviations/2=Mar
+FormatData/pt_BR/DayAbbreviations/0=Dom
+FormatData/pt_BR/DayAbbreviations/1=Seg
+FormatData/pt_BR/DayAbbreviations/2=Ter
+FormatData/pt_BR/DayNames/0=Domingo
+FormatData/pt_BR/DayNames/1=Segunda-feira
+FormatData/pt_BR/DayNames/2=Ter\u00e7a-feira
+CalendarData/pt_BR/firstDayOfWeek=2
+CalendarData/pt_BR/minimalDaysInFirstWeek=1
+FormatData/pt_BR/MonthNames/0=Janeiro
+FormatData/pt_BR/MonthNames/1=Fevereiro
+FormatData/pt_BR/MonthNames/2=Mar\u00e7o
+LocaleNames/pt_BR/pt=portugu\u00eas
+LocaleNames/pt_BR/PT=Portugal
+LocaleNames/pt_BR/BR=Brasil
+
+# bug 6414459: Wrong first day of week for Croatian locale
+CalendarData/hr/firstDayOfWeek=2
+
+# bug #4066550
+FormatData/ja/Eras/0=\u7d00\u5143\u524d
+FormatData/ja/Eras/1=\u897f\u66a6
+
+# bug #4067619
+LocaleNames//LT=Lithuania
+LocaleNames/en/LT=Lithuania
+
+# bug #4068012, 4290801, 4942982
+CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431.
+FormatData/ru_RU/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/ru_RU/NumberPatterns/1=#,##0.##'\u0440.';-#,##0.##'\u0440.' # Changed; see bug 4122840
+FormatData/ru_RU/NumberPatterns/2=#,##0%
+
+# bug #4070174
+FormatData/en_CA/NumberElements/1=,
+FormatData/en_CA/NumberElements/2=;
+
+# bug #4070452
+FormatData/de_DE/DateTimePatterns/7=dd.MM.yy
+
+# bugs #4070178, 4070450, 4070695, 4070725, 6386647
+FormatData/en_GB/DateTimePatterns/0=HH:mm:ss 'o''clock' z
+FormatData/en_GB/DateTimePatterns/1=HH:mm:ss z
+FormatData/en_GB/DateTimePatterns/2=HH:mm:ss
+FormatData/en_GB/DateTimePatterns/3=HH:mm
+FormatData/en_GB/DateTimePatterns/4=EEEE, d MMMM yyyy
+FormatData/en_GB/DateTimePatterns/5=dd MMMM yyyy
+FormatData/en_GB/DateTimePatterns/6=dd-MMM-yyyy
+FormatData/en_GB/DateTimePatterns/7=dd/MM/yy
+FormatData/en_GB/DateTimePatterns/8={1} {0}
+
+# bug #4070795
+FormatData/fr_FR/DateTimePatterns/4=EEEE d MMMM yyyy
+
+# bug #4071003
+# FormatData/fr_CA/DateTimePatterns/4=d MMMM, yyyy # See bug 4103861
+# FormatData/fr_CA/DateTimePatterns/5=d MMMM, yyyy # See bug 4103861
+
+# bug #4071183
+# FormatData/it_IT/NumberPatterns/1='L.' #,##0;-'L.' #,##0 # Changed; see bug 4122840
+
+# bug #4071782
+FormatData/ru/DayAbbreviations/0=\u0412\u0441
+FormatData/ru/DayAbbreviations/1=\u041f\u043d
+FormatData/ru/DayAbbreviations/2=\u0412\u0442
+FormatData/ru/DayAbbreviations/3=\u0421\u0440
+FormatData/ru/DayAbbreviations/4=\u0427\u0442
+FormatData/ru/DayAbbreviations/5=\u041f\u0442
+FormatData/ru/DayAbbreviations/6=\u0421\u0431
+
+# bug #4072013 - obsoleted by 6386647: Full date format in DateFormat does not include day of the week for UK locale
+#FormatData/en_GB/DateTimePatterns/4=dd MMMM yyyy
+
+# bug #4072388
+LocaleNames/cs/cs=\u010de\u0161tina
+
+# bug #4072773
+FormatData/ja/DateTimePatterns/6=yyyy/MM/dd
+FormatData/ja/DateTimePatterns/7=yy/MM/dd
+
+# bug #4075404, 4290801, 4942982
+CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431.
+FormatData/ru_RU/DateTimePatterns/0=H:mm:ss z
+FormatData/ru_RU/DateTimePatterns/1=H:mm:ss z
+FormatData/ru_RU/DateTimePatterns/2=H:mm:ss
+FormatData/ru_RU/DateTimePatterns/3=H:mm
+FormatData/ru_RU/DateTimePatterns/4=d MMMM yyyy '\u0433.'
+FormatData/ru_RU/DateTimePatterns/5=d MMMM yyyy '\u0433.'
+FormatData/ru_RU/DateTimePatterns/6=dd.MM.yyyy
+FormatData/ru_RU/DateTimePatterns/7=dd.MM.yy
+FormatData/ru_RU/DateTimePatterns/8={1} {0}
+
+# bug #4084356, 4290801
+CurrencyNames/pl_PL/PLN=z\u0142
+FormatData/pl_PL/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/pl_PL/NumberPatterns/1=#,##0.## z\u0142;-#,##0.## z\u0142 # Changed; see bug 4122840
+FormatData/pl_PL/NumberPatterns/2=#,##0%
+FormatData/pl_PL/DayNames/0=niedziela
+FormatData/pl_PL/DayNames/1=poniedzia\u0142ek
+FormatData/pl_PL/DayNames/2=wtorek
+FormatData/pl_PL/DayNames/3=\u015broda
+FormatData/pl_PL/DayNames/4=czwartek
+FormatData/pl_PL/DayNames/5=pi\u0105tek
+FormatData/pl_PL/DayNames/6=sobota
+FormatData/pl_PL/MonthNames/0=stycze\u0144
+FormatData/pl_PL/MonthNames/1=luty
+FormatData/pl_PL/MonthNames/2=marzec
+FormatData/pl_PL/MonthNames/3=kwiecie\u0144
+FormatData/pl_PL/MonthNames/4=maj
+FormatData/pl_PL/MonthNames/5=czerwiec
+FormatData/pl_PL/MonthNames/6=lipiec
+FormatData/pl_PL/MonthNames/7=sierpie\u0144
+FormatData/pl_PL/MonthNames/8=wrzesie\u0144
+FormatData/pl_PL/MonthNames/9=pa\u017adziernik
+FormatData/pl_PL/MonthNames/10=listopad
+FormatData/pl_PL/MonthNames/11=grudzie\u0144
+FormatData/pl_PL/MonthNames/12=
+LocaleNames/pl_PL/pl=polski
+FormatData/pl_PL/DateTimePatterns/0=HH:mm:ss z
+FormatData/pl_PL/DateTimePatterns/1=HH:mm:ss z
+FormatData/pl_PL/DateTimePatterns/2=HH:mm:ss
+FormatData/pl_PL/DateTimePatterns/3=HH:mm
+FormatData/pl_PL/DateTimePatterns/4=EEEE, d MMMM yyyy
+FormatData/pl_PL/DateTimePatterns/5=d MMMM yyyy
+FormatData/pl_PL/DateTimePatterns/6=yyyy-MM-dd
+# changed for bug 4984277
+FormatData/pl_PL/DateTimePatterns/7=dd.MM.yy
+FormatData/pl_PL/DateTimePatterns/8={1} {0}
+FormatData/pl_PL/NumberElements/0=,
+FormatData/pl_PL/NumberElements/1=\u00a0
+FormatData/pl_PL/NumberElements/2=;
+FormatData/pl_PL/NumberElements/3=%
+FormatData/pl_PL/NumberElements/4=0
+FormatData/pl_PL/NumberElements/5=#
+FormatData/pl_PL/NumberElements/6=-
+FormatData/pl_PL/NumberElements/7=E
+FormatData/pl_PL/NumberElements/8=\u2030
+FormatData/pl_PL/NumberElements/9=\u221e
+FormatData/pl_PL/NumberElements/10=\ufffd
+FormatData/pl_PL/Eras/0=p.n.e.
+FormatData/pl_PL/Eras/1=n.e.
+LocaleNames/pl_PL/PL=Polska
+FormatData/pl_PL/DayAbbreviations/0=N
+FormatData/pl_PL/DayAbbreviations/1=Pn
+FormatData/pl_PL/DayAbbreviations/2=Wt
+FormatData/pl_PL/DayAbbreviations/3=\u015ar
+FormatData/pl_PL/DayAbbreviations/4=Cz
+FormatData/pl_PL/DayAbbreviations/5=Pt
+FormatData/pl_PL/DayAbbreviations/6=So
+FormatData/pl_PL/MonthAbbreviations/0=sty
+FormatData/pl_PL/MonthAbbreviations/1=lut
+FormatData/pl_PL/MonthAbbreviations/2=mar
+FormatData/pl_PL/MonthAbbreviations/3=kwi
+FormatData/pl_PL/MonthAbbreviations/4=maj
+FormatData/pl_PL/MonthAbbreviations/5=cze
+FormatData/pl_PL/MonthAbbreviations/6=lip
+FormatData/pl_PL/MonthAbbreviations/7=sie
+FormatData/pl_PL/MonthAbbreviations/8=wrz
+FormatData/pl_PL/MonthAbbreviations/9=pa\u017a
+FormatData/pl_PL/MonthAbbreviations/10=lis
+FormatData/pl_PL/MonthAbbreviations/11=gru
+FormatData/pl_PL/MonthAbbreviations/12=
+CalendarData/pl_PL/firstDayOfWeek=2
+CalendarData/pl_PL/minimalDaysInFirstWeek=4
+FormatData/pl_PL/AmPmMarkers/0=AM
+FormatData/pl_PL/AmPmMarkers/1=PM
+
+# bug #4087238, 4290801
+# bug 4156708 - changed currency symbol from 00a5 to ffe5
+CurrencyNames/ja_JP/JPY=\uffe5
+# FormatData/ja_JP/NumberPatterns/1=\u00a5#,##0.00 # Changed; see bug 4122840
+
+# bug #4092361
+FormatData/en_US/DateTimePatterns/0=h:mm:ss a z
+FormatData/en_US/DateTimePatterns/1=h:mm:ss a z
+FormatData/en_US/DateTimePatterns/2=h:mm:ss a
+FormatData/en_US/DateTimePatterns/3=h:mm a
+FormatData/en_US/DateTimePatterns/4=EEEE, MMMM d, yyyy
+FormatData/en_US/DateTimePatterns/5=MMMM d, yyyy
+FormatData/en_US/DateTimePatterns/6=MMM d, yyyy
+FormatData/en_US/DateTimePatterns/7=M/d/yy
+FormatData/en_US/DateTimePatterns/8={1} {0}
+
+# bug #4094033, 4290801, 4942982
+CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431.
+FormatData/ru_RU/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/ru_RU/NumberPatterns/1=#,##0.##'\u0440.';-#,##0.##'\u0440.' # Changed; see bug 4122840
+FormatData/ru_RU/NumberPatterns/2=#,##0%
+FormatData/ru_RU/MonthNames/0=\u042f\u043d\u0432\u0430\u0440\u044c
+FormatData/ru_RU/MonthNames/1=\u0424\u0435\u0432\u0440\u0430\u043b\u044c
+FormatData/ru_RU/MonthNames/2=\u041c\u0430\u0440\u0442
+FormatData/ru_RU/MonthNames/3=\u0410\u043f\u0440\u0435\u043b\u044c
+FormatData/ru_RU/MonthNames/4=\u041c\u0430\u0439
+FormatData/ru_RU/MonthNames/5=\u0418\u044e\u043d\u044c
+FormatData/ru_RU/MonthNames/6=\u0418\u044e\u043b\u044c
+FormatData/ru_RU/MonthNames/7=\u0410\u0432\u0433\u0443\u0441\u0442
+FormatData/ru_RU/MonthNames/8=\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c
+FormatData/ru_RU/MonthNames/9=\u041e\u043a\u0442\u044f\u0431\u0440\u044c
+FormatData/ru_RU/MonthNames/10=\u041d\u043e\u044f\u0431\u0440\u044c
+FormatData/ru_RU/MonthNames/11=\u0414\u0435\u043a\u0430\u0431\u0440\u044c
+FormatData/ru_RU/MonthNames/12=
+FormatData/ru_RU/Eras/0=\u0434\u043e \u043d.\u044d.
+FormatData/ru_RU/Eras/1=\u043d.\u044d.
+LocaleNames/ru_RU/ru=\u0440\u0443\u0441\u0441\u043a\u0438\u0439
+FormatData/ru_RU/MonthAbbreviations/0=\u044f\u043d\u0432
+FormatData/ru_RU/MonthAbbreviations/1=\u0444\u0435\u0432
+FormatData/ru_RU/MonthAbbreviations/2=\u043c\u0430\u0440
+FormatData/ru_RU/MonthAbbreviations/3=\u0430\u043f\u0440
+FormatData/ru_RU/MonthAbbreviations/4=\u043c\u0430\u0439
+FormatData/ru_RU/MonthAbbreviations/5=\u0438\u044e\u043d
+FormatData/ru_RU/MonthAbbreviations/6=\u0438\u044e\u043b
+FormatData/ru_RU/MonthAbbreviations/7=\u0430\u0432\u0433
+FormatData/ru_RU/MonthAbbreviations/8=\u0441\u0435\u043d
+FormatData/ru_RU/MonthAbbreviations/9=\u043e\u043a\u0442
+FormatData/ru_RU/MonthAbbreviations/10=\u043d\u043e\u044f
+FormatData/ru_RU/MonthAbbreviations/11=\u0434\u0435\u043a
+FormatData/ru_RU/MonthAbbreviations/12=
+FormatData/ru_RU/DateTimePatterns/0=H:mm:ss z
+FormatData/ru_RU/DateTimePatterns/1=H:mm:ss z
+FormatData/ru_RU/DateTimePatterns/2=H:mm:ss
+FormatData/ru_RU/DateTimePatterns/3=H:mm
+FormatData/ru_RU/DateTimePatterns/4=d MMMM yyyy '\u0433.'
+FormatData/ru_RU/DateTimePatterns/5=d MMMM yyyy '\u0433.'
+FormatData/ru_RU/DateTimePatterns/6=dd.MM.yyyy
+FormatData/ru_RU/DateTimePatterns/7=dd.MM.yy
+FormatData/ru_RU/DateTimePatterns/8={1} {0}
+FormatData/ru_RU/DayNames/0=\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435
+FormatData/ru_RU/DayNames/1=\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a
+FormatData/ru_RU/DayNames/2=\u0432\u0442\u043e\u0440\u043d\u0438\u043a
+FormatData/ru_RU/DayNames/3=\u0441\u0440\u0435\u0434\u0430
+FormatData/ru_RU/DayNames/4=\u0447\u0435\u0442\u0432\u0435\u0440\u0433
+FormatData/ru_RU/DayNames/5=\u043f\u044f\u0442\u043d\u0438\u0446\u0430
+FormatData/ru_RU/DayNames/6=\u0441\u0443\u0431\u0431\u043e\u0442\u0430
+FormatData/ru_RU/NumberElements/0=,
+FormatData/ru_RU/NumberElements/1=\u00a0
+FormatData/ru_RU/NumberElements/2=;
+FormatData/ru_RU/NumberElements/3=%
+FormatData/ru_RU/NumberElements/4=0
+FormatData/ru_RU/NumberElements/5=#
+FormatData/ru_RU/NumberElements/6=-
+FormatData/ru_RU/NumberElements/7=E
+FormatData/ru_RU/NumberElements/8=\u2030
+FormatData/ru_RU/NumberElements/9=\u221e
+FormatData/ru_RU/NumberElements/10=\ufffd
+LocaleNames/ru_RU/RU=\u0420\u043e\u0441\u0441\u0438\u044f
+FormatData/ru_RU/DayAbbreviations/0=\u0412\u0441
+FormatData/ru_RU/DayAbbreviations/1=\u041f\u043d
+FormatData/ru_RU/DayAbbreviations/2=\u0412\u0442
+FormatData/ru_RU/DayAbbreviations/3=\u0421\u0440
+FormatData/ru_RU/DayAbbreviations/4=\u0427\u0442
+FormatData/ru_RU/DayAbbreviations/5=\u041f\u0442
+FormatData/ru_RU/DayAbbreviations/6=\u0421\u0431
+FormatData/ru_RU/AmPmMarkers/0=AM
+FormatData/ru_RU/AmPmMarkers/1=PM
+CalendarData/ru_RU/firstDayOfWeek=2
+CalendarData/ru_RU/minimalDaysInFirstWeek=1
+
+# bug #4094371, 4098518, 4290801
+FormatData/en_AU/DateTimePatterns/0=hh:mm:ss a z
+FormatData/en_AU/DateTimePatterns/1=H:mm:ss
+FormatData/en_AU/DateTimePatterns/2=HH:mm:ss
+FormatData/en_AU/DateTimePatterns/3=HH:mm
+FormatData/en_AU/DateTimePatterns/4=EEEE, d MMMM yyyy
+FormatData/en_AU/DateTimePatterns/5=d MMMM yyyy
+FormatData/en_AU/DateTimePatterns/6=d/MM/yyyy
+FormatData/en_AU/DateTimePatterns/7=d/MM/yy
+FormatData/en_AU/DateTimePatterns/8={1} {0}
+LocaleNames/en_AU/US=United States
+LocaleNames/en_AU/GB=United Kingdom
+LocaleNames/en_AU/CA=Canada
+LocaleNames/en_AU/IE=Ireland
+LocaleNames/en_AU/AU=Australia
+LocaleNames/en_AU/NZ=New Zealand
+FormatData/en_AU/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/en_AU/NumberPatterns/1=$#,##0.00;-$#,##0.00 # Changed; see bug 4122840
+FormatData/en_AU/NumberPatterns/2=#,##0%
+CurrencyNames/en_AU/AUD=$
+LocaleNames/en_AU/en=English
+FormatData/en_AU/MonthNames/0=January
+FormatData/en_AU/MonthNames/1=February
+FormatData/en_AU/MonthNames/2=March
+FormatData/en_NZ/DateTimePatterns/0=hh:mm:ss a z
+FormatData/en_NZ/DateTimePatterns/1=H:mm:ss
+FormatData/en_NZ/DateTimePatterns/2=HH:mm:ss
+FormatData/en_NZ/DateTimePatterns/3=HH:mm
+FormatData/en_NZ/DateTimePatterns/4=EEEE, d MMMM yyyy
+FormatData/en_NZ/DateTimePatterns/5=d MMMM yyyy
+FormatData/en_NZ/DateTimePatterns/6=d/MM/yyyy
+FormatData/en_NZ/DateTimePatterns/7=d/MM/yy
+FormatData/en_NZ/DateTimePatterns/8={1} {0}
+LocaleNames/en_NZ/US=United States
+LocaleNames/en_NZ/GB=United Kingdom
+LocaleNames/en_NZ/CA=Canada
+LocaleNames/en_NZ/IE=Ireland
+LocaleNames/en_NZ/AU=Australia
+LocaleNames/en_NZ/NZ=New Zealand
+FormatData/en_NZ/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/en_NZ/NumberPatterns/1=$#,##0.00;-$#,##0.00 # Changed; see bug 4122840
+FormatData/en_NZ/NumberPatterns/2=#,##0%
+CurrencyNames/en_NZ/NZD=$
+LocaleNames/en_NZ/en=English
+FormatData/en_NZ/MonthNames/0=January
+FormatData/en_NZ/MonthNames/1=February
+FormatData/en_NZ/MonthNames/2=March
+FormatData/en_ZA/DateTimePatterns/0=hh:mm:ss a
+FormatData/en_ZA/DateTimePatterns/1=hh:mm:ss
+FormatData/en_ZA/DateTimePatterns/2=hh:mm:ss
+FormatData/en_ZA/DateTimePatterns/3=hh:mm
+FormatData/en_ZA/DateTimePatterns/4=dd MMMM yyyy
+FormatData/en_ZA/DateTimePatterns/5=dd MMMM yyyy
+FormatData/en_ZA/DateTimePatterns/6=yyyy/MM/dd
+FormatData/en_ZA/DateTimePatterns/7=yy/MM/dd
+FormatData/en_ZA/DateTimePatterns/8={1} {0}
+LocaleNames/en_ZA/US=United States
+LocaleNames/en_ZA/GB=United Kingdom
+LocaleNames/en_ZA/CA=Canada
+LocaleNames/en_ZA/IE=Ireland
+LocaleNames/en_ZA/ZA=South Africa
+FormatData/en_ZA/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/en_ZA/NumberPatterns/1=R #,##0.00;R-#,##0.00 # Changed; see bug 4122840
+FormatData/en_ZA/NumberPatterns/2=#,##0%
+CurrencyNames/en_ZA/ZAR=R
+LocaleNames/en_ZA/en=English
+FormatData/en_ZA/MonthNames/0=January
+FormatData/en_ZA/MonthNames/1=February
+FormatData/en_ZA/MonthNames/2=March
+CurrencyNames/es_AR/ARS=$
+FormatData/es_AR/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_AR/NumberPatterns/1=$#,##0.00;($#,##0.00) # Changed; see bug 4122840
+FormatData/es_AR/NumberPatterns/2=#,##0%
+FormatData/es_AR/DateTimePatterns/0=HH'h'''mm z
+FormatData/es_AR/DateTimePatterns/1=H:mm:ss z
+FormatData/es_AR/DateTimePatterns/2=HH:mm:ss
+FormatData/es_AR/DateTimePatterns/3=HH:mm
+FormatData/es_AR/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_AR/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_AR/DateTimePatterns/6=dd/MM/yyyy
+FormatData/es_AR/DateTimePatterns/7=dd/MM/yy
+FormatData/es_AR/DateTimePatterns/8={1} {0}
+FormatData/es_AR/NumberElements/0=,
+FormatData/es_AR/NumberElements/1=.
+FormatData/es_AR/NumberElements/2=;
+FormatData/es_BO/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_BO/NumberPatterns/1=B$#,##0.00;(B$#,##0.00) # Changed; see bug 4122840
+FormatData/es_BO/NumberPatterns/2=#,##0%
+CurrencyNames/es_BO/BOB=B$
+FormatData/es_BO/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_BO/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_BO/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_BO/DateTimePatterns/3=hh:mm a
+FormatData/es_BO/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_BO/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_BO/DateTimePatterns/6=dd-MM-yyyy
+FormatData/es_BO/DateTimePatterns/7=dd-MM-yy
+FormatData/es_BO/DateTimePatterns/8={1} {0}
+# changed decimal and group separator for 5102005 bugfix
+FormatData/es_BO/NumberElements/0=,
+FormatData/es_BO/NumberElements/1=.
+FormatData/es_BO/NumberElements/2=;
+CurrencyNames/es_CL/CLP=Ch$
+FormatData/es_CL/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_CL/NumberPatterns/1=Ch$#,##0.00;Ch$-#,##0.00 # Changed; see bug 4122840
+FormatData/es_CL/NumberPatterns/2=#,##0%
+FormatData/es_CL/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_CL/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_CL/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_CL/DateTimePatterns/3=hh:mm a
+FormatData/es_CL/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_CL/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_CL/DateTimePatterns/6=dd-MM-yyyy
+FormatData/es_CL/DateTimePatterns/7=dd-MM-yy
+FormatData/es_CL/DateTimePatterns/8={1} {0}
+FormatData/es_CL/NumberElements/0=,
+FormatData/es_CL/NumberElements/1=.
+FormatData/es_CL/NumberElements/2=;
+FormatData/es_CO/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_CO/NumberPatterns/1=C$#,##0.00;(C$#,##0.00) # Changed; see bug 4122840
+FormatData/es_CO/NumberPatterns/2=#,##0%
+# changed currency symbol during 5102005 bugfix
+CurrencyNames/es_CO/COP=$
+FormatData/es_CO/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_CO/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_CO/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_CO/DateTimePatterns/3=hh:mm a
+FormatData/es_CO/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_CO/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_CO/DateTimePatterns/6=d/MM/yyyy
+FormatData/es_CO/DateTimePatterns/7=d/MM/yy
+FormatData/es_CO/DateTimePatterns/8={1} {0}
+# changed decimal and group separator for 5102005 bugfix
+FormatData/es_CO/NumberElements/0=,
+FormatData/es_CO/NumberElements/1=.
+FormatData/es_CO/NumberElements/2=;
+FormatData/es_CR/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_CR/NumberPatterns/1=C#,##0.00;(C#,##0.00) # Changed; see bug 4122840
+FormatData/es_CR/NumberPatterns/2=#,##0%
+CurrencyNames/es_CR/CRC=C
+FormatData/es_CR/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_CR/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_CR/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_CR/DateTimePatterns/3=hh:mm a
+FormatData/es_CR/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_CR/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_CR/DateTimePatterns/6=dd/MM/yyyy
+FormatData/es_CR/DateTimePatterns/7=dd/MM/yy
+FormatData/es_CR/DateTimePatterns/8={1} {0}
+FormatData/es_CR/NumberElements/0=.
+FormatData/es_CR/NumberElements/1=,
+FormatData/es_CR/NumberElements/2=;
+FormatData/es_DO/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_DO/NumberPatterns/1=RD$#,##0.00;(RD$#,##0.00) # Changed; see bug 4122840
+FormatData/es_DO/NumberPatterns/2=#,##0%
+CurrencyNames/es_DO/DOP=RD$
+FormatData/es_DO/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_DO/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_DO/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_DO/DateTimePatterns/3=hh:mm a
+FormatData/es_DO/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_DO/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_DO/DateTimePatterns/6=MM/dd/yyyy
+FormatData/es_DO/DateTimePatterns/7=MM/dd/yy
+FormatData/es_DO/DateTimePatterns/8={1} {0}
+FormatData/es_DO/NumberElements/0=.
+FormatData/es_DO/NumberElements/1=,
+FormatData/es_DO/NumberElements/2=;
+FormatData/es_EC/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_EC/NumberPatterns/1=S/#,##0.00;S/-#,##0.00 # Changed; see bug 4122840
+FormatData/es_EC/NumberPatterns/2=#,##0%
+#changed for 4945388
+CurrencyNames/es_EC/USD=$
+FormatData/es_EC/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_EC/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_EC/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_EC/DateTimePatterns/3=hh:mm a
+FormatData/es_EC/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_EC/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_EC/DateTimePatterns/6=dd/MM/yyyy
+FormatData/es_EC/DateTimePatterns/7=dd/MM/yy
+FormatData/es_EC/DateTimePatterns/8={1} {0}
+# changed decimal and group separator for 5102005 bugfix
+FormatData/es_EC/NumberElements/0=,
+FormatData/es_EC/NumberElements/1=.
+FormatData/es_EC/NumberElements/2=;
+LocaleNames/es/ES=Espa\u00f1a
+LocaleNames/es/AR=Argentina
+LocaleNames/es/BO=Bolivia
+LocaleNames/es/CL=Chile
+LocaleNames/es/CO=Colombia
+LocaleNames/es/CR=Costa Rica
+LocaleNames/es/DO=Rep\u00fablica Dominicana
+LocaleNames/es/EC=Ecuador
+LocaleNames/es/GT=Guatemala
+LocaleNames/es/HN=Honduras
+LocaleNames/es/MX=M\u00e9xico
+LocaleNames/es/NI=Nicaragua
+LocaleNames/es/PA=Panam\u00e1
+LocaleNames/es/PE=Per\u00fa
+LocaleNames/es/PR=Puerto Rico
+LocaleNames/es/PY=Paraguay
+# LocaleNames/es/SV=El SalvadorUY # Changed, see bug 4331446
+LocaleNames/es/UY=Uruguay
+LocaleNames/es/VE=Venezuela
+FormatData/es_GT/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_GT/NumberPatterns/1=Q#,##0.00;(Q#,##0.00) # Changed; see bug 4122840
+FormatData/es_GT/NumberPatterns/2=#,##0%
+CurrencyNames/es_GT/GTQ=Q
+FormatData/es_GT/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_GT/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_GT/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_GT/DateTimePatterns/3=hh:mm a
+FormatData/es_GT/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_GT/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_GT/DateTimePatterns/6=d/MM/yyyy
+FormatData/es_GT/DateTimePatterns/7=d/MM/yy
+FormatData/es_GT/DateTimePatterns/8={1} {0}
+FormatData/es_GT/NumberElements/0=.
+FormatData/es_GT/NumberElements/1=,
+FormatData/es_GT/NumberElements/2=;
+FormatData/es_HN/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_HN/NumberPatterns/1=L#,##0.00;(L#,##0.00) # Changed; see bug 4122840
+FormatData/es_HN/NumberPatterns/2=#,##0%
+CurrencyNames/es_HN/HNL=L
+FormatData/es_HN/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_HN/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_HN/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_HN/DateTimePatterns/3=hh:mm a
+FormatData/es_HN/DateTimePatterns/4=EEEE dd' de 'MMMM' de 'yyyy
+FormatData/es_HN/DateTimePatterns/5=dd' de 'MMMM' de 'yyyy
+FormatData/es_HN/DateTimePatterns/6=MM-dd-yyyy
+FormatData/es_HN/DateTimePatterns/7=MM-dd-yy
+FormatData/es_HN/DateTimePatterns/8={1} {0}
+FormatData/es_HN/NumberElements/0=.
+FormatData/es_HN/NumberElements/1=,
+FormatData/es_HN/NumberElements/2=;
+FormatData/es_MX/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_MX/NumberPatterns/1=$#,##0.00;($#,##0.00) # Changed; see bug 4122840
+FormatData/es_MX/NumberPatterns/2=#,##0%
+CurrencyNames/es_MX/MXN=$
+FormatData/es_MX/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_MX/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_MX/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_MX/DateTimePatterns/3=hh:mm a
+FormatData/es_MX/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_MX/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_MX/DateTimePatterns/6=d/MM/yyyy
+FormatData/es_MX/DateTimePatterns/7=d/MM/yy
+FormatData/es_MX/DateTimePatterns/8={1} {0}
+FormatData/es_MX/NumberElements/0=.
+FormatData/es_MX/NumberElements/1=,
+FormatData/es_MX/NumberElements/2=;
+FormatData/es_NI/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_NI/NumberPatterns/1=$C#,##0.00;($C#,##0.00) # Changed; see bug 4122840
+FormatData/es_NI/NumberPatterns/2=#,##0%
+CurrencyNames/es_NI/NIO=$C
+FormatData/es_NI/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_NI/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_NI/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_NI/DateTimePatterns/3=hh:mm a
+FormatData/es_NI/DateTimePatterns/4=EEEE dd' de 'MMMM' de 'yyyy
+FormatData/es_NI/DateTimePatterns/5=dd' de 'MMMM' de 'yyyy
+FormatData/es_NI/DateTimePatterns/6=MM-dd-yyyy
+FormatData/es_NI/DateTimePatterns/7=MM-dd-yy
+FormatData/es_NI/DateTimePatterns/8={1} {0}
+FormatData/es_NI/NumberElements/0=.
+FormatData/es_NI/NumberElements/1=,
+FormatData/es_NI/NumberElements/2=;
+FormatData/es_PA/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_PA/NumberPatterns/1=B#,##0.00;(B#,##0.00) # Changed; see bug 4122840
+FormatData/es_PA/NumberPatterns/2=#,##0%
+CurrencyNames/es_PA/PAB=B
+FormatData/es_PA/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_PA/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_PA/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_PA/DateTimePatterns/3=hh:mm a
+FormatData/es_PA/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_PA/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_PA/DateTimePatterns/6=MM/dd/yyyy
+FormatData/es_PA/DateTimePatterns/7=MM/dd/yy
+FormatData/es_PA/DateTimePatterns/8={1} {0}
+FormatData/es_PA/NumberElements/0=.
+FormatData/es_PA/NumberElements/1=,
+FormatData/es_PA/NumberElements/2=;
+CurrencyNames/es_PE/PEN=S/
+FormatData/es_PE/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_PE/NumberPatterns/1=S/#,##0.00;S/-#,##0.00 # Changed; see bug 4122840
+FormatData/es_PE/NumberPatterns/2=#,##0%
+FormatData/es_PE/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_PE/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_PE/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_PE/DateTimePatterns/3=hh:mm a
+FormatData/es_PE/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_PE/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_PE/DateTimePatterns/6=dd/MM/yyyy
+FormatData/es_PE/DateTimePatterns/7=dd/MM/yy
+FormatData/es_PE/DateTimePatterns/8={1} {0}
+FormatData/es_PE/NumberElements/0=,
+FormatData/es_PE/NumberElements/1=.
+FormatData/es_PE/NumberElements/2=;
+FormatData/es_PR/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_PR/NumberPatterns/1=$#,##0.00;($#,##0.00) # Changed; see bug 4122840
+FormatData/es_PR/NumberPatterns/2=#,##0%
+CurrencyNames/es_PR/USD=$
+FormatData/es_PR/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_PR/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_PR/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_PR/DateTimePatterns/3=hh:mm a
+FormatData/es_PR/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_PR/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_PR/DateTimePatterns/6=MM-dd-yyyy
+FormatData/es_PR/DateTimePatterns/7=MM-dd-yy
+FormatData/es_PR/DateTimePatterns/8={1} {0}
+FormatData/es_PR/NumberElements/0=.
+FormatData/es_PR/NumberElements/1=,
+FormatData/es_PR/NumberElements/2=;
+CurrencyNames/es_PY/PYG=G
+FormatData/es_PY/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_PY/NumberPatterns/1=G#,##0.00;(G#,##0.00) # Changed; see bug 4122840
+FormatData/es_PY/NumberPatterns/2=#,##0%
+FormatData/es_PY/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_PY/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_PY/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_PY/DateTimePatterns/3=hh:mm a
+FormatData/es_PY/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_PY/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_PY/DateTimePatterns/6=dd/MM/yyyy
+FormatData/es_PY/DateTimePatterns/7=dd/MM/yy
+FormatData/es_PY/DateTimePatterns/8={1} {0}
+FormatData/es_PY/NumberElements/0=,
+FormatData/es_PY/NumberElements/1=.
+FormatData/es_PY/NumberElements/2=;
+FormatData/es_SV/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_SV/NumberPatterns/1=C#,##0.00;(C#,##0.00) # Changed; see bug 4122840
+FormatData/es_SV/NumberPatterns/2=#,##0%
+CurrencyNames/es_SV/SVC=C
+FormatData/es_SV/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_SV/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_SV/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_SV/DateTimePatterns/3=hh:mm a
+FormatData/es_SV/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_SV/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_SV/DateTimePatterns/6=MM-dd-yyyy
+FormatData/es_SV/DateTimePatterns/7=MM-dd-yy
+FormatData/es_SV/DateTimePatterns/8={1} {0}
+FormatData/es_SV/NumberElements/0=.
+FormatData/es_SV/NumberElements/1=,
+FormatData/es_SV/NumberElements/2=;
+CurrencyNames/es_UY/UYU=NU$
+FormatData/es_UY/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_UY/NumberPatterns/1=NU$ #,##0.00;(NU$#,##0.00) # Changed; see bug 4122840
+FormatData/es_UY/NumberPatterns/2=#,##0%
+FormatData/es_UY/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_UY/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_UY/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_UY/DateTimePatterns/3=hh:mm a
+FormatData/es_UY/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_UY/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_UY/DateTimePatterns/6=dd/MM/yyyy
+FormatData/es_UY/DateTimePatterns/7=dd/MM/yy
+FormatData/es_UY/DateTimePatterns/8={1} {0}
+FormatData/es_UY/NumberElements/0=,
+FormatData/es_UY/NumberElements/1=.
+FormatData/es_UY/NumberElements/2=;
+CurrencyNames/es_VE/VEB=Bs
+FormatData/es_VE/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/es_VE/NumberPatterns/1=Bs#,##0.00;Bs -#,##0.00 # Changed; see bug 4122840
+FormatData/es_VE/NumberPatterns/2=#,##0%
+FormatData/es_VE/DateTimePatterns/0=hh:mm:ss a z
+FormatData/es_VE/DateTimePatterns/1=hh:mm:ss a z
+FormatData/es_VE/DateTimePatterns/2=hh:mm:ss a
+FormatData/es_VE/DateTimePatterns/3=hh:mm a
+FormatData/es_VE/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_VE/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_VE/DateTimePatterns/6=dd/MM/yyyy
+FormatData/es_VE/DateTimePatterns/7=dd/MM/yy
+FormatData/es_VE/DateTimePatterns/8={1} {0}
+FormatData/es_VE/NumberElements/0=,
+FormatData/es_VE/NumberElements/1=.
+FormatData/es_VE/NumberElements/2=;
+
+# bug #4099810, 4290801
+CurrencyNames/uk_UA/UAH=\u0433\u0440\u0432.
+FormatData/uk_UA/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/uk_UA/NumberPatterns/1=#,##0.## '\u0433\u0440\u0432.';-#,##0.## '\u0433\u0440\u0432.' # Changed; see bug 4122840
+FormatData/uk_UA/NumberPatterns/2=#,##0%
+
+# bug 6245766
+FormatData/uk/DateTimePatterns/4=EEEE, d MMMM yyyy \u0440.
+FormatData/uk/DateTimePatterns/5=d MMMM yyyy
+FormatData/uk/DateTimePatterns/6=d MMM yyyy
+FormatData/uk/DateTimePatterns/7=dd.MM.yy
+
+# bug #4103218
+# FormatData/ko_KR/NumberPatterns/1=\u20a9#,##0;-\u20a9#,##0 # Changed; see bug 4122840
+
+# bug #4103220 should be adequately tested by the above tests, which represent a pretty
+# good cross-section of the locale data
+
+# bug #4103861
+# As far as I can tell, French dates do not use commas at all.  However, we
+# already have a comma after the month in the LONG date format, so we want to be
+# consistent with that.  This is probably taken from the Windows locale data,
+# which does include a comma after month for fr_CA (although not for fr_FR).
+# Hence: No comma after the day of week. ASL 5/12/98
+# Follow-up: Well, a follow-up duplicate bug (4141637) has confirmed that the
+# comma should not be present at all in French.  Removing the comma.
+FormatData/fr_CA/DateTimePatterns/4=EEEE d MMMM yyyy
+FormatData/fr_CA/DateTimePatterns/5=d MMMM yyyy
+FormatData/en_CA/DateTimePatterns/4=EEEE, MMMM d, yyyy
+
+# bug #4112136
+FormatData/fr_CA/DateTimePatterns/0=H' h 'mm z
+FormatData/fr_CA/DateTimePatterns/1=HH:mm:ss z
+
+# bug #4113638, 4290801
+CurrencyNames/ar_AE/AED=\u062f.\u0625.\u200f
+FormatData/ar_AE/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_AE/NumberPatterns/1='\u062f.\u0625.\u200f' #,##0.###;'\u062f.\u0625.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_AE/NumberPatterns/2=#,##0%
+FormatData/ar_AE/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_AE/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_AE/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_AE/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_AE/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_AE/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_AE/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_AE/firstDayOfWeek=7
+CalendarData/ar_AE/minimalDaysInFirstWeek=1
+FormatData/ar_AE/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_AE/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_AE/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_AE/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_AE/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_AE/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_AE/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_AE/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_AE/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_AE/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_AE/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_AE/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_AE/MonthAbbreviations/12=
+FormatData/ar_AE/Eras/0=\u0642.\u0645
+FormatData/ar_AE/Eras/1=\u0645
+FormatData/ar_AE/DayAbbreviations/0=\u062d
+FormatData/ar_AE/DayAbbreviations/1=\u0646
+FormatData/ar_AE/DayAbbreviations/2=\u062b
+FormatData/ar_AE/DayAbbreviations/3=\u0631
+FormatData/ar_AE/DayAbbreviations/4=\u062e
+FormatData/ar_AE/DayAbbreviations/5=\u062c
+FormatData/ar_AE/DayAbbreviations/6=\u0633
+LocaleNames/ar_AE/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_AE/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_AE/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_AE/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_AE/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_AE/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_AE/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_AE/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_AE/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_AE/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_AE/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_AE/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_AE/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_AE/MonthNames/12=
+FormatData/ar_AE/AmPmMarkers/0=\u0635
+FormatData/ar_AE/AmPmMarkers/1=\u0645
+FormatData/ar_AE/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_AE/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_AE/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_AE/DateTimePatterns/3=hh:mm a
+FormatData/ar_AE/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_AE/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_AE/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_AE/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_AE/DateTimePatterns/8={1} {0}
+LocaleNames/ar_AE/EG=\u0645\u0635\u0631
+LocaleNames/ar_AE/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_AE/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_AE/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_AE/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_AE/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_AE/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_AE/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_AE/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_AE/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_AE/QA=\u0642\u0637\u0631
+LocaleNames/ar_AE/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_AE/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_AE/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_AE/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_AE/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_AE/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_AE/NumberElements/0=.
+FormatData/ar_AE/NumberElements/1=,
+FormatData/ar_AE/NumberElements/2=;
+FormatData/ar_AE/NumberElements/3=%
+FormatData/ar_AE/NumberElements/4=0
+FormatData/ar_AE/NumberElements/5=#
+FormatData/ar_AE/NumberElements/6=-
+FormatData/ar_AE/NumberElements/7=E
+FormatData/ar_AE/NumberElements/8=\u2030
+FormatData/ar_AE/NumberElements/9=\u221e
+FormatData/ar_AE/NumberElements/10=\ufffd
+CurrencyNames/ar_BH/BHD=\u062f.\u0628.\u200f
+FormatData/ar_BH/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_BH/NumberPatterns/1='\u062f.\u0628.\u200f' #,##0.###;'\u062f.\u0628.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_BH/NumberPatterns/2=#,##0%
+FormatData/ar_BH/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_BH/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_BH/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_BH/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_BH/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_BH/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_BH/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_BH/firstDayOfWeek=7
+CalendarData/ar_BH/minimalDaysInFirstWeek=1
+FormatData/ar_BH/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_BH/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_BH/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_BH/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_BH/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_BH/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_BH/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_BH/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_BH/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_BH/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_BH/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_BH/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_BH/MonthAbbreviations/12=
+FormatData/ar_BH/Eras/0=\u0642.\u0645
+FormatData/ar_BH/Eras/1=\u0645
+FormatData/ar_BH/DayAbbreviations/0=\u062d
+FormatData/ar_BH/DayAbbreviations/1=\u0646
+FormatData/ar_BH/DayAbbreviations/2=\u062b
+FormatData/ar_BH/DayAbbreviations/3=\u0631
+FormatData/ar_BH/DayAbbreviations/4=\u062e
+FormatData/ar_BH/DayAbbreviations/5=\u062c
+FormatData/ar_BH/DayAbbreviations/6=\u0633
+LocaleNames/ar_BH/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_BH/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_BH/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_BH/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_BH/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_BH/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_BH/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_BH/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_BH/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_BH/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_BH/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_BH/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_BH/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_BH/MonthNames/12=
+FormatData/ar_BH/AmPmMarkers/0=\u0635
+FormatData/ar_BH/AmPmMarkers/1=\u0645
+FormatData/ar_BH/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_BH/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_BH/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_BH/DateTimePatterns/3=hh:mm a
+FormatData/ar_BH/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_BH/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_BH/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_BH/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_BH/DateTimePatterns/8={1} {0}
+LocaleNames/ar_BH/EG=\u0645\u0635\u0631
+LocaleNames/ar_BH/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_BH/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_BH/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_BH/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_BH/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_BH/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_BH/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_BH/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_BH/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_BH/QA=\u0642\u0637\u0631
+LocaleNames/ar_BH/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_BH/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_BH/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_BH/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_BH/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_BH/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_BH/NumberElements/0=.
+FormatData/ar_BH/NumberElements/1=,
+FormatData/ar_BH/NumberElements/2=;
+FormatData/ar_BH/NumberElements/3=%
+FormatData/ar_BH/NumberElements/4=0
+FormatData/ar_BH/NumberElements/5=#
+FormatData/ar_BH/NumberElements/6=-
+FormatData/ar_BH/NumberElements/7=E
+FormatData/ar_BH/NumberElements/8=\u2030
+FormatData/ar_BH/NumberElements/9=\u221e
+FormatData/ar_BH/NumberElements/10=\ufffd
+CurrencyNames/ar_DZ/DZD=\u062f.\u062c.\u200f
+FormatData/ar_DZ/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_DZ/NumberPatterns/1='\u062f.\u062c.\u200f' #,##0.###;'\u062f.\u062c.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_DZ/NumberPatterns/2=#,##0%
+FormatData/ar_DZ/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_DZ/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_DZ/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_DZ/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_DZ/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_DZ/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_DZ/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_DZ/firstDayOfWeek=7
+CalendarData/ar_DZ/minimalDaysInFirstWeek=1
+FormatData/ar_DZ/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_DZ/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_DZ/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_DZ/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_DZ/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_DZ/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_DZ/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_DZ/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_DZ/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_DZ/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_DZ/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_DZ/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_DZ/MonthAbbreviations/12=
+FormatData/ar_DZ/Eras/0=\u0642.\u0645
+FormatData/ar_DZ/Eras/1=\u0645
+FormatData/ar_DZ/DayAbbreviations/0=\u062d
+FormatData/ar_DZ/DayAbbreviations/1=\u0646
+FormatData/ar_DZ/DayAbbreviations/2=\u062b
+FormatData/ar_DZ/DayAbbreviations/3=\u0631
+FormatData/ar_DZ/DayAbbreviations/4=\u062e
+FormatData/ar_DZ/DayAbbreviations/5=\u062c
+FormatData/ar_DZ/DayAbbreviations/6=\u0633
+LocaleNames/ar_DZ/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_DZ/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_DZ/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_DZ/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_DZ/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_DZ/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_DZ/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_DZ/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_DZ/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_DZ/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_DZ/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_DZ/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_DZ/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_DZ/MonthNames/12=
+FormatData/ar_DZ/AmPmMarkers/0=\u0635
+FormatData/ar_DZ/AmPmMarkers/1=\u0645
+FormatData/ar_DZ/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_DZ/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_DZ/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_DZ/DateTimePatterns/3=hh:mm a
+FormatData/ar_DZ/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_DZ/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_DZ/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_DZ/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_DZ/DateTimePatterns/8={1} {0}
+LocaleNames/ar_DZ/EG=\u0645\u0635\u0631
+LocaleNames/ar_DZ/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_DZ/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_DZ/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_DZ/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_DZ/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_DZ/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_DZ/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_DZ/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_DZ/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_DZ/QA=\u0642\u0637\u0631
+LocaleNames/ar_DZ/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_DZ/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_DZ/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_DZ/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_DZ/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_DZ/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_DZ/NumberElements/0=.
+FormatData/ar_DZ/NumberElements/1=,
+FormatData/ar_DZ/NumberElements/2=;
+FormatData/ar_DZ/NumberElements/3=%
+FormatData/ar_DZ/NumberElements/4=0
+FormatData/ar_DZ/NumberElements/5=#
+FormatData/ar_DZ/NumberElements/6=-
+FormatData/ar_DZ/NumberElements/7=E
+FormatData/ar_DZ/NumberElements/8=\u2030
+FormatData/ar_DZ/NumberElements/9=\u221e
+FormatData/ar_DZ/NumberElements/10=\ufffd
+CurrencyNames/ar_EG/EGP=\u062c.\u0645.\u200f
+FormatData/ar_EG/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_EG/NumberPatterns/1='\u062c.\u0645.\u200f' #,##0.###;'\u062c.\u0645.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_EG/NumberPatterns/2=#,##0%
+FormatData/ar_EG/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_EG/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_EG/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_EG/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_EG/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_EG/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_EG/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_EG/firstDayOfWeek=7
+CalendarData/ar_EG/minimalDaysInFirstWeek=1
+FormatData/ar_EG/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_EG/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_EG/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_EG/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_EG/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_EG/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_EG/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_EG/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_EG/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_EG/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_EG/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_EG/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_EG/MonthAbbreviations/12=
+FormatData/ar_EG/Eras/0=\u0642.\u0645
+FormatData/ar_EG/Eras/1=\u0645
+FormatData/ar_EG/DayAbbreviations/0=\u062d
+FormatData/ar_EG/DayAbbreviations/1=\u0646
+FormatData/ar_EG/DayAbbreviations/2=\u062b
+FormatData/ar_EG/DayAbbreviations/3=\u0631
+FormatData/ar_EG/DayAbbreviations/4=\u062e
+FormatData/ar_EG/DayAbbreviations/5=\u062c
+FormatData/ar_EG/DayAbbreviations/6=\u0633
+LocaleNames/ar_EG/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_EG/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_EG/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_EG/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_EG/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_EG/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_EG/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_EG/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_EG/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_EG/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_EG/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_EG/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_EG/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_EG/MonthNames/12=
+FormatData/ar_EG/AmPmMarkers/0=\u0635
+FormatData/ar_EG/AmPmMarkers/1=\u0645
+FormatData/ar_EG/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_EG/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_EG/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_EG/DateTimePatterns/3=hh:mm a
+FormatData/ar_EG/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_EG/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_EG/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_EG/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_EG/DateTimePatterns/8={1} {0}
+LocaleNames/ar_EG/EG=\u0645\u0635\u0631
+LocaleNames/ar_EG/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_EG/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_EG/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_EG/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_EG/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_EG/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_EG/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_EG/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_EG/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_EG/QA=\u0642\u0637\u0631
+LocaleNames/ar_EG/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_EG/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_EG/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_EG/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_EG/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_EG/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_EG/NumberElements/0=.
+FormatData/ar_EG/NumberElements/1=,
+FormatData/ar_EG/NumberElements/2=;
+FormatData/ar_EG/NumberElements/3=%
+FormatData/ar_EG/NumberElements/4=0
+FormatData/ar_EG/NumberElements/5=#
+FormatData/ar_EG/NumberElements/6=-
+FormatData/ar_EG/NumberElements/7=E
+FormatData/ar_EG/NumberElements/8=\u2030
+FormatData/ar_EG/NumberElements/9=\u221e
+FormatData/ar_EG/NumberElements/10=\ufffd
+CurrencyNames/ar_IQ/IQD=\u062f.\u0639.\u200f
+FormatData/ar_IQ/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_IQ/NumberPatterns/1='\u062f.\u0639.\u200f' #,##0.###;'\u062f.\u0639.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_IQ/NumberPatterns/2=#,##0%
+FormatData/ar_IQ/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_IQ/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_IQ/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_IQ/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_IQ/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_IQ/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_IQ/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_IQ/firstDayOfWeek=7
+CalendarData/ar_IQ/minimalDaysInFirstWeek=1
+FormatData/ar_IQ/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_IQ/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_IQ/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_IQ/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_IQ/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_IQ/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_IQ/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_IQ/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_IQ/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_IQ/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_IQ/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_IQ/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_IQ/MonthAbbreviations/12=
+FormatData/ar_IQ/Eras/0=\u0642.\u0645
+FormatData/ar_IQ/Eras/1=\u0645
+FormatData/ar_IQ/DayAbbreviations/0=\u062d
+FormatData/ar_IQ/DayAbbreviations/1=\u0646
+FormatData/ar_IQ/DayAbbreviations/2=\u062b
+FormatData/ar_IQ/DayAbbreviations/3=\u0631
+FormatData/ar_IQ/DayAbbreviations/4=\u062e
+FormatData/ar_IQ/DayAbbreviations/5=\u062c
+FormatData/ar_IQ/DayAbbreviations/6=\u0633
+LocaleNames/ar_IQ/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_IQ/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_IQ/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_IQ/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_IQ/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_IQ/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_IQ/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_IQ/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_IQ/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_IQ/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_IQ/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_IQ/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_IQ/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_IQ/MonthNames/12=
+FormatData/ar_IQ/AmPmMarkers/0=\u0635
+FormatData/ar_IQ/AmPmMarkers/1=\u0645
+FormatData/ar_IQ/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_IQ/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_IQ/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_IQ/DateTimePatterns/3=hh:mm a
+FormatData/ar_IQ/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_IQ/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_IQ/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_IQ/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_IQ/DateTimePatterns/8={1} {0}
+LocaleNames/ar_IQ/EG=\u0645\u0635\u0631
+LocaleNames/ar_IQ/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_IQ/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_IQ/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_IQ/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_IQ/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_IQ/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_IQ/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_IQ/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_IQ/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_IQ/QA=\u0642\u0637\u0631
+LocaleNames/ar_IQ/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_IQ/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_IQ/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_IQ/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_IQ/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_IQ/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_IQ/NumberElements/0=.
+FormatData/ar_IQ/NumberElements/1=,
+FormatData/ar_IQ/NumberElements/2=;
+FormatData/ar_IQ/NumberElements/3=%
+FormatData/ar_IQ/NumberElements/4=0
+FormatData/ar_IQ/NumberElements/5=#
+FormatData/ar_IQ/NumberElements/6=-
+FormatData/ar_IQ/NumberElements/7=E
+FormatData/ar_IQ/NumberElements/8=\u2030
+FormatData/ar_IQ/NumberElements/9=\u221e
+FormatData/ar_IQ/NumberElements/10=\ufffd
+FormatData/ar_JO/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_JO/NumberPatterns/1='\u062f.\u0623.\u200f' #,##0.###;'\u062f.\u0623.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_JO/NumberPatterns/2=#,##0%
+CurrencyNames/ar_JO/JOD=\u062f.\u0623.\u200f
+FormatData/ar_JO/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_JO/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_JO/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_JO/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_JO/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_JO/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_JO/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a
+FormatData/ar_JO/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_JO/MonthNames/1=\u0634\u0628\u0627\u0637
+FormatData/ar_JO/MonthNames/2=\u0622\u0630\u0627\u0631
+FormatData/ar_JO/MonthNames/3=\u0646\u064a\u0633\u0627\u0646
+FormatData/ar_JO/MonthNames/4=\u0646\u0648\u0627\u0631
+FormatData/ar_JO/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646
+FormatData/ar_JO/MonthNames/6=\u062a\u0645\u0648\u0632
+FormatData/ar_JO/MonthNames/7=\u0622\u0628
+FormatData/ar_JO/MonthNames/8=\u0623\u064a\u0644\u0648\u0644
+FormatData/ar_JO/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_JO/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_JO/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_JO/MonthNames/12=
+FormatData/ar_JO/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_JO/MonthAbbreviations/1=\u0634\u0628\u0627\u0637
+FormatData/ar_JO/MonthAbbreviations/2=\u0622\u0630\u0627\u0631
+FormatData/ar_JO/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646
+FormatData/ar_JO/MonthAbbreviations/4=\u0646\u0648\u0627\u0631
+FormatData/ar_JO/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646
+FormatData/ar_JO/MonthAbbreviations/6=\u062a\u0645\u0648\u0632
+FormatData/ar_JO/MonthAbbreviations/7=\u0622\u0628
+FormatData/ar_JO/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644
+FormatData/ar_JO/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_JO/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_JO/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_JO/MonthAbbreviations/12=
+FormatData/ar_JO/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_JO/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_JO/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_JO/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_JO/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_JO/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_JO/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_JO/firstDayOfWeek=7
+CalendarData/ar_JO/minimalDaysInFirstWeek=1
+FormatData/ar_JO/Eras/0=\u0642.\u0645
+FormatData/ar_JO/Eras/1=\u0645
+LocaleNames/ar_JO/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_JO/AmPmMarkers/0=\u0635
+FormatData/ar_JO/AmPmMarkers/1=\u0645
+FormatData/ar_JO/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_JO/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_JO/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_JO/DateTimePatterns/3=hh:mm a
+FormatData/ar_JO/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_JO/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_JO/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_JO/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_JO/DateTimePatterns/8={1} {0}
+LocaleNames/ar_JO/EG=\u0645\u0635\u0631
+LocaleNames/ar_JO/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_JO/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_JO/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_JO/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_JO/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_JO/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_JO/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_JO/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_JO/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_JO/QA=\u0642\u0637\u0631
+LocaleNames/ar_JO/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_JO/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_JO/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_JO/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_JO/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_JO/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_JO/NumberElements/0=.
+FormatData/ar_JO/NumberElements/1=,
+FormatData/ar_JO/NumberElements/2=;
+FormatData/ar_JO/NumberElements/3=%
+FormatData/ar_JO/NumberElements/4=0
+FormatData/ar_JO/NumberElements/5=#
+FormatData/ar_JO/NumberElements/6=-
+FormatData/ar_JO/NumberElements/7=E
+FormatData/ar_JO/NumberElements/8=\u2030
+FormatData/ar_JO/NumberElements/9=\u221e
+FormatData/ar_JO/NumberElements/10=\ufffd
+CurrencyNames/ar_KW/KWD=\u062f.\u0643.\u200f
+FormatData/ar_KW/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_KW/NumberPatterns/1='\u062f.\u0643.\u200f' #,##0.###;'\u062f.\u0643.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_KW/NumberPatterns/2=#,##0%
+FormatData/ar_KW/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_KW/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_KW/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_KW/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_KW/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_KW/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_KW/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_KW/firstDayOfWeek=7
+CalendarData/ar_KW/minimalDaysInFirstWeek=1
+FormatData/ar_KW/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_KW/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_KW/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_KW/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_KW/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_KW/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_KW/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_KW/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_KW/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_KW/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_KW/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_KW/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_KW/MonthAbbreviations/12=
+FormatData/ar_KW/Eras/0=\u0642.\u0645
+FormatData/ar_KW/Eras/1=\u0645
+FormatData/ar_KW/DayAbbreviations/0=\u062d
+FormatData/ar_KW/DayAbbreviations/1=\u0646
+FormatData/ar_KW/DayAbbreviations/2=\u062b
+FormatData/ar_KW/DayAbbreviations/3=\u0631
+FormatData/ar_KW/DayAbbreviations/4=\u062e
+FormatData/ar_KW/DayAbbreviations/5=\u062c
+FormatData/ar_KW/DayAbbreviations/6=\u0633
+LocaleNames/ar_KW/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_KW/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_KW/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_KW/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_KW/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_KW/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_KW/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_KW/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_KW/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_KW/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_KW/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_KW/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_KW/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_KW/MonthNames/12=
+FormatData/ar_KW/AmPmMarkers/0=\u0635
+FormatData/ar_KW/AmPmMarkers/1=\u0645
+FormatData/ar_KW/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_KW/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_KW/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_KW/DateTimePatterns/3=hh:mm a
+FormatData/ar_KW/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_KW/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_KW/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_KW/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_KW/DateTimePatterns/8={1} {0}
+LocaleNames/ar_KW/EG=\u0645\u0635\u0631
+LocaleNames/ar_KW/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_KW/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_KW/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_KW/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_KW/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_KW/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_KW/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_KW/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_KW/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_KW/QA=\u0642\u0637\u0631
+LocaleNames/ar_KW/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_KW/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_KW/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_KW/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_KW/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_KW/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_KW/NumberElements/0=.
+FormatData/ar_KW/NumberElements/1=,
+FormatData/ar_KW/NumberElements/2=;
+FormatData/ar_KW/NumberElements/3=%
+FormatData/ar_KW/NumberElements/4=0
+FormatData/ar_KW/NumberElements/5=#
+FormatData/ar_KW/NumberElements/6=-
+FormatData/ar_KW/NumberElements/7=E
+FormatData/ar_KW/NumberElements/8=\u2030
+FormatData/ar_KW/NumberElements/9=\u221e
+FormatData/ar_KW/NumberElements/10=\ufffd
+FormatData/ar_LB/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_LB/NumberPatterns/1='\u0644.\u0644.\u200f' #,##0.###;'\u0644.\u0644.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_LB/NumberPatterns/2=#,##0%
+CurrencyNames/ar_LB/LBP=\u0644.\u0644.\u200f
+FormatData/ar_LB/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_LB/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_LB/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_LB/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_LB/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_LB/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_LB/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a
+FormatData/ar_LB/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_LB/MonthNames/1=\u0634\u0628\u0627\u0637
+FormatData/ar_LB/MonthNames/2=\u0622\u0630\u0627\u0631
+FormatData/ar_LB/MonthNames/3=\u0646\u064a\u0633\u0627\u0646
+FormatData/ar_LB/MonthNames/4=\u0646\u0648\u0627\u0631
+FormatData/ar_LB/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646
+FormatData/ar_LB/MonthNames/6=\u062a\u0645\u0648\u0632
+FormatData/ar_LB/MonthNames/7=\u0622\u0628
+FormatData/ar_LB/MonthNames/8=\u0623\u064a\u0644\u0648\u0644
+FormatData/ar_LB/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_LB/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_LB/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_LB/MonthNames/12=
+FormatData/ar_LB/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_LB/MonthAbbreviations/1=\u0634\u0628\u0627\u0637
+FormatData/ar_LB/MonthAbbreviations/2=\u0622\u0630\u0627\u0631
+FormatData/ar_LB/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646
+FormatData/ar_LB/MonthAbbreviations/4=\u0646\u0648\u0627\u0631
+FormatData/ar_LB/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646
+FormatData/ar_LB/MonthAbbreviations/6=\u062a\u0645\u0648\u0632
+FormatData/ar_LB/MonthAbbreviations/7=\u0622\u0628
+FormatData/ar_LB/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644
+FormatData/ar_LB/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_LB/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_LB/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_LB/MonthAbbreviations/12=
+FormatData/ar_LB/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_LB/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_LB/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_LB/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_LB/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_LB/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_LB/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_LB/firstDayOfWeek=7
+CalendarData/ar_LB/minimalDaysInFirstWeek=1
+FormatData/ar_LB/Eras/0=\u0642.\u0645
+FormatData/ar_LB/Eras/1=\u0645
+LocaleNames/ar_LB/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_LB/AmPmMarkers/0=\u0635
+FormatData/ar_LB/AmPmMarkers/1=\u0645
+FormatData/ar_LB/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_LB/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_LB/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_LB/DateTimePatterns/3=hh:mm a
+FormatData/ar_LB/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_LB/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_LB/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_LB/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_LB/DateTimePatterns/8={1} {0}
+LocaleNames/ar_LB/EG=\u0645\u0635\u0631
+LocaleNames/ar_LB/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_LB/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_LB/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_LB/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_LB/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_LB/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_LB/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_LB/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_LB/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_LB/QA=\u0642\u0637\u0631
+LocaleNames/ar_LB/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_LB/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_LB/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_LB/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_LB/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_LB/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_LB/NumberElements/0=.
+FormatData/ar_LB/NumberElements/1=,
+FormatData/ar_LB/NumberElements/2=;
+FormatData/ar_LB/NumberElements/3=%
+FormatData/ar_LB/NumberElements/4=0
+FormatData/ar_LB/NumberElements/5=#
+FormatData/ar_LB/NumberElements/6=-
+FormatData/ar_LB/NumberElements/7=E
+FormatData/ar_LB/NumberElements/8=\u2030
+FormatData/ar_LB/NumberElements/9=\u221e
+FormatData/ar_LB/NumberElements/10=\ufffd
+CurrencyNames/ar_LY/LYD=\u062f.\u0644.\u200f
+FormatData/ar_LY/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_LY/NumberPatterns/1='\u062f.\u0644.\u200f' #,##0.###;'\u062f.\u0644.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_LY/NumberPatterns/2=#,##0%
+FormatData/ar_LY/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_LY/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_LY/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_LY/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_LY/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_LY/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_LY/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_LY/firstDayOfWeek=7
+CalendarData/ar_LY/minimalDaysInFirstWeek=1
+FormatData/ar_LY/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_LY/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_LY/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_LY/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_LY/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_LY/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_LY/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_LY/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_LY/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_LY/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_LY/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_LY/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_LY/MonthAbbreviations/12=
+FormatData/ar_LY/Eras/0=\u0642.\u0645
+FormatData/ar_LY/Eras/1=\u0645
+FormatData/ar_LY/DayAbbreviations/0=\u062d
+FormatData/ar_LY/DayAbbreviations/1=\u0646
+FormatData/ar_LY/DayAbbreviations/2=\u062b
+FormatData/ar_LY/DayAbbreviations/3=\u0631
+FormatData/ar_LY/DayAbbreviations/4=\u062e
+FormatData/ar_LY/DayAbbreviations/5=\u062c
+FormatData/ar_LY/DayAbbreviations/6=\u0633
+LocaleNames/ar_LY/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_LY/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_LY/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_LY/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_LY/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_LY/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_LY/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_LY/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_LY/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_LY/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_LY/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_LY/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_LY/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_LY/MonthNames/12=
+FormatData/ar_LY/AmPmMarkers/0=\u0635
+FormatData/ar_LY/AmPmMarkers/1=\u0645
+FormatData/ar_LY/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_LY/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_LY/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_LY/DateTimePatterns/3=hh:mm a
+FormatData/ar_LY/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_LY/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_LY/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_LY/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_LY/DateTimePatterns/8={1} {0}
+LocaleNames/ar_LY/EG=\u0645\u0635\u0631
+LocaleNames/ar_LY/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_LY/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_LY/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_LY/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_LY/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_LY/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_LY/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_LY/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_LY/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_LY/QA=\u0642\u0637\u0631
+LocaleNames/ar_LY/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_LY/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_LY/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_LY/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_LY/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_LY/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_LY/NumberElements/0=.
+FormatData/ar_LY/NumberElements/1=,
+FormatData/ar_LY/NumberElements/2=;
+FormatData/ar_LY/NumberElements/3=%
+FormatData/ar_LY/NumberElements/4=0
+FormatData/ar_LY/NumberElements/5=#
+FormatData/ar_LY/NumberElements/6=-
+FormatData/ar_LY/NumberElements/7=E
+FormatData/ar_LY/NumberElements/8=\u2030
+FormatData/ar_LY/NumberElements/9=\u221e
+FormatData/ar_LY/NumberElements/10=\ufffd
+CurrencyNames/ar_MA/MAD=\u062f.\u0645.\u200f
+FormatData/ar_MA/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_MA/NumberPatterns/1='\u062f.\u0645.\u200f' #,##0.###;'\u062f.\u0645.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_MA/NumberPatterns/2=#,##0%
+FormatData/ar_MA/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_MA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_MA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_MA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_MA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_MA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_MA/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_MA/firstDayOfWeek=7
+CalendarData/ar_MA/minimalDaysInFirstWeek=1
+FormatData/ar_MA/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_MA/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_MA/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_MA/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_MA/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_MA/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_MA/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_MA/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_MA/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_MA/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_MA/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_MA/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_MA/MonthAbbreviations/12=
+FormatData/ar_MA/Eras/0=\u0642.\u0645
+FormatData/ar_MA/Eras/1=\u0645
+FormatData/ar_MA/DayAbbreviations/0=\u062d
+FormatData/ar_MA/DayAbbreviations/1=\u0646
+FormatData/ar_MA/DayAbbreviations/2=\u062b
+FormatData/ar_MA/DayAbbreviations/3=\u0631
+FormatData/ar_MA/DayAbbreviations/4=\u062e
+FormatData/ar_MA/DayAbbreviations/5=\u062c
+FormatData/ar_MA/DayAbbreviations/6=\u0633
+LocaleNames/ar_MA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_MA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_MA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_MA/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_MA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_MA/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_MA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_MA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_MA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_MA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_MA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_MA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_MA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_MA/MonthNames/12=
+FormatData/ar_MA/AmPmMarkers/0=\u0635
+FormatData/ar_MA/AmPmMarkers/1=\u0645
+FormatData/ar_MA/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_MA/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_MA/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_MA/DateTimePatterns/3=hh:mm a
+FormatData/ar_MA/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_MA/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_MA/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_MA/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_MA/DateTimePatterns/8={1} {0}
+LocaleNames/ar_MA/EG=\u0645\u0635\u0631
+LocaleNames/ar_MA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_MA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_MA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_MA/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_MA/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_MA/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_MA/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_MA/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_MA/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_MA/QA=\u0642\u0637\u0631
+LocaleNames/ar_MA/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_MA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_MA/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_MA/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_MA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_MA/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_MA/NumberElements/0=.
+FormatData/ar_MA/NumberElements/1=,
+FormatData/ar_MA/NumberElements/2=;
+FormatData/ar_MA/NumberElements/3=%
+FormatData/ar_MA/NumberElements/4=0
+FormatData/ar_MA/NumberElements/5=#
+FormatData/ar_MA/NumberElements/6=-
+FormatData/ar_MA/NumberElements/7=E
+FormatData/ar_MA/NumberElements/8=\u2030
+FormatData/ar_MA/NumberElements/9=\u221e
+FormatData/ar_MA/NumberElements/10=\ufffd
+CurrencyNames/ar_OM/OMR=\u0631.\u0639.\u200f
+FormatData/ar_OM/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_OM/NumberPatterns/1='\u0631.\u0639.\u200f' #,##0.###;'\u0631.\u0639.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_OM/NumberPatterns/2=#,##0%
+FormatData/ar_OM/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_OM/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_OM/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_OM/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_OM/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_OM/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_OM/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_OM/firstDayOfWeek=7
+CalendarData/ar_OM/minimalDaysInFirstWeek=1
+FormatData/ar_OM/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_OM/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_OM/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_OM/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_OM/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_OM/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_OM/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_OM/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_OM/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_OM/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_OM/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_OM/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_OM/MonthAbbreviations/12=
+FormatData/ar_OM/Eras/0=\u0642.\u0645
+FormatData/ar_OM/Eras/1=\u0645
+FormatData/ar_OM/DayAbbreviations/0=\u062d
+FormatData/ar_OM/DayAbbreviations/1=\u0646
+FormatData/ar_OM/DayAbbreviations/2=\u062b
+FormatData/ar_OM/DayAbbreviations/3=\u0631
+FormatData/ar_OM/DayAbbreviations/4=\u062e
+FormatData/ar_OM/DayAbbreviations/5=\u062c
+FormatData/ar_OM/DayAbbreviations/6=\u0633
+LocaleNames/ar_OM/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_OM/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_OM/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_OM/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_OM/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_OM/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_OM/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_OM/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_OM/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_OM/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_OM/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_OM/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_OM/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_OM/MonthNames/12=
+FormatData/ar_OM/AmPmMarkers/0=\u0635
+FormatData/ar_OM/AmPmMarkers/1=\u0645
+FormatData/ar_OM/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_OM/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_OM/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_OM/DateTimePatterns/3=hh:mm a
+FormatData/ar_OM/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_OM/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_OM/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_OM/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_OM/DateTimePatterns/8={1} {0}
+LocaleNames/ar_OM/EG=\u0645\u0635\u0631
+LocaleNames/ar_OM/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_OM/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_OM/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_OM/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_OM/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_OM/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_OM/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_OM/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_OM/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_OM/QA=\u0642\u0637\u0631
+LocaleNames/ar_OM/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_OM/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_OM/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_OM/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_OM/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_OM/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_OM/NumberElements/0=.
+FormatData/ar_OM/NumberElements/1=,
+FormatData/ar_OM/NumberElements/2=;
+FormatData/ar_OM/NumberElements/3=%
+FormatData/ar_OM/NumberElements/4=0
+FormatData/ar_OM/NumberElements/5=#
+FormatData/ar_OM/NumberElements/6=-
+FormatData/ar_OM/NumberElements/7=E
+FormatData/ar_OM/NumberElements/8=\u2030
+FormatData/ar_OM/NumberElements/9=\u221e
+FormatData/ar_OM/NumberElements/10=\ufffd
+CurrencyNames/ar_QA/QAR=\u0631.\u0642.\u200f
+FormatData/ar_QA/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_QA/NumberPatterns/1='\u0631.\u0642.\u200f' #,##0.###;'\u0631.\u0642.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_QA/NumberPatterns/2=#,##0%
+FormatData/ar_QA/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_QA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_QA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_QA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_QA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_QA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_QA/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_QA/firstDayOfWeek=7
+CalendarData/ar_QA/minimalDaysInFirstWeek=1
+FormatData/ar_QA/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_QA/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_QA/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_QA/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_QA/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_QA/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_QA/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_QA/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_QA/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_QA/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_QA/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_QA/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_QA/MonthAbbreviations/12=
+FormatData/ar_QA/Eras/0=\u0642.\u0645
+FormatData/ar_QA/Eras/1=\u0645
+FormatData/ar_QA/DayAbbreviations/0=\u062d
+FormatData/ar_QA/DayAbbreviations/1=\u0646
+FormatData/ar_QA/DayAbbreviations/2=\u062b
+FormatData/ar_QA/DayAbbreviations/3=\u0631
+FormatData/ar_QA/DayAbbreviations/4=\u062e
+FormatData/ar_QA/DayAbbreviations/5=\u062c
+FormatData/ar_QA/DayAbbreviations/6=\u0633
+LocaleNames/ar_QA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_QA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_QA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_QA/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_QA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_QA/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_QA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_QA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_QA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_QA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_QA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_QA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_QA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_QA/MonthNames/12=
+FormatData/ar_QA/AmPmMarkers/0=\u0635
+FormatData/ar_QA/AmPmMarkers/1=\u0645
+FormatData/ar_QA/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_QA/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_QA/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_QA/DateTimePatterns/3=hh:mm a
+FormatData/ar_QA/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_QA/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_QA/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_QA/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_QA/DateTimePatterns/8={1} {0}
+LocaleNames/ar_QA/EG=\u0645\u0635\u0631
+LocaleNames/ar_QA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_QA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_QA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_QA/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_QA/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_QA/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_QA/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_QA/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_QA/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_QA/QA=\u0642\u0637\u0631
+LocaleNames/ar_QA/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_QA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_QA/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_QA/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_QA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_QA/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_QA/NumberElements/0=.
+FormatData/ar_QA/NumberElements/1=,
+FormatData/ar_QA/NumberElements/2=;
+FormatData/ar_QA/NumberElements/3=%
+FormatData/ar_QA/NumberElements/4=0
+FormatData/ar_QA/NumberElements/5=#
+FormatData/ar_QA/NumberElements/6=-
+FormatData/ar_QA/NumberElements/7=E
+FormatData/ar_QA/NumberElements/8=\u2030
+FormatData/ar_QA/NumberElements/9=\u221e
+FormatData/ar_QA/NumberElements/10=\ufffd
+CurrencyNames/ar_SA/SAR=\u0631.\u0633.\u200f
+FormatData/ar_SA/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_SA/NumberPatterns/1='\u0631.\u0633.\u200f' #,##0.###;'\u0631.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_SA/NumberPatterns/2=#,##0%
+FormatData/ar_SA/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_SA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_SA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_SA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_SA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_SA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_SA/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_SA/firstDayOfWeek=7
+CalendarData/ar_SA/minimalDaysInFirstWeek=1
+FormatData/ar_SA/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_SA/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_SA/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_SA/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_SA/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_SA/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_SA/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_SA/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_SA/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_SA/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_SA/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_SA/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_SA/MonthAbbreviations/12=
+FormatData/ar_SA/Eras/0=\u0642.\u0645
+FormatData/ar_SA/Eras/1=\u0645
+FormatData/ar_SA/DayAbbreviations/0=\u062d
+FormatData/ar_SA/DayAbbreviations/1=\u0646
+FormatData/ar_SA/DayAbbreviations/2=\u062b
+FormatData/ar_SA/DayAbbreviations/3=\u0631
+FormatData/ar_SA/DayAbbreviations/4=\u062e
+FormatData/ar_SA/DayAbbreviations/5=\u062c
+FormatData/ar_SA/DayAbbreviations/6=\u0633
+LocaleNames/ar_SA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_SA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_SA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_SA/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_SA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_SA/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_SA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_SA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_SA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_SA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_SA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_SA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_SA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_SA/MonthNames/12=
+FormatData/ar_SA/AmPmMarkers/0=\u0635
+FormatData/ar_SA/AmPmMarkers/1=\u0645
+FormatData/ar_SA/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_SA/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_SA/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_SA/DateTimePatterns/3=hh:mm a
+FormatData/ar_SA/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_SA/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_SA/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_SA/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_SA/DateTimePatterns/8={1} {0}
+LocaleNames/ar_SA/EG=\u0645\u0635\u0631
+LocaleNames/ar_SA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_SA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_SA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_SA/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_SA/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_SA/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_SA/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_SA/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_SA/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_SA/QA=\u0642\u0637\u0631
+LocaleNames/ar_SA/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_SA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_SA/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_SA/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_SA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_SA/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_SA/NumberElements/0=.
+FormatData/ar_SA/NumberElements/1=,
+FormatData/ar_SA/NumberElements/2=;
+FormatData/ar_SA/NumberElements/3=%
+FormatData/ar_SA/NumberElements/4=0
+FormatData/ar_SA/NumberElements/5=#
+FormatData/ar_SA/NumberElements/6=-
+FormatData/ar_SA/NumberElements/7=E
+FormatData/ar_SA/NumberElements/8=\u2030
+FormatData/ar_SA/NumberElements/9=\u221e
+FormatData/ar_SA/NumberElements/10=\ufffd
+# changed for 4945388
+CurrencyNames/ar_SD/SDD=\u062c.\u0633.\u200f
+FormatData/ar_SD/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_SD/NumberPatterns/1='\u062c.\u0633.\u200f' #,##0.###;'\u062c.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_SD/NumberPatterns/2=#,##0%
+FormatData/ar_SD/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_SD/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_SD/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_SD/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_SD/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_SD/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_SD/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_SD/firstDayOfWeek=7
+CalendarData/ar_SD/minimalDaysInFirstWeek=1
+FormatData/ar_SD/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_SD/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_SD/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_SD/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_SD/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_SD/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_SD/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_SD/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_SD/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_SD/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_SD/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_SD/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_SD/MonthAbbreviations/12=
+FormatData/ar_SD/Eras/0=\u0642.\u0645
+FormatData/ar_SD/Eras/1=\u0645
+FormatData/ar_SD/DayAbbreviations/0=\u062d
+FormatData/ar_SD/DayAbbreviations/1=\u0646
+FormatData/ar_SD/DayAbbreviations/2=\u062b
+FormatData/ar_SD/DayAbbreviations/3=\u0631
+FormatData/ar_SD/DayAbbreviations/4=\u062e
+FormatData/ar_SD/DayAbbreviations/5=\u062c
+FormatData/ar_SD/DayAbbreviations/6=\u0633
+LocaleNames/ar_SD/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_SD/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_SD/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_SD/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_SD/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_SD/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_SD/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_SD/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_SD/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_SD/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_SD/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_SD/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_SD/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_SD/MonthNames/12=
+FormatData/ar_SD/AmPmMarkers/0=\u0635
+FormatData/ar_SD/AmPmMarkers/1=\u0645
+FormatData/ar_SD/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_SD/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_SD/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_SD/DateTimePatterns/3=hh:mm a
+FormatData/ar_SD/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_SD/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_SD/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_SD/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_SD/DateTimePatterns/8={1} {0}
+LocaleNames/ar_SD/EG=\u0645\u0635\u0631
+LocaleNames/ar_SD/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_SD/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_SD/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_SD/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_SD/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_SD/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_SD/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_SD/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_SD/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_SD/QA=\u0642\u0637\u0631
+LocaleNames/ar_SD/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_SD/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_SD/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_SD/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_SD/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_SD/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_SD/NumberElements/0=.
+FormatData/ar_SD/NumberElements/1=,
+FormatData/ar_SD/NumberElements/2=;
+FormatData/ar_SD/NumberElements/3=%
+FormatData/ar_SD/NumberElements/4=0
+FormatData/ar_SD/NumberElements/5=#
+FormatData/ar_SD/NumberElements/6=-
+FormatData/ar_SD/NumberElements/7=E
+FormatData/ar_SD/NumberElements/8=\u2030
+FormatData/ar_SD/NumberElements/9=\u221e
+FormatData/ar_SD/NumberElements/10=\ufffd
+FormatData/ar_SY/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_SY/NumberPatterns/1='\u0644.\u0633.\u200f' #,##0.###;'\u0644.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_SY/NumberPatterns/2=#,##0%
+CurrencyNames/ar_SY/SYP=\u0644.\u0633.\u200f
+FormatData/ar_SY/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_SY/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_SY/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_SY/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_SY/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_SY/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_SY/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a
+FormatData/ar_SY/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_SY/MonthNames/1=\u0634\u0628\u0627\u0637
+FormatData/ar_SY/MonthNames/2=\u0622\u0630\u0627\u0631
+FormatData/ar_SY/MonthNames/3=\u0646\u064a\u0633\u0627\u0646
+FormatData/ar_SY/MonthNames/4=\u0646\u0648\u0627\u0631\u0627\u0646
+FormatData/ar_SY/MonthNames/5=\u062d\u0632\u064a\u0631
+FormatData/ar_SY/MonthNames/6=\u062a\u0645\u0648\u0632
+FormatData/ar_SY/MonthNames/7=\u0622\u0628
+FormatData/ar_SY/MonthNames/8=\u0623\u064a\u0644\u0648\u0644
+FormatData/ar_SY/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_SY/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_SY/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_SY/MonthNames/12=
+FormatData/ar_SY/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_SY/MonthAbbreviations/1=\u0634\u0628\u0627\u0637
+FormatData/ar_SY/MonthAbbreviations/2=\u0622\u0630\u0627\u0631
+FormatData/ar_SY/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646
+FormatData/ar_SY/MonthAbbreviations/4=\u0646\u0648\u0627\u0631
+FormatData/ar_SY/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646
+FormatData/ar_SY/MonthAbbreviations/6=\u062a\u0645\u0648\u0632
+FormatData/ar_SY/MonthAbbreviations/7=\u0622\u0628
+FormatData/ar_SY/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644
+FormatData/ar_SY/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_SY/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a
+FormatData/ar_SY/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644
+FormatData/ar_SY/MonthAbbreviations/12=
+FormatData/ar_SY/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_SY/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_SY/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_SY/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_SY/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_SY/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_SY/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_SY/firstDayOfWeek=7
+CalendarData/ar_SY/minimalDaysInFirstWeek=1
+FormatData/ar_SY/Eras/0=\u0642.\u0645
+FormatData/ar_SY/Eras/1=\u0645
+LocaleNames/ar_SY/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_SY/AmPmMarkers/0=\u0635
+FormatData/ar_SY/AmPmMarkers/1=\u0645
+FormatData/ar_SY/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_SY/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_SY/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_SY/DateTimePatterns/3=hh:mm a
+FormatData/ar_SY/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_SY/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_SY/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_SY/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_SY/DateTimePatterns/8={1} {0}
+LocaleNames/ar_SY/EG=\u0645\u0635\u0631
+LocaleNames/ar_SY/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_SY/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_SY/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_SY/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_SY/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_SY/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_SY/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_SY/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_SY/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_SY/QA=\u0642\u0637\u0631
+LocaleNames/ar_SY/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_SY/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_SY/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_SY/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_SY/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_SY/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_SY/NumberElements/0=.
+FormatData/ar_SY/NumberElements/1=,
+FormatData/ar_SY/NumberElements/2=;
+FormatData/ar_SY/NumberElements/3=%
+FormatData/ar_SY/NumberElements/4=0
+FormatData/ar_SY/NumberElements/5=#
+FormatData/ar_SY/NumberElements/6=-
+FormatData/ar_SY/NumberElements/7=E
+FormatData/ar_SY/NumberElements/8=\u2030
+FormatData/ar_SY/NumberElements/9=\u221e
+FormatData/ar_SY/NumberElements/10=\ufffd
+CurrencyNames/ar_TN/TND=\u062f.\u062a.\u200f
+FormatData/ar_TN/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_TN/NumberPatterns/1='\u062f.\u062a.\u200f' #,##0.###;'\u062f.\u062a.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_TN/NumberPatterns/2=#,##0%
+FormatData/ar_TN/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_TN/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_TN/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_TN/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_TN/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_TN/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_TN/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_TN/firstDayOfWeek=7
+CalendarData/ar_TN/minimalDaysInFirstWeek=1
+FormatData/ar_TN/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_TN/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_TN/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_TN/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_TN/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_TN/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_TN/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_TN/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_TN/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_TN/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_TN/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_TN/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_TN/MonthAbbreviations/12=
+FormatData/ar_TN/Eras/0=\u0642.\u0645
+FormatData/ar_TN/Eras/1=\u0645
+FormatData/ar_TN/DayAbbreviations/0=\u062d
+FormatData/ar_TN/DayAbbreviations/1=\u0646
+FormatData/ar_TN/DayAbbreviations/2=\u062b
+FormatData/ar_TN/DayAbbreviations/3=\u0631
+FormatData/ar_TN/DayAbbreviations/4=\u062e
+FormatData/ar_TN/DayAbbreviations/5=\u062c
+FormatData/ar_TN/DayAbbreviations/6=\u0633
+LocaleNames/ar_TN/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_TN/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_TN/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_TN/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_TN/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_TN/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_TN/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_TN/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_TN/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_TN/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_TN/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_TN/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_TN/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_TN/MonthNames/12=
+FormatData/ar_TN/AmPmMarkers/0=\u0635
+FormatData/ar_TN/AmPmMarkers/1=\u0645
+FormatData/ar_TN/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_TN/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_TN/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_TN/DateTimePatterns/3=hh:mm a
+FormatData/ar_TN/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_TN/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_TN/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_TN/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_TN/DateTimePatterns/8={1} {0}
+LocaleNames/ar_TN/EG=\u0645\u0635\u0631
+LocaleNames/ar_TN/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_TN/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_TN/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_TN/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_TN/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_TN/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_TN/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_TN/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_TN/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_TN/QA=\u0642\u0637\u0631
+LocaleNames/ar_TN/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_TN/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_TN/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_TN/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_TN/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_TN/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_TN/NumberElements/0=.
+FormatData/ar_TN/NumberElements/1=,
+FormatData/ar_TN/NumberElements/2=;
+FormatData/ar_TN/NumberElements/3=%
+FormatData/ar_TN/NumberElements/4=0
+FormatData/ar_TN/NumberElements/5=#
+FormatData/ar_TN/NumberElements/6=-
+FormatData/ar_TN/NumberElements/7=E
+FormatData/ar_TN/NumberElements/8=\u2030
+FormatData/ar_TN/NumberElements/9=\u221e
+FormatData/ar_TN/NumberElements/10=\ufffd
+CurrencyNames/ar_YE/YER=\u0631.\u064a.\u200f
+FormatData/ar_YE/NumberPatterns/0=#,##0.###;#,##0.###-
+# FormatData/ar_YE/NumberPatterns/1='\u0631.\u064a.\u200f' #,##0.###;'\u0631.\u064a.\u200f' #,##0.###- # Changed; see bug 4122840
+FormatData/ar_YE/NumberPatterns/2=#,##0%
+FormatData/ar_YE/DayNames/0=\u0627\u0644\u0623\u062d\u062f
+FormatData/ar_YE/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646
+FormatData/ar_YE/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621
+FormatData/ar_YE/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
+FormatData/ar_YE/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633
+FormatData/ar_YE/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629
+FormatData/ar_YE/DayNames/6=\u0627\u0644\u0633\u0628\u062a
+CalendarData/ar_YE/firstDayOfWeek=7
+CalendarData/ar_YE/minimalDaysInFirstWeek=1
+FormatData/ar_YE/MonthAbbreviations/0=\u064a\u0646\u0627
+FormatData/ar_YE/MonthAbbreviations/1=\u0641\u0628\u0631
+FormatData/ar_YE/MonthAbbreviations/2=\u0645\u0627\u0631
+FormatData/ar_YE/MonthAbbreviations/3=\u0623\u0628\u0631
+FormatData/ar_YE/MonthAbbreviations/4=\u0645\u0627\u064a
+FormatData/ar_YE/MonthAbbreviations/5=\u064a\u0648\u0646
+FormatData/ar_YE/MonthAbbreviations/6=\u064a\u0648\u0644
+FormatData/ar_YE/MonthAbbreviations/7=\u0623\u063a\u0633
+FormatData/ar_YE/MonthAbbreviations/8=\u0633\u0628\u062a
+FormatData/ar_YE/MonthAbbreviations/9=\u0623\u0643\u062a
+FormatData/ar_YE/MonthAbbreviations/10=\u0646\u0648\u0641
+FormatData/ar_YE/MonthAbbreviations/11=\u062f\u064a\u0633
+FormatData/ar_YE/MonthAbbreviations/12=
+FormatData/ar_YE/Eras/0=\u0642.\u0645
+FormatData/ar_YE/Eras/1=\u0645
+FormatData/ar_YE/DayAbbreviations/0=\u062d
+FormatData/ar_YE/DayAbbreviations/1=\u0646
+FormatData/ar_YE/DayAbbreviations/2=\u062b
+FormatData/ar_YE/DayAbbreviations/3=\u0631
+FormatData/ar_YE/DayAbbreviations/4=\u062e
+FormatData/ar_YE/DayAbbreviations/5=\u062c
+FormatData/ar_YE/DayAbbreviations/6=\u0633
+LocaleNames/ar_YE/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+FormatData/ar_YE/MonthNames/0=\u064a\u0646\u0627\u064a\u0631
+FormatData/ar_YE/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631
+FormatData/ar_YE/MonthNames/2=\u0645\u0627\u0631\u0633
+FormatData/ar_YE/MonthNames/3=\u0623\u0628\u0631\u064a\u0644
+FormatData/ar_YE/MonthNames/4=\u0645\u0627\u064a\u0648
+FormatData/ar_YE/MonthNames/5=\u064a\u0648\u0646\u064a\u0648
+FormatData/ar_YE/MonthNames/6=\u064a\u0648\u0644\u064a\u0648
+FormatData/ar_YE/MonthNames/7=\u0623\u063a\u0633\u0637\u0633
+FormatData/ar_YE/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631
+FormatData/ar_YE/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631
+FormatData/ar_YE/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631
+FormatData/ar_YE/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631
+FormatData/ar_YE/MonthNames/12=
+FormatData/ar_YE/AmPmMarkers/0=\u0635
+FormatData/ar_YE/AmPmMarkers/1=\u0645
+FormatData/ar_YE/DateTimePatterns/0=z hh:mm:ss a
+FormatData/ar_YE/DateTimePatterns/1=z hh:mm:ss a
+FormatData/ar_YE/DateTimePatterns/2=hh:mm:ss a
+FormatData/ar_YE/DateTimePatterns/3=hh:mm a
+FormatData/ar_YE/DateTimePatterns/4=dd MMMM, yyyy
+FormatData/ar_YE/DateTimePatterns/5=dd MMMM, yyyy
+FormatData/ar_YE/DateTimePatterns/6=dd/MM/yyyy
+FormatData/ar_YE/DateTimePatterns/7=dd/MM/yy
+FormatData/ar_YE/DateTimePatterns/8={1} {0}
+LocaleNames/ar_YE/EG=\u0645\u0635\u0631
+LocaleNames/ar_YE/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631
+LocaleNames/ar_YE/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
+LocaleNames/ar_YE/IQ=\u0627\u0644\u0639\u0631\u0627\u0642
+LocaleNames/ar_YE/JO=\u0627\u0644\u0623\u0631\u062f\u0646
+LocaleNames/ar_YE/KW=\u0627\u0644\u0643\u0648\u064a\u062a
+LocaleNames/ar_YE/LB=\u0644\u0628\u0646\u0627\u0646
+LocaleNames/ar_YE/LY=\u0644\u064a\u0628\u064a\u0627
+LocaleNames/ar_YE/MA=\u0627\u0644\u0645\u063a\u0631\u0628
+LocaleNames/ar_YE/OM=\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646
+LocaleNames/ar_YE/QA=\u0642\u0637\u0631
+LocaleNames/ar_YE/SA=\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629
+LocaleNames/ar_YE/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646
+LocaleNames/ar_YE/SY=\u0633\u0648\u0631\u064a\u0627
+LocaleNames/ar_YE/TN=\u062a\u0648\u0646\u0633
+LocaleNames/ar_YE/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a
+LocaleNames/ar_YE/YE=\u0627\u0644\u064a\u0645\u0646
+FormatData/ar_YE/NumberElements/0=.
+FormatData/ar_YE/NumberElements/1=,
+FormatData/ar_YE/NumberElements/2=;
+FormatData/ar_YE/NumberElements/3=%
+FormatData/ar_YE/NumberElements/4=0
+FormatData/ar_YE/NumberElements/5=#
+FormatData/ar_YE/NumberElements/6=-
+FormatData/ar_YE/NumberElements/7=E
+FormatData/ar_YE/NumberElements/8=\u2030
+FormatData/ar_YE/NumberElements/9=\u221e
+FormatData/ar_YE/NumberElements/10=\ufffd
+
+# bug #4113654 (this is obviously not an exchaustive test; I'm trying it here for a single
+# inheritance chain only.  This bug fix also gets tested fairly well by the tests for all
+# the other bugs as given above)
+FormatData//NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData//NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 # Changed; see bug 4122840
+FormatData//NumberPatterns/2=#,##0%
+FormatData/fr/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/fr/NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 # Changed; see bug 4122840
+FormatData/fr/NumberPatterns/2=#,##0%
+CurrencyNames/fr_FR/FRF=F
+CurrencyNames/fr_FR/EUR=\u20AC
+FormatData/fr_FR/NumberPatterns/0=#,##0.###;-#,##0.###
+# FormatData/fr_FR/NumberPatterns/1=#,##0.00 F;-#,##0.00 F # Changed; see bug 4122840
+FormatData/fr_FR/NumberPatterns/2=#,##0%
+FormatData/fr_FR/DayNames/0=dimanche
+FormatData/fr_FR/DayNames/1=lundi
+FormatData/fr_FR/DayNames/2=mardi
+FormatData/fr_FR/DayNames/3=mercredi
+FormatData/fr_FR/DayNames/4=jeudi
+FormatData/fr_FR/DayNames/5=vendredi
+FormatData/fr_FR/DayNames/6=samedi
+FormatData/fr_FR/MonthNames/0=janvier
+FormatData/fr_FR/MonthNames/1=f\u00e9vrier
+FormatData/fr_FR/MonthNames/2=mars
+FormatData/fr_FR/MonthNames/3=avril
+FormatData/fr_FR/MonthNames/4=mai
+FormatData/fr_FR/MonthNames/5=juin
+FormatData/fr_FR/MonthNames/6=juillet
+FormatData/fr_FR/MonthNames/7=ao\u00fbt
+FormatData/fr_FR/MonthNames/8=septembre
+FormatData/fr_FR/MonthNames/9=octobre
+FormatData/fr_FR/MonthNames/10=novembre
+FormatData/fr_FR/MonthNames/11=d\u00e9cembre
+FormatData/fr_FR/MonthNames/12=
+LocaleNames/fr_FR/fr=fran\u00e7ais
+LocaleNames/fr_FR/en=anglais
+LocaleNames/fr_FR/de=allemand
+LocaleNames/fr_FR/da=danois
+LocaleNames/fr_FR/es=espagnol
+LocaleNames/fr_FR/el=grec
+LocaleNames/fr_FR/fi=finnois
+LocaleNames/fr_FR/it=italien
+LocaleNames/fr_FR/ja=japonais
+#bug 4965260
+LocaleNames/fr_FR/nl=n\u00e9erlandais
+LocaleNames/fr_FR/no=norv\u00e9gien
+LocaleNames/fr_FR/pt=portugais
+LocaleNames/fr_FR/sv=su\u00e9dois
+LocaleNames/fr_FR/tr=turc
+FormatData/fr_FR/DateTimePatterns/0=HH' h 'mm z
+FormatData/fr_FR/DateTimePatterns/1=HH:mm:ss z
+FormatData/fr_FR/DateTimePatterns/2=HH:mm:ss
+FormatData/fr_FR/DateTimePatterns/3=HH:mm
+FormatData/fr_FR/DateTimePatterns/4=EEEE d MMMM yyyy
+FormatData/fr_FR/DateTimePatterns/5=d MMMM yyyy
+FormatData/fr_FR/DateTimePatterns/6=d MMM yyyy
+FormatData/fr_FR/DateTimePatterns/7=dd/MM/yy
+FormatData/fr_FR/DateTimePatterns/8={1} {0}
+FormatData/fr_FR/NumberElements/0=,
+FormatData/fr_FR/NumberElements/1=\u00a0
+FormatData/fr_FR/NumberElements/2=;
+FormatData/fr_FR/NumberElements/3=%
+FormatData/fr_FR/NumberElements/4=0
+FormatData/fr_FR/NumberElements/5=#
+FormatData/fr_FR/NumberElements/6=-
+FormatData/fr_FR/NumberElements/7=E
+FormatData/fr_FR/NumberElements/8=\u2030
+FormatData/fr_FR/NumberElements/9=\u221e
+FormatData/fr_FR/NumberElements/10=\ufffd
+FormatData/fr_FR/Eras/0=BC
+FormatData/fr_FR/Eras/1=ap. J.-C.
+LocaleNames/fr_FR/FR=France
+LocaleNames/fr_FR/US=Etats-Unis
+LocaleNames/fr_FR/DK=Danemark
+LocaleNames/fr_FR/DE=Allemagne
+LocaleNames/fr_FR/AT=Autriche
+LocaleNames/fr_FR/GR=Gr\u00e8ce
+LocaleNames/fr_FR/ES=Espagne
+LocaleNames/fr_FR/FI=Finlande
+LocaleNames/fr_FR/IT=Italie
+LocaleNames/fr_FR/CH=Suisse
+LocaleNames/fr_FR/BE=Belgique
+LocaleNames/fr_FR/CA=Canada
+LocaleNames/fr_FR/JP=Japon
+LocaleNames/fr_FR/NL=Pays-Bas
+LocaleNames/fr_FR/NO=Norv\u00e8ge
+LocaleNames/fr_FR/PT=Portugal
+LocaleNames/fr_FR/SE=Su\u00e8de
+LocaleNames/fr_FR/TR=Turquie
+FormatData/fr_FR/DayAbbreviations/0=dim.
+FormatData/fr_FR/DayAbbreviations/1=lun.
+FormatData/fr_FR/DayAbbreviations/2=mar.
+FormatData/fr_FR/DayAbbreviations/3=mer.
+FormatData/fr_FR/DayAbbreviations/4=jeu.
+FormatData/fr_FR/DayAbbreviations/5=ven.
+FormatData/fr_FR/DayAbbreviations/6=sam.
+FormatData/fr_FR/MonthAbbreviations/0=janv.
+FormatData/fr_FR/MonthAbbreviations/1=f\u00e9vr.
+FormatData/fr_FR/MonthAbbreviations/2=mars
+FormatData/fr_FR/MonthAbbreviations/3=avr.
+FormatData/fr_FR/MonthAbbreviations/4=mai
+FormatData/fr_FR/MonthAbbreviations/5=juin
+FormatData/fr_FR/MonthAbbreviations/6=juil.
+FormatData/fr_FR/MonthAbbreviations/7=ao\u00fbt
+FormatData/fr_FR/MonthAbbreviations/8=sept.
+FormatData/fr_FR/MonthAbbreviations/9=oct.
+FormatData/fr_FR/MonthAbbreviations/10=nov.
+FormatData/fr_FR/MonthAbbreviations/11=d\u00e9c.
+FormatData/fr_FR/MonthAbbreviations/12=
+CalendarData/fr_FR/firstDayOfWeek=2
+# next line changed according the 4518811 bug
+CalendarData/fr_FR/minimalDaysInFirstWeek=4
+FormatData/fr_FR/AmPmMarkers/0=AM
+FormatData/fr_FR/AmPmMarkers/1=PM
+
+# bug #4117054
+FormatData/ja_JP/AmPmMarkers/0=\u5348\u524d
+FormatData/ja_JP/AmPmMarkers/1=\u5348\u5f8c
+
+# bug #4122840, 4290801
+FormatData/ar_AE/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_BH/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_DZ/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_EG/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_IQ/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_JO/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_KW/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_LB/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_LY/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_MA/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_OM/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_QA/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_SA/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_SD/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_SY/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_TN/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/ar_YE/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###-
+FormatData/en_AU/NumberPatterns/1=\u00a4#,##0.00;-\u00a4#,##0.00
+FormatData/en_NZ/NumberPatterns/1=\u00a4#,##0.00;-\u00a4#,##0.00
+FormatData/en_ZA/NumberPatterns/1=\u00a4 #,##0.00;\u00a4-#,##0.00
+FormatData/es_AR/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00
+FormatData/es_BO/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_CL/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00
+FormatData/es_CO/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_CR/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_DO/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_EC/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00
+FormatData/es_GT/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_HN/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_MX/NumberPatterns/1=\u00a4#,##0.00;-\u00a4#,##0.00
+FormatData/es_NI/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_PA/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_PE/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00
+FormatData/es_PR/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_PY/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_SV/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_UY/NumberPatterns/1=\u00a4 #,##0.00;(\u00a4#,##0.00)
+FormatData/es_VE/NumberPatterns/1=\u00a4#,##0.00;\u00a4 -#,##0.00
+FormatData/fr_FR/NumberPatterns/1=#,##0.00 \u00a4;-#,##0.00 \u00a4
+FormatData/it_IT/NumberPatterns/1=\u00A4 #,##0.00;-\u00A4 #,##0.00
+#FormatData/ja_JP/NumberPatterns/1=\u00a4#,##0.00  #see bug 4175306
+FormatData/ko_KR/NumberPatterns/1=\u00a4#,##0;-\u00a4#,##0
+FormatData/pl_PL/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4
+FormatData/pt_BR/NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00
+#Changed; see 4936845
+FormatData/ru_RU/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4
+FormatData/uk_UA/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4
+
+# bug #4122468 # Use common country names
+LocaleNames//CI=C\u00F4te d'Ivoire
+LocaleNames//LY=Libya
+LocaleNames//RU=Russia
+LocaleNames//VN=Vietnam
+
+# bug #4139860
+FormatData/cs/DateTimePatterns/4=EEEE, d. MMMM yyyy
+FormatData/cs/DateTimePatterns/5=d. MMMM yyyy
+FormatData/cs/DateTimePatterns/6=d.M.yyyy
+FormatData/cs/DateTimePatterns/7=d.M.yy
+FormatData/cs/NumberElements/1=\u00A0
+FormatData/cs_CZ/NumberPatterns/0=#,##0.##;-#,##0.##
+FormatData/cs_CZ/NumberPatterns/1=#,##0.## \u00A4;-#,##0.## \u00A4
+FormatData/cs_CZ/NumberPatterns/2=#,##0%
+
+#bug #4135752
+FormatData/th_TH/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00
+CurrencyNames/th_TH/THB=\u0e3f
+
+#bug #4153698
+# TimeZoneNames/zh_HK/zoneStrings/0/1=Hong Kong Standard Time # changed, see bug 4261506
+# TimeZoneNames/zh_HK/zoneStrings/0/2=HKST # changed, see bug 4261506
+LocaleNames/zh/HK=\u9999\u6e2f
+FormatData/zh_HK/MonthNames/0=\u4e00\u6708
+FormatData/zh_HK/MonthNames/1=\u4e8c\u6708
+FormatData/zh_HK/MonthNames/2=\u4e09\u6708
+FormatData/zh_HK/MonthNames/3=\u56db\u6708
+FormatData/zh_HK/MonthAbbreviations/0=1\u6708
+FormatData/zh_HK/MonthAbbreviations/1=2\u6708
+FormatData/zh_HK/MonthAbbreviations/2=3\u6708
+FormatData/zh_HK/MonthAbbreviations/3=4\u6708
+FormatData/zh_HK/DayNames/0=\u661f\u671f\u65e5
+FormatData/zh_HK/DayNames/1=\u661f\u671f\u4e00
+FormatData/zh_HK/DayNames/2=\u661f\u671f\u4e8c
+FormatData/zh_HK/DayAbbreviations/0=\u65e5
+FormatData/zh_HK/DayAbbreviations/1=\u4e00
+FormatData/zh_HK/DayAbbreviations/2=\u4e8c
+FormatData/zh_HK/NumberPatterns/1=\u00A4#,##0.00;(\u00A4#,##0.00)
+CurrencyNames/zh_HK/HKD=HK$
+FormatData/zh_HK/DateTimePatterns/0=ahh'\u6642'mm'\u5206'ss'\u79d2' z
+FormatData/zh_HK/DateTimePatterns/1=ahh'\u6642'mm'\u5206'ss'\u79d2'
+FormatData/zh_HK/DateTimePatterns/2=ahh:mm:ss
+FormatData/zh_HK/DateTimePatterns/3=ah:mm
+FormatData/zh_HK/DateTimePatterns/4=yyyy'\u5e74'MM'\u6708'dd'\u65e5' EEEE
+FormatData/zh_HK/DateTimePatterns/5=yyyy'\u5e74'MM'\u6708'dd'\u65e5' EEEE
+FormatData/zh_HK/DateTimePatterns/6=yyyy'\u5e74'M'\u6708'd'\u65e5'
+FormatData/zh_HK/DateTimePatterns/7=yy'\u5e74'M'\u6708'd'\u65e5'
+FormatData/zh_HK/DateTimePatterns/8={1} {0}
+
+#bug #4149569
+LocaleNames/tr/TR=T\u00fcrkiye
+
+#bug 4175306
+FormatData/es_ES/NumberPatterns/1=#,##0 \u00A4;-#,##0 \u00A4
+FormatData/ja_JP/NumberPatterns/1=\u00A4#,##0;-\u00A4#,##0
+
+#bug #4215747 - commented out by mfang due to 4900884
+#FormatData/ko/DateTimePatterns/0=a h'\uc2dc' m'\ubd84' s'\ucd08' z
+#FormatData/ko/DateTimePatterns/1=a h'\uc2dc' m'\ubd84' s'\ucd08'
+
+#bug 4900884
+FormatData/ko/DateTimePatterns/0=a h'\uc2dc' mm'\ubd84' ss'\ucd08' z
+FormatData/ko/DateTimePatterns/1=a h'\uc2dc' mm'\ubd84' ss'\ucd08'
+FormatData/ko/DateTimePatterns/2=a h:mm:ss
+FormatData/ko/DateTimePatterns/3=a h:mm
+
+#bug 4209960 Incorrect language display names
+#Updated for bug 4819436 Update language and country data for Locale class
+LocaleNames//fo=Faroese
+LocaleNames//iu=Inuktitut
+LocaleNames//sg=Sango
+LocaleNames//si=Sinhalese
+
+#bug 4331446 Localized country and language names for major locales (excerpt only)
+LocaleNames/es/SV=El Salvador
+
+#bug 4261506 (excerpt only)
+TimeZoneNames/en_CA/CTT/1=China Standard Time
+TimeZoneNames/en_CA/CTT/2=CST
+
+#bug nobugid, 4290801, 4942982
+CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431.
+
+#bug 4826794
+LocaleNames/ru_RU/MM=\u041C\u044C\u044F\u043D\u043C\u0430
+
+#bug 4518811
+CalendarData/ca_ES/minimalDaysInFirstWeek=4
+CalendarData/cs_CZ/minimalDaysInFirstWeek=4
+CalendarData/da_DK/minimalDaysInFirstWeek=4
+CalendarData/de_AT/minimalDaysInFirstWeek=4
+CalendarData/el_GR/minimalDaysInFirstWeek=4
+CalendarData/en_IE/minimalDaysInFirstWeek=4
+CalendarData/es_ES/minimalDaysInFirstWeek=4
+CalendarData/et_EE/minimalDaysInFirstWeek=4
+CalendarData/fi_FI/minimalDaysInFirstWeek=4
+CalendarData/is_IS/minimalDaysInFirstWeek=4
+CalendarData/lt_LT/minimalDaysInFirstWeek=4
+CalendarData/pl_PL/minimalDaysInFirstWeek=4
+CalendarData/pt_PT/minimalDaysInFirstWeek=4
+
+#bug 4945388 
+CurrencyNames/be_BY/BYR=\u0420\u0443\u0431
+CurrencyNames/bg_BG/BGN=\u043B\u0432.
+
+#bug 4794068
+FormatData/ca_ES/NumberPatterns/0=#,##0.###;-#,##0.###
+
+#bug 5032580
+FormatData/sk/DayNames/0=Nede\u013ea
+FormatData/sk/DayAbbreviations/5=Pi
+
+#bug 5074431
+FormatData/bg/DayNames/4=\u0427\u0435\u0442\u0432\u044A\u0440\u0442\u044A\u043A
+
+#bug 2121133
+FormatData/sv/NumberElements/1=\u00a0
+
+#bug 6208712
+LocaleNames/zh/tw=\u5951\u7ef4\u6587
+
+#bug 6277020
+CalendarData/ca_ES/firstDayOfWeek=2
+
+#bug 6277696
+#zh_SG, id, id_ID, en_MT, mt_MT, en_PH, el, el_CY, ms, ms_MY
+#zh_SG
+FormatData/zh_SG/DayAbbreviations/0=\u5468\u65e5
+FormatData/zh_SG/DayAbbreviations/1=\u5468\u4e00
+FormatData/zh_SG/DayAbbreviations/2=\u5468\u4e8c
+FormatData/zh_SG/DayAbbreviations/3=\u5468\u4e09
+FormatData/zh_SG/DayAbbreviations/4=\u5468\u56db
+FormatData/zh_SG/DayAbbreviations/5=\u5468\u4e94
+FormatData/zh_SG/DayAbbreviations/6=\u5468\u516d
+FormatData/zh_SG/NumberPatterns/0=#,##0.###
+FormatData/zh_SG/NumberPatterns/1=\u00a4#,##0.00
+FormatData/zh_SG/NumberPatterns/2=#,##0%
+CurrencyNames/zh_SG/SGD=S$
+FormatData/zh_SG/DateTimePatterns/0=a hh:mm:ss
+FormatData/zh_SG/DateTimePatterns/1=a hh:mm:ss
+FormatData/zh_SG/DateTimePatterns/2=a hh:mm
+FormatData/zh_SG/DateTimePatterns/3=a hh:mm
+FormatData/zh_SG/DateTimePatterns/4=dd MMMM yyyy
+FormatData/zh_SG/DateTimePatterns/5=dd MMM yyyy
+FormatData/zh_SG/DateTimePatterns/6=dd-MMM-yy
+FormatData/zh_SG/DateTimePatterns/7=dd/MM/yy
+FormatData/zh_SG/DateTimePatterns/8={1} {0}
+LocaleNames/zh_SG/ae=\u963f\u7ef4\u65af\u5854\u6587
+LocaleNames/zh_SG/ak=\u963f\u80af\u6587
+LocaleNames/zh_SG/cr=\u514b\u91cc\u65cf\u6587
+LocaleNames/zh_SG/cu=\u5b97\u6559\u65af\u62c9\u592b\u6587
+LocaleNames/zh_SG/ff=\u592b\u62c9\u6587
+LocaleNames/zh_SG/gv=\u9a6c\u6069\u5c9b\u6587
+LocaleNames/zh_SG/ig=\u4f0a\u683c\u535a\u6587
+LocaleNames/zh_SG/ii=\u56db\u5ddd\u8bdd
+LocaleNames/zh_SG/ko=\u97e9\u6587
+LocaleNames/zh_SG/kw=\u51ef\u5c14\u7279\u6587
+LocaleNames/zh_SG/lg=\u5362\u5e72\u8fbe\u6587
+LocaleNames/zh_SG/li=\u6dcb\u5e03\u5c14\u5409\u6587
+LocaleNames/zh_SG/lu=\u9c81\u5df4\u52a0\u4e39\u52a0\u6587
+LocaleNames/zh_SG/nd=\u5317\u6069\u5fb7\u8d1d\u52d2\u6587
+LocaleNames/zh_SG/nr=\u5357\u90e8\u6069\u5fb7\u8d1d\u52d2\u6587
+LocaleNames/zh_SG/sc=\u8428\u4e01\u6587
+LocaleNames/zh_SG/ty=\u5854\u897f\u63d0\u6587
+LocaleNames/zh_SG/AS=\u7f8e\u5c5e\u8428\u6469\u4e9a
+LocaleNames/zh_SG/AU=\u6fb3\u6d32
+LocaleNames/zh_SG/BD=\u5b5f\u52a0\u62c9\u56fd
+LocaleNames/zh_SG/BV=\u5e03\u7ef4\u7279\u5c9b
+LocaleNames/zh_SG/BZ=\u4f2f\u5229\u5179
+LocaleNames/zh_SG/CZ=\u6377\u514b
+LocaleNames/zh_SG/ER=\u5384\u7acb\u7279\u91cc\u4e9a
+LocaleNames/zh_SG/FK=\u798f\u514b\u5170\u7fa4\u5c9b
+LocaleNames/zh_SG/FM=\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a\u8054\u90a6
+LocaleNames/zh_SG/GS=\u5357\u4f50\u6cbb\u4e9a\u548c\u5357\u4e09\u660e\u6cbb\u7fa4\u5c9b
+LocaleNames/zh_SG/GW=\u51e0\u5185\u4e9a\u6bd4\u7ecd
+LocaleNames/zh_SG/HK=\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a
+LocaleNames/zh_SG/HM=\u8d6b\u5fb7\u4e0e\u9ea6\u514b\u5510\u7eb3\u7fa4\u5c9b
+LocaleNames/zh_SG/ID=\u5370\u5c3c
+LocaleNames/zh_SG/KR=\u5357\u97e9
+LocaleNames/zh_SG/LA=\u8001\u631d\u4eba\u6c11\u6c11\u4e3b\u5171\u548c\u56fd
+LocaleNames/zh_SG/MK=\u9a6c\u5176\u987f
+LocaleNames/zh_SG/MO=\u4e2d\u56fd\u6fb3\u95e8\u7279\u522b\u884c\u653f\u533a
+LocaleNames/zh_SG/MP=\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b
+LocaleNames/zh_SG/NU=\u7ebd\u57c3
+LocaleNames/zh_SG/NZ=\u7ebd\u897f\u5170
+LocaleNames/zh_SG/PF=\u6cd5\u5c5e\u6ce2\u5229\u5c3c\u897f\u4e9a
+LocaleNames/zh_SG/PM=\u5723\u76ae\u57c3\u5c14\u548c\u5bc6\u514b\u9686
+LocaleNames/zh_SG/PN=\u76ae\u7279\u51ef\u6069
+LocaleNames/zh_SG/PR=\u6ce2\u591a\u9ece\u5404
+LocaleNames/zh_SG/PS=\u5df4\u52d2\u65af\u5766\u9886\u571f
+LocaleNames/zh_SG/RE=\u7559\u5c3c\u6c6a
+LocaleNames/zh_SG/SA=\u6c99\u5730\u963f\u62c9\u4f2f
+LocaleNames/zh_SG/SH=\u5723\u8d6b\u52d2\u62ff
+LocaleNames/zh_SG/SJ=\u65af\u74e6\u5c14\u5df4\u7279\u548c\u626c\u9a6c\u5ef6
+LocaleNames/zh_SG/SL=\u585e\u62c9\u5229\u6602
+LocaleNames/zh_SG/TC=\u7279\u514b\u65af\u548c\u51ef\u79d1\u65af\u7fa4\u5c9b
+LocaleNames/zh_SG/TK=\u6258\u514b\u52b3
+LocaleNames/zh_SG/TW=\u53f0\u6e7e
+LocaleNames/zh_SG/UM=\u7f8e\u56fd\u8fb9\u8fdc\u5c0f\u5c9b
+LocaleNames/zh_SG/WF=\u74e6\u5229\u65af\u548c\u5bcc\u56fe\u7eb3
+LocaleNames/zh_SG/WS=\u8428\u6469\u4e9a
+LocaleNames/zh_SG/YT=\u9a6c\u7ea6\u7279
+#en_SG
+FormatData/en_SG/NumberPatterns/0=#,##0.###
+FormatData/en_SG/NumberPatterns/1=\u00a4#,##0.00
+FormatData/en_SG/NumberPatterns/2=#,##0%
+CurrencyNames/en_SG/SGD=$
+LocaleNames/en_SG/kj=Kuanyama
+LocaleNames/en_SG/kl=Kalaallisut
+LocaleNames/en_SG/ny=Nyanja; Chichewa; Chewa
+LocaleNames/en_SG/oc=Occitan (post 1500); Proven\u00e7al
+LocaleNames/en_SG/os=Ossetic
+LocaleNames/en_SG/pa=Punjabi
+LocaleNames/en_SG/rm=Rhaeto-Romance
+LocaleNames/en_SG/to=Tonga (Tonga Islands)
+LocaleNames/en_SG/CC=Cocos (Keeling) Islands
+LocaleNames/en_SG/CI=Ivory Coast
+LocaleNames/en_SG/GS=South Georgia and the South Sandwich Islands
+LocaleNames/en_SG/HM=Heard Island and McDonald Islands
+LocaleNames/en_SG/KN=Saint Kitts and Nevis
+LocaleNames/en_SG/PM=Saint Pierre and Miquelon
+LocaleNames/en_SG/PS=Palestinian Territory
+LocaleNames/en_SG/SJ=Svalbard and Jan Mayen
+LocaleNames/en_SG/ST=Sao Tome and Principe
+LocaleNames/en_SG/TC=Turks and Caicos Islands
+LocaleNames/en_SG/TL=East Timor
+LocaleNames/en_SG/VC=Saint Vincent and the Grenadines
+LocaleNames/en_SG/WF=Wallis and Futuna
+#in
+FormatData/in/MonthNames/0=Januari
+FormatData/in/MonthNames/1=Februari
+FormatData/in/MonthNames/2=Maret
+FormatData/in/MonthNames/3=April
+FormatData/in/MonthNames/4=Mei
+FormatData/in/MonthNames/5=Juni
+FormatData/in/MonthNames/6=Juli
+FormatData/in/MonthNames/7=Agustus
+FormatData/in/MonthNames/8=September
+FormatData/in/MonthNames/9=Oktober
+FormatData/in/MonthNames/10=November
+FormatData/in/MonthNames/11=Desember
+FormatData/in/MonthNames/12=
+FormatData/in/MonthAbbreviations/0=Jan
+FormatData/in/MonthAbbreviations/1=Feb
+FormatData/in/MonthAbbreviations/2=Mar
+FormatData/in/MonthAbbreviations/3=Apr
+FormatData/in/MonthAbbreviations/4=Mei
+FormatData/in/MonthAbbreviations/5=Jun
+FormatData/in/MonthAbbreviations/6=Jul
+FormatData/in/MonthAbbreviations/7=Agu
+FormatData/in/MonthAbbreviations/8=Sep
+FormatData/in/MonthAbbreviations/9=Okt
+FormatData/in/MonthAbbreviations/10=Nov
+FormatData/in/MonthAbbreviations/11=Des
+FormatData/in/DayNames/0=Minggu
+FormatData/in/DayNames/1=Senin
+FormatData/in/DayNames/2=Selasa
+FormatData/in/DayNames/3=Rabu
+FormatData/in/DayNames/4=Kamis
+FormatData/in/DayNames/5=Jumat
+FormatData/in/DayNames/6=Sabtu
+FormatData/in/DayAbbreviations/0=Min
+FormatData/in/DayAbbreviations/1=Sen
+FormatData/in/DayAbbreviations/2=Sel
+FormatData/in/DayAbbreviations/3=Rab
+FormatData/in/DayAbbreviations/4=Kam
+FormatData/in/DayAbbreviations/5=Jum
+FormatData/in/DayAbbreviations/6=Sab
+FormatData/in/Eras/0=BCE
+FormatData/in/Eras/1=CE
+FormatData/in/NumberPatterns/0=#,##0.###
+FormatData/in/NumberPatterns/1=\u00a4#,##0.00
+FormatData/in/NumberPatterns/2=#,##0%
+FormatData/in/NumberElements/0=,
+FormatData/in/NumberElements/1=.
+FormatData/in/NumberElements/2=;
+FormatData/in/NumberElements/3=%
+FormatData/in/NumberElements/4=0
+FormatData/in/NumberElements/5=#
+FormatData/in/NumberElements/6=-
+FormatData/in/NumberElements/7=E
+FormatData/in/NumberElements/8=\u2030
+FormatData/in/NumberElements/9=\u221e
+FormatData/in/NumberElements/10=NaN
+FormatData/in/DateTimePatterns/0=HH:mm:ss z
+FormatData/in/DateTimePatterns/1=HH:mm:ss z
+FormatData/in/DateTimePatterns/2=HH:mm:ss
+FormatData/in/DateTimePatterns/3=HH:mm
+FormatData/in/DateTimePatterns/4=EEEE, yyyy MMMM dd
+FormatData/in/DateTimePatterns/5=yyyy MMMM d
+FormatData/in/DateTimePatterns/6=yyyy MMM d
+FormatData/in/DateTimePatterns/7=yy/MM/dd
+FormatData/in/DateTimePatterns/8={1} {0}
+LocaleNames/in/ab=Abkhaz
+LocaleNames/in/am=Amharik
+LocaleNames/in/ar=Arab
+LocaleNames/in/as=Assam
+LocaleNames/in/av=Avarik
+LocaleNames/in/az=Azerbaijan
+LocaleNames/in/be=Belarusia
+LocaleNames/in/bg=Bulgaria
+LocaleNames/in/bn=Bengal
+LocaleNames/in/bo=Tibet
+LocaleNames/in/bs=Bosnia
+LocaleNames/in/co=Korsika
+LocaleNames/in/cs=Ceko
+LocaleNames/in/da=Denmark
+LocaleNames/in/de=Jerman
+LocaleNames/in/el=Yunani
+LocaleNames/in/en=Inggris
+LocaleNames/in/es=Spanyol
+LocaleNames/in/fa=Persia
+LocaleNames/in/fi=Finlandia
+LocaleNames/in/fj=Fiji
+LocaleNames/in/fo=Faro
+LocaleNames/in/fr=Perancis
+LocaleNames/in/fy=Frisi
+LocaleNames/in/ga=Irlandia
+LocaleNames/in/gd=Gaelik Skotlandia
+LocaleNames/in/he=Ibrani
+LocaleNames/in/hr=Kroasia
+LocaleNames/in/hu=Hungaria
+LocaleNames/in/hy=Armenia
+LocaleNames/in/id=Bahasa Indonesia
+LocaleNames/in/in=Bahasa Indonesia
+LocaleNames/in/iw=Ibrani
+LocaleNames/in/jv=Jawa
+LocaleNames/in/kj=Kuanyama
+LocaleNames/in/kl=Kalaallisut
+LocaleNames/in/ko=Korea
+LocaleNames/in/ks=Kashmir
+LocaleNames/in/ku=Kurdi
+LocaleNames/in/lb=Luxembourg
+LocaleNames/in/li=Limburg
+LocaleNames/in/lt=Lithuania
+LocaleNames/in/mg=Malagasi
+LocaleNames/in/mh=Marshall
+LocaleNames/in/my=Burma
+LocaleNames/in/ne=Nepal
+LocaleNames/in/nl=Belanda
+LocaleNames/in/ny=Nyanja; Chichewa; Chewa
+LocaleNames/in/os=Ossetic
+LocaleNames/in/pa=Punjabi
+LocaleNames/in/ps=Pashto (Pushto)
+LocaleNames/in/pt=Portugis
+LocaleNames/in/rm=Rhaeto-Romance
+LocaleNames/in/su=Sundan
+LocaleNames/in/sv=Swedia
+LocaleNames/in/zh=Cina
+LocaleNames/in/AD=Andora
+LocaleNames/in/AE=Uni Emirat Arab
+LocaleNames/in/AG=Antigua dan Barbuda
+LocaleNames/in/AN=Antilles Belanda
+LocaleNames/in/AQ=Antarktika
+LocaleNames/in/AS=Samoa Amerika
+LocaleNames/in/BA=Bosnia dan Herzegovina
+LocaleNames/in/BE=Belgia
+LocaleNames/in/BV=Kepulauan Bouvet
+LocaleNames/in/BY=Belarusia
+LocaleNames/in/CA=Kanada
+LocaleNames/in/CC=Kepulauan Cocos
+LocaleNames/in/CD=Republik Demokratik Kongo
+LocaleNames/in/CF=Republik Afrika Tengah
+LocaleNames/in/CG=Kongo
+LocaleNames/in/CH=Swiss
+LocaleNames/in/CI=Pantai Gading
+LocaleNames/in/CK=Kepulauan Cook
+LocaleNames/in/CL=Chili
+LocaleNames/in/CM=Kamerun
+LocaleNames/in/CN=Cina
+LocaleNames/in/CO=Kolombia
+LocaleNames/in/CR=Kosta Rika
+LocaleNames/in/CU=Kuba
+LocaleNames/in/CV=Tanjung Verde
+LocaleNames/in/CX=Pulau Christmas
+LocaleNames/in/CY=Siprus
+LocaleNames/in/CZ=Republik Ceko
+LocaleNames/in/DE=Jerman
+LocaleNames/in/DJ=Jibouti
+LocaleNames/in/DM=Dominika
+LocaleNames/in/DO=Republik Dominika
+LocaleNames/in/EC=Ekuador
+LocaleNames/in/EG=Mesir
+LocaleNames/in/EH=Sahara Barat
+LocaleNames/in/ES=Spanyol
+LocaleNames/in/FI=Finlandia
+LocaleNames/in/FK=Kepulauan Falkland
+LocaleNames/in/FM=Mikronesia
+LocaleNames/in/FO=Kepulauan Faroe
+LocaleNames/in/FR=Perancis
+LocaleNames/in/GB=Inggris Raya
+LocaleNames/in/GF=Guyana Perancis
+LocaleNames/in/GQ=Guinea Khatulistiwa
+LocaleNames/in/GR=Yunani
+LocaleNames/in/GS=Georgia Selatan dan Kepulauan Sandwich Selatan
+LocaleNames/in/HK=Hong Kong S.A.R., Cina
+LocaleNames/in/HM=Pulau Heard dan Kepulauan McDonald
+LocaleNames/in/HR=Kroasia
+LocaleNames/in/HU=Hungaria
+LocaleNames/in/IE=Irlandia
+LocaleNames/in/IS=Islandia
+LocaleNames/in/IT=Itali
+LocaleNames/in/JM=Jamaika
+LocaleNames/in/JO=Yordania
+LocaleNames/in/JP=Jepang
+LocaleNames/in/KH=Kamboja
+LocaleNames/in/KM=Komoros
+LocaleNames/in/KN=Saint Kitts dan Nevis
+LocaleNames/in/KP=Korea Utara
+LocaleNames/in/KR=Korea Selatan
+LocaleNames/in/KY=Kepulauan Kayman
+LocaleNames/in/LC=Santa Lusia
+LocaleNames/in/MA=Maroko
+LocaleNames/in/MG=Madagaskar
+LocaleNames/in/MH=Kepulauan Marshall
+LocaleNames/in/MO=Makao S.A.R. Cina
+LocaleNames/in/MP=Kepualuan Mariana Utara
+LocaleNames/in/NC=Kaledonia Baru
+LocaleNames/in/NF=Kepulauan Norfolk
+LocaleNames/in/NO=Norwegia
+LocaleNames/in/NZ=Selandia Baru
+LocaleNames/in/PF=Polynesia Perancis
+LocaleNames/in/PG=Papua Nugini
+LocaleNames/in/PH=Filipina
+LocaleNames/in/PL=Polandia
+LocaleNames/in/PM=Saint Pierre dan Miquelon
+LocaleNames/in/PR=Puerto Riko
+LocaleNames/in/PS=Otoritas Palestina
+LocaleNames/in/PT=Portugis
+LocaleNames/in/RE=R\u00e9union
+LocaleNames/in/RU=Rusia
+LocaleNames/in/SA=Arab Saudi
+LocaleNames/in/SB=Kepulauan Solomon
+LocaleNames/in/SG=Singapura
+LocaleNames/in/SJ=Svalbard dan Jan Mayen
+LocaleNames/in/ST=Sao Tome dan Principe
+LocaleNames/in/TT=Trinidad dan Tobago
+LocaleNames/in/UA=Ukraina
+LocaleNames/in/US=Amerika Serikat
+LocaleNames/in/VA=Vatikan
+LocaleNames/in/VC=Saint Vincent dan Grenadines
+LocaleNames/in/VG=Kepulauan British Virgin
+LocaleNames/in/VI=Kepulauan U.S. Virgin
+LocaleNames/in/WF=Wallis dan Futuna
+LocaleNames/in/YE=Yaman
+LocaleNames/in/ZA=Afrika Selatan
+#in_ID
+FormatData/in_ID/DateTimePatterns/0=H:mm:ss
+FormatData/in_ID/DateTimePatterns/1=H:mm:ss
+FormatData/in_ID/DateTimePatterns/2=H:mm:ss
+FormatData/in_ID/DateTimePatterns/3=H:mm
+FormatData/in_ID/DateTimePatterns/4=EEEE dd MMMM yyyy
+FormatData/in_ID/DateTimePatterns/5=dd MMMM yyyy
+FormatData/in_ID/DateTimePatterns/6=dd MMM yy
+FormatData/in_ID/DateTimePatterns/7=dd/MM/yy
+FormatData/in_ID/DateTimePatterns/8={1} {0}
+CurrencyNames/in_ID/IDR/0=Rp
+#en_MT
+FormatData/en_MT/NumberPatterns/0=#,##0.###
+FormatData/en_MT/NumberPatterns/1=\u00a4#,##0.00
+FormatData/en_MT/NumberPatterns/2=#,##0%
+FormatData/en_MT/DateTimePatterns/0=HH:mm:ss z
+FormatData/en_MT/DateTimePatterns/1=HH:mm:ss z
+FormatData/en_MT/DateTimePatterns/2=HH:mm:ss
+FormatData/en_MT/DateTimePatterns/3=HH:mm
+FormatData/en_MT/DateTimePatterns/4=EEEE, d MMMM yyyy
+FormatData/en_MT/DateTimePatterns/5=dd MMMM yyyy
+FormatData/en_MT/DateTimePatterns/6=dd MMM yyyy
+FormatData/en_MT/DateTimePatterns/7=dd/MM/yyyy
+FormatData/en_MT/DateTimePatterns/8={1} {0}
+CurrencyNames/en_MT/MTL=Lm
+CurrencyNames/en_MT/EUR=\u20ac
+LocaleNames/en_MT/kj=Kuanyama
+LocaleNames/en_MT/kl=Kalaallisut
+LocaleNames/en_MT/ny=Nyanja; Chichewa; Chewa
+LocaleNames/en_MT/oc=Occitan (post 1500); Proven\u00e7al
+LocaleNames/en_MT/os=Ossetic
+LocaleNames/en_MT/pa=Punjabi
+LocaleNames/en_MT/rm=Rhaeto-Romance
+LocaleNames/en_MT/to=Tonga (Tonga Islands)
+LocaleNames/en_MT/CC=Cocos (Keeling) Islands
+LocaleNames/en_MT/CI=Ivory Coast
+LocaleNames/en_MT/GS=South Georgia and the South Sandwich Islands
+LocaleNames/en_MT/HM=Heard Island and McDonald Islands
+LocaleNames/en_MT/KN=Saint Kitts and Nevis
+LocaleNames/en_MT/PM=Saint Pierre and Miquelon
+LocaleNames/en_MT/PS=Palestinian Territory
+LocaleNames/en_MT/SJ=Svalbard and Jan Mayen
+LocaleNames/en_MT/ST=Sao Tome and Principe
+LocaleNames/en_MT/TC=Turks and Caicos Islands
+LocaleNames/en_MT/TL=East Timor
+LocaleNames/en_MT/VC=Saint Vincent and the Grenadines
+LocaleNames/en_MT/WF=Wallis and Futuna
+#mt_MT
+FormatData/mt_MT/NumberPatterns/0=#,##0.###
+FormatData/mt_MT/NumberPatterns/1=\u00a4#,##0.00
+FormatData/mt_MT/NumberPatterns/2=#,##0%
+CurrencyNames/mt_MT/MTL=Lm
+CurrencyNames/mt_MT/EUR=\u20ac
+#en_PH
+FormatData/en_PH/NumberPatterns/0=#,##0.###
+FormatData/en_PH/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/en_PH/NumberPatterns/2=#,##0%
+FormatData/en_PH/DateTimePatterns/0=h:mm:ss a z
+FormatData/en_PH/DateTimePatterns/1=h:mm:ss a z
+FormatData/en_PH/DateTimePatterns/2=h:mm:ss a
+FormatData/en_PH/DateTimePatterns/3=h:mm a
+FormatData/en_PH/DateTimePatterns/4=EEEE, MMMM d, yyyy
+FormatData/en_PH/DateTimePatterns/5=MMMM d, yyyy
+FormatData/en_PH/DateTimePatterns/6=MM d, yy
+FormatData/en_PH/DateTimePatterns/7=M/d/yy
+FormatData/en_PH/DateTimePatterns/8={1} {0}
+LocaleNames/en_PH/kj=Kuanyama
+LocaleNames/en_PH/kl=Kalaallisut
+LocaleNames/en_PH/ny=Nyanja; Chichewa; Chewa
+LocaleNames/en_PH/oc=Occitan (post 1500); Proven\u00e7al
+LocaleNames/en_PH/os=Ossetic
+LocaleNames/en_PH/pa=Punjabi
+LocaleNames/en_PH/rm=Rhaeto-Romance
+LocaleNames/en_PH/to=Tonga (Tonga Islands)
+LocaleNames/en_PH/CC=Cocos (Keeling) Islands
+LocaleNames/en_PH/CI=Ivory Coast
+LocaleNames/en_PH/GS=South Georgia and the South Sandwich Islands
+LocaleNames/en_PH/HM=Heard Island and McDonald Islands
+LocaleNames/en_PH/KN=Saint Kitts and Nevis
+LocaleNames/en_PH/PM=Saint Pierre and Miquelon
+LocaleNames/en_PH/PS=Palestinian Territory
+LocaleNames/en_PH/SJ=Svalbard and Jan Mayen
+LocaleNames/en_PH/ST=Sao Tome and Principe
+#el
+FormatData/el/MonthNames/0=\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/1=\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/2=\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/3=\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/4=\u039c\u03ac\u03ca\u03bf\u03c2
+FormatData/el/MonthNames/5=\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/6=\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/7=\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2
+FormatData/el/MonthNames/8=\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/9=\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/10=\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/11=\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el/MonthNames/12=
+FormatData/el/MonthAbbreviations/0=\u0399\u03b1\u03bd
+FormatData/el/MonthAbbreviations/1=\u03a6\u03b5\u03b2
+FormatData/el/MonthAbbreviations/2=\u039c\u03b1\u03c1
+FormatData/el/MonthAbbreviations/3=\u0391\u03c0\u03c1
+FormatData/el/MonthAbbreviations/4=\u039c\u03b1\u03ca
+FormatData/el/MonthAbbreviations/5=\u0399\u03bf\u03c5\u03bd
+FormatData/el/MonthAbbreviations/6=\u0399\u03bf\u03c5\u03bb
+FormatData/el/MonthAbbreviations/7=\u0391\u03c5\u03b3
+FormatData/el/MonthAbbreviations/8=\u03a3\u03b5\u03c0
+FormatData/el/MonthAbbreviations/9=\u039f\u03ba\u03c4
+FormatData/el/MonthAbbreviations/10=\u039d\u03bf\u03b5
+FormatData/el/MonthAbbreviations/11=\u0394\u03b5\u03ba
+FormatData/el/DayNames/0=\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae
+FormatData/el/DayNames/1=\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1
+FormatData/el/DayNames/2=\u03a4\u03c1\u03af\u03c4\u03b7
+FormatData/el/DayNames/3=\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7
+FormatData/el/DayNames/4=\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7
+FormatData/el/DayNames/5=\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae
+FormatData/el/DayNames/6=\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf
+FormatData/el/DayAbbreviations/0=\u039a\u03c5\u03c1
+FormatData/el/DayAbbreviations/1=\u0394\u03b5\u03c5
+FormatData/el/DayAbbreviations/2=\u03a4\u03c1\u03b9
+FormatData/el/DayAbbreviations/3=\u03a4\u03b5\u03c4
+FormatData/el/DayAbbreviations/4=\u03a0\u03b5\u03bc
+FormatData/el/DayAbbreviations/5=\u03a0\u03b1\u03c1
+FormatData/el/DayAbbreviations/6=\u03a3\u03b1\u03b2
+FormatData/el/AmPmMarkers/0=\u03c0\u03bc
+FormatData/el/AmPmMarkers/1=\u03bc\u03bc
+FormatData/el/NumberElements/0=,
+FormatData/el/NumberElements/1=.
+FormatData/el/NumberElements/2=;
+FormatData/el/NumberElements/3=%
+FormatData/el/NumberElements/4=0
+FormatData/el/NumberElements/5=#
+FormatData/el/NumberElements/6=-
+FormatData/el/NumberElements/7=E
+FormatData/el/NumberElements/8=\u2030
+FormatData/el/NumberElements/9=\u221e
+FormatData/el/NumberElements/10=\ufffd
+FormatData/el/DateTimePatterns/0=h:mm:ss a z
+FormatData/el/DateTimePatterns/1=h:mm:ss a z
+FormatData/el/DateTimePatterns/2=h:mm:ss a
+FormatData/el/DateTimePatterns/3=h:mm a
+FormatData/el/DateTimePatterns/4=EEEE, d MMMM yyyy
+FormatData/el/DateTimePatterns/5=d MMMM yyyy
+FormatData/el/DateTimePatterns/6=d MMM yyyy
+FormatData/el/DateTimePatterns/7=d/M/yyyy
+FormatData/el/DateTimePatterns/8={1} {0}
+LocaleNames/el/GR=\u0395\u03bb\u03bb\u03ac\u03b4\u03b1
+#el_CY
+#bug 6483191
+FormatData/el_CY/MonthNames/0=\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/1=\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/2=\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/3=\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/4=\u039c\u03ac\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/5=\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/6=\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/7=\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2
+FormatData/el_CY/MonthNames/8=\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/9=\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/10=\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/11=\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2
+FormatData/el_CY/MonthNames/12=
+FormatData/el_CY/AmPmMarkers/0=\u03a0\u039c
+FormatData/el_CY/AmPmMarkers/1=\u039c\u039c
+FormatData/el_CY/Eras/0=\u03c0.\u03a7.
+FormatData/el_CY/Eras/1=\u03bc.\u03a7.
+FormatData/el_CY/NumberPatterns/0=#,##0.###
+FormatData/el_CY/NumberPatterns/1=\u00a4#,##0.00
+FormatData/el_CY/NumberPatterns/2=#,##0%
+FormatData/el_CY/DateTimePatterns/0=h:mm:ss a z
+FormatData/el_CY/DateTimePatterns/1=h:mm:ss a z
+FormatData/el_CY/DateTimePatterns/2=h:mm:ss a
+FormatData/el_CY/DateTimePatterns/3=h:mm a
+FormatData/el_CY/DateTimePatterns/4=EEEE, dd MMMM yyyy
+FormatData/el_CY/DateTimePatterns/5=dd MMMM yyyy
+FormatData/el_CY/DateTimePatterns/6=dd MMM yyyy
+FormatData/el_CY/DateTimePatterns/7=dd/MM/yyyy
+FormatData/el_CY/DateTimePatterns/8={1} {0}
+LocaleNames/el_CY/ar=\u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac
+LocaleNames/el_CY/be=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03b9\u03ba\u03ac
+LocaleNames/el_CY/bg=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03b9\u03ba\u03ac
+LocaleNames/el_CY/bo=\u0398\u03b9\u03b2\u03b5\u03c4\u03b9\u03b1\u03bd\u03ac
+LocaleNames/el_CY/bs=\u0392\u03bf\u03c3\u03bd\u03b9\u03b1\u03ba\u03ac
+LocaleNames/el_CY/bn=\u039c\u03c0\u03b5\u03bd\u03b3\u03ba\u03ac\u03bb\u03b9
+LocaleNames/el_CY/ca=\u039a\u03b1\u03c4\u03b1\u03bb\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/co=\u039a\u03bf\u03c1\u03c3\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/cs=\u03a4\u03c3\u03b5\u03c7\u03b9\u03ba\u03ac
+LocaleNames/el_CY/cy=\u039f\u03c5\u03b1\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el_CY/da=\u0394\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/de=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/el=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/en=\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el_CY/es=\u0399\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/et=\u0395\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/eu=\u0392\u03b1\u03c3\u03ba\u03b9\u03ba\u03ac
+LocaleNames/el_CY/fa=\u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac
+LocaleNames/el_CY/fi=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/fr=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el_CY/ga=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u03ac \u039a\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/he=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el_CY/hi=\u03a7\u03af\u03bd\u03c4\u03b9
+LocaleNames/el_CY/hr=\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/hu=\u039f\u03c5\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac
+LocaleNames/el_CY/hy=\u0391\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/id=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac
+LocaleNames/el_CY/in=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac
+LocaleNames/el_CY/is=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/it=\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el_CY/iw=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el_CY/ja=\u0399\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/ji=\u0399\u03bf\u03c5\u03b4\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el_CY/ka=\u0393\u03b5\u03c9\u03c1\u03b3\u03b9\u03b1\u03bd\u03ac
+LocaleNames/el_CY/ko=\u039a\u03bf\u03c1\u03b5\u03b1\u03c4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/la=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/lt=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/lv=\u039b\u03b5\u03c4\u03bf\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/mk=\u03a3\u03bb\u03b1\u03b2\u03bf\u03bc\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/mn=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el_CY/mo=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03b9\u03ba\u03ac
+LocaleNames/el_CY/mt=\u039c\u03b1\u03bb\u03c4\u03b5\u03b6\u03b9\u03ba\u03ac
+LocaleNames/el_CY/nl=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/no=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac
+LocaleNames/el_CY/pl=\u03a0\u03bf\u03bb\u03c9\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/pt=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el_CY/ro=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/ru=\u03a1\u03c9\u03c3\u03b9\u03ba\u03ac
+LocaleNames/el_CY/sk=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03b9\u03ba\u03ac
+LocaleNames/el_CY/sl=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/sq=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/sr=\u03a3\u03b5\u03c1\u03b2\u03b9\u03ba\u03ac
+LocaleNames/el_CY/sv=\u03a3\u03bf\u03c5\u03b7\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/th=\u03a4\u03b1\u03ca\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el_CY/tr=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac
+LocaleNames/el_CY/uk=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el_CY/vi=\u0392\u03b9\u03b5\u03c4\u03bd\u03b1\u03bc\u03b5\u03b6\u03b9\u03ba\u03ac
+LocaleNames/el_CY/yi=\u0399\u03bf\u03c5\u03b4\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el_CY/zh=\u039a\u03b9\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac
+LocaleNames/el_CY/AD=\u0391\u03bd\u03b4\u03cc\u03c1\u03b1
+LocaleNames/el_CY/AE=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1
+LocaleNames/el_CY/AF=\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el_CY/AG=\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1
+LocaleNames/el_CY/AI=\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1
+LocaleNames/el_CY/AL=\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/AM=\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1
+LocaleNames/el_CY/AN=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ad\u03c2 \u0391\u03bd\u03c4\u03af\u03bb\u03bb\u03b5\u03c2
+LocaleNames/el_CY/AO=\u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1
+LocaleNames/el_CY/AQ=\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae
+LocaleNames/el_CY/AR=\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae
+LocaleNames/el_CY/AS=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1
+LocaleNames/el_CY/AT=\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1
+LocaleNames/el_CY/AU=\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1
+LocaleNames/el_CY/AW=\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1
+LocaleNames/el_CY/AX=\u039d\u03ae\u03c3\u03bf\u03b9 Aland
+LocaleNames/el_CY/AZ=\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd
+LocaleNames/el_CY/BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7
+LocaleNames/el_CY/BB=\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ac\u03bd\u03c4\u03bf\u03c2
+LocaleNames/el_CY/BD=\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2
+LocaleNames/el_CY/BE=\u0392\u03ad\u03bb\u03b3\u03b9\u03bf
+LocaleNames/el_CY/BF=\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf
+LocaleNames/el_CY/BG=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1
+LocaleNames/el_CY/BH=\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd
+LocaleNames/el_CY/BI=\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9
+LocaleNames/el_CY/BJ=\u039c\u03c0\u03ad\u03bd\u03b9\u03bd
+LocaleNames/el_CY/BM=\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2
+LocaleNames/el_CY/BN=\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9 \u039d\u03c4\u03b1\u03c1\u03bf\u03c5\u03c3\u03b1\u03bb\u03ac\u03bc
+LocaleNames/el_CY/BO=\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1
+LocaleNames/el_CY/BR=\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1
+LocaleNames/el_CY/BS=\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2
+LocaleNames/el_CY/BT=\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd
+LocaleNames/el_CY/BV=\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad
+LocaleNames/el_CY/BW=\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1
+LocaleNames/el_CY/BY=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1
+LocaleNames/el_CY/BZ=\u039c\u03c0\u03b5\u03bb\u03af\u03b6
+LocaleNames/el_CY/CA=\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2
+LocaleNames/el_CY/CC=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03ae\u03bb\u03b9\u03bd\u03b3\u03ba)
+LocaleNames/el_CY/CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc, \u039b\u03b1\u03ca\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u03c5
+LocaleNames/el_CY/CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
+LocaleNames/el_CY/CG=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc
+LocaleNames/el_CY/CH=\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1
+LocaleNames/el_CY/CI=\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03cc\u03b4\u03bf\u03bd\u03c4\u03bf\u03c2
+LocaleNames/el_CY/CK=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba
+LocaleNames/el_CY/CL=\u03a7\u03b9\u03bb\u03ae
+LocaleNames/el_CY/CM=\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd
+LocaleNames/el_CY/CN=\u039a\u03af\u03bd\u03b1
+LocaleNames/el_CY/CO=\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1
+LocaleNames/el_CY/CR=\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1
+LocaleNames/el_CY/CS=\u03a3\u03b5\u03c1\u03b2\u03af\u03b1 \u03ba\u03b1\u03b9 \u039c\u03b1\u03c5\u03c1\u03bf\u03b2\u03bf\u03cd\u03bd\u03b9\u03bf
+LocaleNames/el_CY/CU=\u039a\u03bf\u03cd\u03b2\u03b1
+LocaleNames/el_CY/CV=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf\u03c5 \u0391\u03ba\u03c1\u03c9\u03c4\u03b7\u03c1\u03af\u03bf\u03c5
+LocaleNames/el_CY/CX=\u039d\u03ae\u03c3\u03bf\u03c2 \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd
+LocaleNames/el_CY/CY=\u039a\u03cd\u03c0\u03c1\u03bf\u03c2
+LocaleNames/el_CY/CZ=\u03a4\u03c3\u03b5\u03c7\u03af\u03b1
+LocaleNames/el_CY/DE=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/DJ=\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af
+LocaleNames/el_CY/DK=\u0394\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/DM=\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1
+LocaleNames/el_CY/DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
+LocaleNames/el_CY/DZ=\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1
+LocaleNames/el_CY/EC=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2
+LocaleNames/el_CY/EE=\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1
+LocaleNames/el_CY/EG=\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2
+LocaleNames/el_CY/EH=\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1
+LocaleNames/el_CY/ER=\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1
+LocaleNames/el_CY/ES=\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/ET=\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1
+LocaleNames/el_CY/FI=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el_CY/FJ=\u03a6\u03af\u03c4\u03b6\u03b9
+LocaleNames/el_CY/FK=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03ce\u03ba\u03bb\u03b1\u03bd\u03c4
+LocaleNames/el_CY/FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1, \u039f\u03bc\u03cc\u03c3\u03c0\u03bf\u03bd\u03b4\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2 \u03c4\u03b7\u03c2
+LocaleNames/el_CY/FO=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2
+LocaleNames/el_CY/FR=\u0393\u03b1\u03bb\u03bb\u03af\u03b1
+LocaleNames/el_CY/GA=\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd
+LocaleNames/el_CY/GB=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf
+LocaleNames/el_CY/GD=\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1
+LocaleNames/el_CY/GE=\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1
+LocaleNames/el_CY/GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1
+LocaleNames/el_CY/GH=\u0393\u03ba\u03ac\u03bd\u03b1
+LocaleNames/el_CY/GI=\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1
+LocaleNames/el_CY/GL=\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el_CY/GM=\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1
+LocaleNames/el_CY/GN=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
+LocaleNames/el_CY/GP=\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7
+LocaleNames/el_CY/GQ=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
+LocaleNames/el_CY/GS=\u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2
+LocaleNames/el_CY/GT=\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1
+LocaleNames/el_CY/GU=\u0393\u03ba\u03bf\u03c5\u03ac\u03bc
+LocaleNames/el_CY/GW=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1-\u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5
+LocaleNames/el_CY/GY=\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1
+LocaleNames/el_CY/HK=\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba, \u0395\u03b9\u03b4\u03b9\u03ba\u03ae \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u03ae \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u03b7\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
+LocaleNames/el_CY/HM=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4
+LocaleNames/el_CY/HN=\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1
+LocaleNames/el_CY/HR=\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1
+LocaleNames/el_CY/HT=\u0391\u03ca\u03c4\u03ae
+LocaleNames/el_CY/HU=\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1
+LocaleNames/el_CY/ID=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1
+LocaleNames/el_CY/IE=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el_CY/IL=\u0399\u03c3\u03c1\u03b1\u03ae\u03bb
+LocaleNames/el_CY/IN=\u0399\u03bd\u03b4\u03af\u03b1
+LocaleNames/el_CY/IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0388\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd
+LocaleNames/el_CY/IQ=\u0399\u03c1\u03ac\u03ba
+LocaleNames/el_CY/IR=\u0399\u03c1\u03ac\u03bd, \u0399\u03c3\u03bb\u03b1\u03bc\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u03c5
+LocaleNames/el_CY/IS=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el_CY/IT=\u0399\u03c4\u03b1\u03bb\u03af\u03b1
+LocaleNames/el_CY/JM=\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1
+LocaleNames/el_CY/JO=\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/JP=\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1
+LocaleNames/el_CY/KE=\u039a\u03ad\u03bd\u03c5\u03b1
+LocaleNames/el_CY/KG=\u039a\u03b9\u03c1\u03b3\u03b9\u03b6\u03af\u03b1
+LocaleNames/el_CY/KH=\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7
+LocaleNames/el_CY/KI=\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9
+LocaleNames/el_CY/KM=\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2
+LocaleNames/el_CY/KN=\u03a3\u03b1\u03b9\u03bd\u03c4 \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2
+LocaleNames/el_CY/KP=\u039a\u03bf\u03c1\u03ad\u03b1, \u0392\u03cc\u03c1\u03b5\u03b9\u03b1
+LocaleNames/el_CY/KR=\u039a\u03bf\u03c1\u03ad\u03b1, \u039d\u03cc\u03c4\u03b9\u03b1
+LocaleNames/el_CY/KW=\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4
+LocaleNames/el_CY/KY=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd
+LocaleNames/el_CY/KZ=\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el_CY/LA=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ae \u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03ae
+LocaleNames/el_CY/LB=\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2
+LocaleNames/el_CY/LC=\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1
+LocaleNames/el_CY/LI=\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd
+LocaleNames/el_CY/LK=\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1
+LocaleNames/el_CY/LR=\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1
+LocaleNames/el_CY/LS=\u039b\u03b5\u03c3\u03cc\u03c4\u03bf
+LocaleNames/el_CY/LT=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf
+LocaleNames/el_CY/LV=\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1
+LocaleNames/el_CY/LY=\u039b\u03b9\u03b2\u03cd\u03b7
+LocaleNames/el_CY/MA=\u039c\u03b1\u03c1\u03cc\u03ba\u03bf
+LocaleNames/el_CY/MC=\u039c\u03bf\u03bd\u03b1\u03ba\u03cc
+LocaleNames/el_CY/MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1, \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03b7\u03c2
+LocaleNames/el_CY/MG=\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7
+LocaleNames/el_CY/MH=\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb
+LocaleNames/el_CY/MK=\u03a0\u0393\u0394 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1\u03c2
+LocaleNames/el_CY/ML=\u039c\u03ac\u03bb\u03b9
+LocaleNames/el_CY/MM=\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1
+LocaleNames/el_CY/MN=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1
+LocaleNames/el_CY/MO=\u039c\u03b1\u03ba\u03ac\u03bf, \u0395\u03b9\u03b4\u03b9\u03ba\u03ae \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u03ae \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u03b7\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
+LocaleNames/el_CY/MP=\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2
+LocaleNames/el_CY/MQ=\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1
+LocaleNames/el_CY/MR=\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/MS=\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4
+LocaleNames/el_CY/MT=\u039c\u03ac\u03bb\u03c4\u03b1
+LocaleNames/el_CY/MU=\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2
+LocaleNames/el_CY/MV=\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2
+LocaleNames/el_CY/MW=\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9
+LocaleNames/el_CY/MX=\u039c\u03b5\u03be\u03b9\u03ba\u03cc
+LocaleNames/el_CY/MY=\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1
+LocaleNames/el_CY/MZ=\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7
+LocaleNames/el_CY/NA=\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1
+LocaleNames/el_CY/NC=\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1
+LocaleNames/el_CY/NE=\u039d\u03af\u03b3\u03b7\u03c1
+LocaleNames/el_CY/NF=\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba
+LocaleNames/el_CY/NG=\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1
+LocaleNames/el_CY/NI=\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1
+LocaleNames/el_CY/NL=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el_CY/NO=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1
+LocaleNames/el_CY/NP=\u039d\u03b5\u03c0\u03ac\u03bb
+LocaleNames/el_CY/NR=\u039d\u03b1\u03bf\u03cd\u03c1\u03bf\u03c5
+LocaleNames/el_CY/NU=\u039d\u03b9\u03bf\u03cd\u03b5
+LocaleNames/el_CY/NZ=\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el_CY/OM=\u039f\u03bc\u03ac\u03bd
+LocaleNames/el_CY/PA=\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2
+LocaleNames/el_CY/PE=\u03a0\u03b5\u03c1\u03bf\u03cd
+LocaleNames/el_CY/PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1
+LocaleNames/el_CY/PG=\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 - \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
+LocaleNames/el_CY/PH=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2
+LocaleNames/el_CY/PK=\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el_CY/PL=\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1
+LocaleNames/el_CY/PM=\u03a3\u03b1\u03b9\u03bd\u03c4 \u03a0\u03b9\u03ad\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd
+LocaleNames/el_CY/PN=\u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd
+LocaleNames/el_CY/PR=\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf
+LocaleNames/el_CY/PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7
+LocaleNames/el_CY/PT=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1
+LocaleNames/el_CY/PW=\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5
+LocaleNames/el_CY/PY=\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7
+LocaleNames/el_CY/QA=\u039a\u03b1\u03c4\u03ac\u03c1
+LocaleNames/el_CY/RE=\u03a1\u03b5\u03cb\u03bd\u03b9\u03cc\u03bd
+LocaleNames/el_CY/RO=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/RU=\u03a1\u03c9\u03c3\u03af\u03b1
+LocaleNames/el_CY/RW=\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1
+LocaleNames/el_CY/SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1
+LocaleNames/el_CY/SB=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2
+LocaleNames/el_CY/SC=\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2
+LocaleNames/el_CY/SD=\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd
+LocaleNames/el_CY/SE=\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1
+LocaleNames/el_CY/SG=\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7
+LocaleNames/el_CY/SH=\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7
+LocaleNames/el_CY/SI=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1
+LocaleNames/el_CY/SJ=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd
+LocaleNames/el_CY/SK=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1
+LocaleNames/el_CY/SL=\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5
+LocaleNames/el_CY/SM=\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2
+LocaleNames/el_CY/SN=\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7
+LocaleNames/el_CY/SO=\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1
+LocaleNames/el_CY/SR=\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc
+LocaleNames/el_CY/ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5
+LocaleNames/el_CY/SV=\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1
+LocaleNames/el_CY/SY=\u03a3\u03c5\u03c1\u03af\u03b1, \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03b7\u03c2
+LocaleNames/el_CY/SZ=\u03a3\u03bf\u03c5\u03b1\u03b6\u03b9\u03bb\u03ac\u03bd\u03b4\u03b7
+LocaleNames/el_CY/TC=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2
+LocaleNames/el_CY/TD=\u03a4\u03c3\u03b1\u03bd\u03c4
+LocaleNames/el_CY/TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7
+LocaleNames/el_CY/TG=\u03a4\u03cc\u03b3\u03ba\u03bf
+LocaleNames/el_CY/TH=\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7
+LocaleNames/el_CY/TJ=\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el_CY/TK=\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5
+LocaleNames/el_CY/TL=\u0391\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u03cc \u03a4\u03b9\u03bc\u03cc\u03c1
+LocaleNames/el_CY/TM=\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el_CY/TN=\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1
+LocaleNames/el_CY/TO=\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1
+LocaleNames/el_CY/TR=\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1
+LocaleNames/el_CY/TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03b4\u03ac\u03b4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf
+LocaleNames/el_CY/TV=\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd
+LocaleNames/el_CY/TW=\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd
+LocaleNames/el_CY/TZ=\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/UA=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1
+LocaleNames/el_CY/UG=\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1
+LocaleNames/el_CY/UM=\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u03c4\u03c9\u03bd \u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03b9\u03ce\u03bd
+LocaleNames/el_CY/US=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2
+LocaleNames/el_CY/UY=\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7
+LocaleNames/el_CY/UZ=\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el_CY/VA=\u0391\u03b3\u03af\u03b1 \u0388\u03b4\u03c1\u03b1 (\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc)
+LocaleNames/el_CY/VC=\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2
+LocaleNames/el_CY/VE=\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1
+LocaleNames/el_CY/VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9
+LocaleNames/el_CY/VI=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9
+LocaleNames/el_CY/VN=\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
+LocaleNames/el_CY/VU=\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5
+LocaleNames/el_CY/WF=\u039d\u03ae\u03c3\u03bf\u03b9 \u039f\u03c5\u03b1\u03bb\u03bb\u03af\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03c5\u03bd\u03ac
+LocaleNames/el_CY/WS=\u03a3\u03b1\u03bc\u03cc\u03b1
+LocaleNames/el_CY/YE=\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7
+LocaleNames/el_CY/YT=\u039c\u03b1\u03b3\u03b9\u03cc\u03c4
+LocaleNames/el_CY/ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae
+LocaleNames/el_CY/ZM=\u0396\u03ac\u03bc\u03c0\u03b9\u03b1
+LocaleNames/el_CY/ZW=\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5
+CurrencyNames/el_CY/CYP=\u00a3
+CurrencyNames/el_CY/EUR=\u20ac
+CalendarData/el_CY/minimalDaysInFirstWeek=1
+
+#ms_MY and ms
+FormatData/ms_MY/NumberPatterns/0=#,##0.###
+FormatData/ms_MY/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/ms_MY/NumberPatterns/2=#,##0%
+FormatData/ms_MY/DateTimePatterns/0=h:mm:ss a z
+FormatData/ms_MY/DateTimePatterns/1=h:mm:ss a z
+FormatData/ms_MY/DateTimePatterns/2=h:mm:ss a
+FormatData/ms_MY/DateTimePatterns/3=h:mm
+FormatData/ms_MY/DateTimePatterns/4=EEEE dd MMM yyyy
+FormatData/ms_MY/DateTimePatterns/5=dd MMMM yyyy
+FormatData/ms_MY/DateTimePatterns/6=dd MMMM yyyy
+FormatData/ms_MY/DateTimePatterns/7=dd/MM/yyyy
+FormatData/ms_MY/DateTimePatterns/8={1} {0}
+CurrencyNames/ms_MY/MYR=RM
+LocaleNames/ms/ms=Bahasa Melayu
+LocaleNames/ms/AE=Emiriah Arab Bersatu
+LocaleNames/ms/AG=Antigua dan Barbuda
+LocaleNames/ms/BA=Bosnia dan Herzegovina
+LocaleNames/ms/CA=Kanada
+LocaleNames/ms/CC=Cocos (Keeling) Islands
+LocaleNames/ms/CD=Democratic Republic of the Congo
+LocaleNames/ms/CF=Republik Afrika Tengah
+LocaleNames/ms/CI=Pantai Gading
+LocaleNames/ms/CL=Cile
+LocaleNames/ms/CM=Kamerun
+LocaleNames/ms/CN=Cina
+LocaleNames/ms/CR=Kosta Rika
+LocaleNames/ms/CY=Kibris
+LocaleNames/ms/CZ=Republik Czech
+LocaleNames/ms/DE=Jerman
+LocaleNames/ms/DJ=Jibouti
+LocaleNames/ms/DO=Republik Dominican
+LocaleNames/ms/DZ=Aljazair
+LocaleNames/ms/EG=Mesir
+LocaleNames/ms/EH=Sahara Barat
+LocaleNames/ms/ES=Sepanyol
+LocaleNames/ms/FR=Perancis
+LocaleNames/ms/GR=Yunani
+LocaleNames/ms/GS=South Georgia and the South Sandwich Islands
+LocaleNames/ms/GW=Guinea Bissau
+LocaleNames/ms/HK=Hong Kong S.A.R., China
+LocaleNames/ms/HM=Heard Island and McDonald Islands
+LocaleNames/ms/HU=Hungari
+LocaleNames/ms/IN=Hindia
+LocaleNames/ms/IT=Itali
+LocaleNames/ms/JM=Jamaika
+LocaleNames/ms/JP=Jepun
+LocaleNames/ms/KH=Kemboja
+LocaleNames/ms/KN=Saint Kitts dan Nevis
+LocaleNames/ms/KP=Utara Korea
+LocaleNames/ms/KR=Selatan Korea
+LocaleNames/ms/LB=Lubnan
+LocaleNames/ms/LU=Luksembourg
+LocaleNames/ms/MA=Maghribi
+LocaleNames/ms/MG=Madagaskar
+LocaleNames/ms/MH=Kepulauan Marshall
+LocaleNames/ms/MO=Macao S.A.R., China
+LocaleNames/ms/MV=Maldiv
+LocaleNames/ms/MX=Meksiko
+LocaleNames/ms/MZ=Mozambik
+LocaleNames/ms/NL=Belanda
+LocaleNames/ms/PH=Filipina
+LocaleNames/ms/PM=Saint Pierre and Miquelon
+LocaleNames/ms/PS=Palestinian Territory
+LocaleNames/ms/PT=Feringgi
+LocaleNames/ms/RE=R\u00e9union
+LocaleNames/ms/SA=Arab Saudi
+LocaleNames/ms/SB=Kepulauan Solomon
+LocaleNames/ms/SG=Singapura
+LocaleNames/ms/SJ=Svalbard and Jan Mayen
+LocaleNames/ms/SL=Siera Leon
+LocaleNames/ms/SR=Surinam
+LocaleNames/ms/ST=Sao Tome dan Principe
+LocaleNames/ms/TC=Turks and Caicos Islands
+LocaleNames/ms/TD=Cad
+LocaleNames/ms/TJ=Tadjikistan
+LocaleNames/ms/TR=Turki
+LocaleNames/ms/TT=Trinidad dan Tobago
+LocaleNames/ms/US=Amerika Syarikat
+LocaleNames/ms/VC=Saint Vincent dan Grenadines
+LocaleNames/ms/WF=Wallis and Futuna
+LocaleNames/ms/YE=Yaman
+LocaleNames/ms/ZA=Afrika Selatan
+
+# es_US
+FormatData/es_US/Eras/0=a.C.
+FormatData/es_US/Eras/1=d.C.
+FormatData/es_US/NumberPatterns/0=#,##0.###
+FormatData/es_US/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00)
+FormatData/es_US/NumberPatterns/2=#,##0%
+FormatData/es_US/DateTimePatterns/0=h:mm:ss a z
+FormatData/es_US/DateTimePatterns/1=h:mm:ss a z
+FormatData/es_US/DateTimePatterns/2=h:mm:ss a
+FormatData/es_US/DateTimePatterns/3=h:mm a
+FormatData/es_US/DateTimePatterns/4=EEEE d' de 'MMMM' de 'yyyy
+FormatData/es_US/DateTimePatterns/5=d' de 'MMMM' de 'yyyy
+FormatData/es_US/DateTimePatterns/6=MMM d, yyyy
+FormatData/es_US/DateTimePatterns/7=M/d/yy
+FormatData/es_US/DateTimePatterns/8={1} {0}
+LocaleNames/es_US/aa=afar
+LocaleNames/es_US/ae=av\u00e9stico
+LocaleNames/es_US/ak=akan
+LocaleNames/es_US/an=aragon\u00e9s
+LocaleNames/es_US/av=avar
+LocaleNames/es_US/ay=aymara
+LocaleNames/es_US/az=azer\u00ed
+LocaleNames/es_US/ba=bashkir
+LocaleNames/es_US/bh=bihari
+LocaleNames/es_US/bm=bambara
+LocaleNames/es_US/bn=bengal\u00ed
+LocaleNames/es_US/bs=bosnio
+LocaleNames/es_US/ce=checheno
+LocaleNames/es_US/ch=chamorro
+LocaleNames/es_US/cr=cree
+LocaleNames/es_US/cu=eslavo eclesi\u00e1stico
+LocaleNames/es_US/cv=chuvash
+LocaleNames/es_US/dv=divehi
+LocaleNames/es_US/ee=ewe
+LocaleNames/es_US/eu=vasco
+LocaleNames/es_US/ff=fula
+LocaleNames/es_US/fo=fero\u00e9s
+LocaleNames/es_US/fy=fris\u00f3n
+LocaleNames/es_US/gu=gujarati
+LocaleNames/es_US/gv=ga\u00e9lico man\u00e9s
+LocaleNames/es_US/hi=hindi
+LocaleNames/es_US/ho=hiri motu
+LocaleNames/es_US/ht=haitiano
+LocaleNames/es_US/hz=herero
+LocaleNames/es_US/ie=interlingue
+LocaleNames/es_US/ig=igbo
+LocaleNames/es_US/ii=sichuan yi
+LocaleNames/es_US/io=ido
+LocaleNames/es_US/jv=javan\u00e9s
+LocaleNames/es_US/kg=kongo
+LocaleNames/es_US/ki=kikuyu
+LocaleNames/es_US/kj=kuanyama
+LocaleNames/es_US/kk=kazajo
+LocaleNames/es_US/km=jemer
+LocaleNames/es_US/kn=canar\u00e9s
+LocaleNames/es_US/kr=kanuri
+LocaleNames/es_US/ks=cachemiro
+LocaleNames/es_US/ku=kurdo
+LocaleNames/es_US/kv=komi
+LocaleNames/es_US/kw=c\u00f3rnico
+LocaleNames/es_US/ky=kirghiz
+LocaleNames/es_US/lb=luxemburgu\u00e9s
+LocaleNames/es_US/lg=ganda
+LocaleNames/es_US/li=limburgu\u00e9s
+LocaleNames/es_US/lu=luba-katanga
+LocaleNames/es_US/mh=marshal\u00e9s
+LocaleNames/es_US/mr=marathi
+LocaleNames/es_US/nb=bokmal noruego
+LocaleNames/es_US/nd=ndebele septentrional
+LocaleNames/es_US/ng=ndonga
+LocaleNames/es_US/nn=nynorsk noruego
+LocaleNames/es_US/nr=ndebele meridional
+LocaleNames/es_US/nv=navajo
+LocaleNames/es_US/ny=nyanja
+LocaleNames/es_US/oc=occitano (despu\u00e9s del 1500)
+LocaleNames/es_US/oj=ojibwa
+LocaleNames/es_US/os=os\u00e9tico
+LocaleNames/es_US/pi=pali
+LocaleNames/es_US/rm=reto-romance
+LocaleNames/es_US/rn=kiroundi
+LocaleNames/es_US/rw=kinyarwanda
+LocaleNames/es_US/sc=sardo
+LocaleNames/es_US/sd=sindhi
+LocaleNames/es_US/se=sami septentrional
+LocaleNames/es_US/sl=esloveno
+LocaleNames/es_US/sn=shona
+LocaleNames/es_US/ss=siswati
+LocaleNames/es_US/st=sesotho
+LocaleNames/es_US/su=sundan\u00e9s
+LocaleNames/es_US/sw=swahili
+LocaleNames/es_US/tg=tayiko
+LocaleNames/es_US/tn=setchwana
+LocaleNames/es_US/to=tonga (Islas Tonga)
+LocaleNames/es_US/tw=twi
+LocaleNames/es_US/ty=tahitiano
+LocaleNames/es_US/ug=uigur
+LocaleNames/es_US/uk=ucraniano
+LocaleNames/es_US/uz=uzbeko
+LocaleNames/es_US/ve=venda
+LocaleNames/es_US/wa=val\u00f3n
+LocaleNames/es_US/za=zhuang
+LocaleNames/es_US/AN=Antillas Neerlandesas
+LocaleNames/es_US/BA=Bosnia-Herzegovina
+LocaleNames/es_US/CC=Islas Cocos (Keeling)
+LocaleNames/es_US/CX=Isla Navidad
+LocaleNames/es_US/CZ=Rep\u00fablica Checa
+LocaleNames/es_US/EH=S\u00e1hara Occidental
+LocaleNames/es_US/FK=Islas Falkland (Malvinas)
+LocaleNames/es_US/HK=Hong-Kong, Regi\u00f3n administrativa especial de China
+LocaleNames/es_US/KM=Comoras
+LocaleNames/es_US/LC=Saint Lucia
+LocaleNames/es_US/LS=Lesotho
+LocaleNames/es_US/MO=Macao, Regi\u00f3n administrativa especial de China
+LocaleNames/es_US/MW=Malawi
+LocaleNames/es_US/NL=Pa\u00edses Bajos
+LocaleNames/es_US/NU=Isla Niue
+LocaleNames/es_US/PG=Pap\u00faa Nueva Guinea
+LocaleNames/es_US/PK=Pakist\u00e1n
+LocaleNames/es_US/PN=Pitcairn
+LocaleNames/es_US/PS=Territorios Palestinos
+LocaleNames/es_US/PW=Palau
+LocaleNames/es_US/RO=Ruman\u00eda
+LocaleNames/es_US/SA=Arabia Saud\u00ed
+LocaleNames/es_US/SH=Santa Elena
+LocaleNames/es_US/TF=Territorios Australes Franceses
+LocaleNames/es_US/TK=Islas Tokelau
+LocaleNames/es_US/TT=Trinidad y Tabago
+LocaleNames/es_US/VI=Islas V\u00edrgenes de los Estados Unidos
+CurrencyNames/es_US/USD=US$
+CalendarData/es_US/firstDayOfWeek=1
+#bug 4400849
+LocaleNames/pt/aa=afar
+LocaleNames/pt/ab=abkhazian
+LocaleNames/pt/ae=av\u00e9stico
+LocaleNames/pt/af=afric\u00e2ner
+LocaleNames/pt/am=am\u00e1rico
+LocaleNames/pt/an=aragon\u00eas
+LocaleNames/pt/ar=\u00e1rabe
+LocaleNames/pt/as=assam\u00eas
+LocaleNames/pt/av=avaric
+LocaleNames/pt/ay=aimara
+LocaleNames/pt/az=azerbaijano
+LocaleNames/pt/ba=bashkir
+LocaleNames/pt/be=bielo-russo
+LocaleNames/pt/bg=b\u00falgaro
+LocaleNames/pt/bh=biari
+LocaleNames/pt/bi=bislam\u00e1
+LocaleNames/pt/bm=bambara
+LocaleNames/pt/bn=bengali
+LocaleNames/pt/bo=tibetano
+LocaleNames/pt/br=bret\u00e3o
+LocaleNames/pt/bs=b\u00f3snio
+LocaleNames/pt/ca=catal\u00e3o
+LocaleNames/pt/ce=chechene
+LocaleNames/pt/ch=chamorro
+LocaleNames/pt/co=c\u00f3rsico
+LocaleNames/pt/cr=cree
+LocaleNames/pt/cs=tcheco
+LocaleNames/pt/cu=eslavo eclesi\u00e1stico
+LocaleNames/pt/cv=chuvash
+LocaleNames/pt/cy=gal\u00eas
+LocaleNames/pt/da=dinamarqu\u00eas
+LocaleNames/pt/de=alem\u00e3o
+LocaleNames/pt/dv=divehi
+LocaleNames/pt/dz=dzonga
+LocaleNames/pt/ee=eve
+LocaleNames/pt/el=grego
+LocaleNames/pt/en=ingl\u00eas
+LocaleNames/pt/eo=esperanto
+LocaleNames/pt/es=espanhol
+LocaleNames/pt/et=estoniano
+LocaleNames/pt/eu=basco
+LocaleNames/pt/fa=persa
+LocaleNames/pt/ff=fula
+LocaleNames/pt/fi=finland\u00eas
+LocaleNames/pt/fj=fijiano
+LocaleNames/pt/fo=fero\u00eas
+LocaleNames/pt/fr=franc\u00eas
+LocaleNames/pt/fy=fris\u00e3o
+LocaleNames/pt/ga=irland\u00eas
+LocaleNames/pt/gd=ga\u00e9lico escoc\u00eas
+LocaleNames/pt/gl=galego
+LocaleNames/pt/gn=guarani
+LocaleNames/pt/gu=guzerate
+LocaleNames/pt/gv=manx
+LocaleNames/pt/ha=hau\u00e7\u00e1
+LocaleNames/pt/he=hebraico
+LocaleNames/pt/hi=hindi
+LocaleNames/pt/ho=hiri motu
+LocaleNames/pt/hr=croata
+LocaleNames/pt/ht=haitiano
+LocaleNames/pt/hu=h\u00fangaro
+LocaleNames/pt/hy=arm\u00eanio
+LocaleNames/pt/hz=herero
+LocaleNames/pt/ia=interl\u00edngua
+LocaleNames/pt/id=indon\u00e9sio
+LocaleNames/pt/ie=interlingue
+LocaleNames/pt/ig=ibo
+LocaleNames/pt/ii=sichuan yi
+LocaleNames/pt/in=indon\u00e9sio
+LocaleNames/pt/io=ido
+LocaleNames/pt/is=island\u00eas
+LocaleNames/pt/it=italiano
+LocaleNames/pt/iu=inuktitut
+LocaleNames/pt/iw=hebraico
+LocaleNames/pt/ja=japon\u00eas
+LocaleNames/pt/ji=i\u00eddiche
+LocaleNames/pt/ka=georgiano
+LocaleNames/pt/kg=congol\u00eas
+LocaleNames/pt/ki=quicuio
+LocaleNames/pt/kj=Kuanyama
+LocaleNames/pt/kk=cazaque
+LocaleNames/pt/kl=groenland\u00eas
+LocaleNames/pt/km=cmer
+LocaleNames/pt/kn=canar\u00eas
+LocaleNames/pt/ko=coreano
+LocaleNames/pt/kr=can\u00fari
+LocaleNames/pt/ks=kashmiri
+LocaleNames/pt/ku=curdo
+LocaleNames/pt/kv=komi
+LocaleNames/pt/kw=c\u00f3rnico
+LocaleNames/pt/ky=quirguiz
+LocaleNames/pt/la=latim
+LocaleNames/pt/lb=luxemburgu\u00eas
+LocaleNames/pt/lg=luganda
+LocaleNames/pt/li=limburgish
+LocaleNames/pt/ln=lingala
+LocaleNames/pt/lo=laosiano
+LocaleNames/pt/lt=lituano
+LocaleNames/pt/lu=luba-catanga
+LocaleNames/pt/lv=let\u00e3o
+LocaleNames/pt/mg=malgaxe
+LocaleNames/pt/mh=marshall\u00eas
+LocaleNames/pt/mi=maori
+LocaleNames/pt/mk=maced\u00f4nio
+LocaleNames/pt/ml=malaiala
+LocaleNames/pt/mn=mongol
+LocaleNames/pt/mo=mold\u00e1vio
+LocaleNames/pt/mr=marata
+LocaleNames/pt/ms=malaio
+LocaleNames/pt/mt=malt\u00eas
+LocaleNames/pt/my=birman\u00eas
+LocaleNames/pt/na=nauruano
+LocaleNames/pt/nb=bokm\u00e5l noruegu\u00eas
+LocaleNames/pt/nd=ndebele, north
+LocaleNames/pt/ne=nepali
+LocaleNames/pt/ng=dongo
+LocaleNames/pt/nl=holand\u00eas
+LocaleNames/pt/nn=nynorsk noruegu\u00eas
+LocaleNames/pt/no=noruegu\u00eas
+LocaleNames/pt/nr=ndebele, south
+LocaleNames/pt/nv=navajo
+LocaleNames/pt/ny=nianja; chicheua; cheua
+LocaleNames/pt/oc=occit\u00e2nico (ap\u00f3s 1500); proven\u00e7al
+LocaleNames/pt/oj=ojibwa
+LocaleNames/pt/om=oromo
+LocaleNames/pt/or=oriya
+LocaleNames/pt/os=ossetic
+LocaleNames/pt/pa=panjabi
+LocaleNames/pt/pi=p\u00e1li
+LocaleNames/pt/pl=polon\u00eas
+LocaleNames/pt/ps=pashto (pushto)
+LocaleNames/pt/pt=portugu\u00eas
+LocaleNames/pt/qu=qu\u00edchua
+LocaleNames/pt/rm=rhaeto-romance
+LocaleNames/pt/rn=rundi
+LocaleNames/pt/ro=romeno
+LocaleNames/pt/ru=russo
+LocaleNames/pt/rw=kinyarwanda
+LocaleNames/pt/sa=s\u00e2nscrito
+LocaleNames/pt/sc=sardo
+LocaleNames/pt/sd=sindi
+LocaleNames/pt/se=northern sami
+LocaleNames/pt/sg=sango
+LocaleNames/pt/si=cingal\u00eas
+LocaleNames/pt/sk=eslovaco
+LocaleNames/pt/sl=eslov\u00eanio
+LocaleNames/pt/so=somali
+LocaleNames/pt/sq=alban\u00eas
+LocaleNames/pt/sr=s\u00e9rvio
+LocaleNames/pt/ss=swati
+LocaleNames/pt/st=soto, do sul
+LocaleNames/pt/su=sundan\u00eas
+LocaleNames/pt/sv=sueco
+LocaleNames/pt/sw=sua\u00edli
+LocaleNames/pt/ta=t\u00e2mil
+LocaleNames/pt/te=telugu
+LocaleNames/pt/tg=tadjique
+LocaleNames/pt/th=tailand\u00eas
+LocaleNames/pt/ti=tigr\u00ednia
+LocaleNames/pt/tk=turcomano
+LocaleNames/pt/tn=tswana
+LocaleNames/pt/to=tonga (ilhas tonga)
+LocaleNames/pt/tr=turco
+LocaleNames/pt/ts=tsonga
+LocaleNames/pt/tt=tatar
+LocaleNames/pt/tw=twi
+LocaleNames/pt/ty=taitiano
+LocaleNames/pt/ug=uighur
+LocaleNames/pt/uk=ucraniano
+LocaleNames/pt/ur=urdu
+LocaleNames/pt/uz=usbeque
+LocaleNames/pt/ve=venda
+LocaleNames/pt/vi=vietnamita
+LocaleNames/pt/vo=volapuque
+LocaleNames/pt/wa=walloon
+LocaleNames/pt/wo=uolofe
+LocaleNames/pt/xh=xosa
+LocaleNames/pt/yi=i\u00eddiche
+LocaleNames/pt/yo=ioruba
+LocaleNames/pt/za=zhuang
+LocaleNames/pt/zh=chin\u00eas
+LocaleNames/pt/zu=zulu
+LocaleNames/pt/AE=Emirados \u00c1rabes Unidos
+LocaleNames/pt/AF=Afeganist\u00e3o
+LocaleNames/pt/AG=Ant\u00edgua e Barbuda
+LocaleNames/pt/AL=Alb\u00e2nia
+LocaleNames/pt/AM=Arm\u00eania
+LocaleNames/pt/AN=Antilhas Holandesas
+LocaleNames/pt/AQ=Ant\u00e1rtida
+LocaleNames/pt/AS=Samoa Americana
+LocaleNames/pt/AT=\u00c1ustria
+LocaleNames/pt/AU=Austr\u00e1lia
+LocaleNames/pt/AZ=Azerbaij\u00e3o
+LocaleNames/pt/BA=B\u00f3snia-Herzeg\u00f3vina
+LocaleNames/pt/BE=B\u00e9lgica
+LocaleNames/pt/BF=Burquina Faso
+LocaleNames/pt/BG=Bulg\u00e1ria
+LocaleNames/pt/BH=Bareine
+LocaleNames/pt/BM=Bermudas
+LocaleNames/pt/BO=Bol\u00edvia
+LocaleNames/pt/BR=Brasil
+LocaleNames/pt/BT=But\u00e3o
+LocaleNames/pt/BV=Ilha Bouvet
+LocaleNames/pt/BW=Botsuana
+LocaleNames/pt/CA=Canad\u00e1
+LocaleNames/pt/CC=Ilhas Cocos (Keeling)
+LocaleNames/pt/CD=Congo, Rep\u00fablica Democr\u00e1tica do
+LocaleNames/pt/CF=Rep\u00fablica Centro-Africana
+LocaleNames/pt/CH=Su\u00ed\u00e7a
+LocaleNames/pt/CI=Costa do Marfim
+LocaleNames/pt/CK=Ilhas Cook
+LocaleNames/pt/CM=Rep\u00fablica dos Camar\u00f5es
+LocaleNames/pt/CO=Col\u00f4mbia
+LocaleNames/pt/CV=Cabo Verde
+LocaleNames/pt/CX=Ilhas Natal
+LocaleNames/pt/CY=Chipre
+LocaleNames/pt/CZ=Rep\u00fablica Tcheca
+LocaleNames/pt/DE=Alemanha
+LocaleNames/pt/DJ=Djibuti
+LocaleNames/pt/DK=Dinamarca
+LocaleNames/pt/DO=Rep\u00fablica Dominicana
+LocaleNames/pt/DZ=Arg\u00e9lia
+LocaleNames/pt/EC=Equador
+LocaleNames/pt/EE=Est\u00f4nia
+LocaleNames/pt/EG=Egito
+LocaleNames/pt/EH=Saara Ocidental
+LocaleNames/pt/ER=Eritr\u00e9ia
+LocaleNames/pt/ES=Espanha
+LocaleNames/pt/ET=Eti\u00f3pia
+LocaleNames/pt/FI=Finl\u00e2ndia
+LocaleNames/pt/FK=Ilhas Malvinas
+LocaleNames/pt/FM=Micron\u00e9sia, Estados Federados da
+LocaleNames/pt/FO=Ilhas Faroe
+LocaleNames/pt/FR=Fran\u00e7a
+LocaleNames/pt/GA=Gab\u00e3o
+LocaleNames/pt/GB=Reino Unido
+LocaleNames/pt/GD=Granada
+LocaleNames/pt/GE=Ge\u00f3rgia
+LocaleNames/pt/GF=Guiana Francesa
+LocaleNames/pt/GH=Gana
+LocaleNames/pt/GL=Gro\u00eanlandia
+LocaleNames/pt/GM=G\u00e2mbia
+LocaleNames/pt/GN=Guin\u00e9
+LocaleNames/pt/GP=Guadalupe
+LocaleNames/pt/GQ=Guin\u00e9 Equatorial
+LocaleNames/pt/GR=Gr\u00e9cia
+LocaleNames/pt/GS=Ge\u00f3rgia do Sul e Ilhas Sandwich do Sul
+LocaleNames/pt/GW=Guin\u00e9 Bissau
+LocaleNames/pt/GY=Guiana
+LocaleNames/pt/HK=Hong Kong, Regi\u00e3o Admin. Especial da China
+LocaleNames/pt/HM=Ilha Heard e Ilhas McDonald
+LocaleNames/pt/HR=Cro\u00e1cia
+LocaleNames/pt/HU=Hungria
+LocaleNames/pt/ID=Indon\u00e9sia
+LocaleNames/pt/IE=Irlanda
+LocaleNames/pt/IN=\u00cdndia
+LocaleNames/pt/IO=Territ\u00f3rio Brit\u00e2nico do Oceano \u00cdndico
+LocaleNames/pt/IQ=Iraque
+LocaleNames/pt/IR=Ir\u00e3
+LocaleNames/pt/IS=Isl\u00e2ndia
+LocaleNames/pt/IT=It\u00e1lia
+LocaleNames/pt/JO=Jord\u00e2nia
+LocaleNames/pt/JP=Jap\u00e3o
+LocaleNames/pt/KE=Qu\u00eania
+LocaleNames/pt/KG=Quirguist\u00e3o
+LocaleNames/pt/KH=Camboja
+LocaleNames/pt/KI=Quiribati
+LocaleNames/pt/KM=Comores
+LocaleNames/pt/KN=S\u00e3o Cristov\u00e3o e Nevis
+LocaleNames/pt/KP=Cor\u00e9ia, Norte
+LocaleNames/pt/KR=Cor\u00e9ia, Sul
+LocaleNames/pt/KY=Ilhas Caiman
+LocaleNames/pt/KZ=Casaquist\u00e3o
+LocaleNames/pt/LA=Rep\u00fablica Democr\u00e1tica Popular de Lao
+LocaleNames/pt/LB=L\u00edbano
+LocaleNames/pt/LC=Santa L\u00facia
+LocaleNames/pt/LR=Lib\u00e9ria
+LocaleNames/pt/LS=Lesoto
+LocaleNames/pt/LT=Litu\u00e2nia
+LocaleNames/pt/LU=Luxemburgo
+LocaleNames/pt/LV=Let\u00f4nia
+LocaleNames/pt/LY=L\u00edbia
+LocaleNames/pt/MA=Marrocos
+LocaleNames/pt/MC=M\u00f4naco
+LocaleNames/pt/MD=Moldova, Rep\u00fablica de
+LocaleNames/pt/MH=Ilhas Marshall
+LocaleNames/pt/MK=Maced\u00f4nia, Rep\u00fablica da
+LocaleNames/pt/MM=Mianm\u00e1
+LocaleNames/pt/MN=Mong\u00f3lia
+LocaleNames/pt/MO=Macau, Regi\u00e3o Admin. Especial da China
+LocaleNames/pt/MP=Ilhas Marianas do Norte
+LocaleNames/pt/MQ=Martinica
+LocaleNames/pt/MR=Maurit\u00e2nia
+LocaleNames/pt/MU=Maur\u00edcio
+LocaleNames/pt/MV=Maldivas
+LocaleNames/pt/MX=M\u00e9xico
+LocaleNames/pt/MY=Mal\u00e1sia
+LocaleNames/pt/MZ=Mo\u00e7ambique
+LocaleNames/pt/NA=Nam\u00edbia
+LocaleNames/pt/NC=Nova Caled\u00f4nia
+LocaleNames/pt/NE=N\u00edger
+LocaleNames/pt/NF=Ilha Norfolk
+LocaleNames/pt/NG=Nig\u00e9ria
+LocaleNames/pt/NI=Nicar\u00e1gua
+LocaleNames/pt/NL=Pa\u00edses Baixos
+LocaleNames/pt/NO=Noruega
+LocaleNames/pt/NZ=Nova Zel\u00e2ndia
+LocaleNames/pt/OM=Om\u00e3
+LocaleNames/pt/PA=Panam\u00e1
+LocaleNames/pt/PF=Polin\u00e9sia Francesa
+LocaleNames/pt/PG=Papua-Nova Guin\u00e9
+LocaleNames/pt/PH=Filipinas
+LocaleNames/pt/PK=Paquist\u00e3o
+LocaleNames/pt/PL=Pol\u00f4nia
+LocaleNames/pt/PM=Saint Pierre e Miquelon
+LocaleNames/pt/PR=Porto Rico
+LocaleNames/pt/PS=Territ\u00f3rio da Palestina
+LocaleNames/pt/PY=Paraguai
+LocaleNames/pt/QA=Catar
+LocaleNames/pt/RE=Reuni\u00e3o
+LocaleNames/pt/RO=Rom\u00eania
+LocaleNames/pt/RU=R\u00fassia
+LocaleNames/pt/RW=Ruanda
+LocaleNames/pt/SA=Ar\u00e1bia Saudita
+LocaleNames/pt/SB=Ilhas Salom\u00e3o
+LocaleNames/pt/SD=Sud\u00e3o
+LocaleNames/pt/SE=Su\u00e9cia
+LocaleNames/pt/SG=Cingapura
+LocaleNames/pt/SH=Santa Helena
+LocaleNames/pt/SI=Eslov\u00eania
+LocaleNames/pt/SJ=Svalbard e Jan Mayen
+LocaleNames/pt/SK=Eslov\u00e1quia
+LocaleNames/pt/SL=Serra Leoa
+LocaleNames/pt/SO=Som\u00e1lia
+LocaleNames/pt/ST=S\u00e3o Tom\u00e9 e Pr\u00edncipe
+LocaleNames/pt/SY=S\u00edria
+LocaleNames/pt/SZ=Suazil\u00e2ndia
+LocaleNames/pt/TC=Ilhas Turks e Caicos
+LocaleNames/pt/TD=Chade
+LocaleNames/pt/TF=Territ\u00f3rios Franceses do Sul
+LocaleNames/pt/TH=Tail\u00e2ndia
+LocaleNames/pt/TJ=Tadjiquist\u00e3o
+LocaleNames/pt/TL=Timor Leste
+LocaleNames/pt/TM=Turcomenist\u00e3o
+LocaleNames/pt/TN=Tun\u00edsia
+LocaleNames/pt/TR=Turquia
+LocaleNames/pt/TT=Trinidad e Tobago
+LocaleNames/pt/TZ=Tanz\u00e2nia
+LocaleNames/pt/UA=Ucr\u00e2nia
+LocaleNames/pt/UM=Ilhas Menores Distantes dos Estados Unidos
+LocaleNames/pt/US=Estados Unidos
+LocaleNames/pt/UY=Uruguai
+LocaleNames/pt/UZ=Uzbequist\u00e3o
+LocaleNames/pt/VA=Vaticano
+LocaleNames/pt/VC=S\u00e3o Vicente e Granadinas
+LocaleNames/pt/VG=Ilhas Virgens Brit\u00e2nicas
+LocaleNames/pt/VI=Ilhas Virgens dos EUA
+LocaleNames/pt/VN=Vietn\u00e3
+LocaleNames/pt/WF=Wallis e Futuna
+LocaleNames/pt/YE=I\u00eamen
+LocaleNames/pt/ZA=\u00c1frica do Sul
+LocaleNames/pt/ZM=Z\u00e2mbia
+LocaleNames/pt/ZW=Zimb\u00e1bwe
+# pt_PT
+LocaleNames/pt_PT/cs=checo
+LocaleNames/pt_PT/et=est\u00f3nio
+LocaleNames/pt_PT/pl=polaco
+LocaleNames/pt_PT/sl=esloveno
+LocaleNames/pt_PT/AE=Emiratos \u00c1rabes Unidos
+LocaleNames/pt_PT/AM=Arm\u00e9nia
+LocaleNames/pt_PT/AQ=Ant\u00e1rctica
+LocaleNames/pt_PT/AZ=Azerbeij\u00e3o
+LocaleNames/pt_PT/BA=B\u00f3snia-Herzegovina
+LocaleNames/pt_PT/BJ=Benim
+LocaleNames/pt_PT/BY=Bielorr\u00fassia
+LocaleNames/pt_PT/CM=Camar\u00f5es
+LocaleNames/pt_PT/CX=Ilha do Natal
+LocaleNames/pt_PT/CZ=Rep\u00fablica Checa
+LocaleNames/pt_PT/EE=Est\u00f3nia
+LocaleNames/pt_PT/EG=Egipto
+LocaleNames/pt_PT/EH=Sahara Ocidental
+LocaleNames/pt_PT/ER=Eritreia
+LocaleNames/pt_PT/FK=Ilhas Falkland
+LocaleNames/pt_PT/GL=Gronel\u00e2ndia
+LocaleNames/pt_PT/GS=Ilhas South Georgia e South Sandwich
+LocaleNames/pt_PT/GW=Guin\u00e9-Bissau
+LocaleNames/pt_PT/HK=Hong Kong - Regi\u00e3o Administrativa Especial da China
+LocaleNames/pt_PT/KE=Qu\u00e9nia
+LocaleNames/pt_PT/KG=Quirguizist\u00e3o
+LocaleNames/pt_PT/KN=Saint Kitts e Nevis
+LocaleNames/pt_PT/KP=Coreia do Norte
+LocaleNames/pt_PT/KR=Coreia do Sul
+LocaleNames/pt_PT/KY=Ilhas Caim\u00e3o
+LocaleNames/pt_PT/KZ=Cazaquist\u00e3o
+LocaleNames/pt_PT/LA=Lao, Rep\u00fablica Popular Democr\u00e1tica
+LocaleNames/pt_PT/LV=Let\u00f3nia
+LocaleNames/pt_PT/MC=M\u00f3naco
+LocaleNames/pt_PT/MD=Mold\u00e1via, Rep\u00fablica da
+LocaleNames/pt_PT/MG=Madag\u00e1scar
+LocaleNames/pt_PT/MK=Maced\u00f3nia, Rep\u00fablica da
+LocaleNames/pt_PT/MO=Macau - Regi\u00e3o Administrativa Especial da China
+LocaleNames/pt_PT/MP=Ilhas Mariana do Norte
+LocaleNames/pt_PT/MU=Maur\u00edcias
+LocaleNames/pt_PT/NC=Nova Caled\u00f3nia
+LocaleNames/pt_PT/PG=Papua Nova Guin\u00e9
+LocaleNames/pt_PT/PL=Pol\u00f3nia
+LocaleNames/pt_PT/PS=Territ\u00f3rio Palestiniano
+LocaleNames/pt_PT/RE=Reunion
+LocaleNames/pt_PT/RO=Rom\u00e9nia
+LocaleNames/pt_PT/SC=Seicheles
+LocaleNames/pt_PT/SG=Singapura
+LocaleNames/pt_PT/SI=Eslov\u00e9nia
+LocaleNames/pt_PT/SM=S\u00e3o Marino
+LocaleNames/pt_PT/TC=Ilhas Turcas e Caicos
+LocaleNames/pt_PT/TD=Tchade
+LocaleNames/pt_PT/TF=Territ\u00f3rios Franceses a Sul
+LocaleNames/pt_PT/TJ=Tajiquist\u00e3o
+LocaleNames/pt_PT/TM=Turquemenist\u00e3o
+LocaleNames/pt_PT/UM=Ilhas Minor Outlying (E.U.A)
+LocaleNames/pt_PT/UZ=Uzbaquist\u00e3o
+LocaleNames/pt_PT/VA=Santa S\u00e9 (Estado da Cidade do Vaticano)
+LocaleNames/pt_PT/VC=Saint Vincent e Grenadines
+LocaleNames/pt_PT/VG=Ilhas Virgin Brit\u00e2nicas
+LocaleNames/pt_PT/VI=Ilhas Virgin E.U.A.
+LocaleNames/pt_PT/VN=Vietname
+LocaleNames/pt_PT/YE=I\u00e9men
+#bug 6290792 Gaelic support
+LocaleNames/ga/ab=Abc\u00e1isis
+LocaleNames/ga/ae=Aiv\u00e9istis
+LocaleNames/ga/af=Afrac\u00e1inis
+LocaleNames/ga/ar=Araibis
+LocaleNames/ga/as=Asaimis
+LocaleNames/ga/az=Asarbaise\u00e1inis
+LocaleNames/ga/ba=Baisc\u00edris
+LocaleNames/ga/be=Bealar\u00faisis
+LocaleNames/ga/bg=Bulg\u00e1iris
+LocaleNames/ga/bn=Beang\u00e1lais
+LocaleNames/ga/bo=Tib\u00e9adais
+LocaleNames/ga/br=Briot\u00e1inis
+LocaleNames/ga/bs=Boisnis
+LocaleNames/ga/ca=Catal\u00f3inis
+LocaleNames/ga/ce=Sisinis
+LocaleNames/ga/co=Corsaicis
+LocaleNames/ga/cr=Cra\u00edais
+LocaleNames/ga/cs=Seicis
+LocaleNames/ga/cu=Slavais na hEaglaise
+LocaleNames/ga/cv=Suvaisis
+LocaleNames/ga/cy=Breatnais
+LocaleNames/ga/da=Danmhairgis
+LocaleNames/ga/de=Gearm\u00e1inis
+LocaleNames/ga/el=Gr\u00e9igis
+LocaleNames/ga/en=B\u00e9arla
+LocaleNames/ga/es=Sp\u00e1innis
+LocaleNames/ga/et=East\u00f3inis
+LocaleNames/ga/eu=Bascais
+LocaleNames/ga/fa=Peirsis
+LocaleNames/ga/fi=Fionnlainnis
+LocaleNames/ga/fj=Fidsis
+LocaleNames/ga/fo=Far\u00f3is
+LocaleNames/ga/fr=Fraincis
+LocaleNames/ga/fy=Freaslainnais
+LocaleNames/ga/ga=Gaeilge
+LocaleNames/ga/gd=Gaeilge na hAlban
+LocaleNames/ga/gu=G\u00faisear\u00e1itis
+LocaleNames/ga/gv=Mannainis
+LocaleNames/ga/he=Eabhrais
+LocaleNames/ga/hi=Hiond\u00fais
+LocaleNames/ga/hr=Cr\u00f3itis
+LocaleNames/ga/hu=Ung\u00e1iris
+LocaleNames/ga/hy=Airm\u00e9inis
+LocaleNames/ga/id=Indin\u00e9isis
+LocaleNames/ga/in=Indin\u00e9isis
+LocaleNames/ga/is=\u00cdoslainnais
+LocaleNames/ga/it=Iod\u00e1ilis
+LocaleNames/ga/iu=Ion\u00faitis
+LocaleNames/ga/iw=Eabhrais
+LocaleNames/ga/ja=Seap\u00e1inis
+LocaleNames/ga/ji=Gi\u00fadais
+LocaleNames/ga/jv=I\u00e1vais
+LocaleNames/ga/ka=Seoirsis
+LocaleNames/ga/kk=Casachais
+LocaleNames/ga/kn=Cannadais
+LocaleNames/ga/ko=C\u00f3ir\u00e9is
+LocaleNames/ga/ks=Caism\u00edris
+LocaleNames/ga/kw=Cornais
+LocaleNames/ga/ky=Cirgeasais
+LocaleNames/ga/la=Laidin
+LocaleNames/ga/lb=Leitseabuirgis
+LocaleNames/ga/lo=Laosais
+LocaleNames/ga/lt=Liotu\u00e1inis
+LocaleNames/ga/lv=Laitvis
+LocaleNames/ga/mg=Malag\u00e1sais
+LocaleNames/ga/mi=Maorais
+LocaleNames/ga/mk=Macad\u00f3inis
+LocaleNames/ga/ml=Mail\u00e9alaimis
+LocaleNames/ga/mn=Mong\u00f3ilis
+LocaleNames/ga/mo=Mold\u00e1ivis
+LocaleNames/ga/mr=Maraitis
+LocaleNames/ga/mt=Maltais
+LocaleNames/ga/my=Burmais
+LocaleNames/ga/na=N\u00e1r\u00fais
+LocaleNames/ga/nb=Ioruais Bokm\u00e5l
+LocaleNames/ga/ne=Neipealais
+LocaleNames/ga/nl=Ollainnais
+LocaleNames/ga/nn=Ioruais Nynorsk
+LocaleNames/ga/no=Ioruais
+LocaleNames/ga/nv=Navach\u00f3is
+LocaleNames/ga/oc=Ocat\u00e1inis (tar \u00e9is 1500); Proven\u00e7al
+LocaleNames/ga/os=\u00d3is\u00e9itis
+LocaleNames/ga/pa=Puinseaibis
+LocaleNames/ga/pl=Polainnis
+LocaleNames/ga/ps=Paisteo
+LocaleNames/ga/pt=Portaing\u00e9ilis
+LocaleNames/ga/qu=Ceatsuais
+LocaleNames/ga/ro=Rom\u00e1inis
+LocaleNames/ga/ru=R\u00faisis
+LocaleNames/ga/sa=Sanscrait
+LocaleNames/ga/sc=Saird\u00ednis
+LocaleNames/ga/sd=Sindis
+LocaleNames/ga/se=S\u00e1imis Thuaidh
+LocaleNames/ga/sk=Sl\u00f3vacais
+LocaleNames/ga/sl=Sl\u00f3v\u00e9inis
+LocaleNames/ga/sm=Sam\u00f3is
+LocaleNames/ga/so=Som\u00e1lais
+LocaleNames/ga/sq=Alb\u00e1inis
+LocaleNames/ga/sr=Seirbis
+LocaleNames/ga/sv=Sualainnis
+LocaleNames/ga/sw=Svaha\u00edlis
+LocaleNames/ga/ta=Tamailis
+LocaleNames/ga/th=T\u00e9alainnis
+LocaleNames/ga/tl=Tag\u00e1laigis
+LocaleNames/ga/tr=Tuircis
+LocaleNames/ga/tt=Tatarais
+LocaleNames/ga/ty=Taih\u00edtis
+LocaleNames/ga/uk=\u00dacr\u00e1inis
+LocaleNames/ga/ur=Urdais
+LocaleNames/ga/uz=\u00daisb\u00e9icis
+LocaleNames/ga/vi=V\u00edtneamais
+LocaleNames/ga/wa=Vall\u00fanais
+LocaleNames/ga/yi=Gi\u00fadais
+LocaleNames/ga/zh=S\u00ednis
+LocaleNames/ga/zu=S\u00fal\u00fais
+LocaleNames/ga/AD=And\u00f3ra
+LocaleNames/ga/AE=Aontas na n\u00c9im\u00edr\u00edochta\u00ed Arabacha
+LocaleNames/ga/AF=An Afganast\u00e1in
+LocaleNames/ga/AG=Antigua agus Barbuda
+LocaleNames/ga/AL=An Alb\u00e1in
+LocaleNames/ga/AM=An Airm\u00e9in
+LocaleNames/ga/AN=Antill\u00ed na h\u00cdsilt\u00edre
+LocaleNames/ga/AO=Ang\u00f3la
+LocaleNames/ga/AQ=An Antartaice
+LocaleNames/ga/AR=An Airgint\u00edn
+LocaleNames/ga/AS=Sam\u00f3 Meirice\u00e1nach
+LocaleNames/ga/AT=An Ostair
+LocaleNames/ga/AU=An Astr\u00e1il
+LocaleNames/ga/AZ=An Asarbaise\u00e1in
+LocaleNames/ga/BA=An Bhoisnia-Heirseagaiv\u00e9in
+LocaleNames/ga/BB=Barbad\u00f3s
+LocaleNames/ga/BD=An Bhanglaid\u00e9is
+LocaleNames/ga/BE=An Bheilg
+LocaleNames/ga/BF=Buirc\u00edne Fas\u00f3
+LocaleNames/ga/BG=An Bhulg\u00e1ir
+LocaleNames/ga/BH=Bair\u00e9in
+LocaleNames/ga/BI=An Bhur\u00fain
+LocaleNames/ga/BJ=Beinin
+LocaleNames/ga/BM=Beirmi\u00fada
+LocaleNames/ga/BN=Br\u00fain\u00e9
+LocaleNames/ga/BO=An Bholaiv
+LocaleNames/ga/BR=An Bhrasa\u00edl
+LocaleNames/ga/BS=Na Bah\u00e1ma\u00ed
+LocaleNames/ga/BT=An Bh\u00fat\u00e1in
+LocaleNames/ga/BV=Oile\u00e1in Bouvet
+LocaleNames/ga/BW=An Bhotsu\u00e1in
+LocaleNames/ga/BY=An Bhealar\u00fais
+LocaleNames/ga/BZ=An Bheil\u00eds
+LocaleNames/ga/CA=Ceanada
+LocaleNames/ga/CC=Oile\u00e1in Cocos (Keeling)
+LocaleNames/ga/CD=Poblacht Dhaonlathach an Chong\u00f3
+LocaleNames/ga/CF=Poblacht na hAfraice L\u00e1ir
+LocaleNames/ga/CG=An Cong\u00f3
+LocaleNames/ga/CH=An Eilv\u00e9is
+LocaleNames/ga/CI=An C\u00f3sta Eabhair
+LocaleNames/ga/CK=Oile\u00e1in Cook
+LocaleNames/ga/CL=An tSile
+LocaleNames/ga/CM=Camar\u00fan
+LocaleNames/ga/CN=An tS\u00edn
+LocaleNames/ga/CO=An Chol\u00f3im
+LocaleNames/ga/CR=C\u00f3sta R\u00edce
+LocaleNames/ga/CU=C\u00faba
+LocaleNames/ga/CV=Rinn Verde
+LocaleNames/ga/CX=Oile\u00e1n na Nollag
+LocaleNames/ga/CY=An Chipir
+LocaleNames/ga/CZ=Poblacht na Seice
+LocaleNames/ga/DE=An Ghearm\u00e1in
+LocaleNames/ga/DK=An Danmhairg
+LocaleNames/ga/DM=Doiminice
+LocaleNames/ga/DO=An Phoblacht Dhoiminiceach
+LocaleNames/ga/DZ=An Ailg\u00e9ir
+LocaleNames/ga/EC=Eacuad\u00f3r
+LocaleNames/ga/EE=An East\u00f3in
+LocaleNames/ga/EG=An \u00c9igipt
+LocaleNames/ga/EH=An Sah\u00e1ra Thiar
+LocaleNames/ga/ES=An Sp\u00e1inn
+LocaleNames/ga/ET=An Aet\u00f3ip
+LocaleNames/ga/FI=An Fhionlainn
+LocaleNames/ga/FJ=Fids\u00ed
+LocaleNames/ga/FK=Oile\u00e1in Fh\u00e1clainne
+LocaleNames/ga/FM=An Mhicrin\u00e9is
+LocaleNames/ga/FO=Oile\u00e1in Fhar\u00f3
+LocaleNames/ga/FR=An Fhrainc
+LocaleNames/ga/GA=An Ghab\u00fain
+LocaleNames/ga/GB=An R\u00edocht Aontaithe
+LocaleNames/ga/GE=An tSeoirsia
+LocaleNames/ga/GF=An Ghu\u00e1in Fhrancach
+LocaleNames/ga/GH=G\u00e1na
+LocaleNames/ga/GI=Giobr\u00e1ltar
+LocaleNames/ga/GL=An Ghraonlainn
+LocaleNames/ga/GM=An Ghaimbia
+LocaleNames/ga/GN=An Ghuine
+LocaleNames/ga/GP=Guadal\u00faip
+LocaleNames/ga/GQ=An Ghuine Mhe\u00e1nchriosach
+LocaleNames/ga/GR=An Ghr\u00e9ig
+LocaleNames/ga/GS=An tSeoirsia Theas agus Oile\u00e1in Sandwich Theas
+LocaleNames/ga/GT=Guatamala
+LocaleNames/ga/GW=An Ghuine-Bhissau
+LocaleNames/ga/GY=An Ghu\u00e1in
+LocaleNames/ga/HM=Oile\u00e1n Heard agus Oile\u00e1in McDonald
+LocaleNames/ga/HN=Hond\u00faras
+LocaleNames/ga/HR=An Chr\u00f3it
+LocaleNames/ga/HT=H\u00e1it\u00ed
+LocaleNames/ga/HU=An Ung\u00e1ir
+LocaleNames/ga/ID=An Indin\u00e9is
+LocaleNames/ga/IE=\u00c9ire
+LocaleNames/ga/IL=Iosrael
+LocaleNames/ga/IN=An India
+LocaleNames/ga/IO=Cr\u00edocha Briotanacha an Aig\u00e9in Indiagh
+LocaleNames/ga/IQ=An Iar\u00e1ic
+LocaleNames/ga/IR=An Iar\u00e1in
+LocaleNames/ga/IS=An \u00cdoslainn
+LocaleNames/ga/IT=An Iod\u00e1il
+LocaleNames/ga/JM=Iam\u00e1ice
+LocaleNames/ga/JO=An Iord\u00e1in
+LocaleNames/ga/JP=An tSeap\u00e1in
+LocaleNames/ga/KE=An Ch\u00e9inia
+LocaleNames/ga/KG=An Chirgeast\u00e1in
+LocaleNames/ga/KH=An Chamb\u00f3id
+LocaleNames/ga/KI=Cireabait\u00ed
+LocaleNames/ga/KM=Oile\u00e1in Chom\u00f3ra
+LocaleNames/ga/KN=Saint Kitts agus Nevis
+LocaleNames/ga/KP=An Ch\u00f3ir\u00e9 Thuaidh
+LocaleNames/ga/KR=An Ch\u00f3ir\u00e9 Theas
+LocaleNames/ga/KW=Cu\u00e1it
+LocaleNames/ga/KY=Oile\u00e1in Cayman
+LocaleNames/ga/KZ=An Chasacst\u00e1in
+LocaleNames/ga/LB=An Liob\u00e1in
+LocaleNames/ga/LI=Lichtinst\u00e9in
+LocaleNames/ga/LK=Sr\u00ed Lanca
+LocaleNames/ga/LR=An Lib\u00e9ir
+LocaleNames/ga/LS=Leos\u00f3ta
+LocaleNames/ga/LT=An Liotu\u00e1in
+LocaleNames/ga/LU=Lucsamburg
+LocaleNames/ga/LV=An Laitvia
+LocaleNames/ga/LY=An Libia
+LocaleNames/ga/MA=Marac\u00f3
+LocaleNames/ga/MC=Monac\u00f3
+LocaleNames/ga/MD=An Mhold\u00f3iv
+LocaleNames/ga/MH=Oile\u00e1in Marshall
+LocaleNames/ga/MK=An Mhacad\u00f3in
+LocaleNames/ga/ML=Mail\u00ed
+LocaleNames/ga/MM=Maenmar
+LocaleNames/ga/MN=An Mhong\u00f3il
+LocaleNames/ga/MP=Oile\u00e1in Mariana Thuaidh
+LocaleNames/ga/MR=An Mharat\u00e1in
+LocaleNames/ga/MS=Montsarat
+LocaleNames/ga/MT=M\u00e1lta
+LocaleNames/ga/MU=Oile\u00e1n Mhuir\u00eds
+LocaleNames/ga/MV=Mhaildiv\u00ed
+LocaleNames/ga/MW=An Mhal\u00e1iv
+LocaleNames/ga/MX=Meicsiceo
+LocaleNames/ga/MY=An Mhalaeisia
+LocaleNames/ga/MZ=M\u00f3saimb\u00edc
+LocaleNames/ga/NA=An Namaib
+LocaleNames/ga/NC=An Nua-Chalad\u00f3in
+LocaleNames/ga/NE=An N\u00edgir
+LocaleNames/ga/NF=Oile\u00e1n Norfolk
+LocaleNames/ga/NG=An Nig\u00e9ir
+LocaleNames/ga/NI=Nicearagua
+LocaleNames/ga/NL=An \u00cdsilt\u00edr
+LocaleNames/ga/NO=An Iorua
+LocaleNames/ga/NP=Neipeal
+LocaleNames/ga/NR=N\u00e1r\u00fa
+LocaleNames/ga/NZ=An Nua-Sh\u00e9alainn
+LocaleNames/ga/PE=Peiri\u00fa
+LocaleNames/ga/PF=An Pholain\u00e9is Fhrancach
+LocaleNames/ga/PG=Nua-Ghuine Phapua
+LocaleNames/ga/PH=Na hOile\u00e1in Fhilip\u00edneacha
+LocaleNames/ga/PK=An Phacast\u00e1in
+LocaleNames/ga/PL=An Pholainn
+LocaleNames/ga/PM=Saint Pierre agus Miquelon
+LocaleNames/ga/PR=Port\u00f3 R\u00edce
+LocaleNames/ga/PS=Na Cr\u00edocha Pailist\u00edneacha
+LocaleNames/ga/PT=An Phortaing\u00e9il
+LocaleNames/ga/PY=Paragua
+LocaleNames/ga/QA=Catar
+LocaleNames/ga/RE=R\u00e9union
+LocaleNames/ga/RO=An R\u00f3m\u00e1in
+LocaleNames/ga/RU=C\u00f3naidhm na R\u00faise
+LocaleNames/ga/RW=Ruanda
+LocaleNames/ga/SA=An Araib Sh\u00e1dach
+LocaleNames/ga/SB=Oile\u00e1in Solomon
+LocaleNames/ga/SC=Na S\u00e9is\u00e9il
+LocaleNames/ga/SD=An tS\u00fad\u00e1in
+LocaleNames/ga/SE=An tSualainn
+LocaleNames/ga/SG=Singeap\u00f3r
+LocaleNames/ga/SH=San H\u00e9ilin
+LocaleNames/ga/SI=An tSl\u00f3v\u00e9in
+LocaleNames/ga/SJ=Svalbard agus Jan Mayen
+LocaleNames/ga/SK=An tSl\u00f3vaic
+LocaleNames/ga/SL=Siarra Leon
+LocaleNames/ga/SM=San Mair\u00edne
+LocaleNames/ga/SN=An tSeineag\u00e1il
+LocaleNames/ga/SO=An tSom\u00e1il
+LocaleNames/ga/SR=Suranam
+LocaleNames/ga/ST=Sao Tome agus Principe
+LocaleNames/ga/SV=An tSalvad\u00f3ir
+LocaleNames/ga/SY=An tSiria
+LocaleNames/ga/SZ=An tSuasalainn
+LocaleNames/ga/TC=Oile\u00e1in Turks agus Caicos
+LocaleNames/ga/TD=Sead
+LocaleNames/ga/TF=Cr\u00edocha Francacha Theas
+LocaleNames/ga/TG=T\u00f3ga
+LocaleNames/ga/TH=An T\u00e9alainn
+LocaleNames/ga/TJ=An T\u00e1ids\u00edceast\u00e1in
+LocaleNames/ga/TK=T\u00f3cal\u00e1
+LocaleNames/ga/TL=T\u00edom\u00f3r-Leste
+LocaleNames/ga/TM=An Tuircm\u00e9anast\u00e1in
+LocaleNames/ga/TN=An T\u00fain\u00e9is
+LocaleNames/ga/TR=An Tuirc
+LocaleNames/ga/TT=Oile\u00e1in na Tr\u00edon\u00f3ide agus Tob\u00e1ga
+LocaleNames/ga/TV=Tuval\u00fa
+LocaleNames/ga/TW=An T\u00e9av\u00e1in
+LocaleNames/ga/TZ=An Tans\u00e1in
+LocaleNames/ga/UA=An \u00dacr\u00e1in
+LocaleNames/ga/UM=Mion-Oile\u00e1in Imeallacha S.A.M.
+LocaleNames/ga/US=St\u00e1it Aontaithe Mheirice\u00e1
+LocaleNames/ga/UY=Urugua
+LocaleNames/ga/UZ=\u00daisb\u00e9iceast\u00e1in
+LocaleNames/ga/VA=An Chathaoir Naofa (St\u00e1t Chathair na Vatac\u00e1ine)
+LocaleNames/ga/VC=Saint Vincent agus na Grenadines
+LocaleNames/ga/VE=Veinis\u00e9ala
+LocaleNames/ga/VG=Oile\u00e1in Bhriotanacha na Maighdean
+LocaleNames/ga/VI=Oile\u00e1in na Maighdean S.A.M.
+LocaleNames/ga/VN=V\u00edtneam
+LocaleNames/ga/VU=Vanuat\u00fa
+LocaleNames/ga/WF=Oile\u00e1in Vail\u00eds agus Fut\u00fana
+LocaleNames/ga/WS=Sam\u00f3
+LocaleNames/ga/YE=\u00c9imin
+LocaleNames/ga/ZA=An Afraic Theas
+LocaleNames/ga/ZM=An tSaimbia
+# bug #6277696
+FormatData/sr/MonthNames/0=\u0458\u0430\u043d\u0443\u0430\u0440
+FormatData/sr/MonthNames/1=\u0444\u0435\u0431\u0440\u0443\u0430\u0440
+FormatData/sr/MonthNames/2=\u043c\u0430\u0440\u0442
+FormatData/sr/MonthNames/3=\u0430\u043f\u0440\u0438\u043b
+FormatData/sr/MonthNames/4=\u043c\u0430\u0458
+FormatData/sr/MonthNames/5=\u0458\u0443\u043d
+FormatData/sr/MonthNames/6=\u0458\u0443\u043b
+FormatData/sr/MonthNames/7=\u0430\u0432\u0433\u0443\u0441\u0442
+FormatData/sr/MonthNames/8=\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440
+FormatData/sr/MonthNames/9=\u043e\u043a\u0442\u043e\u0431\u0430\u0440
+FormatData/sr/MonthNames/10=\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440
+FormatData/sr/MonthNames/11=\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440
+FormatData/sr/MonthAbbreviations/0=\u0458\u0430\u043d
+FormatData/sr/MonthAbbreviations/1=\u0444\u0435\u0431
+FormatData/sr/MonthAbbreviations/2=\u043c\u0430\u0440
+FormatData/sr/MonthAbbreviations/3=\u0430\u043f\u0440
+FormatData/sr/MonthAbbreviations/4=\u043c\u0430\u0458
+FormatData/sr/MonthAbbreviations/5=\u0458\u0443\u043d
+FormatData/sr/MonthAbbreviations/6=\u0458\u0443\u043b
+FormatData/sr/MonthAbbreviations/7=\u0430\u0432\u0433
+FormatData/sr/MonthAbbreviations/8=\u0441\u0435\u043f
+FormatData/sr/MonthAbbreviations/9=\u043e\u043a\u0442
+FormatData/sr/MonthAbbreviations/10=\u043d\u043e\u0432
+FormatData/sr/MonthAbbreviations/11=\u0434\u0435\u0446
+FormatData/sr/DayNames/0=\u043d\u0435\u0434\u0435\u0459\u0430
+FormatData/sr/DayNames/1=\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a
+FormatData/sr/DayNames/2=\u0443\u0442\u043e\u0440\u0430\u043a
+FormatData/sr/DayNames/3=\u0441\u0440\u0435\u0434\u0430
+FormatData/sr/DayNames/4=\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a
+FormatData/sr/DayNames/5=\u043f\u0435\u0442\u0430\u043a
+FormatData/sr/DayNames/6=\u0441\u0443\u0431\u043e\u0442\u0430
+FormatData/sr/DayAbbreviations/0=\u043d\u0435\u0434
+FormatData/sr/DayAbbreviations/1=\u043f\u043e\u043d
+FormatData/sr/DayAbbreviations/2=\u0443\u0442\u043e
+FormatData/sr/DayAbbreviations/3=\u0441\u0440\u0435
+FormatData/sr/DayAbbreviations/4=\u0447\u0435\u0442
+FormatData/sr/DayAbbreviations/5=\u043f\u0435\u0442
+FormatData/sr/DayAbbreviations/6=\u0441\u0443\u0431
+FormatData/sr/Eras/0=\u043f. \u043d. \u0435.
+FormatData/sr/Eras/1=\u043d. \u0435
+FormatData/sr/NumberPatterns/0=#,##0.###
+FormatData/sr/NumberPatterns/1=\u00a4 #,##0.00
+FormatData/sr/NumberPatterns/2=#,##0%
+FormatData/sr/NumberElements/0=,
+FormatData/sr/NumberElements/1=.
+FormatData/sr/NumberElements/2=;
+FormatData/sr/NumberElements/3=%
+FormatData/sr/NumberElements/4=0
+FormatData/sr/NumberElements/5=#
+FormatData/sr/NumberElements/6=-
+FormatData/sr/NumberElements/7=E
+FormatData/sr/NumberElements/8=\u2030
+FormatData/sr/NumberElements/9=\u221e
+FormatData/sr/NumberElements/10=NaN
+FormatData/sr/DateTimePatterns/0=HH.mm.ss z
+FormatData/sr/DateTimePatterns/1=HH.mm.ss z
+FormatData/sr/DateTimePatterns/2=HH.mm.ss
+FormatData/sr/DateTimePatterns/3=HH.mm
+FormatData/sr/DateTimePatterns/4=EEEE, dd.MMMM.yyyy.
+FormatData/sr/DateTimePatterns/5=dd.MM.yyyy.
+FormatData/sr/DateTimePatterns/6=dd.MM.yyyy.
+FormatData/sr/DateTimePatterns/7=d.M.yy.
+FormatData/sr/DateTimePatterns/8={1} {0}
+LocaleNames/sr/af=\u0410\u0444\u0440\u0438\u043a\u0430\u043d\u0435\u0440\u0441\u043a\u0438
+LocaleNames/sr/ar=\u0410\u0440\u0430\u043f\u0441\u043a\u0438
+LocaleNames/sr/be=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u043a\u0438
+LocaleNames/sr/bg=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0438
+LocaleNames/sr/br=\u0411\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438
+LocaleNames/sr/ca=\u041a\u0430\u0442\u0430\u043b\u043e\u043d\u0441\u043a\u0438
+LocaleNames/sr/co=\u041a\u043e\u0440\u0437\u0438\u043a\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/cs=\u0427\u0435\u0448\u043a\u0438
+LocaleNames/sr/da=\u0414\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/de=\u041d\u0435\u043c\u0430\u0447\u043a\u0438
+LocaleNames/sr/el=\u0413\u0440\u0447\u043a\u0438
+LocaleNames/sr/en=\u0415\u043d\u0433\u043b\u0435\u0441\u043a\u0438
+LocaleNames/sr/eo=\u0415\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e
+LocaleNames/sr/es=\u0428\u043f\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/et=\u0415\u0441\u0442\u043e\u043d\u0441\u043a\u0438
+LocaleNames/sr/eu=\u0411\u0430\u0441\u043a\u0438\u0458\u0441\u043a\u0438
+LocaleNames/sr/fa=\u041f\u0435\u0440\u0441\u0438\u0458\u0441\u043a\u0438
+LocaleNames/sr/fi=\u0424\u0438\u043d\u0441\u043a\u0438
+LocaleNames/sr/fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438
+LocaleNames/sr/ga=\u0418\u0440\u0441\u043a\u0438
+LocaleNames/sr/he=\u0425\u0435\u0431\u0440\u0435\u0458\u0441\u043a\u0438
+LocaleNames/sr/hi=\u0425\u0438\u043d\u0434\u0438
+LocaleNames/sr/hr=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0438
+LocaleNames/sr/hu=\u041c\u0430\u0452\u0430\u0440\u0441\u043a\u0438
+LocaleNames/sr/hy=\u0410\u0440\u043c\u0435\u043d\u0441\u043a\u0438
+LocaleNames/sr/id=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0458\u0441\u043a\u0438
+LocaleNames/sr/in=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0458\u0441\u043a\u0438
+LocaleNames/sr/is=\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438
+LocaleNames/sr/it=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/iw=\u0425\u0435\u0431\u0440\u0435\u0458\u0441\u043a\u0438
+LocaleNames/sr/ja=\u0408\u0430\u043f\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/ji=\u0408\u0438\u0434\u0438\u0448
+LocaleNames/sr/ka=\u0413\u0440\u0443\u0437\u0438\u0458\u0441\u043a\u0438
+LocaleNames/sr/km=\u041a\u043c\u0435\u0440\u0441\u043a\u0438
+LocaleNames/sr/ko=\u041a\u043e\u0440\u0435\u0458\u0441\u043a\u0438
+LocaleNames/sr/ku=\u041a\u0443\u0440\u0434\u0441\u043a\u0438
+LocaleNames/sr/ky=\u041a\u0438\u0440\u0433\u0438\u0441\u043a\u0438
+LocaleNames/sr/la=\u041b\u0430\u0442\u0438\u043d\u0441\u043a\u0438
+LocaleNames/sr/lt=\u041b\u0438\u0442\u0432\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/lv=\u041b\u0435\u0442\u043e\u043d\u0441\u043a\u0438
+LocaleNames/sr/mk=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438
+LocaleNames/sr/mn=\u041c\u043e\u043d\u0433\u043e\u043b\u0441\u043a\u0438
+LocaleNames/sr/mo=\u041c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438
+LocaleNames/sr/my=\u0411\u0443\u0440\u043c\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/nl=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438
+LocaleNames/sr/no=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0438
+LocaleNames/sr/pl=\u041f\u043e\u0459\u0441\u043a\u0438
+LocaleNames/sr/pt=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438
+LocaleNames/sr/rm=\u0420\u0435\u0442\u043e-\u0420\u043e\u043c\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/ro=\u0420\u0443\u043c\u0443\u043d\u0441\u043a\u0438
+LocaleNames/sr/ru=\u0420\u0443\u0441\u043a\u0438
+LocaleNames/sr/sa=\u0421\u0430\u043d\u0441\u043a\u0440\u0438\u0442
+LocaleNames/sr/sk=\u0421\u043b\u043e\u0432\u0430\u0447\u043a\u0438
+LocaleNames/sr/sl=\u0421\u043b\u043e\u0432\u0435\u043d\u0430\u0447\u043a\u0438
+LocaleNames/sr/sq=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438
+LocaleNames/sr/sr=\u0421\u0440\u043f\u0441\u043a\u0438
+LocaleNames/sr/sv=\u0428\u0432\u0435\u0434\u0441\u043a\u0438
+LocaleNames/sr/sw=\u0421\u0432\u0430\u0445\u0438\u043b\u0438
+LocaleNames/sr/tr=\u0422\u0443\u0440\u0441\u043a\u0438
+LocaleNames/sr/uk=\u0423\u043a\u0440\u0430\u0458\u0438\u043d\u0441\u043a\u0438
+LocaleNames/sr/vi=\u0412\u0438\u0458\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438
+LocaleNames/sr/yi=\u0408\u0438\u0434\u0438\u0448
+LocaleNames/sr/zh=\u041a\u0438\u043d\u0435\u0441\u043a\u0438
+LocaleNames/sr/AD=\u0410\u043d\u0434\u043e\u0440\u0430
+LocaleNames/sr/AE=\u0423\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u0438 \u0410\u0440\u0430\u043f\u0441\u043a\u0438 \u0415\u043c\u0438\u0440\u0430\u0442\u0438
+LocaleNames/sr/AF=\u0410\u0432\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d
+LocaleNames/sr/AL=\u0410\u043b\u0431\u0430\u043d\u0438\u0458\u0430
+LocaleNames/sr/AM=\u0410\u0440\u043c\u0435\u043d\u0438\u0458\u0430
+LocaleNames/sr/AN=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0410\u043d\u0442\u0438\u043b\u0438
+LocaleNames/sr/AO=\u0410\u043d\u0433\u043e\u043b\u0430
+LocaleNames/sr/AR=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430
+LocaleNames/sr/AT=\u0410\u0443\u0441\u0442\u0440\u0438\u0458\u0430
+LocaleNames/sr/AU=\u0410\u0443\u0441\u0442\u0440\u0430\u043b\u0438\u0458\u0430
+LocaleNames/sr/AW=\u0410\u0440\u0443\u0431\u0430
+LocaleNames/sr/AX=\u0410\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/AZ=\u0410\u0437\u0435\u0440\u0431\u0435\u0458\u045f\u0430\u043d
+LocaleNames/sr/BA=\u0411\u043e\u0441\u043d\u0430 \u0438 \u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0438\u043d\u0430
+LocaleNames/sr/BB=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441
+LocaleNames/sr/BD=\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448
+LocaleNames/sr/BE=\u0411\u0435\u043b\u0433\u0438\u0458\u0430
+LocaleNames/sr/BF=\u0411\u0443\u0440\u043a\u0438\u043d\u0430 \u0424\u0430\u0441\u043e
+LocaleNames/sr/BG=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0430
+LocaleNames/sr/BH=\u0411\u0430\u0445\u0440\u0435\u0438\u043d
+LocaleNames/sr/BI=\u0411\u0443\u0440\u0443\u043d\u0434\u0438
+LocaleNames/sr/BJ=\u0411\u0435\u043d\u0438\u043d
+LocaleNames/sr/BM=\u0411\u0435\u0440\u043c\u0443\u0434\u0430
+LocaleNames/sr/BN=\u0411\u0440\u0443\u043d\u0435\u0458
+LocaleNames/sr/BO=\u0411\u043e\u043b\u0438\u0432\u0438\u0458\u0430
+LocaleNames/sr/BR=\u0411\u0440\u0430\u0455\u0438\u043b
+LocaleNames/sr/BS=\u0411\u0430\u0445\u0430\u043c\u0438
+LocaleNames/sr/BT=\u0411\u0443\u0442\u0430\u043d
+LocaleNames/sr/BV=\u0411\u0443\u0432\u0435
+LocaleNames/sr/BW=\u0411\u043e\u0446\u0432\u0430\u043d\u0430
+LocaleNames/sr/BY=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0438\u0458\u0430
+LocaleNames/sr/BZ=\u0411\u0435\u043b\u0438\u0441\u0435
+LocaleNames/sr/CA=\u041a\u0430\u043d\u0430\u0434\u0430
+LocaleNames/sr/CC=\u041a\u043e\u043a\u043e\u0441\u043e\u0432\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/CD=\u0414\u0435\u043c\u043e\u043a\u0440\u0430\u0442\u0441\u043a\u0430 \u0440\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041a\u043e\u043d\u0433\u043e
+LocaleNames/sr/CF=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e \u0410\u0444\u0440\u0438\u0447\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
+LocaleNames/sr/CG=\u041a\u043e\u043d\u0433\u043e
+LocaleNames/sr/CH=\u0428\u0432\u0430\u0458\u0446\u0430\u0440\u0441\u043a\u0430
+LocaleNames/sr/CI=\u041e\u0431\u0430\u043b\u0430 \u0421\u043b\u043e\u043d\u043e\u0432\u0430\u0447\u0435
+LocaleNames/sr/CL=\u0427\u0438\u043b\u0435
+LocaleNames/sr/CM=\u041a\u0430\u043c\u0435\u0440\u0443\u043d
+LocaleNames/sr/CN=\u041a\u0438\u043d\u0430
+LocaleNames/sr/CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0458\u0430
+LocaleNames/sr/CR=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430
+LocaleNames/sr/CS=\u0421\u0440\u0431\u0438\u0458\u0430 \u0438 \u0426\u0440\u043d\u0430 \u0413\u043e\u0440\u0430
+LocaleNames/sr/CU=\u041a\u0443\u0431\u0430
+LocaleNames/sr/CV=\u041a\u0430\u043f\u0435 \u0412\u0435\u0440\u0434\u0435
+LocaleNames/sr/CX=\u0411\u043e\u0436\u0438\u045b\u043d\u043e \u041e\u0441\u0442\u0440\u0432\u043e
+LocaleNames/sr/CY=\u041a\u0438\u043f\u0430\u0440
+LocaleNames/sr/CZ=\u0427\u0435\u0448\u043a\u0430
+LocaleNames/sr/DE=\u041d\u0435\u043c\u0430\u0447\u043a\u0430
+LocaleNames/sr/DJ=\u040f\u0438\u0431\u0443\u0442\u0438
+LocaleNames/sr/DK=\u0414\u0430\u043d\u0441\u043a\u0430
+LocaleNames/sr/DM=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430
+LocaleNames/sr/DO=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
+LocaleNames/sr/DZ=\u0410\u043b\u0436\u0438\u0440
+LocaleNames/sr/EC=\u0415\u043a\u0432\u0430\u0434\u043e\u0440
+LocaleNames/sr/EE=\u0415\u0441\u0442\u043e\u043d\u0438\u0458\u0430
+LocaleNames/sr/EG=\u0415\u0433\u0438\u043f\u0430\u0442
+LocaleNames/sr/EH=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0421\u0430\u0445\u0430\u0440\u0430
+LocaleNames/sr/ER=\u0415\u0440\u0438\u0442\u0440\u0435\u0458\u0430
+LocaleNames/sr/ES=\u0428\u043f\u0430\u043d\u0438\u0458\u0430
+LocaleNames/sr/ET=\u0415\u0442\u0438\u043e\u043f\u0438\u0458\u0430
+LocaleNames/sr/FI=\u0424\u0438\u043d\u0441\u043a\u0430
+LocaleNames/sr/FJ=\u0424\u0438\u045f\u0438
+LocaleNames/sr/FK=\u0424\u043e\u043b\u043a\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/FM=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u0458\u0430
+LocaleNames/sr/FO=\u0424\u0430\u0440\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/FR=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430
+LocaleNames/sr/GA=\u0413\u0430\u0431\u043e\u043d
+LocaleNames/sr/GB=\u0412\u0435\u043b\u0438\u043a\u0430 \u0411\u0440\u0438\u0442\u0430\u043d\u0438\u0458\u0430
+LocaleNames/sr/GD=\u0413\u0440\u0435\u043d\u0430\u0434\u0430
+LocaleNames/sr/GE=\u0413\u0440\u0443\u0437\u0438\u0458\u0430
+LocaleNames/sr/GF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 \u0413\u0432\u0430\u0458\u0430\u043d\u0430
+LocaleNames/sr/GH=\u0413\u0430\u043d\u0430
+LocaleNames/sr/GI=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440
+LocaleNames/sr/GL=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434
+LocaleNames/sr/GM=\u0413\u0430\u043c\u0431\u0438\u0458\u0430
+LocaleNames/sr/GN=\u0413\u0432\u0438\u043d\u0435\u0458\u0430
+LocaleNames/sr/GP=\u0413\u0432\u0430\u0434\u0435\u043b\u0443\u043f\u0435
+LocaleNames/sr/GQ=\u0415\u043a\u0432\u0430\u0442\u043e\u0440\u0438\u0458\u0430\u043b\u043d\u0430 \u0413\u0432\u0438\u043d\u0435\u0458\u0430
+LocaleNames/sr/GR=\u0413\u0440\u0447\u043a\u0430
+LocaleNames/sr/GS=\u0408\u0443\u0436\u043d\u0430 \u040f\u043e\u0440\u045f\u0438\u0458\u0430 \u0438 \u0408\u0443\u0436\u043d\u0430 \u0421\u0435\u043d\u0434\u0432\u0438\u0447 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/GT=\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430
+LocaleNames/sr/GU=\u0413\u0443\u0430\u043c
+LocaleNames/sr/GW=\u0413\u0432\u0438\u043d\u0435\u0458\u0430-\u0411\u0438\u0441\u0430\u043e
+LocaleNames/sr/GY=\u0413\u0432\u0430\u0458\u0430\u043d\u0430
+LocaleNames/sr/HK=\u0425\u043e\u043d\u0433 \u041a\u043e\u043d\u0433 (\u0421. \u0410. \u0420. \u041a\u0438\u043d\u0430)
+LocaleNames/sr/HM=\u0425\u0435\u0440\u0434 \u0438 \u041c\u0435\u043a\u0434\u043e\u043d\u0430\u043b\u0434 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/HN=\u0425\u043e\u043d\u0434\u0443\u0440\u0430\u0441
+LocaleNames/sr/HR=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0430
+LocaleNames/sr/HT=\u0425\u0430\u0438\u0442\u0438
+LocaleNames/sr/HU=\u041c\u0430\u0452\u0430\u0440\u0441\u043a\u0430
+LocaleNames/sr/ID=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0458\u0430
+LocaleNames/sr/IE=\u0418\u0440\u0441\u043a\u0430
+LocaleNames/sr/IL=\u0418\u0437\u0440\u0430\u0435\u043b
+LocaleNames/sr/IN=\u0418\u043d\u0434\u0438\u0458\u0430
+LocaleNames/sr/IQ=\u0418\u0440\u0430\u043a
+LocaleNames/sr/IR=\u0418\u0440\u0430\u043d
+LocaleNames/sr/IS=\u0418\u0441\u043b\u0430\u043d\u0434
+LocaleNames/sr/IT=\u0418\u0442\u0430\u043b\u0438\u0458\u0430
+LocaleNames/sr/JM=\u0408\u0430\u043c\u0430\u0458\u043a\u0430
+LocaleNames/sr/JO=\u0408\u043e\u0440\u0434\u0430\u043d
+LocaleNames/sr/JP=\u0408\u0430\u043f\u0430\u043d
+LocaleNames/sr/KE=\u041a\u0435\u043d\u0438\u0458\u0430
+LocaleNames/sr/KG=\u041a\u0438\u0440\u0433\u0438\u0437\u0441\u0442\u0430\u043d
+LocaleNames/sr/KH=\u041a\u0430\u043c\u0431\u043e\u045f\u0430
+LocaleNames/sr/KI=\u041a\u0438\u0440\u0438\u0431\u0430\u0442\u0438
+LocaleNames/sr/KM=\u041a\u043e\u043c\u043e\u0440\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/KN=\u0421\u0435\u043d\u0442 \u041a\u0438\u0442\u0441 \u0438 \u041d\u0435\u0432\u0438\u0441
+LocaleNames/sr/KP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430
+LocaleNames/sr/KR=\u0408\u0443\u0436\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430
+LocaleNames/sr/KW=\u041a\u0443\u0432\u0430\u0458\u0442
+LocaleNames/sr/KY=\u041a\u0430\u0458\u043c\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/KZ=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d
+LocaleNames/sr/LA=\u041b\u0430\u043e\u0441
+LocaleNames/sr/LB=\u041b\u0438\u0431\u0430\u043d
+LocaleNames/sr/LC=\u0421\u0435\u043d\u0442 \u041b\u0443\u0446\u0438\u0458\u0430
+LocaleNames/sr/LI=\u041b\u0438\u0445\u0442\u0435\u043d\u0448\u0442\u0430\u0458\u043d
+LocaleNames/sr/LK=\u0428\u0440\u0438 \u041b\u0430\u043d\u043a\u0430
+LocaleNames/sr/LR=\u041b\u0438\u0431\u0435\u0440\u0438\u0458\u0430
+LocaleNames/sr/LS=\u041b\u0435\u0441\u043e\u0442\u043e
+LocaleNames/sr/LT=\u041b\u0438\u0442\u0432\u0430\u043d\u0438\u0458\u0430
+LocaleNames/sr/LU=\u041b\u0443\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433
+LocaleNames/sr/LV=\u041b\u0435\u0442\u043e\u043d\u0438\u0458\u0430
+LocaleNames/sr/LY=\u041b\u0438\u0431\u0438\u0458\u0430
+LocaleNames/sr/MA=\u041c\u0430\u0440\u043e\u043a\u043e
+LocaleNames/sr/MC=\u041c\u043e\u043d\u0430\u043a\u043e
+LocaleNames/sr/MD=\u041c\u043e\u043b\u0434\u0430\u0432\u0438\u0458\u0430
+LocaleNames/sr/MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440
+LocaleNames/sr/MH=\u041c\u0430\u0440\u0448\u0430\u043b\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/MK=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u0458\u0430
+LocaleNames/sr/ML=\u041c\u0430\u043b\u0438
+LocaleNames/sr/MM=\u041c\u0438\u0458\u0430\u043d\u043c\u0430\u0440
+LocaleNames/sr/MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u0458\u0430
+LocaleNames/sr/MO=\u041c\u0430\u043a\u0430\u043e (\u0421. \u0410. \u0420. \u041a\u0438\u043d\u0430)
+LocaleNames/sr/MP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041c\u0430\u0440\u0438\u0458\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/MQ=\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a
+LocaleNames/sr/MR=\u041c\u0430\u0443\u0440\u0438\u0442\u0430\u043d\u0438\u0458\u0430
+LocaleNames/sr/MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0430\u0442
+LocaleNames/sr/MT=\u041c\u0430\u043b\u0442\u0430
+LocaleNames/sr/MU=\u041c\u0430\u0443\u0440\u0438\u0446\u0438\u0458\u0443\u0441
+LocaleNames/sr/MV=\u041c\u0430\u043b\u0434\u0438\u0432\u0438
+LocaleNames/sr/MW=\u041c\u0430\u043b\u0430\u0432\u0438
+LocaleNames/sr/MX=\u041c\u0435\u043a\u0441\u0438\u043a\u043e
+LocaleNames/sr/MY=\u041c\u0430\u043b\u0435\u0437\u0438\u0458\u0430
+LocaleNames/sr/MZ=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a
+LocaleNames/sr/NA=\u041d\u0430\u043c\u0438\u0431\u0438\u0458\u0430
+LocaleNames/sr/NC=\u041d\u043e\u0432\u0430 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438\u0458\u0430
+LocaleNames/sr/NE=\u041d\u0438\u0433\u0435\u0440
+LocaleNames/sr/NF=\u041d\u043e\u0440\u0444\u043e\u043b\u043a \u041e\u0441\u0442\u0440\u0432\u043e
+LocaleNames/sr/NG=\u041d\u0438\u0433\u0435\u0440\u0438\u0458\u0430
+LocaleNames/sr/NI=\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0432\u0430
+LocaleNames/sr/NL=\u0425\u043e\u043b\u0430\u043d\u0434\u0438\u0458\u0430
+LocaleNames/sr/NO=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0430
+LocaleNames/sr/NP=\u041d\u0435\u043f\u0430\u043b
+LocaleNames/sr/NR=\u041d\u0430\u0443\u0440\u0443
+LocaleNames/sr/NU=\u041d\u0438\u0443\u0435
+LocaleNames/sr/NZ=\u041d\u043e\u0432\u0438 \u0417\u0435\u043b\u0430\u043d\u0434
+LocaleNames/sr/OM=\u041e\u043c\u0430\u043d
+LocaleNames/sr/PA=\u041f\u0430\u043d\u0430\u043c\u0430
+LocaleNames/sr/PE=\u041f\u0435\u0440\u0443
+LocaleNames/sr/PF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 \u041f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u0458\u0430
+LocaleNames/sr/PG=\u041f\u0430\u043f\u0443\u0430 \u041d\u043e\u0432\u0430 \u0413\u0432\u0438\u043d\u0435\u0458\u0430
+LocaleNames/sr/PH=\u0424\u0438\u043b\u0438\u043f\u0438\u043d\u0438
+LocaleNames/sr/PK=\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d
+LocaleNames/sr/PL=\u041f\u043e\u0459\u0441\u043a\u0430
+LocaleNames/sr/PM=\u0421\u0435\u043d \u041f\u0458\u0435\u0440 \u0438 \u041c\u0438\u043a\u0435\u043b\u043e\u043d
+LocaleNames/sr/PN=\u041f\u0438\u0442\u043a\u0435\u0440\u043d
+LocaleNames/sr/PR=\u041f\u043e\u0440\u0442\u043e \u0420\u0438\u043a\u043e
+LocaleNames/sr/PS=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0430 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0458\u0430
+LocaleNames/sr/PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b
+LocaleNames/sr/PW=\u041f\u0430\u043b\u0430\u0443
+LocaleNames/sr/PY=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0458
+LocaleNames/sr/QA=\u041a\u0430\u0442\u0430\u0440
+LocaleNames/sr/RE=\u0420\u0435\u0438\u043d\u0438\u043e\u043d
+LocaleNames/sr/RO=\u0420\u0443\u043c\u0443\u043d\u0438\u0458\u0430
+LocaleNames/sr/RU=\u0420\u0443\u0441\u0438\u0458\u0430
+LocaleNames/sr/RW=\u0420\u0443\u0430\u043d\u0434\u0430
+LocaleNames/sr/SA=\u0421\u0430\u0443\u0434\u0438\u0458\u0441\u043a\u0430 \u0410\u0440\u0430\u0431\u0438\u0458\u0430
+LocaleNames/sr/SB=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/SC=\u0421\u0435\u0458\u0448\u0435\u043b\u0438
+LocaleNames/sr/SD=\u0421\u0443\u0434\u0430\u043d
+LocaleNames/sr/SE=\u0428\u0432\u0435\u0434\u0441\u043a\u0430
+LocaleNames/sr/SG=\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440
+LocaleNames/sr/SH=\u0421\u0432\u0435\u0442\u0430 \u0408\u0435\u043b\u0435\u043d\u0430
+LocaleNames/sr/SI=\u0421\u043b\u043e\u0432\u0435\u043d\u0438\u0458\u0430
+LocaleNames/sr/SJ=\u0421\u0432\u0430\u043b\u0431\u0430\u0440\u0434 \u0438 \u0408\u0430\u043d\u043c\u0430\u0458\u0435\u043d \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/SK=\u0421\u043b\u043e\u0432\u0430\u0447\u043a\u0430
+LocaleNames/sr/SL=\u0421\u0438\u0458\u0435\u0440\u0430 \u041b\u0435\u043e\u043d\u0435
+LocaleNames/sr/SM=\u0421\u0430\u043d \u041c\u0430\u0440\u0438\u043d\u043e
+LocaleNames/sr/SN=\u0421\u0435\u043d\u0435\u0433\u0430\u043b
+LocaleNames/sr/SO=\u0421\u043e\u043c\u0430\u043b\u0438\u0458\u0430
+LocaleNames/sr/SR=\u0421\u0443\u0440\u0438\u043d\u0430\u043c
+LocaleNames/sr/ST=\u0421\u0430\u043e \u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0438
+LocaleNames/sr/SV=\u0421\u0430\u043b\u0432\u0430\u0434\u043e\u0440
+LocaleNames/sr/SY=\u0421\u0438\u0440\u0438\u0458\u0430
+LocaleNames/sr/SZ=\u0421\u0432\u0430\u0437\u0438\u043b\u0435\u043d\u0434
+LocaleNames/sr/TC=\u0422\u0443\u0440\u043a\u0441 \u0438 \u041a\u0430\u0458\u043a\u043e\u0441 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/TD=\u0427\u0430\u0434
+LocaleNames/sr/TF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0435 \u0408\u0443\u0436\u043d\u0435 \u0422\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0458\u0435
+LocaleNames/sr/TG=\u0422\u043e\u0433\u043e
+LocaleNames/sr/TH=\u0422\u0430\u0458\u043b\u0430\u043d\u0434
+LocaleNames/sr/TJ=\u0422\u0430\u045f\u0438\u043a\u0438\u0441\u0442\u0430\u043d
+LocaleNames/sr/TK=\u0422\u043e\u043a\u0435\u043b\u0430\u0443
+LocaleNames/sr/TL=\u0422\u0438\u043c\u043e\u0440-\u041b\u0435\u0441\u0442\u0435
+LocaleNames/sr/TM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u0430\u043d
+LocaleNames/sr/TN=\u0422\u0443\u043d\u0438\u0441
+LocaleNames/sr/TO=\u0422\u043e\u043d\u0433\u0430
+LocaleNames/sr/TR=\u0422\u0443\u0440\u0441\u043a\u0430
+LocaleNames/sr/TT=\u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0434 \u0438 \u0422\u043e\u0431\u0430\u0433\u043e
+LocaleNames/sr/TV=\u0422\u0443\u0432\u0430\u043b\u0443
+LocaleNames/sr/TW=\u0422\u0430\u0458\u0432\u0430\u043d
+LocaleNames/sr/TZ=\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u0458\u0430
+LocaleNames/sr/UA=\u0423\u043a\u0440\u0430\u0458\u0438\u043d\u0430
+LocaleNames/sr/UG=\u0423\u0433\u0430\u043d\u0434\u0430
+LocaleNames/sr/UM=\u041c\u0430\u045a\u0430 \u0443\u0434\u0430\u0459\u0435\u043d\u0430 \u043e\u0441\u0442\u0440\u0432\u0430 \u0421\u0410\u0414
+LocaleNames/sr/US=\u0421\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u0435 \u0410\u043c\u0435\u0440\u0438\u0447\u043a\u0435 \u0414\u0440\u0436\u0430\u0432\u0435
+LocaleNames/sr/UY=\u0423\u0440\u0443\u0433\u0432\u0430\u0458
+LocaleNames/sr/UZ=\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d
+LocaleNames/sr/VA=\u0412\u0430\u0442\u0438\u043a\u0430\u043d
+LocaleNames/sr/VC=\u0421\u0435\u043d\u0442 \u0412\u0438\u043d\u0441\u0435\u043d\u0442 \u0438 \u0413\u0440\u0435\u043d\u0430\u0434\u0438\u043d\u0438
+LocaleNames/sr/VE=\u0412\u0435\u043d\u0435\u0446\u0443\u0435\u043b\u0430
+LocaleNames/sr/VG=\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430 \u0414\u0435\u0432\u0438\u0447\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/VI=\u0421.\u0410.\u0414. \u0414\u0435\u0432\u0438\u0447\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/VN=\u0412\u0438\u0458\u0435\u0442\u043d\u0430\u043c
+LocaleNames/sr/VU=\u0412\u0430\u043d\u0443\u0430\u0442\u0443
+LocaleNames/sr/WF=\u0412\u0430\u043b\u0438\u0441 \u0438 \u0424\u0443\u0442\u0443\u043d\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
+LocaleNames/sr/WS=\u0421\u0430\u043c\u043e\u0430
+LocaleNames/sr/YE=\u0408\u0435\u043c\u0435\u043d
+LocaleNames/sr/YT=\u041c\u0430\u0458\u043e\u0442\u0435
+LocaleNames/sr/ZM=\u0417\u0430\u043c\u0431\u0438\u0458\u0430
+LocaleNames/sr/ZW=\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0435
+CalendarData/sr/firstDayOfWeek=2
+CurrencyNames/sr_CS/EUR=\u20ac
+# bug 6498742: data is changed
+CurrencyNames/sr_BA/BAM=\u041a\u041c.
+
+CurrencyNames/sr_BA/EUR=\u20ac
+
+# bug #6351682 Country name for Korean is wrong in Simplified Chinese
+LocaleNames/zh/KP=\u671d\u9c9c
+LocaleNames/zh/KR=\u97e9\u56fd
+
+# bug 6379382: Finnish time of day should be formatted as "H.mm.ss", not "hh:mm:ss"
+FormatData/fi/DateTimePatterns/0=H.mm.ss z
+FormatData/fi/DateTimePatterns/1='klo 'H.mm.ss
+
+# bug 6455680 Update locale data derived from CLDR1.3 to CLDR1.4
+LocaleNames/pt/CS=S\u00e9rvia e Montenegro
+
+# bug 6498742: data for IR & ZW changed
+LocaleNames/pt_PT/IR=Ir\u00e3
+LocaleNames/pt_PT/ZW=Zimb\u00e1bwe
+
+LocaleNames/el/ar=\u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac
+LocaleNames/el/be=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03b9\u03ba\u03ac
+LocaleNames/el/bg=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03b9\u03ba\u03ac
+LocaleNames/el/bn=\u039c\u03c0\u03b5\u03bd\u03b3\u03ba\u03ac\u03bb\u03b9
+LocaleNames/el/bo=\u0398\u03b9\u03b2\u03b5\u03c4\u03b9\u03b1\u03bd\u03ac
+LocaleNames/el/bs=\u0392\u03bf\u03c3\u03bd\u03b9\u03b1\u03ba\u03ac
+LocaleNames/el/ca=\u039a\u03b1\u03c4\u03b1\u03bb\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/co=\u039a\u03bf\u03c1\u03c3\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/cs=\u03a4\u03c3\u03b5\u03c7\u03b9\u03ba\u03ac
+LocaleNames/el/cy=\u039f\u03c5\u03b1\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el/da=\u0394\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/de=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/el=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/en=\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el/es=\u0399\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/et=\u0395\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/eu=\u0392\u03b1\u03c3\u03ba\u03b9\u03ba\u03ac
+LocaleNames/el/fa=\u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac
+LocaleNames/el/fi=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el/fr=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el/ga=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el/gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u03ac \u039a\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac
+LocaleNames/el/he=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el/hi=\u03a7\u03af\u03bd\u03c4\u03b9
+LocaleNames/el/hr=\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac
+LocaleNames/el/hu=\u039f\u03c5\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac
+LocaleNames/el/hy=\u0391\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/id=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac
+LocaleNames/el/in=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac
+LocaleNames/el/is=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el/it=\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el/iw=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el/ja=\u0399\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/ji=\u0399\u03bf\u03c5\u03b4\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el/ka=\u0393\u03b5\u03c9\u03c1\u03b3\u03b9\u03b1\u03bd\u03ac
+LocaleNames/el/ko=\u039a\u03bf\u03c1\u03b5\u03b1\u03c4\u03b9\u03ba\u03ac
+LocaleNames/el/la=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/lt=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/lv=\u039b\u03b5\u03c4\u03bf\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/mk=\u03a3\u03bb\u03b1\u03b2\u03bf\u03bc\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/mn=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el/mo=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03b9\u03ba\u03ac
+LocaleNames/el/mt=\u039c\u03b1\u03bb\u03c4\u03b5\u03b6\u03b9\u03ba\u03ac
+LocaleNames/el/no=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac
+LocaleNames/el/pl=\u03a0\u03bf\u03bb\u03c9\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/pt=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac
+LocaleNames/el/ro=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/ru=\u03a1\u03c9\u03c3\u03b9\u03ba\u03ac
+LocaleNames/el/sk=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03b9\u03ba\u03ac
+LocaleNames/el/sl=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/sq=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/sr=\u03a3\u03b5\u03c1\u03b2\u03b9\u03ba\u03ac
+LocaleNames/el/sv=\u03a3\u03bf\u03c5\u03b7\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el/th=\u03a4\u03b1\u03ca\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+LocaleNames/el/tr=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac
+LocaleNames/el/uk=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac
+LocaleNames/el/vi=\u0392\u03b9\u03b5\u03c4\u03bd\u03b1\u03bc\u03b5\u03b6\u03b9\u03ba\u03ac
+LocaleNames/el/yi=\u0399\u03bf\u03c5\u03b4\u03b1\u03ca\u03ba\u03ac
+LocaleNames/el/zh=\u039a\u03b9\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac
+LocaleNames/el/AD=\u0391\u03bd\u03b4\u03cc\u03c1\u03b1
+LocaleNames/el/AE=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1
+LocaleNames/el/AF=\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el/AG=\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1
+LocaleNames/el/AI=\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1
+LocaleNames/el/AL=\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/AM=\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1
+LocaleNames/el/AN=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ad\u03c2 \u0391\u03bd\u03c4\u03af\u03bb\u03bb\u03b5\u03c2
+LocaleNames/el/AO=\u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1
+LocaleNames/el/AQ=\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae
+LocaleNames/el/AR=\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae
+LocaleNames/el/AS=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1
+LocaleNames/el/AT=\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1
+LocaleNames/el/AU=\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1
+LocaleNames/el/AW=\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1
+LocaleNames/el/AX=\u039d\u03ae\u03c3\u03bf\u03b9 Aland
+LocaleNames/el/AZ=\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd
+LocaleNames/el/BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7
+LocaleNames/el/BB=\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ac\u03bd\u03c4\u03bf\u03c2
+LocaleNames/el/BD=\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2
+LocaleNames/el/BE=\u0392\u03ad\u03bb\u03b3\u03b9\u03bf
+LocaleNames/el/BF=\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf
+LocaleNames/el/BG=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1
+LocaleNames/el/BH=\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd
+LocaleNames/el/BI=\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9
+LocaleNames/el/BJ=\u039c\u03c0\u03ad\u03bd\u03b9\u03bd
+LocaleNames/el/BM=\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2
+LocaleNames/el/BN=\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9 \u039d\u03c4\u03b1\u03c1\u03bf\u03c5\u03c3\u03b1\u03bb\u03ac\u03bc
+LocaleNames/el/BO=\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1
+LocaleNames/el/BR=\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1
+LocaleNames/el/BS=\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2
+LocaleNames/el/BT=\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd
+LocaleNames/el/BV=\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad
+LocaleNames/el/BW=\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1
+LocaleNames/el/BY=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1
+LocaleNames/el/BZ=\u039c\u03c0\u03b5\u03bb\u03af\u03b6
+LocaleNames/el/CA=\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2
+LocaleNames/el/CC=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03ae\u03bb\u03b9\u03bd\u03b3\u03ba)
+LocaleNames/el/CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc, \u039b\u03b1\u03ca\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u03c5
+LocaleNames/el/CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
+LocaleNames/el/CG=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc
+LocaleNames/el/CH=\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1
+LocaleNames/el/CI=\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03cc\u03b4\u03bf\u03bd\u03c4\u03bf\u03c2
+LocaleNames/el/CK=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba
+LocaleNames/el/CL=\u03a7\u03b9\u03bb\u03ae
+LocaleNames/el/CM=\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd
+LocaleNames/el/CN=\u039a\u03af\u03bd\u03b1
+LocaleNames/el/CO=\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1
+LocaleNames/el/CR=\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1
+LocaleNames/el/CS=\u03a3\u03b5\u03c1\u03b2\u03af\u03b1 \u03ba\u03b1\u03b9 \u039c\u03b1\u03c5\u03c1\u03bf\u03b2\u03bf\u03cd\u03bd\u03b9\u03bf
+LocaleNames/el/CU=\u039a\u03bf\u03cd\u03b2\u03b1
+LocaleNames/el/CV=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf\u03c5 \u0391\u03ba\u03c1\u03c9\u03c4\u03b7\u03c1\u03af\u03bf\u03c5
+LocaleNames/el/CX=\u039d\u03ae\u03c3\u03bf\u03c2 \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd
+LocaleNames/el/CY=\u039a\u03cd\u03c0\u03c1\u03bf\u03c2
+LocaleNames/el/CZ=\u03a4\u03c3\u03b5\u03c7\u03af\u03b1
+LocaleNames/el/DE=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/DJ=\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af
+LocaleNames/el/DK=\u0394\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/DM=\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1
+LocaleNames/el/DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
+LocaleNames/el/DZ=\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1
+LocaleNames/el/EC=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2
+LocaleNames/el/EE=\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1
+LocaleNames/el/EG=\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2
+LocaleNames/el/EH=\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1
+LocaleNames/el/ER=\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1
+LocaleNames/el/ES=\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/ET=\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1
+LocaleNames/el/FI=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el/FJ=\u03a6\u03af\u03c4\u03b6\u03b9
+LocaleNames/el/FK=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03ce\u03ba\u03bb\u03b1\u03bd\u03c4
+LocaleNames/el/FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1, \u039f\u03bc\u03cc\u03c3\u03c0\u03bf\u03bd\u03b4\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2 \u03c4\u03b7\u03c2
+LocaleNames/el/FO=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2
+LocaleNames/el/FR=\u0393\u03b1\u03bb\u03bb\u03af\u03b1
+LocaleNames/el/GA=\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd
+LocaleNames/el/GB=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf
+LocaleNames/el/GD=\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1
+LocaleNames/el/GE=\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1
+LocaleNames/el/GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1
+LocaleNames/el/GH=\u0393\u03ba\u03ac\u03bd\u03b1
+LocaleNames/el/GI=\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1
+LocaleNames/el/GL=\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el/GM=\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1
+LocaleNames/el/GN=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
+LocaleNames/el/GP=\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7
+LocaleNames/el/GQ=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
+LocaleNames/el/GS=\u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2
+LocaleNames/el/GT=\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1
+LocaleNames/el/GU=\u0393\u03ba\u03bf\u03c5\u03ac\u03bc
+LocaleNames/el/GW=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1-\u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5
+LocaleNames/el/GY=\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1
+LocaleNames/el/HK=\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba, \u0395\u03b9\u03b4\u03b9\u03ba\u03ae \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u03ae \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u03b7\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
+LocaleNames/el/HM=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4
+LocaleNames/el/HN=\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1
+LocaleNames/el/HR=\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1
+LocaleNames/el/HT=\u0391\u03ca\u03c4\u03ae
+LocaleNames/el/HU=\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1
+LocaleNames/el/ID=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1
+LocaleNames/el/IE=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el/IL=\u0399\u03c3\u03c1\u03b1\u03ae\u03bb
+LocaleNames/el/IN=\u0399\u03bd\u03b4\u03af\u03b1
+LocaleNames/el/IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0388\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd
+LocaleNames/el/IQ=\u0399\u03c1\u03ac\u03ba
+LocaleNames/el/IR=\u0399\u03c1\u03ac\u03bd, \u0399\u03c3\u03bb\u03b1\u03bc\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u03c5
+LocaleNames/el/IS=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el/IT=\u0399\u03c4\u03b1\u03bb\u03af\u03b1
+LocaleNames/el/JM=\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1
+LocaleNames/el/JO=\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/JP=\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1
+LocaleNames/el/KE=\u039a\u03ad\u03bd\u03c5\u03b1
+LocaleNames/el/KG=\u039a\u03b9\u03c1\u03b3\u03b9\u03b6\u03af\u03b1
+LocaleNames/el/KH=\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7
+LocaleNames/el/KI=\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9
+LocaleNames/el/KM=\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2
+LocaleNames/el/KN=\u03a3\u03b1\u03b9\u03bd\u03c4 \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2
+LocaleNames/el/KP=\u039a\u03bf\u03c1\u03ad\u03b1, \u0392\u03cc\u03c1\u03b5\u03b9\u03b1
+LocaleNames/el/KR=\u039a\u03bf\u03c1\u03ad\u03b1, \u039d\u03cc\u03c4\u03b9\u03b1
+LocaleNames/el/KW=\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4
+LocaleNames/el/KY=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd
+LocaleNames/el/KZ=\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el/LA=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ae \u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03ae
+LocaleNames/el/LB=\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2
+LocaleNames/el/LC=\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1
+LocaleNames/el/LI=\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd
+LocaleNames/el/LK=\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1
+LocaleNames/el/LR=\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1
+LocaleNames/el/LS=\u039b\u03b5\u03c3\u03cc\u03c4\u03bf
+LocaleNames/el/LT=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf
+LocaleNames/el/LV=\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1
+LocaleNames/el/LY=\u039b\u03b9\u03b2\u03cd\u03b7
+LocaleNames/el/MA=\u039c\u03b1\u03c1\u03cc\u03ba\u03bf
+LocaleNames/el/MC=\u039c\u03bf\u03bd\u03b1\u03ba\u03cc
+LocaleNames/el/MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1, \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03b7\u03c2
+LocaleNames/el/MG=\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7
+LocaleNames/el/MH=\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb
+LocaleNames/el/MK=\u03a0\u0393\u0394 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1\u03c2
+LocaleNames/el/ML=\u039c\u03ac\u03bb\u03b9
+LocaleNames/el/MM=\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1
+LocaleNames/el/MN=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1
+LocaleNames/el/MO=\u039c\u03b1\u03ba\u03ac\u03bf, \u0395\u03b9\u03b4\u03b9\u03ba\u03ae \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u03ae \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u03b7\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
+LocaleNames/el/MP=\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2
+LocaleNames/el/MQ=\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1
+LocaleNames/el/MR=\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/MS=\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4
+LocaleNames/el/MT=\u039c\u03ac\u03bb\u03c4\u03b1
+LocaleNames/el/MU=\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2
+LocaleNames/el/MV=\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2
+LocaleNames/el/MW=\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9
+LocaleNames/el/MX=\u039c\u03b5\u03be\u03b9\u03ba\u03cc
+LocaleNames/el/MY=\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1
+LocaleNames/el/MZ=\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7
+LocaleNames/el/NA=\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1
+LocaleNames/el/NC=\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1
+LocaleNames/el/NE=\u039d\u03af\u03b3\u03b7\u03c1
+LocaleNames/el/NF=\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba
+LocaleNames/el/NG=\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1
+LocaleNames/el/NI=\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1
+LocaleNames/el/NL=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el/NO=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1
+LocaleNames/el/NP=\u039d\u03b5\u03c0\u03ac\u03bb
+LocaleNames/el/NR=\u039d\u03b1\u03bf\u03cd\u03c1\u03bf\u03c5
+LocaleNames/el/NU=\u039d\u03b9\u03bf\u03cd\u03b5
+LocaleNames/el/NZ=\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+LocaleNames/el/OM=\u039f\u03bc\u03ac\u03bd
+LocaleNames/el/PA=\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2
+LocaleNames/el/PE=\u03a0\u03b5\u03c1\u03bf\u03cd
+LocaleNames/el/PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1
+LocaleNames/el/PG=\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 - \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
+LocaleNames/el/PH=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2
+LocaleNames/el/PK=\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el/PL=\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1
+LocaleNames/el/PM=\u03a3\u03b1\u03b9\u03bd\u03c4 \u03a0\u03b9\u03ad\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd
+LocaleNames/el/PN=\u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd
+LocaleNames/el/PR=\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf
+LocaleNames/el/PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7
+LocaleNames/el/PT=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1
+LocaleNames/el/PW=\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5
+LocaleNames/el/PY=\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7
+LocaleNames/el/QA=\u039a\u03b1\u03c4\u03ac\u03c1
+LocaleNames/el/RE=\u03a1\u03b5\u03cb\u03bd\u03b9\u03cc\u03bd
+LocaleNames/el/RO=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/RU=\u03a1\u03c9\u03c3\u03af\u03b1
+LocaleNames/el/RW=\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1
+LocaleNames/el/SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1
+LocaleNames/el/SB=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2
+LocaleNames/el/SC=\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2
+LocaleNames/el/SD=\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd
+LocaleNames/el/SE=\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1
+LocaleNames/el/SG=\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7
+LocaleNames/el/SH=\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7
+LocaleNames/el/SI=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1
+LocaleNames/el/SJ=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd
+LocaleNames/el/SK=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1
+LocaleNames/el/SL=\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5
+LocaleNames/el/SM=\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2
+LocaleNames/el/SN=\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7
+LocaleNames/el/SO=\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1
+LocaleNames/el/SR=\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc
+LocaleNames/el/ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5
+LocaleNames/el/SV=\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1
+LocaleNames/el/SY=\u03a3\u03c5\u03c1\u03af\u03b1, \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03b7\u03c2
+LocaleNames/el/SZ=\u03a3\u03bf\u03c5\u03b1\u03b6\u03b9\u03bb\u03ac\u03bd\u03b4\u03b7
+LocaleNames/el/TC=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2
+LocaleNames/el/TD=\u03a4\u03c3\u03b1\u03bd\u03c4
+LocaleNames/el/TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7
+LocaleNames/el/TG=\u03a4\u03cc\u03b3\u03ba\u03bf
+LocaleNames/el/TH=\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7
+LocaleNames/el/TJ=\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el/TK=\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5
+LocaleNames/el/TL=\u0391\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u03cc \u03a4\u03b9\u03bc\u03cc\u03c1
+LocaleNames/el/TM=\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el/TN=\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1
+LocaleNames/el/TO=\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1
+LocaleNames/el/TR=\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1
+LocaleNames/el/TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03b4\u03ac\u03b4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf
+LocaleNames/el/TV=\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd
+LocaleNames/el/TW=\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd
+LocaleNames/el/TZ=\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/UA=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1
+LocaleNames/el/UG=\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1
+LocaleNames/el/UM=\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u03c4\u03c9\u03bd \u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03b9\u03ce\u03bd
+LocaleNames/el/US=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2
+LocaleNames/el/UY=\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7
+LocaleNames/el/UZ=\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+LocaleNames/el/VA=\u0391\u03b3\u03af\u03b1 \u0388\u03b4\u03c1\u03b1 (\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc)
+LocaleNames/el/VC=\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2
+LocaleNames/el/VE=\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1
+LocaleNames/el/VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9
+LocaleNames/el/VI=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9
+LocaleNames/el/VN=\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
+LocaleNames/el/VU=\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5
+LocaleNames/el/WF=\u039d\u03ae\u03c3\u03bf\u03b9 \u039f\u03c5\u03b1\u03bb\u03bb\u03af\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03c5\u03bd\u03ac
+LocaleNames/el/WS=\u03a3\u03b1\u03bc\u03cc\u03b1
+LocaleNames/el/YE=\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7
+LocaleNames/el/YT=\u039c\u03b1\u03b3\u03b9\u03cc\u03c4
+LocaleNames/el/ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae
+LocaleNames/el/ZM=\u0396\u03ac\u03bc\u03c0\u03b9\u03b1
+LocaleNames/el/ZW=\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5
+LocaleNames/en_MT/fy=Western Frisian
+LocaleNames/en_MT/gl=Galician
+LocaleNames/en_MT/ps=Pashto
+LocaleNames/en_MT/AX=Aland Islands
+LocaleNames/en_MT/CD=Congo (Kinshasa)
+LocaleNames/en_MT/CG=Congo (Brazzaville)
+LocaleNames/en_MT/CS=Serbia And Montenegro
+LocaleNames/en_MT/HK=Hong Kong SAR China
+LocaleNames/en_MT/MO=Macao SAR China
+LocaleNames/en_PH/fy=Western Frisian
+LocaleNames/en_PH/gl=Galician
+LocaleNames/en_PH/ps=Pashto
+LocaleNames/en_PH/AX=Aland Islands
+LocaleNames/en_PH/CD=Congo (Kinshasa)
+LocaleNames/en_PH/CG=Congo (Brazzaville)
+LocaleNames/en_PH/CS=Serbia And Montenegro
+LocaleNames/en_PH/HK=Hong Kong SAR China
+LocaleNames/en_PH/MO=Macao SAR China
+LocaleNames/en_PH/MO=Macao SAR China
+LocaleNames/en_SG/fy=Western Frisian
+LocaleNames/en_SG/gl=Galician
+LocaleNames/en_SG/ps=Pashto
+LocaleNames/en_SG/AX=Aland Islands
+LocaleNames/en_SG/CD=Congo (Kinshasa)
+LocaleNames/en_SG/CG=Congo (Brazzaville)
+LocaleNames/en_SG/CS=Serbia And Montenegro
+LocaleNames/en_SG/HK=Hong Kong SAR China
+LocaleNames/en_SG/MO=Macao SAR China
+LocaleNames/es_US/ab=abjaso
+LocaleNames/es_US/dz=dzongkha
+LocaleNames/es_US/fj=fidjiano
+LocaleNames/es_US/si=cingal\u00e9s
+LocaleNames/es_US/ti=tigri\u00f1a
+LocaleNames/es_US/vo=volap\u00fck
+LocaleNames/es_US/AX=Islas \u00c5land
+LocaleNames/es_US/BH=Bahr\u00e9in
+LocaleNames/es_US/KG=Kirguist\u00e1n
+LocaleNames/mt/ab=Abka\u017cjan
+LocaleNames/mt/af=Afrikans
+LocaleNames/mt/am=Am\u0127ariku
+LocaleNames/mt/ar=G\u0127arbi
+LocaleNames/mt/av=Avarik
+LocaleNames/mt/ay=Ajmara
+LocaleNames/mt/az=A\u017cerbaj\u0121ani
+LocaleNames/mt/ba=Baxkir
+LocaleNames/mt/be=Belarussu
+LocaleNames/mt/bg=Bulgaru
+LocaleNames/mt/bh=Bi\u0127ari
+LocaleNames/mt/bo=Tibetjan
+LocaleNames/mt/br=Brenton
+LocaleNames/mt/bs=Bosnijan
+LocaleNames/mt/ca=Katalan
+LocaleNames/mt/ce=\u010ae\u010ben
+LocaleNames/mt/ch=\u010aamorro
+LocaleNames/mt/co=Korsiku
+LocaleNames/mt/cr=Krij
+LocaleNames/mt/cs=\u010aek
+LocaleNames/mt/cu=Slaviku tal-Knisja
+LocaleNames/mt/cv=\u010auvax
+LocaleNames/mt/cy=Welx
+LocaleNames/mt/da=Dani\u017c
+LocaleNames/mt/de=\u0120ermani\u017c
+LocaleNames/mt/dv=Dive\u0127i
+LocaleNames/mt/dz=D\u017congka
+LocaleNames/mt/el=Grieg
+LocaleNames/mt/en=Ingli\u017c
+LocaleNames/mt/es=Spanjol
+LocaleNames/mt/et=Estonjan
+LocaleNames/mt/eu=Bask
+LocaleNames/mt/fa=Persjan
+LocaleNames/mt/ff=Fula\u0127
+LocaleNames/mt/fi=Finlandi\u017c
+LocaleNames/mt/fj=Fi\u0121i
+LocaleNames/mt/fo=Fawri\u017c
+LocaleNames/mt/fr=Fran\u010bi\u017c
+LocaleNames/mt/fy=Fri\u017cjan
+LocaleNames/mt/ga=Irlandi\u017c
+LocaleNames/mt/gd=Galliku Sko\u010b\u010bi\u017c
+LocaleNames/mt/gl=Gallegjan
+LocaleNames/mt/gn=Gwarani
+LocaleNames/mt/gu=Gu\u0121arati
+LocaleNames/mt/gv=Manks
+LocaleNames/mt/ha=\u0126awsa
+LocaleNames/mt/he=Ebrajk
+LocaleNames/mt/hi=\u0126indi
+LocaleNames/mt/ho=\u0126iri Motu
+LocaleNames/mt/hr=Kroat
+LocaleNames/mt/hu=Ungeri\u017c
+LocaleNames/mt/hy=Armenjan
+LocaleNames/mt/hz=\u0126erero
+LocaleNames/mt/id=Indone\u017cjan
+LocaleNames/mt/ik=Inupjak
+LocaleNames/mt/in=Indone\u017cjan
+LocaleNames/mt/is=I\u017clandi\u017c
+LocaleNames/mt/it=Taljan
+LocaleNames/mt/iu=Inukitut
+LocaleNames/mt/iw=Ebrajk
+LocaleNames/mt/ja=\u0120appuni\u017c
+LocaleNames/mt/ji=Jiddix
+LocaleNames/mt/jv=\u0120avani\u017c
+LocaleNames/mt/ka=\u0120or\u0121jan
+LocaleNames/mt/ki=Kikuju
+LocaleNames/mt/kj=Kuanyama
+LocaleNames/mt/kk=Ka\u017cak
+LocaleNames/mt/kl=Kalallisut
+LocaleNames/mt/km=Kmer
+LocaleNames/mt/ko=Korejan
+LocaleNames/mt/ks=Kaxmiri
+LocaleNames/mt/ku=Kurdi\u017c
+LocaleNames/mt/kw=Korniku
+LocaleNames/mt/ky=Kirgi\u017c
+LocaleNames/mt/lb=Let\u017cburgi\u017c
+LocaleNames/mt/ln=Lingaljan
+LocaleNames/mt/lt=Litwanjan
+LocaleNames/mt/lv=Latvjan (Lettix)
+LocaleNames/mt/mg=Malaga\u017ci
+LocaleNames/mt/mh=Marxall
+LocaleNames/mt/mk=Ma\u010bedonjan
+LocaleNames/mt/ml=Malajalam
+LocaleNames/mt/mn=Mongoljan
+LocaleNames/mt/mo=Moldavjan
+LocaleNames/mt/mr=Marati
+LocaleNames/mt/ms=Malajan
+LocaleNames/mt/mt=Malti
+LocaleNames/mt/my=Burmi\u017c
+LocaleNames/mt/na=Nawuru
+LocaleNames/mt/nb=Bokmahal Norve\u0121i\u017c
+LocaleNames/mt/nd=Ndebele, ta\u2019 Fuq
+LocaleNames/mt/ne=Nepali\u017c
+LocaleNames/mt/nl=Olandi\u017c
+LocaleNames/mt/nn=Ninorsk Norve\u0121i\u017c
+LocaleNames/mt/no=Norve\u0121i\u017c
+LocaleNames/mt/nr=Ndebele, t\u2019Isfel
+LocaleNames/mt/nv=Nava\u0127o
+LocaleNames/mt/ny=\u010ai\u010bewa; Njan\u0121a
+LocaleNames/mt/oc=Provenzal (wara 1500)
+LocaleNames/mt/oj=O\u0121ibwa
+LocaleNames/mt/om=Oromo (Afan)
+LocaleNames/mt/or=Orija
+LocaleNames/mt/os=Ossettiku
+LocaleNames/mt/pa=Pun\u0121abi
+LocaleNames/mt/pl=Pollakk
+LocaleNames/mt/ps=Paxtun
+LocaleNames/mt/pt=Portugi\u017c
+LocaleNames/mt/qu=Ke\u010bwa
+LocaleNames/mt/rm=Reto-Romanz
+LocaleNames/mt/ro=Rumen
+LocaleNames/mt/ru=Russu
+LocaleNames/mt/rw=Kinjarwanda
+LocaleNames/mt/sc=Sardinjan
+LocaleNames/mt/sd=Sindi
+LocaleNames/mt/se=Sami ta\u2019 Fuq
+LocaleNames/mt/si=Sin\u0127ali\u017c
+LocaleNames/mt/sk=Slovakk
+LocaleNames/mt/sl=Sloven
+LocaleNames/mt/sm=Samojan
+LocaleNames/mt/sn=Xona
+LocaleNames/mt/sq=Albani\u017c
+LocaleNames/mt/sr=Serb
+LocaleNames/mt/st=Soto, t\u2019Isfel
+LocaleNames/mt/su=Sundani\u017c
+LocaleNames/mt/sv=Svedi\u017c
+LocaleNames/mt/sw=Swa\u0127ili
+LocaleNames/mt/tg=Ta\u0121ik
+LocaleNames/mt/th=Tajlandi\u017c
+LocaleNames/mt/ti=Tigrinja
+LocaleNames/mt/tk=Turkmeni
+LocaleNames/mt/tn=Zwana
+LocaleNames/mt/to=Tongan (G\u017cejjer ta\u2019 Tonga)
+LocaleNames/mt/tr=Tork
+LocaleNames/mt/ty=Ta\u0127itjan
+LocaleNames/mt/ug=Wigur
+LocaleNames/mt/uk=Ukranjan
+LocaleNames/mt/uz=U\u017cbek
+LocaleNames/mt/vi=Vjetnami\u017c
+LocaleNames/mt/vo=Volapuk
+LocaleNames/mt/xh=\u0126o\u017ca
+LocaleNames/mt/yi=Jiddix
+LocaleNames/mt/yo=Joruba
+LocaleNames/mt/za=\u017bwang
+LocaleNames/mt/zh=\u010aini\u017c
+LocaleNames/mt/zu=\u017bulu
+LocaleNames/mt/AE=Emirati G\u0127arab Maqg\u0127uda
+LocaleNames/mt/AF=Afganistan
+LocaleNames/mt/AI=Angwilla
+LocaleNames/mt/AL=Albanija
+LocaleNames/mt/AM=Armenja
+LocaleNames/mt/AN=Antilles Olandi\u017ci
+LocaleNames/mt/AQ=Antartika
+LocaleNames/mt/AR=Ar\u0121entina
+LocaleNames/mt/AS=Samoa Amerikana
+LocaleNames/mt/AT=Awstrija
+LocaleNames/mt/AU=Awstralja
+LocaleNames/mt/AZ=A\u017cerbaj\u0121an
+LocaleNames/mt/BA=Bo\u017cnija \u0126er\u017cegovina
+LocaleNames/mt/BD=Bangladexx
+LocaleNames/mt/BE=Bel\u0121ju
+LocaleNames/mt/BG=Bulgarija
+LocaleNames/mt/BH=Ba\u0127rajn
+LocaleNames/mt/BN=Brunej
+LocaleNames/mt/BO=Bolivja
+LocaleNames/mt/BR=Bra\u017cil
+LocaleNames/mt/BS=Ba\u0127amas
+LocaleNames/mt/BT=Butan
+LocaleNames/mt/BY=Bjelorussja
+LocaleNames/mt/BZ=Beli\u017ce
+LocaleNames/mt/CA=Kanada
+LocaleNames/mt/CC=Cocos (Keeling) Islands
+LocaleNames/mt/CD=Democratic Republic of the Congo
+LocaleNames/mt/CF=Repubblika Afrikana \u010aentrali
+LocaleNames/mt/CG=Kongo
+LocaleNames/mt/CH=Svizzera
+LocaleNames/mt/CI=Kosta ta\u2019 l-Avorju
+LocaleNames/mt/CL=\u010aili
+LocaleNames/mt/CM=Kamerun
+LocaleNames/mt/CN=\u010aina
+LocaleNames/mt/CO=Kolumbja
+LocaleNames/mt/CR=Kosta Rika
+LocaleNames/mt/CS=Serbja u Montenegro
+LocaleNames/mt/CU=Kuba
+LocaleNames/mt/CV=Kape Verde
+LocaleNames/mt/CY=\u010aipru
+LocaleNames/mt/CZ=Repubblika \u010aeka
+LocaleNames/mt/DE=\u0120ermanja
+LocaleNames/mt/DJ=\u0120ibuti
+LocaleNames/mt/DK=Danimarka
+LocaleNames/mt/DM=Dominika
+LocaleNames/mt/DO=Republikka Domenikana
+LocaleNames/mt/DZ=Al\u0121erija
+LocaleNames/mt/EC=Ekwador
+LocaleNames/mt/EE=Estonja
+LocaleNames/mt/EG=E\u0121ittu
+LocaleNames/mt/EH=Sahara tal-Punent
+LocaleNames/mt/ER=Eritreja
+LocaleNames/mt/ES=Spanja
+LocaleNames/mt/ET=Etijopja
+LocaleNames/mt/FI=Finlandja
+LocaleNames/mt/FJ=Fi\u0121i
+LocaleNames/mt/FM=Mikronesja
+LocaleNames/mt/FO=G\u017cejjer Faroe
+LocaleNames/mt/FR=Franza
+LocaleNames/mt/GB=Ingilterra
+LocaleNames/mt/GE=\u0120or\u0121ja
+LocaleNames/mt/GF=Gujana Fran\u010bi\u017ca
+LocaleNames/mt/GH=Gana
+LocaleNames/mt/GL=Grinlandja
+LocaleNames/mt/GM=Gambja
+LocaleNames/mt/GN=Gineja
+LocaleNames/mt/GP=Gwadelupe
+LocaleNames/mt/GQ=Ginea Ekwatorjali
+LocaleNames/mt/GR=Gre\u010bja
+LocaleNames/mt/GS=South Georgia and the South Sandwich Islands
+LocaleNames/mt/GT=Gwatemala
+LocaleNames/mt/GU=Gwam
+LocaleNames/mt/GW=Ginea-Bissaw
+LocaleNames/mt/GY=Gujana
+LocaleNames/mt/HK=\u0126ong Kong S.A.R., \u010aina
+LocaleNames/mt/HM=Heard Island and McDonald Islands
+LocaleNames/mt/HN=\u0126onduras
+LocaleNames/mt/HR=Kroazja
+LocaleNames/mt/HT=\u0126aiti
+LocaleNames/mt/HU=Ungerija
+LocaleNames/mt/ID=Indone\u017cja
+LocaleNames/mt/IE=Irlanda
+LocaleNames/mt/IL=I\u017crael
+LocaleNames/mt/IN=Indja
+LocaleNames/mt/IS=Islanda
+LocaleNames/mt/IT=Italja
+LocaleNames/mt/JM=\u0120amajka
+LocaleNames/mt/JO=\u0120ordan
+LocaleNames/mt/JP=\u0120appun
+LocaleNames/mt/KE=Kenja
+LocaleNames/mt/KG=Kirgistan
+LocaleNames/mt/KH=Kambodja
+LocaleNames/mt/KM=Komoros
+LocaleNames/mt/KN=Saint Kitts and Nevis
+LocaleNames/mt/KP=Koreja ta\u2019 Fuq
+LocaleNames/mt/KR=Koreja t\u2019Isfel
+LocaleNames/mt/KW=Kuwajt
+LocaleNames/mt/KZ=Ka\u017cakstan
+LocaleNames/mt/LB=Libanu
+LocaleNames/mt/LC=Santa Lu\u010bija
+LocaleNames/mt/LR=Liberja
+LocaleNames/mt/LS=Lesoto
+LocaleNames/mt/LT=Litwanja
+LocaleNames/mt/LU=Lussemburgu
+LocaleNames/mt/LV=Latvja
+LocaleNames/mt/LY=Libja
+LocaleNames/mt/MA=Marokk
+LocaleNames/mt/MC=Monako
+LocaleNames/mt/MD=Maldova
+LocaleNames/mt/MG=Madagaskar
+LocaleNames/mt/MH=G\u017cejjer ta\u2019 Marshall
+LocaleNames/mt/MK=Ma\u010bedonja
+LocaleNames/mt/MM=Mjanmar
+LocaleNames/mt/MN=Mongolja
+LocaleNames/mt/MO=Macao S.A.R., China
+LocaleNames/mt/MP=G\u017cejjer Marjana ta\u2019 Fuq
+LocaleNames/mt/MQ=Martinik
+LocaleNames/mt/MR=Mawritanja
+LocaleNames/mt/MU=Mawrizju
+LocaleNames/mt/MX=Messiku
+LocaleNames/mt/MY=Malasja
+LocaleNames/mt/MZ=Mo\u017cambik
+LocaleNames/mt/NA=Namibja
+LocaleNames/mt/NE=Ni\u0121er
+LocaleNames/mt/NG=Ni\u0121erja
+LocaleNames/mt/NI=Nikaragwa
+LocaleNames/mt/NL=Olanda
+LocaleNames/mt/NO=Norve\u0121ja
+LocaleNames/mt/PF=Polinesja Fran\u010bi\u017ca
+LocaleNames/mt/PG=Papwa-Ginea \u0120dida
+LocaleNames/mt/PH=Filippini
+LocaleNames/mt/PL=Polonja
+LocaleNames/mt/PM=Saint Pierre and Miquelon
+LocaleNames/mt/PS=Palestinian Territory
+LocaleNames/mt/PT=Portugall
+LocaleNames/mt/PY=Paragwaj
+LocaleNames/mt/RE=R\u00e9union
+LocaleNames/mt/RO=Rumanija
+LocaleNames/mt/RU=Russja
+LocaleNames/mt/SA=G\u0127arabja Sawdita
+LocaleNames/mt/SE=\u017bvezja
+LocaleNames/mt/SG=Singapor
+LocaleNames/mt/SI=Slovenja
+LocaleNames/mt/SJ=Svalbard and Jan Mayen
+LocaleNames/mt/SK=Slovakkja
+LocaleNames/mt/SO=Somalja
+LocaleNames/mt/SR=Surinam
+LocaleNames/mt/ST=Sao Tome and Principe
+LocaleNames/mt/SY=Sirja
+LocaleNames/mt/SZ=Swa\u017ciland
+LocaleNames/mt/TC=Turks and Caicos Islands
+LocaleNames/mt/TD=\u010aad
+LocaleNames/mt/TF=Territorji Fran\u010bi\u017ci ta\u2019 Nofsinhar
+LocaleNames/mt/TH=Tajlandja
+LocaleNames/mt/TJ=Ta\u0121ikistan
+LocaleNames/mt/TK=Tokelaw
+LocaleNames/mt/TL=Timor tal-Lvant
+LocaleNames/mt/TN=Tune\u017c
+LocaleNames/mt/TR=Turkija
+LocaleNames/mt/TT=Trinidad u Tobago
+LocaleNames/mt/TW=Tajwan
+LocaleNames/mt/TZ=Tan\u017canija
+LocaleNames/mt/UA=Ukraina
+LocaleNames/mt/US=Stati Uniti
+LocaleNames/mt/UY=Urugwaj
+LocaleNames/mt/UZ=U\u017cbekistan
+LocaleNames/mt/VA=Vatikan
+LocaleNames/mt/VC=Saint Vincent and the Grenadines
+LocaleNames/mt/VE=Venezwela
+LocaleNames/mt/VN=Vjetnam
+LocaleNames/mt/VU=Vanwatu
+LocaleNames/mt/WF=Wallis and Futuna
+LocaleNames/mt/YE=Jemen
+LocaleNames/mt/YT=Majotte
+LocaleNames/mt/ZA=Afrika t\u2019Isfel
+LocaleNames/mt/ZM=\u017bambja
+LocaleNames/mt/ZW=\u017bimbabwe
+LocaleNames/sr/ZA=\u0408\u0443\u0436\u043d\u043e\u0430\u0444\u0440\u0438\u0447\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
+LocaleNames/zh_SG/bo=\u85cf\u6587
+LocaleNames/zh_SG/gd=\u82cf\u683c\u5170\u76d6\u5c14\u6587
+LocaleNames/zh_SG/ho=\u5e0c\u91cc\u83ab\u56fe\u6587
+LocaleNames/zh_SG/ia=\u56fd\u9645\u6587 A
+LocaleNames/zh_SG/ie=\u56fd\u9645\u6587 E
+LocaleNames/zh_SG/iu=\u4f0a\u52aa\u4f0a\u7279\u6587
+LocaleNames/zh_SG/kj=\u5bbd\u4e9a\u739b\u6587
+LocaleNames/zh_SG/kn=\u574e\u7eb3\u8fbe\u6587
+LocaleNames/zh_SG/lv=\u62c9\u8131\u7ef4\u4e9a\u6587
+LocaleNames/zh_SG/ny=\u5c3c\u626c\u8d3e\u6587\uff1b\u9f50\u5207\u74e6\u6587\uff1b\u5207\u74e6\u6587
+LocaleNames/zh_SG/oc=\u5965\u514b\u897f\u5510\u6587(1500\u4ee5\u540e)
+LocaleNames/zh_SG/om=\u5965\u6d1b\u83ab\u6587
+LocaleNames/zh_SG/rm=\u5217\u6258\uff0d\u7f57\u66fc\u6587
+LocaleNames/zh_SG/sd=\u4fe1\u5fb7\u6587
+LocaleNames/zh_SG/se=\u5317\u8428\u7c73\u6587
+LocaleNames/zh_SG/sn=\u7ecd\u7eb3\u6587
+LocaleNames/zh_SG/ss=\u65af\u74e6\u7279\u6587
+LocaleNames/zh_SG/su=\u5dfd\u4ed6\u6587
+LocaleNames/zh_SG/tl=\u4ed6\u52a0\u7984\u6587
+LocaleNames/zh_SG/tn=\u585e\u8328\u74e6\u7eb3\u6587
+LocaleNames/zh_SG/ts=\u5b97\u52a0\u6587
+LocaleNames/zh_SG/tt=\u5854\u5854\u5c14\u6587
+LocaleNames/zh_SG/tw=\u7279\u5a01\u6587
+LocaleNames/zh_SG/wa=\u74e6\u9686\u6587
+LocaleNames/zh_SG/wo=\u6c83\u6d1b\u592b\u6587
+LocaleNames/zh_SG/xh=\u79d1\u8428\u6587
+LocaleNames/zh_SG/za=\u58ee\u8bed
+LocaleNames/zh_SG/BA=\u6ce2\u65af\u5c3c\u4e9a\u548c\u9ed1\u585e\u54e5\u7ef4\u90a3
+LocaleNames/zh_SG/CC=\u79d1\u79d1\u65af\uff08\u57fa\u6797\uff09\u7fa4\u5c9b
+LocaleNames/zh_SG/CD=\u521a\u679c\uff08\u91d1\uff09
+LocaleNames/zh_SG/CG=\u521a\u679c\uff08\u5e03\uff09
+LocaleNames/zh_SG/DM=\u591a\u7c73\u5c3c\u52a0
+LocaleNames/zh_SG/KG=\u5409\u5c14\u5409\u65af\u65af\u5766
+LocaleNames/zh_SG/KP=\u5317\u671d\u9c9c
+LocaleNames/zh_SG/MQ=\u9a6c\u63d0\u5c3c\u514b\u7fa4\u5c9b
+LocaleNames/zh_SG/MQ=\u9a6c\u63d0\u5c3c\u514b\u7fa4\u5c9b
+LocaleNames/zh_SG/NC=\u65b0\u5361\u91cc\u591a\u5c3c\u4e9a
+LocaleNames/zh_SG/TF=\u6cd5\u5c5e\u5357\u90e8\u9886\u571f
+FormatData/es_US/AmPmMarkers/0=a.m.
+FormatData/es_US/AmPmMarkers/1=p.m.
+FormatData/es_US/NumberElements/0=.
+FormatData/es_US/NumberElements/1=,
+FormatData/es_US/NumberElements/2=;
+FormatData/es_US/NumberElements/3=%
+FormatData/es_US/NumberElements/4=0
+FormatData/es_US/NumberElements/5=#
+FormatData/es_US/NumberElements/6=-
+FormatData/es_US/NumberElements/7=E
+FormatData/es_US/NumberElements/8=\u2030
+FormatData/es_US/NumberElements/9=\u221e
+FormatData/es_US/NumberElements/10=NaN
+FormatData/mt/AmPmMarkers/0=QN
+FormatData/mt/AmPmMarkers/1=WN
+FormatData/mt/DateTimePatterns/4=EEEE, d 'ta\u2019' MMMM yyyy
+# bug# 6483191
+CalendarData/ga_IE/firstDayOfWeek=1
+CalendarData/en_PH/firstDayOfWeek=1
+CalendarData/en_SG/firstDayOfWeek=1
+CalendarData/zh_SG/firstDayOfWeek=1
+CalendarData/mt_MT/firstDayOfWeek=1
+CalendarData/en_MT/firstDayOfWeek=1
+CalendarData/es_US/firstDayOfWeek=1
+CalendarData/es_CY/firstDayOfWeek=2
+CalendarData/in_ID/firstDayOfWeek=2
+CalendarData/ms_MY/firstDayOfWeek=2
+CalendarData/sr_BA/firstDayOfWeek=2
+CalendarData/sr_CS/firstDayOfWeek=2
+# bug# 6498742
+# make sure that the default en data is used for en_SG : CLDR1.4.1 demoted these data
+FormatData/en_SG/DateTimePatterns/0=h:mm:ss a z
+FormatData/en_SG/DateTimePatterns/1=h:mm:ss a z
+FormatData/en_SG/DateTimePatterns/2=h:mm:ss a
+FormatData/en_SG/DateTimePatterns/3=h:mm a
+FormatData/en_SG/DateTimePatterns/4=EEEE, MMMM d, yyyy
+FormatData/en_SG/DateTimePatterns/5=MMMM d, yyyy
+FormatData/en_SG/DateTimePatterns/6=MMM d, yyyy
+FormatData/en_SG/DateTimePatterns/7=M/d/yy
+FormatData/en_SG/DateTimePatterns/8={1} {0}
+# Use approved data 
+FormatData/ms/Eras/0=BCE
+FormatData/ms/Eras/1=CE
+FormatData/sr_BA/MonthNames/5=\u0458\u0443\u043d\u0438
+FormatData/sr_BA/MonthNames/6=\u0458\u0443\u043b\u0438
+FormatData/sr_BA/DayNames/3=\u0441\u0440\u0438\u0458\u0435\u0434\u0430
+FormatData/sr_BA/DayAbbreviations/3=\u0441\u0440\u0438
+FormatData/sr_BA/DateTimePatterns/0=HH '\u0447\u0430\u0441\u043e\u0432\u0430', mm '\u043c\u0438\u043d\u0443\u0442\u0430', ss' \u0441\u0435\u043a\u0443\u043d\u0434\u0438'
+FormatData/sr_BA/DateTimePatterns/1=HH.mm.ss z
+FormatData/sr_BA/DateTimePatterns/2=HH:mm:ss
+FormatData/sr_BA/DateTimePatterns/3=HH:mm
+FormatData/sr_BA/DateTimePatterns/4=EEEE, dd. MMMM yyyy.
+FormatData/sr_BA/DateTimePatterns/5=dd. MMMM yyyy.
+FormatData/sr_BA/DateTimePatterns/6=yyyy-MM-dd
+FormatData/sr_BA/DateTimePatterns/7=yy-MM-dd
+FormatData/sr_BA/DateTimePatterns/8={1} {0}
+LocaleNames/pt_BR/ce=checheno
+LocaleNames/pt_BR/ik=inupiaque
+LocaleNames/pt_BR/jv=javan\u00eas
+LocaleNames/pt_BR/nd=ndebele do norte
+LocaleNames/pt_BR/nr=ndebele do sul
+LocaleNames/pt_BR/st=soto do sul
+LocaleNames/pt_BR/AX=Ilhas Aland
+LocaleNames/pt_BR/BA=B\u00f3snia-Herzegovina
+LocaleNames/pt_BR/BH=Bahrain
+LocaleNames/pt_BR/KP=Cor\u00e9ia do Norte
+LocaleNames/pt_BR/MK=Maced\u00f4nia
+LocaleNames/pt_BR/ZW=Zimb\u00e1bue
+LocaleNames/pt_PT/ee=eve
+LocaleNames/pt_PT/fo=fero\u00eas
+LocaleNames/pt_PT/gl=galego
+LocaleNames/pt_PT/ha=hau\u00e7\u00e1
+LocaleNames/pt_PT/hy=arm\u00eanio
+LocaleNames/pt_PT/ig=ibo
+LocaleNames/pt_PT/ki=quicuio
+LocaleNames/pt_PT/kl=groenland\u00eas
+LocaleNames/pt_PT/km=cmer
+LocaleNames/pt_PT/mh=marshall\u00eas
+LocaleNames/pt_PT/mk=maced\u00f4nio
+LocaleNames/pt_PT/nr=ndebele, south
+LocaleNames/pt_PT/os=ossetic
+LocaleNames/pt_PT/st=soto, do sul
+LocaleNames/pt_PT/ta=t\u00e2mil
+LocaleNames/pt_PT/AI=Anguilla
+LocaleNames/pt_PT/AX=\u00c5land Islands
+
+# JE, GG, IM (6544471)
+LocaleNames//JE=Jersey
+LocaleNames//GG=Guernsey
+LocaleNames//IM=Isle Of Man
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/text/resources/LocaleDataTest.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,424 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test @(#)LocaleDataTest.java	1.42 07/04/06
+ * @bug 4052473 4052679 4055602 4066550 4067619 4068012 4068073 4070174 4070452
+ *      4070178 4070450 4070695 4070725 4070795 4071003 4071183 4071782 4072013
+ *      4072388 4072773 4075404 4084356 4087238 4092361 4094033 4094371 4098518
+ *      4099810 4103218 4103220 4103861 4112136 4113638 4113654 4117054 4122468
+ *      4122840 4139860 4156708 4175306 4215747 4209960 4290801 4900884 4942982
+ *      4518811 4945388 4936845 4794068 4461740 4965260 4984277 4826794 5032580
+ *      5102005 5074431 6182685 6208712 6277020 6245766 6351682 6386647 6379382
+ *      6414459 6455680 6498742
+ * @summary Verify locale data
+ * 
+ */
+
+/*
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+/*    This test is a generalized test for verifying changes to the locale data.
+ *    It is driven by an external file that specifies the particular pieces of locale
+ *    data to check.  That file is in .properties file format: a series of key/value
+ *    pairs delimited by newline characters, with the keys separated from the values
+ *    by = signs.  The keys are similar in syntax to a Unix pathname, with keys at
+ *    successive levels of containment in the resource-data hierarchy separated by
+ *    slashes.  The file is in ISO 8859-1 encoding, with control characters and
+ *    non-ASCII characters denoted with backslash-u escape sequences.  The program also allows
+ *    blank lines and comment lines to be interspersed with the data.  Comment lines
+ *    begin with '#'.
+ *
+ *    A data file for this test would look something like this:<pre>
+ *        FormatData//MonthNames/0=January
+ *        FormatData//MonthNames/1=February
+ *        LocaleNames//US=United States
+ *        LocaleNames//FR=France
+ *        FormatData/fr_FR/MonthNames/0=janvier
+ *        FormatData/fr_FR/MonthNames/1=f\u00e9vrier
+ *        LocaleNames/fr_FR/US=\u00c9tats-Unis
+ *        LocaleNames/fr_FR/FR=France</pre>
+ *
+ *    The command-line syntax of this test is
+ *        <tt>java LocaleDataTest [-w] [{ -s | <filename> }]</tt>
+ *
+ *    This program always sends its results to standard output.   If -w is not specified,
+ *    this program prints out only the differences between the data file and the actual
+ *    resource data.  If -w is specified, the program prints out every entry, comment,
+ *    and blank line from the data file.  Where there is a difference between the data
+ *    file and the resource data, the data is the data from the resources.  This feature
+ *    can be used to quickly generate a new data file.
+ *
+ *    The user can specify an optional filename or -s.  If the user specifies a filename,
+ *    the program uses that file as the data file.  If the user specifies -s, the program
+ *    reads its input from standard input rather than from a file.  If the user specifies
+ *    neither, the program reads its input from a file called LocaleData in the same
+ *    directory the program itself resides in.
+ *
+ *    The -nothrow option prevents the program from throwing an exception when it
+ *    gets an error.  -w implies -nothrow.
+ *
+ *    Other command-line options can be specified, but are ignored.
+ *
+ *    It's important to note what this test will NOT test.  Certain changes to the locale
+ *    data are meant to have certain effects on the internationalization frameworks.  For
+ *    instance, we could ensure round-trip formatting/parsing integrity for the full
+ *    date/time format of SimpleDateFormat by making sure that the full date and time
+ *    patterns include sufficient data.  The test of this is not whether changes were
+ *    made to the locale data; it's whether using this data gives round-trip integrity.
+ *    Likewise, changing the currency patterns to use \u00a4 instead of local currency
+ *    symbols isn't something that can be tested by this test; instead, you want to
+ *    actually format currency values and make sure the proper currency symbol was used.
+ *
+ *    This test by itself doesn't do an exhaustive comparison of locale data.  It is
+ *    possible to do this manually, however:  Use the GenerateKeyList tool to produce
+ *    a complete list of keys for the two versions of the locales you want to compare,
+ *    and then diff them.  This will flag additions and deletions.  Generate a data file
+ *    for the base version of the data using the -w option and the output from
+ *    GenerateKeyList, and then use the resultant file as the data file when you run
+ *    this test against the new version of the data.
+ */
+
+import java.io.*;
+import java.text.*;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.ResourceBundle.Control;
+import java.util.MissingResourceException;
+
+public class LocaleDataTest
+{
+    public static void main(String[] args) throws Exception {
+
+        // set up our flags and our input and output streams based on the
+        // command-line arguments (exceptions generated here will propagate out
+        // to the environment)
+        BufferedReader in = null;
+        PrintWriter out = null;
+        boolean writeNewFile = false;
+        boolean doThrow = true;
+
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].equals("-w")) {
+                writeNewFile = true;
+                doThrow = false;
+            }
+
+            else if (args[i].equals("-nothrow"))
+                doThrow = false;
+
+            else if (args[i].equals("-s") && in == null)
+                in = new BufferedReader(new EscapeReader(new InputStreamReader(System.in,
+                                "ISO8859_1")));
+            else if (!args[i].startsWith("-") && in == null)
+                in = new BufferedReader(new EscapeReader(new InputStreamReader(new
+                                FileInputStream(args[i]), "ISO8859_1")));
+        }
+        if (in == null) {
+            File localeData = new File(System.getProperty("test.src", "."), "LocaleData");
+            in = new BufferedReader(new EscapeReader(new InputStreamReader(new
+                            FileInputStream(localeData), "ISO8859_1")));
+        }
+        out = new PrintWriter(new EscapeWriter(new OutputStreamWriter(System.out,
+                        "ISO8859_1")), true);
+
+        // perform the actual test
+        int errorCount = doTest(in, out, writeNewFile);
+
+        // write out the error count, and throw an exception out into the environment
+        // if there were any errors
+        if (errorCount != 0) {
+            if (!writeNewFile)
+                out.println("Test failed.  " + errorCount + " errors.");
+            if (doThrow)
+                throw new Exception("Test failed.  " + errorCount + " errors.");
+        }
+        else if (!writeNewFile)
+            out.println("Test passed.");
+
+        in.close();
+        out.close();
+    }
+
+    static int doTest(BufferedReader in, PrintWriter out, boolean writeNewFile)
+                    throws Exception {
+        int errorCount = 0;
+
+        String key = null;
+        String expectedValue = null;
+        String line = in.readLine();
+        while (line != null) {
+            if (line.startsWith("#") || line.length() == 0) {
+                if (writeNewFile)
+                    out.println(line);
+            }
+
+            else {
+                int index  = line.indexOf("=");
+                if (index == -1) {
+                    key = line;
+                    expectedValue = "";
+                }
+                else {
+                    key = line.substring(0, index);
+                    if (index + 1 == line.length())
+                        expectedValue = "";
+                    else
+                        expectedValue = line.substring(index + 1);
+                }
+                if (!processLine(key, expectedValue, out, writeNewFile))
+                    ++errorCount;
+            }
+            line = in.readLine();
+        }
+        return errorCount;
+    }
+
+    static boolean processLine(String key, String expectedValue, PrintWriter out,
+                    boolean writeNewFile) throws Exception {
+        String rbName, localeName, resTag, qualifier;
+        String language = "", country = "", variant = "";
+        int index, oldIndex;
+
+        index = key.indexOf("/");
+        if (index == -1 || index + 1 == key.length())
+            throw new Exception("Malformed input file: no slashes in \"" + key + "\"");
+        rbName = key.substring(0, index);
+
+        oldIndex = index + 1;
+        index = key.indexOf("/", oldIndex);
+        if (index == -1 || index + 1 == key.length())
+            throw new Exception("Malformed input file: \"" + key + "\" is missing locale name");
+        localeName = key.substring(oldIndex, index);
+        if (localeName.length() > 0) {
+            language = localeName.substring(0, 2);
+            if (localeName.length() > 3) {
+                country = localeName.substring(3, 5);
+                if (localeName.length() > 5)
+                    variant = localeName.substring(6);
+            }
+        }
+
+        oldIndex = index + 1;
+        index = key.indexOf("/", oldIndex);
+        if (index == -1)
+            index = key.length();
+        resTag = key.substring(oldIndex, index);
+
+        if (index < key.length() - 1)
+            qualifier = key.substring(index + 1);
+        else
+            qualifier = "";
+
+        String retrievedValue = null;
+        Object resource = null;
+        try {
+            String fullName = null;
+            if (rbName.equals("CalendarData")
+                    || rbName.equals("CurrencyNames")
+                    || rbName.equals("LocaleNames")
+                    || rbName.equals("TimeZoneNames")) {
+                fullName = "sun.util.resources." + rbName;
+            } else {
+                fullName = "sun.text.resources." + rbName;
+            }
+            ResourceBundle bundle = ResourceBundle.getBundle(fullName,
+                           new Locale(language, country, variant), 
+                           ResourceBundle.Control.getNoFallbackControl(Control.FORMAT_DEFAULT));
+            resource = bundle.getObject(resTag);
+        }
+        catch (MissingResourceException e) {
+        }
+
+        if (resource != null) {
+            if (resource instanceof String) {
+                retrievedValue = (String)resource;
+            }
+            else if (resource instanceof String[]) {
+                int element = Integer.valueOf(qualifier).intValue();
+                String[] stringList = (String[])resource;
+                if (element >= 0 || element < stringList.length)
+                    retrievedValue = stringList[element];
+            }
+            else if (resource instanceof String[][]) {
+                String[][] stringArray = (String[][])resource;
+                int slash = qualifier.indexOf("/");
+                if (slash == -1) {
+                    for (int i = 0; i < stringArray.length; i++) {
+                        if (stringArray[i][0].equals(qualifier))
+                            retrievedValue = stringArray[i][1];
+                    }
+                }
+                else {
+                    int row = Integer.valueOf(qualifier.substring(0, slash)).intValue();
+                    int column = Integer.valueOf(qualifier.substring(slash + 1)).intValue();
+                    if (row >= 0 || row < stringArray.length || column >= 0 || column <
+                                    stringArray[row].length)
+                        retrievedValue = stringArray[row][column];
+                }
+            }
+        }
+
+        if (retrievedValue == null || !retrievedValue.equals(expectedValue)) {
+            if (retrievedValue == null)
+                retrievedValue = "<MISSING!>";
+
+            if (writeNewFile)
+                out.println(key + "=" + retrievedValue);
+            else {
+                out.println("Mismatch in " + key + ":");
+                out.println("  file = \"" + expectedValue + "\"");
+                out.println("   jvm = \"" + retrievedValue + "\"");
+            }
+            return false;
+        }
+        else {
+            if (writeNewFile)
+                out.println(key + "=" + expectedValue);
+        }
+        return true;
+    }
+}
+
+class EscapeReader extends FilterReader {
+    public EscapeReader(Reader in) {
+        super(in);
+    }
+
+    public int read() throws IOException {
+        if (buffer != null) {
+            String b = buffer.toString();
+            int result = b.charAt(0);
+            if (b.length() > 1)
+                buffer = new StringBuffer(b.substring(1));
+            else
+                buffer = null;
+            return result;
+        }
+        else {
+            int result = super.read();
+            if (result != '\\')
+                return result;
+            else {
+                buffer = new StringBuffer();
+                result = super.read();
+                buffer.append((char)result);
+                if (result == 'u') {
+                    for (int i = 0; i < 4; i++) {
+                        result = super.read();
+                        if (result == -1)
+                            break;
+                        buffer.append((char)result);
+                    }
+                    String number = buffer.toString().substring(1);
+                    result = Integer.parseInt(number, 16);
+                    buffer = null;
+                    return result;
+                }
+                return '\\';
+            }
+        }
+    }
+
+    public int read(char[] cbuf, int start, int len) throws IOException {
+        int p = start;
+        int end = start + len;
+        int c = 0;
+        while (c != -1 && p < end) {
+            c = read();
+            if (c != -1)
+                cbuf[p++] = (char)c;
+        }
+        if (c == -1 && p == start)
+            return -1;
+        else
+            return p - start;
+    }
+
+    private StringBuffer buffer = null;
+}
+
+class EscapeWriter extends FilterWriter {
+    public EscapeWriter(Writer out) {
+        super(out);
+    }
+
+    public void write(int c) throws IOException {
+        if ((c >= ' ' && c <= '\u007e') || c == '\r' || c == '\n')
+            super.write(c);
+        else {
+            super.write('\\');
+            super.write('u');
+            String number = Integer.toHexString(c);
+            if (number.length() < 4)
+                number = zeros.substring(0, 4 - number.length()) + number;
+            super.write(number.charAt(0));
+            super.write(number.charAt(1));
+            super.write(number.charAt(2));
+            super.write(number.charAt(3));
+        }
+    }
+
+    public void write(char[] cbuf, int off, int len) throws IOException {
+        int end = off + len;
+        while (off < end)
+            write(cbuf[off++]);
+    }
+
+    public void write(String str, int off, int len) throws IOException {
+        int end = off + len;
+        while (off < end)
+            write(str.charAt(off++));
+    }
+
+    private static String zeros = "0000";
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/util/resources/Locale/Bug4429024.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,137 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+    @test  @(#)Bug4429024.java	1.3 07/04/06
+    @summary checking localised language/country names in finnish
+    @bug 4429024 4964035
+*/
+
+import java.util.Locale;
+
+public class Bug4429024 {
+
+    public static void main(String[] args) throws Exception {
+       	
+	int errors=0;
+
+	String [][] fiLocales = {
+		    { "ar", "arabia" },
+		    { "ba", "baski" },
+		    { "bg", "bulgaria" },
+		    { "ca", "katalaani" },
+		    { "cs", "tsekki" },
+		    { "da", "danska" },
+		    { "de", "saksa" },
+		    { "el", "kreikka" },
+		    { "en", "englanti" },
+		    { "es", "espanja" },
+		    { "fi", "suomi" },
+		    { "fr", "franska" },
+		    { "he", "heprea" },
+		    { "hi", "hindi" },
+		    { "it", "italia" },
+		    { "ja", "japani" },
+		    { "lt", "liettua" },
+		    { "lv", "latvia" },
+		    { "nl", "hollanti" },
+		    { "no", "norja" },
+		    { "pl", "puola" },
+		    { "pt", "portugali" },
+		    { "ru", "ven\u00e4j\u00e4" },
+		    { "sv", "ruotsi" },
+		    { "th", "thai" },
+		    { "tr", "turkki" },
+		    { "zh", "kiina" }
+	};
+
+	String[][] fiCountries = {
+		    { "BE", "Belgia" },
+		    { "BR", "Brasilia" },
+		    { "CA", "Kanada" },
+		    { "CH", "Sveitsi" },
+		    { "CN", "Kiina" },
+		    { "CZ", "Tsekin tasavalta" },
+		    { "DE", "Saksa" },
+		    { "DK", "Danska" },
+		    { "ES", "Espanja" },
+		    { "FI", "Suomi" },
+		    { "FR", "Franska" },
+		    { "GB", "Iso-Britannia" },
+		    { "GR", "Kreikka" },
+		    { "IE", "Irlanti" },
+		    { "IT", "Italia" },
+		    { "JP", "Japani" },
+		    { "KR", "Korea" },
+		    { "NL", "Alankomaat" },
+		    { "NO", "Norja" },
+		    { "PL", "Puola" },
+		    { "PT", "Portugali" },
+		    { "RU", "Ven\u00e4j\u00e4" },
+		    { "SE", "Ruotsi" },
+		    { "TR", "Turkki" },
+		    { "US", "Yhdysvallat" }
+	};
+	
+	for (int i=0; i < fiLocales.length; i++) {
+	    errors += getLanguage(fiLocales[i][0], fiLocales[i][1]);
+	} 
+	
+	for (int i=0; i < fiCountries.length; i++) {
+	    errors += getCountry(fiCountries[i][0], fiCountries[i][1]);
+	}
+
+	if(errors > 0){
+	    throw new RuntimeException();
+	}
+    };
+
+
+	static int getLanguage(String inLang, String localizedName){
+
+	    Locale fiLocale = new Locale("fi", "FI");
+	    Locale inLocale = new Locale (inLang, "");
+      
+	    if (!inLocale.getDisplayLanguage(fiLocale).equals(localizedName)){
+		System.out.println("Language " + inLang +" should be \"" + localizedName  + "\", not \"" + inLocale.getDisplayLanguage(fiLocale) + "\"");
+		return 1;
+	    }
+	    else{
+		return 0;
+	    }
+	}
+
+    static int getCountry(String inCountry, String localizedName){
+
+	    Locale fiLocale = new Locale("fi", "FI");
+	    Locale inLocale = new Locale ("", inCountry);
+	   
+	    if (!inLocale.getDisplayCountry(fiLocale).equals(localizedName)){
+		System.out.println("Country " + inCountry + " should be \"" + localizedName + "\", not \"" + inLocale.getDisplayCountry(fiLocale) + "\"");
+	    	return 1;
+	    }
+	    else{
+		return 0;
+	    }
+	    
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/j2se/test/sun/util/resources/Locale/Bug4965260.java	Fri Jun 22 00:46:43 2007 +0000
@@ -0,0 +1,78 @@
+/* 
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/**
+ *@test 1.2 04/06/07
+ *@bug 4965260
+ *@summary Verifies the language name of "nl" for supported locales
+ */
+
+import java.util.Locale;
+
+public class Bug4965260  {
+
+  // Define supported locales
+  static Locale[] locales2Test = new Locale[] {
+    new Locale("de"),
+    new Locale("es"),
+    new Locale("fr"),
+    new Locale("it"),
+    new Locale("sv")
+  }; 
+  
+  static String[] expectedNames = new String[] {
+    "Niederl\u00e4ndisch",
+    "Neerland\u00e9s",
+    "n\u00e9erlandais",
+    "neerlandese",
+    "nederl\u00e4ndska"
+  };
+
+  public static void main(String[] args) throws Exception {
+    Locale.setDefault(Locale.ENGLISH);
+    if (locales2Test.length != expectedNames.length) {
+      throw new Exception("\nData sizes does not match!\n");
+    }
+    
+    StringBuffer message = new StringBuffer("");
+    Locale dutch = new Locale("nl", "BE");
+    String current;
+    for (int i = 0; i < locales2Test.length; i++) {
+      Locale locale = locales2Test[i];
+      current = dutch.getDisplayLanguage(locale);
+      if (!current.equals(expectedNames[i])) {
+        message.append("[");
+        message.append(locale.getDisplayLanguage());
+        message.append("] ");
+        message.append("Language name is ");
+        message.append(current);
+        message.append(" should be ");
+        message.append(expectedNames[i]);
+        message.append("\n");
+      }
+    }
+    
+    if (message.length() >0) {
+      throw new Exception("\n" + message.toString());
+    }
+  }
+}
Binary file j2se/test/tools/javac/6547131/p/Outer$I.class has changed
--- a/j2se/test/tools/javac/6547131/p/Outer$I.jasm	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/tools/javac/6547131/p/Outer$I.jasm	Fri Jun 22 00:46:43 2007 +0000
@@ -1,7 +1,7 @@
 package  p;
 
 public interface  Outer$I
-	version 50:0
+	version 49:0
 {
 
 
Binary file j2se/test/tools/javac/6547131/p/Outer.class has changed
--- a/j2se/test/tools/javac/6547131/p/Outer.jasm	Fri May 25 00:49:14 2007 +0000
+++ b/j2se/test/tools/javac/6547131/p/Outer.jasm	Fri Jun 22 00:46:43 2007 +0000
@@ -1,7 +1,7 @@
 package  p;
 
 super public class Outer
-	version 50:0
+	version 49:0
 {